12a0553609b5b6d1d4dce0366b334dc9ef8aa4d65buildbot@webrtc.org/*
22a0553609b5b6d1d4dce0366b334dc9ef8aa4d65buildbot@webrtc.org * libjingle
32a0553609b5b6d1d4dce0366b334dc9ef8aa4d65buildbot@webrtc.org * Copyright 2008 Google Inc.
42a0553609b5b6d1d4dce0366b334dc9ef8aa4d65buildbot@webrtc.org *
52a0553609b5b6d1d4dce0366b334dc9ef8aa4d65buildbot@webrtc.org * Redistribution and use in source and binary forms, with or without
62a0553609b5b6d1d4dce0366b334dc9ef8aa4d65buildbot@webrtc.org * modification, are permitted provided that the following conditions are met:
72a0553609b5b6d1d4dce0366b334dc9ef8aa4d65buildbot@webrtc.org *
82a0553609b5b6d1d4dce0366b334dc9ef8aa4d65buildbot@webrtc.org *  1. Redistributions of source code must retain the above copyright notice,
92a0553609b5b6d1d4dce0366b334dc9ef8aa4d65buildbot@webrtc.org *     this list of conditions and the following disclaimer.
102a0553609b5b6d1d4dce0366b334dc9ef8aa4d65buildbot@webrtc.org *  2. Redistributions in binary form must reproduce the above copyright notice,
112a0553609b5b6d1d4dce0366b334dc9ef8aa4d65buildbot@webrtc.org *     this list of conditions and the following disclaimer in the documentation
122a0553609b5b6d1d4dce0366b334dc9ef8aa4d65buildbot@webrtc.org *     and/or other materials provided with the distribution.
132a0553609b5b6d1d4dce0366b334dc9ef8aa4d65buildbot@webrtc.org *  3. The name of the author may not be used to endorse or promote products
142a0553609b5b6d1d4dce0366b334dc9ef8aa4d65buildbot@webrtc.org *     derived from this software without specific prior written permission.
152a0553609b5b6d1d4dce0366b334dc9ef8aa4d65buildbot@webrtc.org *
162a0553609b5b6d1d4dce0366b334dc9ef8aa4d65buildbot@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
172a0553609b5b6d1d4dce0366b334dc9ef8aa4d65buildbot@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
182a0553609b5b6d1d4dce0366b334dc9ef8aa4d65buildbot@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
192a0553609b5b6d1d4dce0366b334dc9ef8aa4d65buildbot@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
202a0553609b5b6d1d4dce0366b334dc9ef8aa4d65buildbot@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
212a0553609b5b6d1d4dce0366b334dc9ef8aa4d65buildbot@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
222a0553609b5b6d1d4dce0366b334dc9ef8aa4d65buildbot@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
232a0553609b5b6d1d4dce0366b334dc9ef8aa4d65buildbot@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
242a0553609b5b6d1d4dce0366b334dc9ef8aa4d65buildbot@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
252a0553609b5b6d1d4dce0366b334dc9ef8aa4d65buildbot@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
262a0553609b5b6d1d4dce0366b334dc9ef8aa4d65buildbot@webrtc.org */
270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <stdio.h>
290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <vector>
300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/fakemediaprocessor.h"
320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/fakevideocapturer.h"
330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/fakevideorenderer.h"
340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/testutils.h"
350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/videocapturer.h"
360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/videoprocessor.h"
37cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/gunit.h"
38cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/logging.h"
39cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/thread.h"
400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::FakeVideoCapturer;
420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace {
440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgconst int kMsCallbackWait = 500;
460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// For HD only the height matters.
470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgconst int kMinHdHeight = 720;
480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgconst uint32 kTimeout = 5000U;
490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
50d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.orgvoid NormalizeVideoSize(int* expected_width, int* expected_height) {
51d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org  // WebRtcVideoFrame truncates the frame size to a multiple of 4.
52d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org  *expected_width = *expected_width & ~3;
53d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org  *expected_height = *expected_height & ~3;
54d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org}
55d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org
560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}  // namespace
570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Sets the elapsed time in the video frame to 0.
590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass VideoProcessor0 : public cricket::VideoProcessor {
600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void OnFrame(uint32 /*ssrc*/, cricket::VideoFrame* frame,
620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       bool* drop_frame) {
630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    frame->SetElapsedTime(0u);
640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Adds one to the video frame's elapsed time. Note that VideoProcessor0 and
680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// VideoProcessor1 are not commutative.
690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass VideoProcessor1 : public cricket::VideoProcessor {
700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void OnFrame(uint32 /*ssrc*/, cricket::VideoFrame* frame,
720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       bool* drop_frame) {
730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    int64 elapsed_time = frame->GetElapsedTime();
740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    frame->SetElapsedTime(elapsed_time + 1);
750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass VideoCapturerTest
790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    : public sigslot::has_slots<>,
800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      public testing::Test {
810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  VideoCapturerTest()
830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      : capture_state_(cricket::CS_STOPPED),
840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        num_state_changes_(0),
850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        video_frames_received_(0),
860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        last_frame_elapsed_time_(0) {
870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    capturer_.SignalVideoFrame.connect(this, &VideoCapturerTest::OnVideoFrame);
880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    capturer_.SignalStateChange.connect(this,
890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                        &VideoCapturerTest::OnStateChange);
900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org protected:
930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void OnVideoFrame(cricket::VideoCapturer*, const cricket::VideoFrame* frame) {
940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ++video_frames_received_;
950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    last_frame_elapsed_time_ = frame->GetElapsedTime();
960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    renderer_.RenderFrame(frame);
970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void OnStateChange(cricket::VideoCapturer*,
990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     cricket::CaptureState capture_state) {
1000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    capture_state_ = capture_state;
1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ++num_state_changes_;
1020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::CaptureState capture_state() { return capture_state_; }
1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int num_state_changes() { return num_state_changes_; }
1050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int video_frames_received() const {
1060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return video_frames_received_;
1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int64 last_frame_elapsed_time() const { return last_frame_elapsed_time_; }
1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::FakeVideoCapturer capturer_;
1110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::CaptureState capture_state_;
1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int num_state_changes_;
1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int video_frames_received_;
1140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int64 last_frame_elapsed_time_;
1150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::FakeVideoRenderer renderer_;
1160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoCapturerTest, CaptureState) {
119e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org  EXPECT_TRUE(capturer_.enable_video_adapter());
1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::CS_RUNNING, capturer_.Start(cricket::VideoFormat(
1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      640,
1220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      480,
1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30),
1240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::FOURCC_I420)));
1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.IsRunning());
1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ_WAIT(cricket::CS_RUNNING, capture_state(), kMsCallbackWait);
1270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(1, num_state_changes());
1280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  capturer_.Stop();
1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ_WAIT(cricket::CS_STOPPED, capture_state(), kMsCallbackWait);
1300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(2, num_state_changes());
1310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  capturer_.Stop();
1322a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::Thread::Current()->ProcessMessages(100);
1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(2, num_state_changes());
1340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
1350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoCapturerTest, TestRestart) {
1370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::CS_RUNNING, capturer_.Start(cricket::VideoFormat(
1380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      640,
1390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      480,
1400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30),
1410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::FOURCC_I420)));
1420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.IsRunning());
1430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ_WAIT(cricket::CS_RUNNING, capture_state(), kMsCallbackWait);
1440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(1, num_state_changes());
1450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.Restart(cricket::VideoFormat(
1460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      320,
1470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      240,
1480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30),
1490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::FOURCC_I420)));
1500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ_WAIT(cricket::CS_RUNNING, capture_state(), kMsCallbackWait);
1510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.IsRunning());
1520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_GE(1, num_state_changes());
1530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  capturer_.Stop();
1542a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::Thread::Current()->ProcessMessages(100);
1550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(capturer_.IsRunning());
1560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
1570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoCapturerTest, TestStartingWithRestart) {
1590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(capturer_.IsRunning());
1600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.Restart(cricket::VideoFormat(
1610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      640,
1620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      480,
1630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30),
1640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::FOURCC_I420)));
1650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.IsRunning());
1660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ_WAIT(cricket::CS_RUNNING, capture_state(), kMsCallbackWait);
1670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
1680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoCapturerTest, TestRestartWithSameFormat) {
1700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::VideoFormat format(640, 480,
1710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                              cricket::VideoFormat::FpsToInterval(30),
1720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                              cricket::FOURCC_I420);
1730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::CS_RUNNING, capturer_.Start(format));
1740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.IsRunning());
1750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ_WAIT(cricket::CS_RUNNING, capture_state(), kMsCallbackWait);
1760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(1, num_state_changes());
1770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.Restart(format));
1780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::CS_RUNNING, capture_state());
1790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.IsRunning());
1800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(1, num_state_changes());
1810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
1820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoCapturerTest, CameraOffOnMute) {
1840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::CS_RUNNING, capturer_.Start(cricket::VideoFormat(
1850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      640,
1860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      480,
1870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30),
1880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::FOURCC_I420)));
1890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.IsRunning());
1900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, video_frames_received());
1910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.CaptureFrame());
1920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(1, video_frames_received());
1930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(capturer_.IsMuted());
1940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Mute the camera and expect black output frame.
1960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  capturer_.MuteToBlackThenPause(true);
1970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.IsMuted());
1980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  for (int i = 0; i < 31; ++i) {
1990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(capturer_.CaptureFrame());
2000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(renderer_.black_frame());
2010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
2020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(32, video_frames_received());
2030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ_WAIT(cricket::CS_PAUSED,
2040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                 capturer_.capture_state(), kTimeout);
2050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Verify that the camera is off.
2070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(capturer_.CaptureFrame());
2080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(32, video_frames_received());
2090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Unmute the camera and expect non-black output frame.
2110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  capturer_.MuteToBlackThenPause(false);
2120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(capturer_.IsMuted());
2130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ_WAIT(cricket::CS_RUNNING,
2140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                 capturer_.capture_state(), kTimeout);
2150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.CaptureFrame());
2160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(renderer_.black_frame());
2170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(33, video_frames_received());
2180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
2190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
220952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.orgTEST_F(VideoCapturerTest, ScreencastScaledMaxPixels) {
221952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  capturer_.SetScreencast(true);
222952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org
223952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  int kWidth = 1280;
224952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  int kHeight = 720;
225952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org
226952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  // Screencasts usually have large weird dimensions and are ARGB.
227952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  std::vector<cricket::VideoFormat> formats;
228952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  formats.push_back(cricket::VideoFormat(kWidth, kHeight,
229952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org      cricket::VideoFormat::FpsToInterval(5), cricket::FOURCC_ARGB));
230952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  formats.push_back(cricket::VideoFormat(2 * kWidth, 2 * kHeight,
231952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org      cricket::VideoFormat::FpsToInterval(5), cricket::FOURCC_ARGB));
232952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  capturer_.ResetSupportedFormats(formats);
233952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org
234952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org
235952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  EXPECT_EQ(0, capturer_.screencast_max_pixels());
236952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  EXPECT_EQ(cricket::CS_RUNNING, capturer_.Start(cricket::VideoFormat(
237952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org      2 * kWidth,
238952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org      2 * kHeight,
239952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org      cricket::VideoFormat::FpsToInterval(30),
240952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org      cricket::FOURCC_ARGB)));
241952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  EXPECT_TRUE(capturer_.IsRunning());
242952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  EXPECT_EQ(0, renderer_.num_rendered_frames());
243952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  renderer_.SetSize(2 * kWidth, 2 * kHeight, 0);
244952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  EXPECT_TRUE(capturer_.CaptureFrame());
245952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  EXPECT_EQ(1, renderer_.num_rendered_frames());
246952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org
247952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  capturer_.set_screencast_max_pixels(kWidth * kHeight);
248952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  renderer_.SetSize(kWidth, kHeight, 0);
249952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  EXPECT_TRUE(capturer_.CaptureFrame());
250952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org  EXPECT_EQ(2, renderer_.num_rendered_frames());
251952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org}
252952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org
253d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.orgTEST_F(VideoCapturerTest, ScreencastScaledOddWidth) {
254d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org  capturer_.SetScreencast(true);
255d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org
256d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org  int kWidth = 1281;
257d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org  int kHeight = 720;
258d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org
259d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org  std::vector<cricket::VideoFormat> formats;
260d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org  formats.push_back(cricket::VideoFormat(kWidth, kHeight,
261d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org      cricket::VideoFormat::FpsToInterval(5), cricket::FOURCC_ARGB));
262d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org  capturer_.ResetSupportedFormats(formats);
263d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org
264d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org  EXPECT_EQ(cricket::CS_RUNNING, capturer_.Start(cricket::VideoFormat(
265d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org      kWidth,
266d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org      kHeight,
267d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org      cricket::VideoFormat::FpsToInterval(30),
268d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org      cricket::FOURCC_ARGB)));
269d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org  EXPECT_TRUE(capturer_.IsRunning());
270d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org  EXPECT_EQ(0, renderer_.num_rendered_frames());
271d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org  int expected_width = kWidth;
272d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org  int expected_height = kHeight;
273d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org  NormalizeVideoSize(&expected_width, &expected_height);
274d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org  renderer_.SetSize(expected_width, expected_height, 0);
275d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org  EXPECT_TRUE(capturer_.CaptureFrame());
276d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org  EXPECT_EQ(1, renderer_.num_rendered_frames());
277d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org}
278d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org
279d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.orgTEST_F(VideoCapturerTest, ScreencastScaledSuperLarge) {
280d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org  capturer_.SetScreencast(true);
281d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org
282d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org  const int kMaxWidth = 4096;
283d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org  const int kMaxHeight = 3072;
284d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org  int kWidth = kMaxWidth + 4;
285d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org  int kHeight = kMaxHeight + 4;
286d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org
287d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org  std::vector<cricket::VideoFormat> formats;
288d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org  formats.push_back(cricket::VideoFormat(kWidth, kHeight,
289d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org      cricket::VideoFormat::FpsToInterval(5), cricket::FOURCC_ARGB));
290d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org  capturer_.ResetSupportedFormats(formats);
291d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org
292d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org  EXPECT_EQ(cricket::CS_RUNNING, capturer_.Start(cricket::VideoFormat(
293d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org      kWidth,
294d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org      kHeight,
295d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org      cricket::VideoFormat::FpsToInterval(30),
296d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org      cricket::FOURCC_ARGB)));
297d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org  EXPECT_TRUE(capturer_.IsRunning());
298d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org  EXPECT_EQ(0, renderer_.num_rendered_frames());
299d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org  int expected_width = 2050;
300d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org  int expected_height = 1538;
301d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org  NormalizeVideoSize(&expected_width, &expected_height);
302d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org  renderer_.SetSize(expected_width, expected_height, 0);
303d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org  EXPECT_TRUE(capturer_.CaptureFrame());
304d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org  EXPECT_EQ(1, renderer_.num_rendered_frames());
305d607b292ac512f12547b0fc220f50cc155cdfc38buildbot@webrtc.org}
3062007187dab65bb5d6f602355216534d6dd4ceaf2mallinath@webrtc.org
3070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoCapturerTest, TestFourccMatch) {
3080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::VideoFormat desired(640, 480,
3090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                               cricket::VideoFormat::FpsToInterval(30),
3100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                               cricket::FOURCC_ANY);
3110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::VideoFormat best;
3120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(desired, &best));
3130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(640, best.width);
3140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(480, best.height);
3150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
3160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  desired.fourcc = cricket::FOURCC_MJPG;
3180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(capturer_.GetBestCaptureFormat(desired, &best));
3190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  desired.fourcc = cricket::FOURCC_I420;
3210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(desired, &best));
3220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
3230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoCapturerTest, TestResolutionMatch) {
3250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::VideoFormat desired(1920, 1080,
3260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                               cricket::VideoFormat::FpsToInterval(30),
3270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                               cricket::FOURCC_ANY);
3280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::VideoFormat best;
3290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Ask for 1920x1080. Get HD 1280x720 which is the highest.
3300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(desired, &best));
3310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(1280, best.width);
3320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(720, best.height);
3330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
3340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  desired.width = 360;
3360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  desired.height = 250;
3370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Ask for a little higher than QVGA. Get QVGA.
3380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(desired, &best));
3390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(320, best.width);
3400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(240, best.height);
3410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
3420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  desired.width = 480;
3440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  desired.height = 270;
3450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Ask for HVGA. Get VGA.
3460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(desired, &best));
3470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(640, best.width);
3480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(480, best.height);
3490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
3500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  desired.width = 320;
3520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  desired.height = 240;
3530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Ask for QVGA. Get QVGA.
3540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(desired, &best));
3550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(320, best.width);
3560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(240, best.height);
3570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
3580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  desired.width = 80;
3600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  desired.height = 60;
3610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Ask for lower than QQVGA. Get QQVGA, which is the lowest.
3620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(desired, &best));
3630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(160, best.width);
3640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(120, best.height);
3650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
3660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
3670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoCapturerTest, TestHDResolutionMatch) {
3690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Add some HD formats typical of a mediocre HD webcam.
3700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::VideoFormat> formats;
3710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  formats.push_back(cricket::VideoFormat(320, 240,
3720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
3730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  formats.push_back(cricket::VideoFormat(640, 480,
3740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
3750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  formats.push_back(cricket::VideoFormat(960, 544,
3760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(24), cricket::FOURCC_I420));
3770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  formats.push_back(cricket::VideoFormat(1280, 720,
3780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(15), cricket::FOURCC_I420));
3790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  formats.push_back(cricket::VideoFormat(2592, 1944,
3800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(7), cricket::FOURCC_I420));
3810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  capturer_.ResetSupportedFormats(formats);
3820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::VideoFormat desired(960, 720,
3840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                               cricket::VideoFormat::FpsToInterval(30),
3850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                               cricket::FOURCC_ANY);
3860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::VideoFormat best;
3870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Ask for 960x720 30 fps. Get qHD 24 fps
3880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(desired, &best));
3890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(960, best.width);
3900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(544, best.height);
3910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(24), best.interval);
3920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  desired.width = 960;
3940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  desired.height = 544;
3950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  desired.interval = cricket::VideoFormat::FpsToInterval(30);
3960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Ask for qHD 30 fps. Get qHD 24 fps
3970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(desired, &best));
3980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(960, best.width);
3990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(544, best.height);
4000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(24), best.interval);
4010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  desired.width = 360;
4030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  desired.height = 250;
4040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  desired.interval = cricket::VideoFormat::FpsToInterval(30);
4050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Ask for a little higher than QVGA. Get QVGA.
4060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(desired, &best));
4070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(320, best.width);
4080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(240, best.height);
4090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
4100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  desired.width = 480;
4120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  desired.height = 270;
4130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Ask for HVGA. Get VGA.
4140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(desired, &best));
4150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(640, best.width);
4160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(480, best.height);
4170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
4180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  desired.width = 320;
4200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  desired.height = 240;
4210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Ask for QVGA. Get QVGA.
4220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(desired, &best));
4230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(320, best.width);
4240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(240, best.height);
4250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
4260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  desired.width = 160;
4280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  desired.height = 120;
4290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Ask for lower than QVGA. Get QVGA, which is the lowest.
4300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(desired, &best));
4310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(320, best.width);
4320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(240, best.height);
4330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
4340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  desired.width = 1280;
4360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  desired.height = 720;
4370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Ask for HD. 720p fps is too low. Get VGA which has 30 fps.
4380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(desired, &best));
4390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(640, best.width);
4400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(480, best.height);
4410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
4420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  desired.width = 1280;
4440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  desired.height = 720;
4450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  desired.interval = cricket::VideoFormat::FpsToInterval(15);
4460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Ask for HD 15 fps. Fps matches. Get HD
4470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(desired, &best));
4480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(1280, best.width);
4490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(720, best.height);
4500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(15), best.interval);
4510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  desired.width = 1920;
4530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  desired.height = 1080;
4540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  desired.interval = cricket::VideoFormat::FpsToInterval(30);
4550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Ask for 1080p. Fps of HD formats is too low. Get VGA which can do 30 fps.
4560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(desired, &best));
4570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(640, best.width);
4580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(480, best.height);
4590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
4600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
4610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Some cameras support 320x240 and 320x640. Verify we choose 320x240.
4630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoCapturerTest, TestStrangeFormats) {
4640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::VideoFormat> supported_formats;
4650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(320, 240,
4660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
4670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(320, 640,
4680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
4690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  capturer_.ResetSupportedFormats(supported_formats);
4700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::VideoFormat> required_formats;
4720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  required_formats.push_back(cricket::VideoFormat(320, 240,
4730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
4740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  required_formats.push_back(cricket::VideoFormat(320, 200,
4750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
4760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  required_formats.push_back(cricket::VideoFormat(320, 180,
4770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
4780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::VideoFormat best;
4790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  for (size_t i = 0; i < required_formats.size(); ++i) {
4800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(capturer_.GetBestCaptureFormat(required_formats[i], &best));
4810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(320, best.width);
4820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(240, best.height);
4830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.clear();
4860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(320, 640,
4870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
4880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(320, 240,
4890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
4900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  capturer_.ResetSupportedFormats(supported_formats);
4910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  for (size_t i = 0; i < required_formats.size(); ++i) {
4930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(capturer_.GetBestCaptureFormat(required_formats[i], &best));
4940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(320, best.width);
4950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(240, best.height);
4960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
4980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Some cameras only have very low fps. Verify we choose something sensible.
5000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoCapturerTest, TestPoorFpsFormats) {
5010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // all formats are low framerate
5020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::VideoFormat> supported_formats;
5030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(320, 240,
5040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(10), cricket::FOURCC_I420));
5050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(640, 480,
5060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(7), cricket::FOURCC_I420));
5070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(1280, 720,
5080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(2), cricket::FOURCC_I420));
5090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  capturer_.ResetSupportedFormats(supported_formats);
5100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::VideoFormat> required_formats;
5120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  required_formats.push_back(cricket::VideoFormat(320, 240,
5130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
5140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  required_formats.push_back(cricket::VideoFormat(640, 480,
5150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
5160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::VideoFormat best;
5170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  for (size_t i = 0; i < required_formats.size(); ++i) {
5180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(capturer_.GetBestCaptureFormat(required_formats[i], &best));
5190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(required_formats[i].width, best.width);
5200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(required_formats[i].height, best.height);
5210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Increase framerate of 320x240. Expect low fps VGA avoided.
5240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.clear();
5250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(320, 240,
5260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
5270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(640, 480,
5280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(7), cricket::FOURCC_I420));
5290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(1280, 720,
5300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(2), cricket::FOURCC_I420));
5310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  capturer_.ResetSupportedFormats(supported_formats);
5320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  for (size_t i = 0; i < required_formats.size(); ++i) {
5340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(capturer_.GetBestCaptureFormat(required_formats[i], &best));
5350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(320, best.width);
5360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(240, best.height);
5370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
5390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Some cameras support same size with different frame rates. Verify we choose
5410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// the frame rate properly.
5420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoCapturerTest, TestSameSizeDifferentFpsFormats) {
5430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::VideoFormat> supported_formats;
5440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(320, 240,
5450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(10), cricket::FOURCC_I420));
5460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(320, 240,
5470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(20), cricket::FOURCC_I420));
5480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(320, 240,
5490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
5500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  capturer_.ResetSupportedFormats(supported_formats);
5510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::VideoFormat> required_formats = supported_formats;
5530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::VideoFormat best;
5540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  for (size_t i = 0; i < required_formats.size(); ++i) {
5550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(capturer_.GetBestCaptureFormat(required_formats[i], &best));
5560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(320, best.width);
5570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(240, best.height);
5580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(required_formats[i].interval, best.interval);
5590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
5610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Some cameras support the correct resolution but at a lower fps than
5630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// we'd like. This tests we get the expected resolution and fps.
5640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoCapturerTest, TestFpsFormats) {
5650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // We have VGA but low fps. Choose VGA, not HD
5660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::VideoFormat> supported_formats;
5670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(1280, 720,
5680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
5690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(640, 480,
5700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(15), cricket::FOURCC_I420));
5710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(640, 400,
5720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
5730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(640, 360,
5740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
5750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  capturer_.ResetSupportedFormats(supported_formats);
5760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::VideoFormat> required_formats;
5780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  required_formats.push_back(cricket::VideoFormat(640, 480,
5790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_ANY));
5800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  required_formats.push_back(cricket::VideoFormat(640, 480,
5810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(20), cricket::FOURCC_ANY));
5820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  required_formats.push_back(cricket::VideoFormat(640, 480,
5830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(10), cricket::FOURCC_ANY));
5840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::VideoFormat best;
5850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
586f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  // Expect 30 fps to choose 30 fps format.
5870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(required_formats[0], &best));
5880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(640, best.width);
5890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(400, best.height);
5900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
5910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
592f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  // Expect 20 fps to choose 30 fps format.
5930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(required_formats[1], &best));
5940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(640, best.width);
5950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(400, best.height);
596f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
5970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
598f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  // Expect 10 fps to choose 15 fps format and set fps to 15.
5990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(required_formats[2], &best));
6000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(640, best.width);
6010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(480, best.height);
602f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(15), best.interval);
6030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // We have VGA 60 fps and 15 fps. Choose best fps.
6050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.clear();
6060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(1280, 720,
6070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
6080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(640, 480,
6090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(60), cricket::FOURCC_MJPG));
6100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(640, 480,
6110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(15), cricket::FOURCC_I420));
6120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(640, 400,
6130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
6140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(640, 360,
6150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
6160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  capturer_.ResetSupportedFormats(supported_formats);
6170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
618f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  // Expect 30 fps to choose 60 fps format and will set best fps to 60.
6190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(required_formats[0], &best));
6200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(640, best.width);
6210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(480, best.height);
622f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(60), best.interval);
6230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
624f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  // Expect 20 fps to choose 60 fps format, and will set best fps to 60.
6250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(required_formats[1], &best));
6260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(640, best.width);
6270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(480, best.height);
628f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(60), best.interval);
6290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
630f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  // Expect 10 fps to choose 15 fps.
6310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(required_formats[2], &best));
6320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(640, best.width);
6330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(480, best.height);
634f32dd31e14521d7f845e7776af6d44d411573370sergeyu@chromium.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(15), best.interval);
6350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
6360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoCapturerTest, TestRequest16x10_9) {
6380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::VideoFormat> supported_formats;
6390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // We do not support HD, expect 4x3 for 4x3, 16x10, and 16x9 requests.
6400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(640, 480,
6410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
6420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(640, 400,
6430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
6440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(640, 360,
6450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
6460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  capturer_.ResetSupportedFormats(supported_formats);
6470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::VideoFormat> required_formats = supported_formats;
6490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::VideoFormat best;
6500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Expect 4x3, 16x10, and 16x9 requests are respected.
6510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  for (size_t i = 0; i < required_formats.size(); ++i) {
6520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(capturer_.GetBestCaptureFormat(required_formats[i], &best));
6530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(required_formats[i].width, best.width);
6540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(required_formats[i].height, best.height);
6550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
6560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // We do not support 16x9 HD, expect 4x3 for 4x3, 16x10, and 16x9 requests.
6580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.clear();
6590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(960, 720,
6600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
6610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(640, 480,
6620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
6630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(640, 400,
6640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
6650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(640, 360,
6660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
6670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  capturer_.ResetSupportedFormats(supported_formats);
6680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Expect 4x3, 16x10, and 16x9 requests are respected.
6700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  for (size_t i = 0; i < required_formats.size(); ++i) {
6710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(capturer_.GetBestCaptureFormat(required_formats[i], &best));
6720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(required_formats[i].width, best.width);
6730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(required_formats[i].height, best.height);
6740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
6750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // We support 16x9HD, Expect 4x3, 16x10, and 16x9 requests are respected.
6770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.clear();
6780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(1280, 720,
6790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
6800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(640, 480,
6810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
6820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(640, 400,
6830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
6840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(640, 360,
6850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
6860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  capturer_.ResetSupportedFormats(supported_formats);
6870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Expect 4x3 for 4x3 and 16x10 requests.
6890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  for (size_t i = 0; i < required_formats.size() - 1; ++i) {
6900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(capturer_.GetBestCaptureFormat(required_formats[i], &best));
6910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(required_formats[i].width, best.width);
6920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(required_formats[i].height, best.height);
6930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
6940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Expect 16x9 for 16x9 request.
6960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(required_formats[2], &best));
6970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(640, best.width);
6980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(360, best.height);
6990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
7000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7012a0553609b5b6d1d4dce0366b334dc9ef8aa4d65buildbot@webrtc.org// If HAVE_WEBRTC_VIDEO is not defined the video capturer will not be able to
7022a0553609b5b6d1d4dce0366b334dc9ef8aa4d65buildbot@webrtc.org// provide OnVideoFrame-callbacks since they require cricket::CapturedFrame to
7032a0553609b5b6d1d4dce0366b334dc9ef8aa4d65buildbot@webrtc.org// be decoded as a cricket::VideoFrame (i.e. an I420 frame). This functionality
7042a0553609b5b6d1d4dce0366b334dc9ef8aa4d65buildbot@webrtc.org// only exist if HAVE_WEBRTC_VIDEO is defined below. I420 frames are also a
7052a0553609b5b6d1d4dce0366b334dc9ef8aa4d65buildbot@webrtc.org// requirement for the VideoProcessors so they will not be called either.
7062a0553609b5b6d1d4dce0366b334dc9ef8aa4d65buildbot@webrtc.org#if defined(HAVE_WEBRTC_VIDEO)
7070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoCapturerTest, VideoFrame) {
7080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::CS_RUNNING, capturer_.Start(cricket::VideoFormat(
7090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      640,
7100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      480,
7110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30),
7120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::FOURCC_I420)));
7130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.IsRunning());
7140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, video_frames_received());
7150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.CaptureFrame());
7160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(1, video_frames_received());
7170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
7180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoCapturerTest, ProcessorChainTest) {
7200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  VideoProcessor0 processor0;
7210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  VideoProcessor1 processor1;
7220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::CS_RUNNING, capturer_.Start(cricket::VideoFormat(
7230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      640,
7240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      480,
7250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30),
7260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::FOURCC_I420)));
7270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.IsRunning());
7280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, video_frames_received());
7290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // First processor sets elapsed time to 0.
7300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  capturer_.AddVideoProcessor(&processor0);
7310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Second processor adds 1 to the elapsed time. I.e. a frames elapsed time
7320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // should now always be 1 (and not 0).
7330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  capturer_.AddVideoProcessor(&processor1);
7340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.CaptureFrame());
7350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(1, video_frames_received());
7360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(1u, last_frame_elapsed_time());
7370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  capturer_.RemoveVideoProcessor(&processor1);
7380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.CaptureFrame());
7390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Since processor1 has been removed the elapsed time should now be 0.
7400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(2, video_frames_received());
7410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0u, last_frame_elapsed_time());
7420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
7430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoCapturerTest, ProcessorDropFrame) {
7450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::FakeMediaProcessor dropping_processor_;
7460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  dropping_processor_.set_drop_frames(true);
7470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(cricket::CS_RUNNING, capturer_.Start(cricket::VideoFormat(
7480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      640,
7490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      480,
7500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30),
7510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::FOURCC_I420)));
7520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.IsRunning());
7530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, video_frames_received());
7540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Install a processor that always drop frames.
7550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  capturer_.AddVideoProcessor(&dropping_processor_);
7560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(capturer_.CaptureFrame());
7570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0, video_frames_received());
7580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
7592a0553609b5b6d1d4dce0366b334dc9ef8aa4d65buildbot@webrtc.org#endif  // HAVE_WEBRTC_VIDEO
7600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgbool HdFormatInList(const std::vector<cricket::VideoFormat>& formats) {
7620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  for (std::vector<cricket::VideoFormat>::const_iterator found =
7630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org           formats.begin(); found != formats.end(); ++found) {
7640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (found->height >= kMinHdHeight) {
7650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return true;
7660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
7670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
7680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  return false;
7690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
7700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(VideoCapturerTest, Whitelist) {
7720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // The definition of HD only applies to the height. Set the HD width to the
7730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // smallest legal number to document this fact in this test.
7740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const int kMinHdWidth = 1;
7750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::VideoFormat hd_format(kMinHdWidth,
7760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                 kMinHdHeight,
7770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                 cricket::VideoFormat::FpsToInterval(30),
7780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                 cricket::FOURCC_I420);
7790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::VideoFormat vga_format(640, 480,
7800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                  cricket::VideoFormat::FpsToInterval(30),
7810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                  cricket::FOURCC_I420);
7820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::vector<cricket::VideoFormat> formats = *capturer_.GetSupportedFormats();
7830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  formats.push_back(hd_format);
7840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Enable whitelist. Expect HD not in list.
7860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  capturer_.set_enable_camera_list(true);
7870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  capturer_.ResetSupportedFormats(formats);
7880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(HdFormatInList(*capturer_.GetSupportedFormats()));
7890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  capturer_.ConstrainSupportedFormats(vga_format);
7900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(HdFormatInList(*capturer_.GetSupportedFormats()));
7910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Disable whitelist. Expect HD in list.
7930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  capturer_.set_enable_camera_list(false);
7940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  capturer_.ResetSupportedFormats(formats);
7950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(HdFormatInList(*capturer_.GetSupportedFormats()));
7960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  capturer_.ConstrainSupportedFormats(vga_format);
7970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(HdFormatInList(*capturer_.GetSupportedFormats()));
7980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
799a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org
800a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.orgTEST_F(VideoCapturerTest, BlacklistAllFormats) {
801a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org  cricket::VideoFormat vga_format(640, 480,
802a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org                                  cricket::VideoFormat::FpsToInterval(30),
803a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org                                  cricket::FOURCC_I420);
804a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org  std::vector<cricket::VideoFormat> supported_formats;
805a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org  // Mock a device that only supports HD formats.
806a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org  supported_formats.push_back(cricket::VideoFormat(1280, 720,
807a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
808a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org  supported_formats.push_back(cricket::VideoFormat(1920, 1080,
809a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
810a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org  capturer_.ResetSupportedFormats(supported_formats);
811a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org  EXPECT_EQ(2u, capturer_.GetSupportedFormats()->size());
812a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org  // Now, enable the list, which would exclude both formats. However, since
813a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org  // only HD formats are available, we refuse to filter at all, so we don't
814a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org  // break this camera.
815a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org  capturer_.set_enable_camera_list(true);
816a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org  capturer_.ConstrainSupportedFormats(vga_format);
817a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org  EXPECT_EQ(2u, capturer_.GetSupportedFormats()->size());
818a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org  // To make sure it's not just the camera list being broken, add in VGA and
819a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org  // try again. This time, only the VGA format should be there.
820a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org  supported_formats.push_back(vga_format);
821a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org  capturer_.ResetSupportedFormats(supported_formats);
822a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org  ASSERT_EQ(1u, capturer_.GetSupportedFormats()->size());
823a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org  EXPECT_EQ(vga_format.height, capturer_.GetSupportedFormats()->at(0).height);
824a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org}
825