1 /* 2 * libjingle 3 * Copyright 2012 Google Inc. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, 9 * this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright notice, 11 * this list of conditions and the following disclaimer in the documentation 12 * and/or other materials provided with the distribution. 13 * 3. The name of the author may not be used to endorse or promote products 14 * derived from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 */ 27 28 #include <string> 29 30 #include "talk/app/webrtc/remotevideocapturer.h" 31 #include "talk/app/webrtc/test/fakevideotrackrenderer.h" 32 #include "talk/app/webrtc/videosource.h" 33 #include "talk/app/webrtc/videotrack.h" 34 #include "talk/media/base/fakemediaengine.h" 35 #include "talk/media/webrtc/webrtcvideoframe.h" 36 #include "talk/session/media/channelmanager.h" 37 #include "webrtc/base/gunit.h" 38 #include "webrtc/base/scoped_ptr.h" 39 40 using webrtc::FakeVideoTrackRenderer; 41 using webrtc::VideoSource; 42 using webrtc::VideoTrack; 43 using webrtc::VideoTrackInterface; 44 45 namespace { 46 47 class WebRtcVideoTestFrame : public cricket::WebRtcVideoFrame { 48 public: 49 using cricket::WebRtcVideoFrame::SetRotation; 50 }; 51 52 } // namespace 53 54 class VideoTrackTest : public testing::Test { 55 public: 56 VideoTrackTest() { 57 static const char kVideoTrackId[] = "track_id"; 58 59 channel_manager_.reset(new cricket::ChannelManager( 60 new cricket::FakeMediaEngine(), rtc::Thread::Current())); 61 EXPECT_TRUE(channel_manager_->Init()); 62 video_track_ = VideoTrack::Create( 63 kVideoTrackId, 64 VideoSource::Create(channel_manager_.get(), 65 new webrtc::RemoteVideoCapturer(), NULL, true)); 66 } 67 68 protected: 69 rtc::scoped_ptr<cricket::ChannelManager> channel_manager_; 70 rtc::scoped_refptr<VideoTrackInterface> video_track_; 71 }; 72 73 // Test adding renderers to a video track and render to them by providing 74 // frames to the source. 75 TEST_F(VideoTrackTest, RenderVideo) { 76 // FakeVideoTrackRenderer register itself to |video_track_| 77 rtc::scoped_ptr<FakeVideoTrackRenderer> renderer_1( 78 new FakeVideoTrackRenderer(video_track_.get())); 79 80 cricket::VideoRenderer* renderer_input = 81 video_track_->GetSource()->FrameInput(); 82 ASSERT_FALSE(renderer_input == NULL); 83 84 cricket::WebRtcVideoFrame frame; 85 frame.InitToBlack(123, 123, 1, 1, 0); 86 renderer_input->RenderFrame(&frame); 87 EXPECT_EQ(1, renderer_1->num_rendered_frames()); 88 89 EXPECT_EQ(123, renderer_1->width()); 90 EXPECT_EQ(123, renderer_1->height()); 91 92 // FakeVideoTrackRenderer register itself to |video_track_| 93 rtc::scoped_ptr<FakeVideoTrackRenderer> renderer_2( 94 new FakeVideoTrackRenderer(video_track_.get())); 95 96 renderer_input->RenderFrame(&frame); 97 98 EXPECT_EQ(123, renderer_1->width()); 99 EXPECT_EQ(123, renderer_1->height()); 100 EXPECT_EQ(123, renderer_2->width()); 101 EXPECT_EQ(123, renderer_2->height()); 102 103 EXPECT_EQ(2, renderer_1->num_rendered_frames()); 104 EXPECT_EQ(1, renderer_2->num_rendered_frames()); 105 106 video_track_->RemoveRenderer(renderer_1.get()); 107 renderer_input->RenderFrame(&frame); 108 109 EXPECT_EQ(2, renderer_1->num_rendered_frames()); 110 EXPECT_EQ(2, renderer_2->num_rendered_frames()); 111 } 112