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