14f0d401faecf5d8a4c82e6e2223651ef13ad8e31buildbot@webrtc.org/*
24f0d401faecf5d8a4c82e6e2223651ef13ad8e31buildbot@webrtc.org * libjingle
34f0d401faecf5d8a4c82e6e2223651ef13ad8e31buildbot@webrtc.org * Copyright 2008 Google Inc.
44f0d401faecf5d8a4c82e6e2223651ef13ad8e31buildbot@webrtc.org *
54f0d401faecf5d8a4c82e6e2223651ef13ad8e31buildbot@webrtc.org * Redistribution and use in source and binary forms, with or without
64f0d401faecf5d8a4c82e6e2223651ef13ad8e31buildbot@webrtc.org * modification, are permitted provided that the following conditions are met:
74f0d401faecf5d8a4c82e6e2223651ef13ad8e31buildbot@webrtc.org *
84f0d401faecf5d8a4c82e6e2223651ef13ad8e31buildbot@webrtc.org *  1. Redistributions of source code must retain the above copyright notice,
94f0d401faecf5d8a4c82e6e2223651ef13ad8e31buildbot@webrtc.org *     this list of conditions and the following disclaimer.
104f0d401faecf5d8a4c82e6e2223651ef13ad8e31buildbot@webrtc.org *  2. Redistributions in binary form must reproduce the above copyright notice,
114f0d401faecf5d8a4c82e6e2223651ef13ad8e31buildbot@webrtc.org *     this list of conditions and the following disclaimer in the documentation
124f0d401faecf5d8a4c82e6e2223651ef13ad8e31buildbot@webrtc.org *     and/or other materials provided with the distribution.
134f0d401faecf5d8a4c82e6e2223651ef13ad8e31buildbot@webrtc.org *  3. The name of the author may not be used to endorse or promote products
144f0d401faecf5d8a4c82e6e2223651ef13ad8e31buildbot@webrtc.org *     derived from this software without specific prior written permission.
154f0d401faecf5d8a4c82e6e2223651ef13ad8e31buildbot@webrtc.org *
164f0d401faecf5d8a4c82e6e2223651ef13ad8e31buildbot@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
174f0d401faecf5d8a4c82e6e2223651ef13ad8e31buildbot@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
184f0d401faecf5d8a4c82e6e2223651ef13ad8e31buildbot@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
194f0d401faecf5d8a4c82e6e2223651ef13ad8e31buildbot@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
204f0d401faecf5d8a4c82e6e2223651ef13ad8e31buildbot@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
214f0d401faecf5d8a4c82e6e2223651ef13ad8e31buildbot@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
224f0d401faecf5d8a4c82e6e2223651ef13ad8e31buildbot@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
234f0d401faecf5d8a4c82e6e2223651ef13ad8e31buildbot@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
244f0d401faecf5d8a4c82e6e2223651ef13ad8e31buildbot@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
254f0d401faecf5d8a4c82e6e2223651ef13ad8e31buildbot@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
264f0d401faecf5d8a4c82e6e2223651ef13ad8e31buildbot@webrtc.org */
2728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
2828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include <stdio.h>
2928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include <vector>
3028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
3128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/media/base/fakevideocapturer.h"
3228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/media/base/fakevideorenderer.h"
3328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/media/base/testutils.h"
3428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/media/base/videocapturer.h"
35a09a99950ec40aef6421e4ba35eee7196b7a6e68buildbot@webrtc.org#include "webrtc/base/gunit.h"
36a09a99950ec40aef6421e4ba35eee7196b7a6e68buildbot@webrtc.org#include "webrtc/base/logging.h"
37a09a99950ec40aef6421e4ba35eee7196b7a6e68buildbot@webrtc.org#include "webrtc/base/thread.h"
3828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
3928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing cricket::FakeVideoCapturer;
4028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
4128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgnamespace {
4228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
4328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgconst int kMsCallbackWait = 500;
4428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// For HD only the height matters.
4528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgconst int kMinHdHeight = 720;
460c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmconst uint32_t kTimeout = 5000U;
4728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
4828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}  // namespace
4928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
5028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass VideoCapturerTest
5128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    : public sigslot::has_slots<>,
5228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      public testing::Test {
5328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public:
5428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  VideoCapturerTest()
5528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      : capture_state_(cricket::CS_STOPPED),
5628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org        num_state_changes_(0),
5728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org        video_frames_received_(0),
581226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org        expects_rotation_applied_(true) {
5928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    capturer_.SignalVideoFrame.connect(this, &VideoCapturerTest::OnVideoFrame);
6028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    capturer_.SignalStateChange.connect(this,
6128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org                                        &VideoCapturerTest::OnStateChange);
6228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  }
6328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
641226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  void set_expected_compensation(bool compensation) {
651226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org    expects_rotation_applied_ = compensation;
661226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  }
671226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org
6828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org protected:
6928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  void OnVideoFrame(cricket::VideoCapturer*, const cricket::VideoFrame* frame) {
7028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    ++video_frames_received_;
711226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org    if (expects_rotation_applied_) {
721226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org      EXPECT_EQ(webrtc::kVideoRotation_0, frame->GetRotation());
731226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org    } else {
741226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org      EXPECT_EQ(capturer_.GetRotation(), frame->GetRotation());
751226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org    }
7628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    renderer_.RenderFrame(frame);
7728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  }
7828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  void OnStateChange(cricket::VideoCapturer*,
7928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org                     cricket::CaptureState capture_state) {
8028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    capture_state_ = capture_state;
8128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    ++num_state_changes_;
8228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  }
8328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  cricket::CaptureState capture_state() { return capture_state_; }
8428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  int num_state_changes() { return num_state_changes_; }
8528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  int video_frames_received() const {
8628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    return video_frames_received_;
8728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  }
8828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
8928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  cricket::FakeVideoCapturer capturer_;
9028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  cricket::CaptureState capture_state_;
9128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  int num_state_changes_;
9228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  int video_frames_received_;
9328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  cricket::FakeVideoRenderer renderer_;
941226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  bool expects_rotation_applied_;
9528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org};
9628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
9728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(VideoCapturerTest, CaptureState) {
98a7b981843f35bb6c26cf3bc95b5a00a0b9f50a93henrike@webrtc.org  EXPECT_TRUE(capturer_.enable_video_adapter());
9928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(cricket::CS_RUNNING, capturer_.Start(cricket::VideoFormat(
10028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      640,
10128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      480,
10228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30),
10328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::FOURCC_I420)));
10428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.IsRunning());
10528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ_WAIT(cricket::CS_RUNNING, capture_state(), kMsCallbackWait);
10628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(1, num_state_changes());
10728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  capturer_.Stop();
10828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ_WAIT(cricket::CS_STOPPED, capture_state(), kMsCallbackWait);
10928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(2, num_state_changes());
11028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  capturer_.Stop();
111d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org  rtc::Thread::Current()->ProcessMessages(100);
11228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(2, num_state_changes());
11328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
11428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
11528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(VideoCapturerTest, TestRestart) {
11628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(cricket::CS_RUNNING, capturer_.Start(cricket::VideoFormat(
11728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      640,
11828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      480,
11928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30),
12028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::FOURCC_I420)));
12128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.IsRunning());
12228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ_WAIT(cricket::CS_RUNNING, capture_state(), kMsCallbackWait);
12328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(1, num_state_changes());
12428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.Restart(cricket::VideoFormat(
12528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      320,
12628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      240,
12728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30),
12828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::FOURCC_I420)));
12928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ_WAIT(cricket::CS_RUNNING, capture_state(), kMsCallbackWait);
13028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.IsRunning());
13128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_GE(1, num_state_changes());
13228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  capturer_.Stop();
133d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org  rtc::Thread::Current()->ProcessMessages(100);
13428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_FALSE(capturer_.IsRunning());
13528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
13628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
13728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(VideoCapturerTest, TestStartingWithRestart) {
13828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_FALSE(capturer_.IsRunning());
13928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.Restart(cricket::VideoFormat(
14028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      640,
14128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      480,
14228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30),
14328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::FOURCC_I420)));
14428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.IsRunning());
14528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ_WAIT(cricket::CS_RUNNING, capture_state(), kMsCallbackWait);
14628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
14728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
14828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(VideoCapturerTest, TestRestartWithSameFormat) {
14928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  cricket::VideoFormat format(640, 480,
15028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org                              cricket::VideoFormat::FpsToInterval(30),
15128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org                              cricket::FOURCC_I420);
15228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(cricket::CS_RUNNING, capturer_.Start(format));
15328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.IsRunning());
15428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ_WAIT(cricket::CS_RUNNING, capture_state(), kMsCallbackWait);
15528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(1, num_state_changes());
15628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.Restart(format));
15728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(cricket::CS_RUNNING, capture_state());
15828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.IsRunning());
15928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(1, num_state_changes());
16028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
16128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
16228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(VideoCapturerTest, CameraOffOnMute) {
16328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(cricket::CS_RUNNING, capturer_.Start(cricket::VideoFormat(
16428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      640,
16528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      480,
16628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30),
16728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::FOURCC_I420)));
16828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.IsRunning());
16928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(0, video_frames_received());
17028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.CaptureFrame());
17128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(1, video_frames_received());
17228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_FALSE(capturer_.IsMuted());
17328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
17428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // Mute the camera and expect black output frame.
17528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  capturer_.MuteToBlackThenPause(true);
17628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.IsMuted());
17728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  for (int i = 0; i < 31; ++i) {
17828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    EXPECT_TRUE(capturer_.CaptureFrame());
17928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    EXPECT_TRUE(renderer_.black_frame());
18028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  }
18128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(32, video_frames_received());
18228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ_WAIT(cricket::CS_PAUSED,
18328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org                 capturer_.capture_state(), kTimeout);
18428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
18528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // Verify that the camera is off.
18628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_FALSE(capturer_.CaptureFrame());
18728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(32, video_frames_received());
18828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
18928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // Unmute the camera and expect non-black output frame.
19028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  capturer_.MuteToBlackThenPause(false);
19128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_FALSE(capturer_.IsMuted());
19228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ_WAIT(cricket::CS_RUNNING,
19328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org                 capturer_.capture_state(), kTimeout);
19428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.CaptureFrame());
19528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_FALSE(renderer_.black_frame());
19628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(33, video_frames_received());
19728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
19828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
19953f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.orgTEST_F(VideoCapturerTest, ScreencastScaledOddWidth) {
20053f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org  capturer_.SetScreencast(true);
20153f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org
20253f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org  int kWidth = 1281;
20353f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org  int kHeight = 720;
20453f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org
20553f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org  std::vector<cricket::VideoFormat> formats;
20653f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org  formats.push_back(cricket::VideoFormat(kWidth, kHeight,
20753f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org      cricket::VideoFormat::FpsToInterval(5), cricket::FOURCC_ARGB));
20853f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org  capturer_.ResetSupportedFormats(formats);
20953f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org
21053f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org  EXPECT_EQ(cricket::CS_RUNNING, capturer_.Start(cricket::VideoFormat(
21153f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org      kWidth,
21253f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org      kHeight,
21353f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org      cricket::VideoFormat::FpsToInterval(30),
21453f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org      cricket::FOURCC_ARGB)));
21553f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org  EXPECT_TRUE(capturer_.IsRunning());
21653f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org  EXPECT_EQ(0, renderer_.num_rendered_frames());
21714ee8cc9c7c04f0125bdb1e46226918ca090a66bmagjed@webrtc.org  renderer_.SetSize(kWidth, kHeight, 0);
21853f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org  EXPECT_TRUE(capturer_.CaptureFrame());
21953f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org  EXPECT_EQ(1, renderer_.num_rendered_frames());
22053f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org}
22153f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org
2221226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.orgTEST_F(VideoCapturerTest, TestRotationPending) {
2231226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  int kWidth = 800;
2241226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  int kHeight = 400;
2251226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  int frame_count = 0;
2261226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org
2271226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  std::vector<cricket::VideoFormat> formats;
2281226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  formats.push_back(cricket::VideoFormat(kWidth, kHeight,
2291226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org                                         cricket::VideoFormat::FpsToInterval(5),
2301226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org                                         cricket::FOURCC_I420));
2311226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org
2321226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  capturer_.ResetSupportedFormats(formats);
2331226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  // capturer_ should compensate rotation as default.
2341226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  capturer_.UpdateAspectRatio(400, 200);
2351226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org
2361226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  EXPECT_EQ(cricket::CS_RUNNING,
2371226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org            capturer_.Start(cricket::VideoFormat(
2381226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org                kWidth, kHeight, cricket::VideoFormat::FpsToInterval(30),
2391226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org                cricket::FOURCC_I420)));
2401226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  EXPECT_TRUE(capturer_.IsRunning());
2411226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  EXPECT_EQ(0, renderer_.num_rendered_frames());
2421226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org
2431226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  // If the frame's rotation is compensated anywhere in the pipeline based on
2441226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  // the rotation information, the renderer should be given the right dimension
2451226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  // such that the frame could be rendered.
2461226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org
2471226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  // Swap the dimension for the next 2 frames which are rotated by 90 and 270
2481226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  // degree.
24914ee8cc9c7c04f0125bdb1e46226918ca090a66bmagjed@webrtc.org  renderer_.SetSize(kHeight, kWidth, 0);
2501226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org
2511226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  capturer_.SetRotation(webrtc::kVideoRotation_90);
2521226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  EXPECT_TRUE(capturer_.CaptureFrame());
2531226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  EXPECT_EQ(++frame_count, renderer_.num_rendered_frames());
2541226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org
2551226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  capturer_.SetRotation(webrtc::kVideoRotation_270);
2561226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  EXPECT_TRUE(capturer_.CaptureFrame());
2571226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  EXPECT_EQ(++frame_count, renderer_.num_rendered_frames());
2581226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org
2591226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  // Reset the renderer to have corresponding width and height.
26014ee8cc9c7c04f0125bdb1e46226918ca090a66bmagjed@webrtc.org  renderer_.SetSize(kWidth, kHeight, 0);
2611226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org
2621226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  capturer_.SetRotation(webrtc::kVideoRotation_180);
2631226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  EXPECT_TRUE(capturer_.CaptureFrame());
2641226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  EXPECT_EQ(++frame_count, renderer_.num_rendered_frames());
2651226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org}
2661226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org
2671226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.orgTEST_F(VideoCapturerTest, TestRotationApplied) {
2681226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  int kWidth = 800;
2691226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  int kHeight = 400;
2701226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org
2711226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  std::vector<cricket::VideoFormat> formats;
2721226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  formats.push_back(cricket::VideoFormat(kWidth, kHeight,
2731226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org                                         cricket::VideoFormat::FpsToInterval(5),
2741226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org                                         cricket::FOURCC_I420));
2751226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org
2761226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  capturer_.ResetSupportedFormats(formats);
2771226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  // capturer_ should not compensate rotation.
2781226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  capturer_.SetApplyRotation(false);
2791226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  capturer_.UpdateAspectRatio(400, 200);
2801226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  set_expected_compensation(false);
2811226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org
2821226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  EXPECT_EQ(cricket::CS_RUNNING,
2831226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org            capturer_.Start(cricket::VideoFormat(
2841226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org                kWidth, kHeight, cricket::VideoFormat::FpsToInterval(30),
2851226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org                cricket::FOURCC_I420)));
2861226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  EXPECT_TRUE(capturer_.IsRunning());
2871226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  EXPECT_EQ(0, renderer_.num_rendered_frames());
2881226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org
28914ee8cc9c7c04f0125bdb1e46226918ca090a66bmagjed@webrtc.org  renderer_.SetSize(kWidth, kHeight, 0);
2901226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org
2911226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  // If the frame's rotation is compensated anywhere in the pipeline, the frame
2921226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  // won't have its original dimension out from capturer. Since the renderer
2931226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  // here has the same dimension as the capturer, it will skip that frame as the
2941226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  // resolution won't match anymore.
2951226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org
2961226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  int frame_count = 0;
2971226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  capturer_.SetRotation(webrtc::kVideoRotation_0);
2981226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  EXPECT_TRUE(capturer_.CaptureFrame());
2991226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  EXPECT_EQ(++frame_count, renderer_.num_rendered_frames());
3001226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org
3011226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  capturer_.SetRotation(webrtc::kVideoRotation_90);
3021226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  EXPECT_TRUE(capturer_.CaptureFrame());
3031226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  EXPECT_EQ(++frame_count, renderer_.num_rendered_frames());
3041226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org
3051226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  capturer_.SetRotation(webrtc::kVideoRotation_180);
3061226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  EXPECT_TRUE(capturer_.CaptureFrame());
3071226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  EXPECT_EQ(++frame_count, renderer_.num_rendered_frames());
3081226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org
3091226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  capturer_.SetRotation(webrtc::kVideoRotation_270);
3101226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  EXPECT_TRUE(capturer_.CaptureFrame());
3111226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org  EXPECT_EQ(++frame_count, renderer_.num_rendered_frames());
3121226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org}
3131226e926e6104322d9b99026b98f515cb4d40fd4guoweis@webrtc.org
31453f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.orgTEST_F(VideoCapturerTest, ScreencastScaledSuperLarge) {
31553f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org  capturer_.SetScreencast(true);
31653f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org
31753f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org  const int kMaxWidth = 4096;
31853f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org  const int kMaxHeight = 3072;
31953f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org  int kWidth = kMaxWidth + 4;
32053f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org  int kHeight = kMaxHeight + 4;
32153f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org
32253f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org  std::vector<cricket::VideoFormat> formats;
32353f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org  formats.push_back(cricket::VideoFormat(kWidth, kHeight,
32453f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org      cricket::VideoFormat::FpsToInterval(5), cricket::FOURCC_ARGB));
32553f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org  capturer_.ResetSupportedFormats(formats);
32653f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org
32753f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org  EXPECT_EQ(cricket::CS_RUNNING, capturer_.Start(cricket::VideoFormat(
32853f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org      kWidth,
32953f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org      kHeight,
33053f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org      cricket::VideoFormat::FpsToInterval(30),
33153f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org      cricket::FOURCC_ARGB)));
33253f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org  EXPECT_TRUE(capturer_.IsRunning());
33353f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org  EXPECT_EQ(0, renderer_.num_rendered_frames());
33414ee8cc9c7c04f0125bdb1e46226918ca090a66bmagjed@webrtc.org  renderer_.SetSize(2050, 1538, 0);
33553f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org  EXPECT_TRUE(capturer_.CaptureFrame());
33653f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org  EXPECT_EQ(1, renderer_.num_rendered_frames());
33753f57936c1fbe0caaabce7ccb85b77935fd97fa8buildbot@webrtc.org}
3381b15f4226ff417095d2146401ca71cd98ab735b3mallinath@webrtc.org
33928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(VideoCapturerTest, TestFourccMatch) {
34028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  cricket::VideoFormat desired(640, 480,
34128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org                               cricket::VideoFormat::FpsToInterval(30),
34228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org                               cricket::FOURCC_ANY);
34328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  cricket::VideoFormat best;
34428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(desired, &best));
34528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(640, best.width);
34628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(480, best.height);
34728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
34828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
34928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  desired.fourcc = cricket::FOURCC_MJPG;
35028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_FALSE(capturer_.GetBestCaptureFormat(desired, &best));
35128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
35228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  desired.fourcc = cricket::FOURCC_I420;
35328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(desired, &best));
35428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
35528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
35628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(VideoCapturerTest, TestResolutionMatch) {
35728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  cricket::VideoFormat desired(1920, 1080,
35828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org                               cricket::VideoFormat::FpsToInterval(30),
35928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org                               cricket::FOURCC_ANY);
36028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  cricket::VideoFormat best;
36128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // Ask for 1920x1080. Get HD 1280x720 which is the highest.
36228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(desired, &best));
36328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(1280, best.width);
36428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(720, best.height);
36528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
36628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
36728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  desired.width = 360;
36828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  desired.height = 250;
36928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // Ask for a little higher than QVGA. Get QVGA.
37028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(desired, &best));
37128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(320, best.width);
37228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(240, best.height);
37328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
37428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
37528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  desired.width = 480;
37635c1ace18532b50ff274f65b1369889baefca319magjed@webrtc.org  desired.height = 270;
37728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // Ask for HVGA. Get VGA.
37828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(desired, &best));
37928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(640, best.width);
38028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(480, best.height);
38128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
38228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
38328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  desired.width = 320;
38428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  desired.height = 240;
38528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // Ask for QVGA. Get QVGA.
38628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(desired, &best));
38728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(320, best.width);
38828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(240, best.height);
38928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
39028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
39128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  desired.width = 80;
39228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  desired.height = 60;
39328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // Ask for lower than QQVGA. Get QQVGA, which is the lowest.
39428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(desired, &best));
39528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(160, best.width);
39628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(120, best.height);
39728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
39828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
39928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
40028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(VideoCapturerTest, TestHDResolutionMatch) {
40128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // Add some HD formats typical of a mediocre HD webcam.
40228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  std::vector<cricket::VideoFormat> formats;
40328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  formats.push_back(cricket::VideoFormat(320, 240,
40428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
40528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  formats.push_back(cricket::VideoFormat(640, 480,
40628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
40728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  formats.push_back(cricket::VideoFormat(960, 544,
40828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(24), cricket::FOURCC_I420));
40928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  formats.push_back(cricket::VideoFormat(1280, 720,
41028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(15), cricket::FOURCC_I420));
41128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  formats.push_back(cricket::VideoFormat(2592, 1944,
41228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(7), cricket::FOURCC_I420));
41328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  capturer_.ResetSupportedFormats(formats);
41428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
41528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  cricket::VideoFormat desired(960, 720,
41628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org                               cricket::VideoFormat::FpsToInterval(30),
41728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org                               cricket::FOURCC_ANY);
41828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  cricket::VideoFormat best;
41928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // Ask for 960x720 30 fps. Get qHD 24 fps
42028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(desired, &best));
42128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(960, best.width);
42228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(544, best.height);
42328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(24), best.interval);
42428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
42528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  desired.width = 960;
42628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  desired.height = 544;
42728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  desired.interval = cricket::VideoFormat::FpsToInterval(30);
42828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // Ask for qHD 30 fps. Get qHD 24 fps
42928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(desired, &best));
43028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(960, best.width);
43128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(544, best.height);
43228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(24), best.interval);
43328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
43428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  desired.width = 360;
43528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  desired.height = 250;
43628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  desired.interval = cricket::VideoFormat::FpsToInterval(30);
43728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // Ask for a little higher than QVGA. Get QVGA.
43828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(desired, &best));
43928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(320, best.width);
44028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(240, best.height);
44128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
44228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
44328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  desired.width = 480;
44428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  desired.height = 270;
44528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // Ask for HVGA. Get VGA.
44628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(desired, &best));
44728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(640, best.width);
44828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(480, best.height);
44928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
45028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
45128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  desired.width = 320;
45228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  desired.height = 240;
45328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // Ask for QVGA. Get QVGA.
45428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(desired, &best));
45528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(320, best.width);
45628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(240, best.height);
45728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
45828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
45928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  desired.width = 160;
46028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  desired.height = 120;
46128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // Ask for lower than QVGA. Get QVGA, which is the lowest.
46228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(desired, &best));
46328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(320, best.width);
46428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(240, best.height);
46528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
46628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
46728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  desired.width = 1280;
46828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  desired.height = 720;
46928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // Ask for HD. 720p fps is too low. Get VGA which has 30 fps.
47028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(desired, &best));
47128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(640, best.width);
47228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(480, best.height);
47328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
47428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
47528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  desired.width = 1280;
47628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  desired.height = 720;
47728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  desired.interval = cricket::VideoFormat::FpsToInterval(15);
47828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // Ask for HD 15 fps. Fps matches. Get HD
47928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(desired, &best));
48028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(1280, best.width);
48128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(720, best.height);
48228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(15), best.interval);
48328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
48428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  desired.width = 1920;
48528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  desired.height = 1080;
48628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  desired.interval = cricket::VideoFormat::FpsToInterval(30);
48728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // Ask for 1080p. Fps of HD formats is too low. Get VGA which can do 30 fps.
48828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(desired, &best));
48928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(640, best.width);
49028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(480, best.height);
49128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
49228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
49328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
49428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Some cameras support 320x240 and 320x640. Verify we choose 320x240.
49528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(VideoCapturerTest, TestStrangeFormats) {
49628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  std::vector<cricket::VideoFormat> supported_formats;
49728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(320, 240,
49828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
49928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(320, 640,
50028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
50128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  capturer_.ResetSupportedFormats(supported_formats);
50228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
50328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  std::vector<cricket::VideoFormat> required_formats;
50428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  required_formats.push_back(cricket::VideoFormat(320, 240,
50528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
50628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  required_formats.push_back(cricket::VideoFormat(320, 200,
50728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
50828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  required_formats.push_back(cricket::VideoFormat(320, 180,
50928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
51028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  cricket::VideoFormat best;
51128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  for (size_t i = 0; i < required_formats.size(); ++i) {
51228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    EXPECT_TRUE(capturer_.GetBestCaptureFormat(required_formats[i], &best));
51328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    EXPECT_EQ(320, best.width);
51428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    EXPECT_EQ(240, best.height);
51528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  }
51628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
51728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.clear();
51828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(320, 640,
51928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
52028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(320, 240,
52128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
52228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  capturer_.ResetSupportedFormats(supported_formats);
52328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
52428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  for (size_t i = 0; i < required_formats.size(); ++i) {
52528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    EXPECT_TRUE(capturer_.GetBestCaptureFormat(required_formats[i], &best));
52628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    EXPECT_EQ(320, best.width);
52728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    EXPECT_EQ(240, best.height);
52828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  }
52928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
53028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
53128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Some cameras only have very low fps. Verify we choose something sensible.
53228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(VideoCapturerTest, TestPoorFpsFormats) {
53328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // all formats are low framerate
53428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  std::vector<cricket::VideoFormat> supported_formats;
53528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(320, 240,
53628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(10), cricket::FOURCC_I420));
53728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(640, 480,
53828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(7), cricket::FOURCC_I420));
53928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(1280, 720,
54028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(2), cricket::FOURCC_I420));
54128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  capturer_.ResetSupportedFormats(supported_formats);
54228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
54328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  std::vector<cricket::VideoFormat> required_formats;
54428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  required_formats.push_back(cricket::VideoFormat(320, 240,
54528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
54628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  required_formats.push_back(cricket::VideoFormat(640, 480,
54728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
54828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  cricket::VideoFormat best;
54928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  for (size_t i = 0; i < required_formats.size(); ++i) {
55028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    EXPECT_TRUE(capturer_.GetBestCaptureFormat(required_formats[i], &best));
55128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    EXPECT_EQ(required_formats[i].width, best.width);
55228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    EXPECT_EQ(required_formats[i].height, best.height);
55328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  }
55428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
55528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // Increase framerate of 320x240. Expect low fps VGA avoided.
55628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.clear();
55728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(320, 240,
55828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
55928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(640, 480,
56028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(7), cricket::FOURCC_I420));
56128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(1280, 720,
56228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(2), cricket::FOURCC_I420));
56328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  capturer_.ResetSupportedFormats(supported_formats);
56428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
56528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  for (size_t i = 0; i < required_formats.size(); ++i) {
56628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    EXPECT_TRUE(capturer_.GetBestCaptureFormat(required_formats[i], &best));
56728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    EXPECT_EQ(320, best.width);
56828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    EXPECT_EQ(240, best.height);
56928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  }
57028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
57128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
57228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Some cameras support same size with different frame rates. Verify we choose
57328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// the frame rate properly.
57428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(VideoCapturerTest, TestSameSizeDifferentFpsFormats) {
57528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  std::vector<cricket::VideoFormat> supported_formats;
57628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(320, 240,
57728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(10), cricket::FOURCC_I420));
57828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(320, 240,
57928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(20), cricket::FOURCC_I420));
58028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(320, 240,
58128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
58228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  capturer_.ResetSupportedFormats(supported_formats);
58328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
58428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  std::vector<cricket::VideoFormat> required_formats = supported_formats;
58528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  cricket::VideoFormat best;
58628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  for (size_t i = 0; i < required_formats.size(); ++i) {
58728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    EXPECT_TRUE(capturer_.GetBestCaptureFormat(required_formats[i], &best));
58828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    EXPECT_EQ(320, best.width);
58928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    EXPECT_EQ(240, best.height);
59028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    EXPECT_EQ(required_formats[i].interval, best.interval);
59128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  }
59228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
59328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
59428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Some cameras support the correct resolution but at a lower fps than
59528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// we'd like. This tests we get the expected resolution and fps.
59628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(VideoCapturerTest, TestFpsFormats) {
59728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // We have VGA but low fps. Choose VGA, not HD
59828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  std::vector<cricket::VideoFormat> supported_formats;
59928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(1280, 720,
60028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
60128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(640, 480,
60228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(15), cricket::FOURCC_I420));
60328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(640, 400,
60428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
60528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(640, 360,
60628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
60728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  capturer_.ResetSupportedFormats(supported_formats);
60828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
60928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  std::vector<cricket::VideoFormat> required_formats;
61028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  required_formats.push_back(cricket::VideoFormat(640, 480,
61128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_ANY));
61228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  required_formats.push_back(cricket::VideoFormat(640, 480,
61328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(20), cricket::FOURCC_ANY));
61428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  required_formats.push_back(cricket::VideoFormat(640, 480,
61528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(10), cricket::FOURCC_ANY));
61628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  cricket::VideoFormat best;
61728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
6184b26e2eee3e3b2a0c22946372a38f7efa6cee146sergeyu@chromium.org  // Expect 30 fps to choose 30 fps format.
61928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(required_formats[0], &best));
62028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(640, best.width);
62128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(400, best.height);
62228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
62328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
6244b26e2eee3e3b2a0c22946372a38f7efa6cee146sergeyu@chromium.org  // Expect 20 fps to choose 30 fps format.
62528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(required_formats[1], &best));
62628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(640, best.width);
62728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(400, best.height);
6284b26e2eee3e3b2a0c22946372a38f7efa6cee146sergeyu@chromium.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
62928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
6304b26e2eee3e3b2a0c22946372a38f7efa6cee146sergeyu@chromium.org  // Expect 10 fps to choose 15 fps format and set fps to 15.
63128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(required_formats[2], &best));
63228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(640, best.width);
63328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(480, best.height);
6344b26e2eee3e3b2a0c22946372a38f7efa6cee146sergeyu@chromium.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(15), best.interval);
63528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
63628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // We have VGA 60 fps and 15 fps. Choose best fps.
63728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.clear();
63828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(1280, 720,
63928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
64028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(640, 480,
64128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(60), cricket::FOURCC_MJPG));
64228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(640, 480,
64328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(15), cricket::FOURCC_I420));
64428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(640, 400,
64528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
64628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(640, 360,
64728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
64828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  capturer_.ResetSupportedFormats(supported_formats);
64928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
6504b26e2eee3e3b2a0c22946372a38f7efa6cee146sergeyu@chromium.org  // Expect 30 fps to choose 60 fps format and will set best fps to 60.
65128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(required_formats[0], &best));
65228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(640, best.width);
65328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(480, best.height);
6544b26e2eee3e3b2a0c22946372a38f7efa6cee146sergeyu@chromium.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(60), best.interval);
65528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
6564b26e2eee3e3b2a0c22946372a38f7efa6cee146sergeyu@chromium.org  // Expect 20 fps to choose 60 fps format, and will set best fps to 60.
65728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(required_formats[1], &best));
65828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(640, best.width);
65928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(480, best.height);
6604b26e2eee3e3b2a0c22946372a38f7efa6cee146sergeyu@chromium.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(60), best.interval);
66128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
6624b26e2eee3e3b2a0c22946372a38f7efa6cee146sergeyu@chromium.org  // Expect 10 fps to choose 15 fps.
66328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(required_formats[2], &best));
66428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(640, best.width);
66528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(480, best.height);
6664b26e2eee3e3b2a0c22946372a38f7efa6cee146sergeyu@chromium.org  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(15), best.interval);
66728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
66828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
66928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(VideoCapturerTest, TestRequest16x10_9) {
67028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  std::vector<cricket::VideoFormat> supported_formats;
67128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // We do not support HD, expect 4x3 for 4x3, 16x10, and 16x9 requests.
67228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(640, 480,
67328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
67428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(640, 400,
67528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
67628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(640, 360,
67728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
67828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  capturer_.ResetSupportedFormats(supported_formats);
67928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
68028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  std::vector<cricket::VideoFormat> required_formats = supported_formats;
68128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  cricket::VideoFormat best;
68228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // Expect 4x3, 16x10, and 16x9 requests are respected.
68328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  for (size_t i = 0; i < required_formats.size(); ++i) {
68428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    EXPECT_TRUE(capturer_.GetBestCaptureFormat(required_formats[i], &best));
68528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    EXPECT_EQ(required_formats[i].width, best.width);
68628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    EXPECT_EQ(required_formats[i].height, best.height);
68728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  }
68828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
68928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // We do not support 16x9 HD, expect 4x3 for 4x3, 16x10, and 16x9 requests.
69028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.clear();
69128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(960, 720,
69228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
69328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(640, 480,
69428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
69528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(640, 400,
69628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
69728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(640, 360,
69828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
69928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  capturer_.ResetSupportedFormats(supported_formats);
70028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
70128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // Expect 4x3, 16x10, and 16x9 requests are respected.
70228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  for (size_t i = 0; i < required_formats.size(); ++i) {
70328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    EXPECT_TRUE(capturer_.GetBestCaptureFormat(required_formats[i], &best));
70428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    EXPECT_EQ(required_formats[i].width, best.width);
70528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    EXPECT_EQ(required_formats[i].height, best.height);
70628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  }
70728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
70828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // We support 16x9HD, Expect 4x3, 16x10, and 16x9 requests are respected.
70928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.clear();
71028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(1280, 720,
71128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
71228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(640, 480,
71328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
71428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(640, 400,
71528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
71628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  supported_formats.push_back(cricket::VideoFormat(640, 360,
71728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
71828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  capturer_.ResetSupportedFormats(supported_formats);
71928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
72028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // Expect 4x3 for 4x3 and 16x10 requests.
72128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  for (size_t i = 0; i < required_formats.size() - 1; ++i) {
72228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    EXPECT_TRUE(capturer_.GetBestCaptureFormat(required_formats[i], &best));
72328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    EXPECT_EQ(required_formats[i].width, best.width);
72428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    EXPECT_EQ(required_formats[i].height, best.height);
72528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  }
72628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
72728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // Expect 16x9 for 16x9 request.
72828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.GetBestCaptureFormat(required_formats[2], &best));
72928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(640, best.width);
73028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(360, best.height);
73128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
73228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
7334f0d401faecf5d8a4c82e6e2223651ef13ad8e31buildbot@webrtc.org// If HAVE_WEBRTC_VIDEO is not defined the video capturer will not be able to
7344f0d401faecf5d8a4c82e6e2223651ef13ad8e31buildbot@webrtc.org// provide OnVideoFrame-callbacks since they require cricket::CapturedFrame to
7354f0d401faecf5d8a4c82e6e2223651ef13ad8e31buildbot@webrtc.org// be decoded as a cricket::VideoFrame (i.e. an I420 frame). This functionality
7364f0d401faecf5d8a4c82e6e2223651ef13ad8e31buildbot@webrtc.org// only exist if HAVE_WEBRTC_VIDEO is defined below. I420 frames are also a
7374f0d401faecf5d8a4c82e6e2223651ef13ad8e31buildbot@webrtc.org// requirement for the VideoProcessors so they will not be called either.
7384f0d401faecf5d8a4c82e6e2223651ef13ad8e31buildbot@webrtc.org#if defined(HAVE_WEBRTC_VIDEO)
73928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(VideoCapturerTest, VideoFrame) {
74028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(cricket::CS_RUNNING, capturer_.Start(cricket::VideoFormat(
74128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      640,
74228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      480,
74328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::VideoFormat::FpsToInterval(30),
74428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      cricket::FOURCC_I420)));
74528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.IsRunning());
74628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(0, video_frames_received());
74728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(capturer_.CaptureFrame());
74828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(1, video_frames_received());
74928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
7504f0d401faecf5d8a4c82e6e2223651ef13ad8e31buildbot@webrtc.org#endif  // HAVE_WEBRTC_VIDEO
75128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
75228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgbool HdFormatInList(const std::vector<cricket::VideoFormat>& formats) {
75328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  for (std::vector<cricket::VideoFormat>::const_iterator found =
75428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org           formats.begin(); found != formats.end(); ++found) {
75528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    if (found->height >= kMinHdHeight) {
75628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      return true;
75728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    }
75828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  }
75928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  return false;
76028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
76128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
76228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(VideoCapturerTest, Whitelist) {
76328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // The definition of HD only applies to the height. Set the HD width to the
76428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // smallest legal number to document this fact in this test.
76528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  const int kMinHdWidth = 1;
76628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  cricket::VideoFormat hd_format(kMinHdWidth,
76728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org                                 kMinHdHeight,
76828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org                                 cricket::VideoFormat::FpsToInterval(30),
76928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org                                 cricket::FOURCC_I420);
77028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  cricket::VideoFormat vga_format(640, 480,
77128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org                                  cricket::VideoFormat::FpsToInterval(30),
77228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org                                  cricket::FOURCC_I420);
77328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  std::vector<cricket::VideoFormat> formats = *capturer_.GetSupportedFormats();
77428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  formats.push_back(hd_format);
77528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
77628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // Enable whitelist. Expect HD not in list.
77728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  capturer_.set_enable_camera_list(true);
77828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  capturer_.ResetSupportedFormats(formats);
77928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(HdFormatInList(*capturer_.GetSupportedFormats()));
78028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  capturer_.ConstrainSupportedFormats(vga_format);
78128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_FALSE(HdFormatInList(*capturer_.GetSupportedFormats()));
78228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
78328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // Disable whitelist. Expect HD in list.
78428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  capturer_.set_enable_camera_list(false);
78528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  capturer_.ResetSupportedFormats(formats);
78628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(HdFormatInList(*capturer_.GetSupportedFormats()));
78728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  capturer_.ConstrainSupportedFormats(vga_format);
78828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_TRUE(HdFormatInList(*capturer_.GetSupportedFormats()));
78928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
7900be6aa0665a24ec8fd5edfdddd82a707a299508csergeyu@chromium.org
7910be6aa0665a24ec8fd5edfdddd82a707a299508csergeyu@chromium.orgTEST_F(VideoCapturerTest, BlacklistAllFormats) {
7920be6aa0665a24ec8fd5edfdddd82a707a299508csergeyu@chromium.org  cricket::VideoFormat vga_format(640, 480,
7930be6aa0665a24ec8fd5edfdddd82a707a299508csergeyu@chromium.org                                  cricket::VideoFormat::FpsToInterval(30),
7940be6aa0665a24ec8fd5edfdddd82a707a299508csergeyu@chromium.org                                  cricket::FOURCC_I420);
7950be6aa0665a24ec8fd5edfdddd82a707a299508csergeyu@chromium.org  std::vector<cricket::VideoFormat> supported_formats;
7960be6aa0665a24ec8fd5edfdddd82a707a299508csergeyu@chromium.org  // Mock a device that only supports HD formats.
7970be6aa0665a24ec8fd5edfdddd82a707a299508csergeyu@chromium.org  supported_formats.push_back(cricket::VideoFormat(1280, 720,
7980be6aa0665a24ec8fd5edfdddd82a707a299508csergeyu@chromium.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
7990be6aa0665a24ec8fd5edfdddd82a707a299508csergeyu@chromium.org  supported_formats.push_back(cricket::VideoFormat(1920, 1080,
8000be6aa0665a24ec8fd5edfdddd82a707a299508csergeyu@chromium.org      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
8010be6aa0665a24ec8fd5edfdddd82a707a299508csergeyu@chromium.org  capturer_.ResetSupportedFormats(supported_formats);
8020be6aa0665a24ec8fd5edfdddd82a707a299508csergeyu@chromium.org  EXPECT_EQ(2u, capturer_.GetSupportedFormats()->size());
8030be6aa0665a24ec8fd5edfdddd82a707a299508csergeyu@chromium.org  // Now, enable the list, which would exclude both formats. However, since
8040be6aa0665a24ec8fd5edfdddd82a707a299508csergeyu@chromium.org  // only HD formats are available, we refuse to filter at all, so we don't
8050be6aa0665a24ec8fd5edfdddd82a707a299508csergeyu@chromium.org  // break this camera.
8060be6aa0665a24ec8fd5edfdddd82a707a299508csergeyu@chromium.org  capturer_.set_enable_camera_list(true);
8070be6aa0665a24ec8fd5edfdddd82a707a299508csergeyu@chromium.org  capturer_.ConstrainSupportedFormats(vga_format);
8080be6aa0665a24ec8fd5edfdddd82a707a299508csergeyu@chromium.org  EXPECT_EQ(2u, capturer_.GetSupportedFormats()->size());
8090be6aa0665a24ec8fd5edfdddd82a707a299508csergeyu@chromium.org  // To make sure it's not just the camera list being broken, add in VGA and
8100be6aa0665a24ec8fd5edfdddd82a707a299508csergeyu@chromium.org  // try again. This time, only the VGA format should be there.
8110be6aa0665a24ec8fd5edfdddd82a707a299508csergeyu@chromium.org  supported_formats.push_back(vga_format);
8120be6aa0665a24ec8fd5edfdddd82a707a299508csergeyu@chromium.org  capturer_.ResetSupportedFormats(supported_formats);
8130be6aa0665a24ec8fd5edfdddd82a707a299508csergeyu@chromium.org  ASSERT_EQ(1u, capturer_.GetSupportedFormats()->size());
8140be6aa0665a24ec8fd5edfdddd82a707a299508csergeyu@chromium.org  EXPECT_EQ(vga_format.height, capturer_.GetSupportedFormats()->at(0).height);
8150be6aa0665a24ec8fd5edfdddd82a707a299508csergeyu@chromium.org}
816