1967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org/* 2967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org * libjingle 35f93d0a140515e3b8cdd1b9a4c6f5871144e5deejlmiller@webrtc.org * Copyright 2013 Google Inc. 4967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org * 5967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org * Redistribution and use in source and binary forms, with or without 6967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org * modification, are permitted provided that the following conditions are met: 7967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org * 8967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 9967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org * this list of conditions and the following disclaimer. 10967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 11967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org * this list of conditions and the following disclaimer in the documentation 12967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org * and/or other materials provided with the distribution. 13967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org * 3. The name of the author may not be used to endorse or promote products 14967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org * derived from this software without specific prior written permission. 15967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org * 16967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 17967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 19967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 22967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 23967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 24967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 25967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org */ 27967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org 28967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org#include <string> 29967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org 30967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org#include "talk/app/webrtc/remotevideocapturer.h" 31967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org#include "talk/media/webrtc/webrtcvideoframe.h" 32a09a99950ec40aef6421e4ba35eee7196b7a6e68buildbot@webrtc.org#include "webrtc/base/gunit.h" 33967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org 34967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.orgusing cricket::CaptureState; 35967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.orgusing cricket::VideoCapturer; 36967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.orgusing cricket::VideoFormat; 37967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.orgusing cricket::VideoFormatPod; 38967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.orgusing cricket::VideoFrame; 39967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org 40967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.orgstatic const int kMaxWaitMs = 1000; 41967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.orgstatic const VideoFormatPod kTestFormat = 42967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org {640, 480, FPS_TO_INTERVAL(30), cricket::FOURCC_ANY}; 43967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org 44967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.orgclass RemoteVideoCapturerTest : public testing::Test, 45967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org public sigslot::has_slots<> { 46967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org protected: 47967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org RemoteVideoCapturerTest() 48967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org : captured_frame_num_(0), 49967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org capture_state_(cricket::CS_STOPPED) {} 50967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org 51967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org virtual void SetUp() { 52967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org capturer_.SignalStateChange.connect( 53967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org this, &RemoteVideoCapturerTest::OnStateChange); 54967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org capturer_.SignalVideoFrame.connect( 55967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org this, &RemoteVideoCapturerTest::OnVideoFrame); 56967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org } 57967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org 58967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org ~RemoteVideoCapturerTest() { 59967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org capturer_.SignalStateChange.disconnect(this); 60967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org capturer_.SignalVideoFrame.disconnect(this); 61967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org } 62967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org 63967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org int captured_frame_num() const { 64967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org return captured_frame_num_; 65967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org } 66967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org 67967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org CaptureState capture_state() const { 68967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org return capture_state_; 69967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org } 70967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org 71967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org webrtc::RemoteVideoCapturer capturer_; 72967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org 73967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org private: 74967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org void OnStateChange(VideoCapturer* capturer, 75967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org CaptureState capture_state) { 76967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org EXPECT_EQ(&capturer_, capturer); 77967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org capture_state_ = capture_state; 78967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org } 79967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org 80967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org void OnVideoFrame(VideoCapturer* capturer, const VideoFrame* frame) { 81967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org EXPECT_EQ(&capturer_, capturer); 82967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org ++captured_frame_num_; 83967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org } 84967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org 85967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org int captured_frame_num_; 86967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org CaptureState capture_state_; 87967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org}; 88967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org 89967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.orgTEST_F(RemoteVideoCapturerTest, StartStop) { 90967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org // Start 91967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org EXPECT_TRUE( 92967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org capturer_.StartCapturing(VideoFormat(kTestFormat))); 93967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org EXPECT_TRUE_WAIT((cricket::CS_RUNNING == capture_state()), kMaxWaitMs); 94967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org EXPECT_EQ(VideoFormat(kTestFormat), 95967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org *capturer_.GetCaptureFormat()); 96967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org EXPECT_TRUE(capturer_.IsRunning()); 97967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org 98967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org // Stop 99967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org capturer_.Stop(); 100967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org EXPECT_TRUE_WAIT((cricket::CS_STOPPED == capture_state()), kMaxWaitMs); 101967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org EXPECT_TRUE(NULL == capturer_.GetCaptureFormat()); 102967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org} 103967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org 104967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.orgTEST_F(RemoteVideoCapturerTest, GetPreferredFourccs) { 105967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org EXPECT_FALSE(capturer_.GetPreferredFourccs(NULL)); 106967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org 1070c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström std::vector<uint32_t> fourccs; 108967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org EXPECT_TRUE(capturer_.GetPreferredFourccs(&fourccs)); 109967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org EXPECT_EQ(1u, fourccs.size()); 110967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org EXPECT_EQ(cricket::FOURCC_I420, fourccs.at(0)); 111967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org} 112967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org 113967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.orgTEST_F(RemoteVideoCapturerTest, GetBestCaptureFormat) { 114967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org VideoFormat desired = VideoFormat(kTestFormat); 115967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org EXPECT_FALSE(capturer_.GetBestCaptureFormat(desired, NULL)); 116967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org 117967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org VideoFormat expected_format = VideoFormat(kTestFormat); 118967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org expected_format.fourcc = cricket::FOURCC_I420; 119967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org VideoFormat best_format; 120967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org EXPECT_TRUE(capturer_.GetBestCaptureFormat(desired, &best_format)); 121967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org EXPECT_EQ(expected_format, best_format); 122967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org} 123967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org 124967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.orgTEST_F(RemoteVideoCapturerTest, InputFrame) { 125967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org EXPECT_EQ(0, captured_frame_num()); 126967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org 127967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org cricket::WebRtcVideoFrame test_frame; 128967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org capturer_.SignalVideoFrame(&capturer_, &test_frame); 129967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org EXPECT_EQ(1, captured_frame_num()); 130967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org capturer_.SignalVideoFrame(&capturer_, &test_frame); 131967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org EXPECT_EQ(2, captured_frame_num()); 132967bfff54d00f176a554bf9f955f14dde99f7bb9wu@webrtc.org} 133