15976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org/* 25976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * libjingle 35976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Copyright 2012, Google Inc. 45976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 55976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Redistribution and use in source and binary forms, with or without 65976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * modification, are permitted provided that the following conditions are met: 75976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 85976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 95976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * this list of conditions and the following disclaimer. 105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * this list of conditions and the following disclaimer in the documentation 125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * and/or other materials provided with the distribution. 135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 3. The name of the author may not be used to endorse or promote products 145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * derived from this software without specific prior written permission. 155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org */ 275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/media/base/capturemanager.h" 295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/gunit.h" 315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/sigslot.h" 325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/media/base/fakemediaprocessor.h" 335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/media/base/fakevideocapturer.h" 345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/media/base/fakevideorenderer.h" 355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgconst int kMsCallbackWait = 50; 375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgconst int kFps = 30; 395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgconst cricket::VideoFormatPod kCameraFormats[] = { 405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org {640, 480, cricket::VideoFormat::FpsToInterval(kFps), cricket::FOURCC_I420}, 415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org {320, 240, cricket::VideoFormat::FpsToInterval(kFps), cricket::FOURCC_I420} 425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}; 435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass CaptureManagerTest : public ::testing::Test, public sigslot::has_slots<> { 455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public: 465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CaptureManagerTest() 475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org : capture_manager_(), 485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org callback_count_(0), 495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org format_vga_(kCameraFormats[0]), 505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org format_qvga_(kCameraFormats[1]) { 515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual void SetUp() { 535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org PopulateSupportedFormats(); 545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org capture_state_ = cricket::CS_STOPPED; 555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org capture_manager_.SignalCapturerStateChange.connect( 565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org this, 575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org &CaptureManagerTest::OnCapturerStateChange); 585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void PopulateSupportedFormats() { 605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::vector<cricket::VideoFormat> formats; 615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org for (int i = 0; i < ARRAY_SIZE(kCameraFormats); ++i) { 625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org formats.push_back(cricket::VideoFormat(kCameraFormats[i])); 635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org video_capturer_.ResetSupportedFormats(formats); 655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int NumFramesProcessed() { return media_processor_.video_frame_count(); } 675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int NumFramesRendered() { return video_renderer_.num_rendered_frames(); } 685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool WasRenderedResolution(cricket::VideoFormat format) { 695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return format.width == video_renderer_.width() && 705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org format.height == video_renderer_.height(); 715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::CaptureState capture_state() { return capture_state_; } 735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int callback_count() { return callback_count_; } 745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void OnCapturerStateChange(cricket::VideoCapturer* capturer, 755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::CaptureState capture_state) { 765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org capture_state_ = capture_state; 775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ++callback_count_; 785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org protected: 815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::FakeMediaProcessor media_processor_; 825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::FakeVideoCapturer video_capturer_; 835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::FakeVideoRenderer video_renderer_; 845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::CaptureManager capture_manager_; 865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::CaptureState capture_state_; 885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int callback_count_; 895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::VideoFormat format_vga_; 905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::VideoFormat format_qvga_; 915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}; 925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Incorrect use cases. 945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(CaptureManagerTest, InvalidCallOrder) { 955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Capturer must be registered before any of these calls. 965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(capture_manager_.AddVideoRenderer(&video_capturer_, 975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org &video_renderer_)); 985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(capture_manager_.AddVideoProcessor(&video_capturer_, 995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org &media_processor_)); 1005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(CaptureManagerTest, InvalidAddingRemoving) { 1035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(capture_manager_.StopVideoCapture(&video_capturer_, 1045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::VideoFormat())); 1055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(capture_manager_.StartVideoCapture(&video_capturer_, 1065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org format_vga_)); 1075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ_WAIT(cricket::CS_RUNNING, capture_state(), kMsCallbackWait); 1085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(1, callback_count()); 1095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(capture_manager_.AddVideoRenderer(&video_capturer_, NULL)); 1105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(capture_manager_.RemoveVideoRenderer(&video_capturer_, 1115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org &video_renderer_)); 1125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(capture_manager_.AddVideoProcessor(&video_capturer_, 1135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org NULL)); 1145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(capture_manager_.RemoveVideoProcessor(&video_capturer_, 1155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org &media_processor_)); 1165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(capture_manager_.StopVideoCapture(&video_capturer_, format_vga_)); 1175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Valid use cases 1205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(CaptureManagerTest, ProcessorTest) { 1215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(capture_manager_.StartVideoCapture(&video_capturer_, 1225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org format_vga_)); 1235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ_WAIT(cricket::CS_RUNNING, capture_state(), kMsCallbackWait); 1245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(1, callback_count()); 1255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(capture_manager_.AddVideoRenderer(&video_capturer_, 1265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org &video_renderer_)); 1275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(capture_manager_.AddVideoProcessor(&video_capturer_, 1285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org &media_processor_)); 1295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(video_capturer_.CaptureFrame()); 1305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(1, NumFramesProcessed()); 1315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(1, NumFramesRendered()); 1325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(capture_manager_.RemoveVideoProcessor(&video_capturer_, 1335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org &media_processor_)); 1345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Processor has been removed so no more frames should be processed. 1355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(video_capturer_.CaptureFrame()); 1365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(1, NumFramesProcessed()); 1375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(2, NumFramesRendered()); 1385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(capture_manager_.StopVideoCapture(&video_capturer_, format_vga_)); 1395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(2, callback_count()); 1405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(CaptureManagerTest, KeepFirstResolutionHigh) { 1435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(capture_manager_.StartVideoCapture(&video_capturer_, 1445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org format_vga_)); 1455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ_WAIT(cricket::CS_RUNNING, capture_state(), kMsCallbackWait); 1465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(1, callback_count()); 1475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(capture_manager_.AddVideoRenderer(&video_capturer_, 1485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org &video_renderer_)); 1495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(video_capturer_.CaptureFrame()); 1505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(1, NumFramesRendered()); 1515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Renderer should be fed frames with the resolution of format_vga_. 1525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(WasRenderedResolution(format_vga_)); 1535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Start again with one more format. 1555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(capture_manager_.StartVideoCapture(&video_capturer_, 1565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org format_qvga_)); 1575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Existing renderers should be fed frames with the resolution of format_vga_. 1585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(video_capturer_.CaptureFrame()); 1595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(WasRenderedResolution(format_vga_)); 1605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(capture_manager_.StopVideoCapture(&video_capturer_, format_vga_)); 1615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(capture_manager_.StopVideoCapture(&video_capturer_, 1625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org format_qvga_)); 1635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(capture_manager_.StopVideoCapture(&video_capturer_, 1645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org format_vga_)); 1655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(capture_manager_.StopVideoCapture(&video_capturer_, 1665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org format_qvga_)); 1675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Should pick the lowest resolution as the highest resolution is not chosen 1705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// until after capturing has started. This ensures that no particular resolution 1715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// is favored over others. 1725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(CaptureManagerTest, KeepFirstResolutionLow) { 1735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(capture_manager_.StartVideoCapture(&video_capturer_, 1745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org format_qvga_)); 1755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(capture_manager_.StartVideoCapture(&video_capturer_, 1765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org format_vga_)); 1775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(capture_manager_.AddVideoRenderer(&video_capturer_, 1785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org &video_renderer_)); 1795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ_WAIT(1, callback_count(), kMsCallbackWait); 1805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(video_capturer_.CaptureFrame()); 1815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(1, NumFramesRendered()); 1825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(WasRenderedResolution(format_qvga_)); 183f69a59cbfe7dcb7e8b9737052e27f12176c97d53andrew@webrtc.org EXPECT_TRUE(capture_manager_.StopVideoCapture(&video_capturer_, 184f69a59cbfe7dcb7e8b9737052e27f12176c97d53andrew@webrtc.org format_qvga_)); 185f69a59cbfe7dcb7e8b9737052e27f12176c97d53andrew@webrtc.org EXPECT_TRUE(capture_manager_.StopVideoCapture(&video_capturer_, 186f69a59cbfe7dcb7e8b9737052e27f12176c97d53andrew@webrtc.org format_vga_)); 1875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 1885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Ensure that the reference counting is working when multiple start and 1905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// multiple stop calls are made. 1915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(CaptureManagerTest, MultipleStartStops) { 1925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(capture_manager_.StartVideoCapture(&video_capturer_, 1935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org format_vga_)); 1945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Add video capturer but with different format. 1955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(capture_manager_.StartVideoCapture(&video_capturer_, 1965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org format_qvga_)); 1975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ_WAIT(cricket::CS_RUNNING, capture_state(), kMsCallbackWait); 1985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(1, callback_count()); 1995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(capture_manager_.AddVideoRenderer(&video_capturer_, 2005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org &video_renderer_)); 2015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Ensure that a frame can be captured when two start calls have been made. 2025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(video_capturer_.CaptureFrame()); 2035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(1, NumFramesRendered()); 2045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(capture_manager_.StopVideoCapture(&video_capturer_, format_vga_)); 2065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Video should still render since there has been two start calls but only 2075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // one stop call. 2085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(video_capturer_.CaptureFrame()); 2095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(2, NumFramesRendered()); 2105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(capture_manager_.StopVideoCapture(&video_capturer_, 2125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org format_qvga_)); 2135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ_WAIT(cricket::CS_STOPPED, capture_state(), kMsCallbackWait); 2145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(2, callback_count()); 2155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Last stop call should fail as it is one more than the number of start 2165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // calls. 2175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_FALSE(capture_manager_.StopVideoCapture(&video_capturer_, 2185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org format_vga_)); 2195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 2205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(CaptureManagerTest, TestForceRestart) { 2225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(capture_manager_.StartVideoCapture(&video_capturer_, 2235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org format_qvga_)); 2245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(capture_manager_.AddVideoRenderer(&video_capturer_, 2255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org &video_renderer_)); 2265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ_WAIT(1, callback_count(), kMsCallbackWait); 2275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(video_capturer_.CaptureFrame()); 2285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(1, NumFramesRendered()); 2295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(WasRenderedResolution(format_qvga_)); 2305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Now restart with vga. 2315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(capture_manager_.RestartVideoCapture( 2325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org &video_capturer_, format_qvga_, format_vga_, 2335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::CaptureManager::kForceRestart)); 2345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(video_capturer_.CaptureFrame()); 2355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(2, NumFramesRendered()); 2365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(WasRenderedResolution(format_vga_)); 237f69a59cbfe7dcb7e8b9737052e27f12176c97d53andrew@webrtc.org EXPECT_TRUE(capture_manager_.StopVideoCapture(&video_capturer_, 238f69a59cbfe7dcb7e8b9737052e27f12176c97d53andrew@webrtc.org format_vga_)); 2395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 2405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgTEST_F(CaptureManagerTest, TestRequestRestart) { 2425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(capture_manager_.StartVideoCapture(&video_capturer_, 2435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org format_vga_)); 2445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(capture_manager_.AddVideoRenderer(&video_capturer_, 2455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org &video_renderer_)); 2465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ_WAIT(1, callback_count(), kMsCallbackWait); 2475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(video_capturer_.CaptureFrame()); 2485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(1, NumFramesRendered()); 2495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(WasRenderedResolution(format_vga_)); 2505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Now request restart with qvga. 2515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(capture_manager_.RestartVideoCapture( 2525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org &video_capturer_, format_vga_, format_qvga_, 2535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cricket::CaptureManager::kRequestRestart)); 2545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(video_capturer_.CaptureFrame()); 2555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_EQ(2, NumFramesRendered()); 2565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EXPECT_TRUE(WasRenderedResolution(format_vga_)); 257f69a59cbfe7dcb7e8b9737052e27f12176c97d53andrew@webrtc.org EXPECT_TRUE(capture_manager_.StopVideoCapture(&video_capturer_, 258f69a59cbfe7dcb7e8b9737052e27f12176c97d53andrew@webrtc.org format_qvga_)); 2595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 260