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