2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
16 #include "testing/gtest/include/gtest/gtest.h"
17 #include "webrtc/common_video/interface/i420_video_frame.h"
18 #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
19 #include "webrtc/modules/utility/interface/process_thread.h"
20 #include "webrtc/modules/video_capture/ensure_initialized.h"
21 #include "webrtc/modules/video_capture/include/video_capture.h"
22 #include "webrtc/modules/video_capture/include/video_capture_factory.h"
23 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
24 #include "webrtc/system_wrappers/interface/scoped_ptr.h"
25 #include "webrtc/system_wrappers/interface/scoped_refptr.h"
26 #include "webrtc/system_wrappers/interface/sleep.h"
27 #include "webrtc/system_wrappers/interface/tick_util.h"
28 #include "webrtc/test/testsupport/gtest_disable.h"
30 using webrtc::CriticalSectionWrapper;
31 using webrtc::CriticalSectionScoped;
32 using webrtc::scoped_ptr;
33 using webrtc::SleepMs;
34 using webrtc::TickTime;
35 using webrtc::VideoCaptureAlarm;
36 using webrtc::VideoCaptureCapability;
37 using webrtc::VideoCaptureDataCallback;
38 using webrtc::VideoCaptureFactory;
39 using webrtc::VideoCaptureFeedBack;
40 using webrtc::VideoCaptureModule;
43 #define WAIT_(ex, timeout, res) \
46 int64_t start = TickTime::MillisecondTimestamp(); \
47 while (!res && TickTime::MillisecondTimestamp() < start + timeout) { \
53 #define EXPECT_TRUE_WAIT(ex, timeout) \
56 WAIT_(ex, timeout, res); \
57 if (!res) EXPECT_TRUE(ex); \
61 static const int kTimeOut = 5000;
62 static const int kTestHeight = 288;
63 static const int kTestWidth = 352;
64 static const int kTestFramerate = 30;
66 // Compares the content of two video frames.
67 static bool CompareFrames(const webrtc::I420VideoFrame& frame1,
68 const webrtc::I420VideoFrame& frame2) {
70 (frame1.stride(webrtc::kYPlane) == frame2.stride(webrtc::kYPlane)) &&
71 (frame1.stride(webrtc::kUPlane) == frame2.stride(webrtc::kUPlane)) &&
72 (frame1.stride(webrtc::kVPlane) == frame2.stride(webrtc::kVPlane)) &&
73 (frame1.width() == frame2.width()) &&
74 (frame1.height() == frame2.height());
78 for (int plane = 0; plane < webrtc::kNumOfPlanes; plane ++) {
79 webrtc::PlaneType plane_type = static_cast<webrtc::PlaneType>(plane);
80 int allocated_size1 = frame1.allocated_size(plane_type);
81 int allocated_size2 = frame2.allocated_size(plane_type);
82 if (allocated_size1 != allocated_size2)
84 const uint8_t* plane_buffer1 = frame1.buffer(plane_type);
85 const uint8_t* plane_buffer2 = frame2.buffer(plane_type);
86 if (memcmp(plane_buffer1, plane_buffer2, allocated_size1))
92 class TestVideoCaptureCallback : public VideoCaptureDataCallback {
94 TestVideoCaptureCallback()
95 : capture_cs_(CriticalSectionWrapper::CreateCriticalSection()),
97 last_render_time_ms_(0),
100 rotate_frame_(webrtc::kCameraRotate0){
103 ~TestVideoCaptureCallback() {
104 if (timing_warnings_ > 0)
105 printf("No of timing warnings %d\n", timing_warnings_);
108 virtual void OnIncomingCapturedFrame(const int32_t id,
109 webrtc::I420VideoFrame& videoFrame) {
110 CriticalSectionScoped cs(capture_cs_.get());
112 int height = videoFrame.height();
113 int width = videoFrame.width();
114 if (rotate_frame_ == webrtc::kCameraRotate90 ||
115 rotate_frame_ == webrtc::kCameraRotate270) {
116 EXPECT_EQ(width, capability_.height);
117 EXPECT_EQ(height, capability_.width);
119 EXPECT_EQ(height, capability_.height);
120 EXPECT_EQ(width, capability_.width);
122 // RenderTimstamp should be the time now.
124 videoFrame.render_time_ms() >= TickTime::MillisecondTimestamp()-30 &&
125 videoFrame.render_time_ms() <= TickTime::MillisecondTimestamp());
127 if ((videoFrame.render_time_ms() >
128 last_render_time_ms_ + (1000 * 1.1) / capability_.maxFPS &&
129 last_render_time_ms_ > 0) ||
130 (videoFrame.render_time_ms() <
131 last_render_time_ms_ + (1000 * 0.9) / capability_.maxFPS &&
132 last_render_time_ms_ > 0)) {
137 last_render_time_ms_ = videoFrame.render_time_ms();
138 last_frame_.CopyFrame(videoFrame);
140 virtual void OnIncomingCapturedEncodedFrame(const int32_t id,
141 webrtc::VideoFrame& videoFrame,
142 webrtc::VideoCodecType codecType)
147 virtual void OnCaptureDelayChanged(const int32_t id,
148 const int32_t delay) {
149 CriticalSectionScoped cs(capture_cs_.get());
150 capture_delay_ = delay;
153 void SetExpectedCapability(VideoCaptureCapability capability) {
154 CriticalSectionScoped cs(capture_cs_.get());
155 capability_= capability;
156 incoming_frames_ = 0;
157 last_render_time_ms_ = 0;
160 int incoming_frames() {
161 CriticalSectionScoped cs(capture_cs_.get());
162 return incoming_frames_;
165 int capture_delay() {
166 CriticalSectionScoped cs(capture_cs_.get());
167 return capture_delay_;
169 int timing_warnings() {
170 CriticalSectionScoped cs(capture_cs_.get());
171 return timing_warnings_;
173 VideoCaptureCapability capability() {
174 CriticalSectionScoped cs(capture_cs_.get());
178 bool CompareLastFrame(const webrtc::I420VideoFrame& frame) {
179 CriticalSectionScoped cs(capture_cs_.get());
180 return CompareFrames(last_frame_, frame);
183 void SetExpectedCaptureRotation(webrtc::VideoCaptureRotation rotation) {
184 CriticalSectionScoped cs(capture_cs_.get());
185 rotate_frame_ = rotation;
189 scoped_ptr<CriticalSectionWrapper> capture_cs_;
190 VideoCaptureCapability capability_;
192 int64_t last_render_time_ms_;
193 int incoming_frames_;
194 int timing_warnings_;
195 webrtc::I420VideoFrame last_frame_;
196 webrtc::VideoCaptureRotation rotate_frame_;
199 class TestVideoCaptureFeedBack : public VideoCaptureFeedBack {
201 TestVideoCaptureFeedBack() :
202 capture_cs_(CriticalSectionWrapper::CreateCriticalSection()),
204 alarm_(webrtc::Cleared) {
207 virtual void OnCaptureFrameRate(const int32_t id,
208 const uint32_t frameRate) {
209 CriticalSectionScoped cs(capture_cs_.get());
210 frame_rate_ = frameRate;
213 virtual void OnNoPictureAlarm(const int32_t id,
214 const VideoCaptureAlarm reported_alarm) {
215 CriticalSectionScoped cs(capture_cs_.get());
216 alarm_ = reported_alarm;
219 CriticalSectionScoped cs(capture_cs_.get());
223 VideoCaptureAlarm alarm() {
224 CriticalSectionScoped cs(capture_cs_.get());
229 scoped_ptr<CriticalSectionWrapper> capture_cs_;
230 unsigned int frame_rate_;
231 VideoCaptureAlarm alarm_;
234 class VideoCaptureTest : public testing::Test {
236 VideoCaptureTest() : number_of_devices_(0) {}
239 webrtc::videocapturemodule::EnsureInitialized();
240 device_info_.reset(VideoCaptureFactory::CreateDeviceInfo(0));
241 assert(device_info_.get());
242 number_of_devices_ = device_info_->NumberOfDevices();
243 ASSERT_GT(number_of_devices_, 0u);
246 webrtc::scoped_refptr<VideoCaptureModule> OpenVideoCaptureDevice(
248 VideoCaptureDataCallback* callback) {
249 char device_name[256];
250 char unique_name[256];
252 EXPECT_EQ(0, device_info_->GetDeviceName(
253 device, device_name, 256, unique_name, 256));
255 webrtc::scoped_refptr<VideoCaptureModule> module(
256 VideoCaptureFactory::Create(device, unique_name));
257 if (module.get() == NULL)
260 EXPECT_FALSE(module->CaptureStarted());
262 module->RegisterCaptureDataCallback(*callback);
266 void StartCapture(VideoCaptureModule* capture_module,
267 VideoCaptureCapability capability) {
268 ASSERT_EQ(0, capture_module->StartCapture(capability));
269 EXPECT_TRUE(capture_module->CaptureStarted());
271 VideoCaptureCapability resulting_capability;
272 EXPECT_EQ(0, capture_module->CaptureSettings(resulting_capability));
273 EXPECT_EQ(capability.width, resulting_capability.width);
274 EXPECT_EQ(capability.height, resulting_capability.height);
277 scoped_ptr<VideoCaptureModule::DeviceInfo> device_info_;
278 unsigned int number_of_devices_;
281 TEST_F(VideoCaptureTest, CreateDelete) {
282 for (int i = 0; i < 5; ++i) {
283 int64_t start_time = TickTime::MillisecondTimestamp();
284 TestVideoCaptureCallback capture_observer;
285 webrtc::scoped_refptr<VideoCaptureModule> module(OpenVideoCaptureDevice(
286 0, &capture_observer));
287 ASSERT_TRUE(module.get() != NULL);
289 VideoCaptureCapability capability;
291 device_info_->GetCapability(module->CurrentDeviceName(), 0, capability);
293 capability.width = kTestWidth;
294 capability.height = kTestHeight;
295 capability.maxFPS = kTestFramerate;
296 capability.rawType = webrtc::kVideoUnknown;
298 capture_observer.SetExpectedCapability(capability);
299 ASSERT_NO_FATAL_FAILURE(StartCapture(module.get(), capability));
301 // Less than 4s to start the camera.
302 EXPECT_LE(TickTime::MillisecondTimestamp() - start_time, 4000);
304 // Make sure 5 frames are captured.
305 EXPECT_TRUE_WAIT(capture_observer.incoming_frames() >= 5, kTimeOut);
307 EXPECT_GE(capture_observer.capture_delay(), 0);
309 int64_t stop_time = TickTime::MillisecondTimestamp();
310 EXPECT_EQ(0, module->StopCapture());
311 EXPECT_FALSE(module->CaptureStarted());
313 // Less than 3s to stop the camera.
314 EXPECT_LE(TickTime::MillisecondTimestamp() - stop_time, 3000);
318 TEST_F(VideoCaptureTest, Capabilities) {
320 printf("Video capture capabilities are not supported on Mac.\n");
324 TestVideoCaptureCallback capture_observer;
326 webrtc::scoped_refptr<VideoCaptureModule> module(OpenVideoCaptureDevice(
327 0, &capture_observer));
328 ASSERT_TRUE(module.get() != NULL);
330 int number_of_capabilities = device_info_->NumberOfCapabilities(
331 module->CurrentDeviceName());
332 EXPECT_GT(number_of_capabilities, 0);
333 // Key is <width>x<height>, value is vector of maxFPS values at that
335 typedef std::map<std::string, std::vector<int> > FrameRatesByResolution;
336 FrameRatesByResolution frame_rates_by_resolution;
337 for (int i = 0; i < number_of_capabilities; ++i) {
338 VideoCaptureCapability capability;
339 EXPECT_EQ(0, device_info_->GetCapability(module->CurrentDeviceName(), i,
341 std::ostringstream resolutionStream;
342 resolutionStream << capability.width << "x" << capability.height;
343 resolutionStream.flush();
344 std::string resolution = resolutionStream.str();
345 frame_rates_by_resolution[resolution].push_back(capability.maxFPS);
347 // Since Android presents so many resolution/FPS combinations and the test
348 // runner imposes a timeout, we only actually start the capture and test
349 // that a frame was captured for 2 frame-rates at each resolution.
350 if (frame_rates_by_resolution[resolution].size() > 2)
353 capture_observer.SetExpectedCapability(capability);
354 ASSERT_NO_FATAL_FAILURE(StartCapture(module.get(), capability));
355 // Make sure at least one frame is captured.
356 EXPECT_TRUE_WAIT(capture_observer.incoming_frames() >= 1, kTimeOut);
358 EXPECT_EQ(0, module->StopCapture());
362 // There's no reason for this to _necessarily_ be true, but in practice all
363 // Android devices this test runs on in fact do support multiple capture
364 // resolutions and multiple frame-rates per captured resolution, so we assert
365 // this fact here as a regression-test against the time that we only noticed a
366 // single frame-rate per resolution (bug 2974). If this test starts being run
367 // on devices for which this is untrue (e.g. Nexus4) then the following should
368 // probably be wrapped in a base::android::BuildInfo::model()/device() check.
369 EXPECT_GT(frame_rates_by_resolution.size(), 1U);
370 for (FrameRatesByResolution::const_iterator it =
371 frame_rates_by_resolution.begin();
372 it != frame_rates_by_resolution.end();
374 EXPECT_GT(it->second.size(), 1U) << it->first;
379 // NOTE: flaky, crashes sometimes.
380 // http://code.google.com/p/webrtc/issues/detail?id=777
381 TEST_F(VideoCaptureTest, DISABLED_TestTwoCameras) {
382 if (number_of_devices_ < 2) {
383 printf("There are not two cameras available. Aborting test. \n");
387 TestVideoCaptureCallback capture_observer1;
388 webrtc::scoped_refptr<VideoCaptureModule> module1(OpenVideoCaptureDevice(
389 0, &capture_observer1));
390 ASSERT_TRUE(module1.get() != NULL);
391 VideoCaptureCapability capability1;
393 device_info_->GetCapability(module1->CurrentDeviceName(), 0, capability1);
395 capability1.width = kTestWidth;
396 capability1.height = kTestHeight;
397 capability1.maxFPS = kTestFramerate;
398 capability1.rawType = webrtc::kVideoUnknown;
400 capture_observer1.SetExpectedCapability(capability1);
402 TestVideoCaptureCallback capture_observer2;
403 webrtc::scoped_refptr<VideoCaptureModule> module2(OpenVideoCaptureDevice(
404 1, &capture_observer2));
405 ASSERT_TRUE(module1.get() != NULL);
408 VideoCaptureCapability capability2;
410 device_info_->GetCapability(module2->CurrentDeviceName(), 0, capability2);
412 capability2.width = kTestWidth;
413 capability2.height = kTestHeight;
414 capability2.maxFPS = kTestFramerate;
415 capability2.rawType = webrtc::kVideoUnknown;
417 capture_observer2.SetExpectedCapability(capability2);
419 ASSERT_NO_FATAL_FAILURE(StartCapture(module1.get(), capability1));
420 ASSERT_NO_FATAL_FAILURE(StartCapture(module2.get(), capability2));
421 EXPECT_TRUE_WAIT(capture_observer1.incoming_frames() >= 5, kTimeOut);
422 EXPECT_TRUE_WAIT(capture_observer2.incoming_frames() >= 5, kTimeOut);
423 EXPECT_EQ(0, module2->StopCapture());
424 EXPECT_EQ(0, module1->StopCapture());
427 // Test class for testing external capture and capture feedback information
428 // such as frame rate and picture alarm.
429 class VideoCaptureExternalTest : public testing::Test {
432 capture_module_ = VideoCaptureFactory::Create(0, capture_input_interface_);
433 process_module_ = webrtc::ProcessThread::CreateProcessThread();
434 process_module_->Start();
435 process_module_->RegisterModule(capture_module_);
437 VideoCaptureCapability capability;
438 capability.width = kTestWidth;
439 capability.height = kTestHeight;
440 capability.rawType = webrtc::kVideoYV12;
441 capability.maxFPS = kTestFramerate;
442 capture_callback_.SetExpectedCapability(capability);
444 test_frame_.CreateEmptyFrame(kTestWidth, kTestHeight, kTestWidth,
445 ((kTestWidth + 1) / 2), (kTestWidth + 1) / 2);
446 SleepMs(1); // Wait 1ms so that two tests can't have the same timestamp.
447 memset(test_frame_.buffer(webrtc::kYPlane), 127, kTestWidth * kTestHeight);
448 memset(test_frame_.buffer(webrtc::kUPlane), 127,
449 ((kTestWidth + 1) / 2) * ((kTestHeight + 1) / 2));
450 memset(test_frame_.buffer(webrtc::kVPlane), 127,
451 ((kTestWidth + 1) / 2) * ((kTestHeight + 1) / 2));
453 capture_module_->RegisterCaptureDataCallback(capture_callback_);
454 capture_module_->RegisterCaptureCallback(capture_feedback_);
455 capture_module_->EnableFrameRateCallback(true);
456 capture_module_->EnableNoPictureAlarm(true);
460 process_module_->Stop();
461 webrtc::ProcessThread::DestroyProcessThread(process_module_);
464 webrtc::VideoCaptureExternal* capture_input_interface_;
465 webrtc::scoped_refptr<VideoCaptureModule> capture_module_;
466 webrtc::ProcessThread* process_module_;
467 webrtc::I420VideoFrame test_frame_;
468 TestVideoCaptureCallback capture_callback_;
469 TestVideoCaptureFeedBack capture_feedback_;
472 // Test input of external video frames.
473 TEST_F(VideoCaptureExternalTest, TestExternalCapture) {
474 unsigned int length = webrtc::CalcBufferSize(webrtc::kI420,
476 test_frame_.height());
477 webrtc::scoped_ptr<uint8_t[]> test_buffer(new uint8_t[length]);
478 webrtc::ExtractBuffer(test_frame_, length, test_buffer.get());
479 EXPECT_EQ(0, capture_input_interface_->IncomingFrame(test_buffer.get(),
480 length, capture_callback_.capability(), 0));
481 EXPECT_TRUE(capture_callback_.CompareLastFrame(test_frame_));
484 // Test input of planar I420 frames.
485 // NOTE: flaky, sometimes fails on the last CompareLastFrame.
486 // http://code.google.com/p/webrtc/issues/detail?id=777
487 TEST_F(VideoCaptureExternalTest, DISABLED_TestExternalCaptureI420) {
488 webrtc::I420VideoFrame frame_i420;
489 frame_i420.CopyFrame(test_frame_);
492 capture_input_interface_->IncomingI420VideoFrame(&frame_i420, 0));
493 EXPECT_TRUE(capture_callback_.CompareLastFrame(frame_i420));
495 // Test with a frame with pitch not equal to width
496 memset(test_frame_.buffer(webrtc::kYPlane), 0xAA,
497 test_frame_.allocated_size(webrtc::kYPlane));
498 memset(test_frame_.buffer(webrtc::kUPlane), 0xAA,
499 test_frame_.allocated_size(webrtc::kUPlane));
500 memset(test_frame_.buffer(webrtc::kVPlane), 0xAA,
501 test_frame_.allocated_size(webrtc::kVPlane));
502 webrtc::I420VideoFrame aligned_test_frame;
503 int y_pitch = kTestWidth + 2;
504 int u_pitch = kTestWidth / 2 + 1;
505 int v_pitch = u_pitch;
506 aligned_test_frame.CreateEmptyFrame(kTestWidth, kTestHeight,
507 y_pitch, u_pitch, v_pitch);
508 memset(aligned_test_frame.buffer(webrtc::kYPlane), 0,
509 kTestWidth * kTestHeight);
510 memset(aligned_test_frame.buffer(webrtc::kUPlane), 0,
511 (kTestWidth + 1) / 2 * (kTestHeight + 1) / 2);
512 memset(aligned_test_frame.buffer(webrtc::kVPlane), 0,
513 (kTestWidth + 1) / 2 * (kTestHeight + 1) / 2);
514 // Copy the test_frame_ to aligned_test_frame.
515 int y_width = kTestWidth;
516 int uv_width = kTestWidth / 2;
517 int y_rows = kTestHeight;
518 int uv_rows = kTestHeight / 2;
519 unsigned char* y_plane = test_frame_.buffer(webrtc::kYPlane);
520 unsigned char* u_plane = test_frame_.buffer(webrtc::kUPlane);
521 unsigned char* v_plane = test_frame_.buffer(webrtc::kVPlane);
523 unsigned char* current_pointer = aligned_test_frame.buffer(webrtc::kYPlane);
524 for (int i = 0; i < y_rows; ++i) {
525 memcpy(current_pointer, y_plane, y_width);
526 // Remove the alignment which ViE doesn't support.
527 current_pointer += y_pitch;
531 current_pointer = aligned_test_frame.buffer(webrtc::kUPlane);
532 for (int i = 0; i < uv_rows; ++i) {
533 memcpy(current_pointer, u_plane, uv_width);
534 // Remove the alignment which ViE doesn't support.
535 current_pointer += u_pitch;
539 current_pointer = aligned_test_frame.buffer(webrtc::kVPlane);
540 for (int i = 0; i < uv_rows; ++i) {
541 memcpy(current_pointer, v_plane, uv_width);
542 // Remove the alignment which ViE doesn't support.
543 current_pointer += v_pitch;
546 frame_i420.CopyFrame(aligned_test_frame);
549 capture_input_interface_->IncomingI420VideoFrame(&frame_i420, 0));
550 EXPECT_TRUE(capture_callback_.CompareLastFrame(test_frame_));
553 // Test frame rate and no picture alarm.
554 // Flaky on Win32, see webrtc:3270.
555 TEST_F(VideoCaptureExternalTest, DISABLED_ON_WIN(FrameRate)) {
556 int64_t testTime = 3;
557 TickTime startTime = TickTime::Now();
559 while ((TickTime::Now() - startTime).Milliseconds() < testTime * 1000) {
560 unsigned int length = webrtc::CalcBufferSize(webrtc::kI420,
562 test_frame_.height());
563 webrtc::scoped_ptr<uint8_t[]> test_buffer(new uint8_t[length]);
564 webrtc::ExtractBuffer(test_frame_, length, test_buffer.get());
565 EXPECT_EQ(0, capture_input_interface_->IncomingFrame(test_buffer.get(),
566 length, capture_callback_.capability(), 0));
569 EXPECT_TRUE(capture_feedback_.frame_rate() >= 8 &&
570 capture_feedback_.frame_rate() <= 10);
572 EXPECT_EQ(webrtc::Raised, capture_feedback_.alarm());
574 startTime = TickTime::Now();
575 while ((TickTime::Now() - startTime).Milliseconds() < testTime * 1000) {
576 unsigned int length = webrtc::CalcBufferSize(webrtc::kI420,
578 test_frame_.height());
579 webrtc::scoped_ptr<uint8_t[]> test_buffer(new uint8_t[length]);
580 webrtc::ExtractBuffer(test_frame_, length, test_buffer.get());
581 EXPECT_EQ(0, capture_input_interface_->IncomingFrame(test_buffer.get(),
582 length, capture_callback_.capability(), 0));
585 EXPECT_EQ(webrtc::Cleared, capture_feedback_.alarm());
586 // Frame rate might be less than 33 since we have paused providing
587 // frames for a while.
588 EXPECT_TRUE(capture_feedback_.frame_rate() >= 25 &&
589 capture_feedback_.frame_rate() <= 33);
592 TEST_F(VideoCaptureExternalTest, Rotation) {
593 EXPECT_EQ(0, capture_module_->SetCaptureRotation(webrtc::kCameraRotate0));
594 unsigned int length = webrtc::CalcBufferSize(webrtc::kI420,
596 test_frame_.height());
597 webrtc::scoped_ptr<uint8_t[]> test_buffer(new uint8_t[length]);
598 webrtc::ExtractBuffer(test_frame_, length, test_buffer.get());
599 EXPECT_EQ(0, capture_input_interface_->IncomingFrame(test_buffer.get(),
600 length, capture_callback_.capability(), 0));
601 EXPECT_EQ(0, capture_module_->SetCaptureRotation(webrtc::kCameraRotate90));
602 capture_callback_.SetExpectedCaptureRotation(webrtc::kCameraRotate90);
603 EXPECT_EQ(0, capture_input_interface_->IncomingFrame(test_buffer.get(),
604 length, capture_callback_.capability(), 0));
605 EXPECT_EQ(0, capture_module_->SetCaptureRotation(webrtc::kCameraRotate180));
606 capture_callback_.SetExpectedCaptureRotation(webrtc::kCameraRotate180);
607 EXPECT_EQ(0, capture_input_interface_->IncomingFrame(test_buffer.get(),
608 length, capture_callback_.capability(), 0));
609 EXPECT_EQ(0, capture_module_->SetCaptureRotation(webrtc::kCameraRotate270));
610 capture_callback_.SetExpectedCaptureRotation(webrtc::kCameraRotate270);
611 EXPECT_EQ(0, capture_input_interface_->IncomingFrame(test_buffer.get(),
612 length, capture_callback_.capability(), 0));