blob: 9f44b81ea6525a341b8abc9424b4c3f20706a030 [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001/*
kjellanderb24317b2016-02-10 07:54:43 -08002 * Copyright 2012 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003 *
kjellanderb24317b2016-02-10 07:54:43 -08004 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00009 */
10
11#include <string>
12
Henrik Kjellander15583c12016-02-10 10:53:12 +010013#include "webrtc/api/remotevideocapturer.h"
14#include "webrtc/api/test/fakevideotrackrenderer.h"
perkja3ede6c2016-03-08 01:27:48 +010015#include "webrtc/api/videocapturertracksource.h"
Henrik Kjellander15583c12016-02-10 10:53:12 +010016#include "webrtc/api/videotrack.h"
buildbot@webrtc.orga09a9992014-08-13 17:26:08 +000017#include "webrtc/base/gunit.h"
18#include "webrtc/base/scoped_ptr.h"
kjellandera96e2d72016-02-04 23:52:28 -080019#include "webrtc/media/base/fakemediaengine.h"
kjellander@webrtc.org5ad12972016-02-12 06:39:40 +010020#include "webrtc/media/engine/webrtcvideoframe.h"
kjellander@webrtc.org9b8df252016-02-12 06:47:59 +010021#include "webrtc/pc/channelmanager.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000022
23using webrtc::FakeVideoTrackRenderer;
nissedb25d2e2016-02-26 01:24:58 -080024using webrtc::FakeVideoTrackRendererOld;
perkja3ede6c2016-03-08 01:27:48 +010025using webrtc::VideoCapturerTrackSource;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000026using webrtc::VideoTrack;
27using webrtc::VideoTrackInterface;
28
guoweis@webrtc.org00c509a2015-03-12 21:37:26 +000029namespace {
30
31class WebRtcVideoTestFrame : public cricket::WebRtcVideoFrame {
32 public:
33 using cricket::WebRtcVideoFrame::SetRotation;
34};
35
36} // namespace
37
38class VideoTrackTest : public testing::Test {
39 public:
40 VideoTrackTest() {
41 static const char kVideoTrackId[] = "track_id";
guoweis@webrtc.org00c509a2015-03-12 21:37:26 +000042 video_track_ = VideoTrack::Create(
perkja3ede6c2016-03-08 01:27:48 +010043 kVideoTrackId, VideoCapturerTrackSource::Create(
44 rtc::Thread::Current(),
45 new webrtc::RemoteVideoCapturer(), NULL, true));
guoweis@webrtc.org00c509a2015-03-12 21:37:26 +000046 }
47
48 protected:
guoweis@webrtc.org00c509a2015-03-12 21:37:26 +000049 rtc::scoped_refptr<VideoTrackInterface> video_track_;
50};
51
henrike@webrtc.org28e20752013-07-10 00:45:36 +000052// Test adding renderers to a video track and render to them by providing
wu@webrtc.org967bfff2013-09-19 05:49:50 +000053// frames to the source.
guoweis@webrtc.org00c509a2015-03-12 21:37:26 +000054TEST_F(VideoTrackTest, RenderVideo) {
55 // FakeVideoTrackRenderer register itself to |video_track_|
guoweis@webrtc.orgf9a75d92015-03-10 06:37:00 +000056 rtc::scoped_ptr<FakeVideoTrackRenderer> renderer_1(
guoweis@webrtc.org00c509a2015-03-12 21:37:26 +000057 new FakeVideoTrackRenderer(video_track_.get()));
guoweis@webrtc.orgf9a75d92015-03-10 06:37:00 +000058
nisse8e8908a2016-02-05 01:52:15 -080059 rtc::VideoSinkInterface<cricket::VideoFrame>* renderer_input =
60 video_track_->GetSink();
guoweis@webrtc.org00c509a2015-03-12 21:37:26 +000061 ASSERT_FALSE(renderer_input == NULL);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000062
henrike@webrtc.org28e20752013-07-10 00:45:36 +000063 cricket::WebRtcVideoFrame frame;
nisse8b1e4312016-01-18 01:46:27 -080064 frame.InitToBlack(123, 123, 0);
nisse8e8908a2016-02-05 01:52:15 -080065 renderer_input->OnFrame(frame);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000066 EXPECT_EQ(1, renderer_1->num_rendered_frames());
67
wu@webrtc.org967bfff2013-09-19 05:49:50 +000068 EXPECT_EQ(123, renderer_1->width());
69 EXPECT_EQ(123, renderer_1->height());
70
guoweis@webrtc.org00c509a2015-03-12 21:37:26 +000071 // FakeVideoTrackRenderer register itself to |video_track_|
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000072 rtc::scoped_ptr<FakeVideoTrackRenderer> renderer_2(
guoweis@webrtc.org00c509a2015-03-12 21:37:26 +000073 new FakeVideoTrackRenderer(video_track_.get()));
henrike@webrtc.org28e20752013-07-10 00:45:36 +000074
nisse8e8908a2016-02-05 01:52:15 -080075 renderer_input->OnFrame(frame);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000076
henrike@webrtc.org28e20752013-07-10 00:45:36 +000077 EXPECT_EQ(123, renderer_1->width());
78 EXPECT_EQ(123, renderer_1->height());
henrike@webrtc.org28e20752013-07-10 00:45:36 +000079 EXPECT_EQ(123, renderer_2->width());
80 EXPECT_EQ(123, renderer_2->height());
81
82 EXPECT_EQ(2, renderer_1->num_rendered_frames());
83 EXPECT_EQ(1, renderer_2->num_rendered_frames());
84
nissedb25d2e2016-02-26 01:24:58 -080085 video_track_->RemoveSink(renderer_1.get());
86 renderer_input->OnFrame(frame);
87
88 EXPECT_EQ(2, renderer_1->num_rendered_frames());
89 EXPECT_EQ(2, renderer_2->num_rendered_frames());
90}
91
92// Test adding renderers to a video track and render to them by
93// providing frames to the source. Uses the old VideoTrack interface
94// with AddRenderer and RemoveRenderer.
95TEST_F(VideoTrackTest, RenderVideoOld) {
96 // FakeVideoTrackRenderer register itself to |video_track_|
97 rtc::scoped_ptr<FakeVideoTrackRendererOld> renderer_1(
98 new FakeVideoTrackRendererOld(video_track_.get()));
99
100 rtc::VideoSinkInterface<cricket::VideoFrame>* renderer_input =
101 video_track_->GetSink();
102 ASSERT_FALSE(renderer_input == NULL);
103
104 cricket::WebRtcVideoFrame frame;
105 frame.InitToBlack(123, 123, 0);
106 renderer_input->OnFrame(frame);
107 EXPECT_EQ(1, renderer_1->num_rendered_frames());
108
109 EXPECT_EQ(123, renderer_1->width());
110 EXPECT_EQ(123, renderer_1->height());
111
112 // FakeVideoTrackRenderer register itself to |video_track_|
113 rtc::scoped_ptr<FakeVideoTrackRenderer> renderer_2(
114 new FakeVideoTrackRenderer(video_track_.get()));
115
116 renderer_input->OnFrame(frame);
117
118 EXPECT_EQ(123, renderer_1->width());
119 EXPECT_EQ(123, renderer_1->height());
120 EXPECT_EQ(123, renderer_2->width());
121 EXPECT_EQ(123, renderer_2->height());
122
123 EXPECT_EQ(2, renderer_1->num_rendered_frames());
124 EXPECT_EQ(1, renderer_2->num_rendered_frames());
125
guoweis@webrtc.org00c509a2015-03-12 21:37:26 +0000126 video_track_->RemoveRenderer(renderer_1.get());
nisse8e8908a2016-02-05 01:52:15 -0800127 renderer_input->OnFrame(frame);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000128
129 EXPECT_EQ(2, renderer_1->num_rendered_frames());
130 EXPECT_EQ(2, renderer_2->num_rendered_frames());
131}
nisse81354f52016-01-19 00:23:24 -0800132
133// Test that disabling the track results in blacked out frames.
134TEST_F(VideoTrackTest, DisableTrackBlackout) {
135 rtc::scoped_ptr<FakeVideoTrackRenderer> renderer(
136 new FakeVideoTrackRenderer(video_track_.get()));
137
nisse8e8908a2016-02-05 01:52:15 -0800138 rtc::VideoSinkInterface<cricket::VideoFrame>* renderer_input =
139 video_track_->GetSink();
nisse81354f52016-01-19 00:23:24 -0800140 ASSERT_FALSE(renderer_input == NULL);
141
142 cricket::WebRtcVideoFrame frame;
nisse8cb910d2016-02-04 01:01:54 -0800143 frame.InitToBlack(100, 200, 0);
nisse81354f52016-01-19 00:23:24 -0800144 // Make it not all-black
145 frame.GetUPlane()[0] = 0;
146
nisse8e8908a2016-02-05 01:52:15 -0800147 renderer_input->OnFrame(frame);
nisse81354f52016-01-19 00:23:24 -0800148 EXPECT_EQ(1, renderer->num_rendered_frames());
149 EXPECT_FALSE(renderer->black_frame());
150 EXPECT_EQ(100, renderer->width());
151 EXPECT_EQ(200, renderer->height());
152
153 video_track_->set_enabled(false);
nisse8e8908a2016-02-05 01:52:15 -0800154 renderer_input->OnFrame(frame);
nisse81354f52016-01-19 00:23:24 -0800155 EXPECT_EQ(2, renderer->num_rendered_frames());
156 EXPECT_TRUE(renderer->black_frame());
157 EXPECT_EQ(100, renderer->width());
158 EXPECT_EQ(200, renderer->height());
159
160 video_track_->set_enabled(true);
nisse8e8908a2016-02-05 01:52:15 -0800161 renderer_input->OnFrame(frame);
nisse81354f52016-01-19 00:23:24 -0800162 EXPECT_EQ(3, renderer->num_rendered_frames());
163 EXPECT_FALSE(renderer->black_frame());
164 EXPECT_EQ(100, renderer->width());
165 EXPECT_EQ(200, renderer->height());
166}