blob: c80f0853af336c38851d57da40ec9f47a759af2a [file] [log] [blame]
perkj2d5f0912016-02-29 00:04:41 -08001/*
2 * Copyright 2016 The WebRTC project authors. All Rights Reserved.
3 *
4 * 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.
9 */
10
11#include "webrtc/base/gunit.h"
perkjd6c39542016-03-17 10:35:23 +010012#include "webrtc/media/base/fakevideorenderer.h"
perkj2d5f0912016-02-29 00:04:41 -080013#include "webrtc/media/base/videobroadcaster.h"
nisseacd935b2016-11-11 03:55:13 -080014#include "webrtc/video_frame.h"
perkj2d5f0912016-02-29 00:04:41 -080015
16using rtc::VideoBroadcaster;
17using rtc::VideoSinkWants;
perkjd6c39542016-03-17 10:35:23 +010018using cricket::FakeVideoRenderer;
perkj2d5f0912016-02-29 00:04:41 -080019
perkj2d5f0912016-02-29 00:04:41 -080020
21TEST(VideoBroadcasterTest, frame_wanted) {
22 VideoBroadcaster broadcaster;
23 EXPECT_FALSE(broadcaster.frame_wanted());
24
perkjd6c39542016-03-17 10:35:23 +010025 FakeVideoRenderer sink;
perkj2d5f0912016-02-29 00:04:41 -080026 broadcaster.AddOrUpdateSink(&sink, rtc::VideoSinkWants());
27 EXPECT_TRUE(broadcaster.frame_wanted());
28
29 broadcaster.RemoveSink(&sink);
30 EXPECT_FALSE(broadcaster.frame_wanted());
31}
32
33TEST(VideoBroadcasterTest, OnFrame) {
34 VideoBroadcaster broadcaster;
35
perkjd6c39542016-03-17 10:35:23 +010036 FakeVideoRenderer sink1;
37 FakeVideoRenderer sink2;
perkj2d5f0912016-02-29 00:04:41 -080038 broadcaster.AddOrUpdateSink(&sink1, rtc::VideoSinkWants());
39 broadcaster.AddOrUpdateSink(&sink2, rtc::VideoSinkWants());
nissedf2ceb82016-12-15 06:29:53 -080040 static int kWidth = 100;
41 static int kHeight = 50;
perkj2d5f0912016-02-29 00:04:41 -080042
nissedf2ceb82016-12-15 06:29:53 -080043 rtc::scoped_refptr<webrtc::I420Buffer> buffer(
44 webrtc::I420Buffer::Create(kWidth, kHeight));
45 // Initialize, to avoid warnings on use of initialized values.
46 buffer->SetToBlack();
47
48 webrtc::VideoFrame frame(buffer, webrtc::kVideoRotation_0, 0);
perkj2d5f0912016-02-29 00:04:41 -080049
50 broadcaster.OnFrame(frame);
perkjd6c39542016-03-17 10:35:23 +010051 EXPECT_EQ(1, sink1.num_rendered_frames());
52 EXPECT_EQ(1, sink2.num_rendered_frames());
perkj2d5f0912016-02-29 00:04:41 -080053
54 broadcaster.RemoveSink(&sink1);
55 broadcaster.OnFrame(frame);
perkjd6c39542016-03-17 10:35:23 +010056 EXPECT_EQ(1, sink1.num_rendered_frames());
57 EXPECT_EQ(2, sink2.num_rendered_frames());
perkj2d5f0912016-02-29 00:04:41 -080058
59 broadcaster.AddOrUpdateSink(&sink1, rtc::VideoSinkWants());
60 broadcaster.OnFrame(frame);
perkjd6c39542016-03-17 10:35:23 +010061 EXPECT_EQ(2, sink1.num_rendered_frames());
62 EXPECT_EQ(3, sink2.num_rendered_frames());
perkj2d5f0912016-02-29 00:04:41 -080063}
64
65TEST(VideoBroadcasterTest, AppliesRotationIfAnySinkWantsRotationApplied) {
66 VideoBroadcaster broadcaster;
deadbeeff5629ad2016-03-18 11:38:26 -070067 EXPECT_FALSE(broadcaster.wants().rotation_applied);
perkj2d5f0912016-02-29 00:04:41 -080068
perkjd6c39542016-03-17 10:35:23 +010069 FakeVideoRenderer sink1;
perkj2d5f0912016-02-29 00:04:41 -080070 VideoSinkWants wants1;
71 wants1.rotation_applied = false;
72
73 broadcaster.AddOrUpdateSink(&sink1, wants1);
74 EXPECT_FALSE(broadcaster.wants().rotation_applied);
75
perkjd6c39542016-03-17 10:35:23 +010076 FakeVideoRenderer sink2;
perkj2d5f0912016-02-29 00:04:41 -080077 VideoSinkWants wants2;
78 wants2.rotation_applied = true;
79
80 broadcaster.AddOrUpdateSink(&sink2, wants2);
81 EXPECT_TRUE(broadcaster.wants().rotation_applied);
82
83 broadcaster.RemoveSink(&sink2);
84 EXPECT_FALSE(broadcaster.wants().rotation_applied);
85}
86
87TEST(VideoBroadcasterTest, AppliesMinOfSinkWantsMaxPixelCount) {
88 VideoBroadcaster broadcaster;
89 EXPECT_TRUE(!broadcaster.wants().max_pixel_count);
90
perkjd6c39542016-03-17 10:35:23 +010091 FakeVideoRenderer sink1;
perkj2d5f0912016-02-29 00:04:41 -080092 VideoSinkWants wants1;
93 wants1.max_pixel_count = rtc::Optional<int>(1280 * 720);
94
95 broadcaster.AddOrUpdateSink(&sink1, wants1);
96 EXPECT_EQ(1280 * 720, *broadcaster.wants().max_pixel_count);
97
perkjd6c39542016-03-17 10:35:23 +010098 FakeVideoRenderer sink2;
perkj2d5f0912016-02-29 00:04:41 -080099 VideoSinkWants wants2;
100 wants2.max_pixel_count = rtc::Optional<int>(640 * 360);
101 broadcaster.AddOrUpdateSink(&sink2, wants2);
102 EXPECT_EQ(640 * 360, *broadcaster.wants().max_pixel_count);
103
104 broadcaster.RemoveSink(&sink2);
105 EXPECT_EQ(1280 * 720, *broadcaster.wants().max_pixel_count);
106}
107
108TEST(VideoBroadcasterTest, AppliesMinOfSinkWantsMaxPixelCountStepUp) {
109 VideoBroadcaster broadcaster;
110 EXPECT_TRUE(!broadcaster.wants().max_pixel_count_step_up);
111
perkjd6c39542016-03-17 10:35:23 +0100112 FakeVideoRenderer sink1;
perkj2d5f0912016-02-29 00:04:41 -0800113 VideoSinkWants wants1;
114 wants1.max_pixel_count_step_up = rtc::Optional<int>(1280 * 720);
115
116 broadcaster.AddOrUpdateSink(&sink1, wants1);
117 EXPECT_EQ(1280 * 720, *broadcaster.wants().max_pixel_count_step_up);
118
perkjd6c39542016-03-17 10:35:23 +0100119 FakeVideoRenderer sink2;
perkj2d5f0912016-02-29 00:04:41 -0800120 VideoSinkWants wants2;
121 wants2.max_pixel_count_step_up = rtc::Optional<int>(640 * 360);
122 broadcaster.AddOrUpdateSink(&sink2, wants2);
123 EXPECT_EQ(640 * 360, *broadcaster.wants().max_pixel_count_step_up);
124
125 broadcaster.RemoveSink(&sink2);
126 EXPECT_EQ(1280 * 720, *broadcaster.wants().max_pixel_count_step_up);
127}
perkjd6c39542016-03-17 10:35:23 +0100128
129TEST(VideoBroadcasterTest, SinkWantsBlackFrames) {
130 VideoBroadcaster broadcaster;
131 EXPECT_TRUE(!broadcaster.wants().black_frames);
132
133 FakeVideoRenderer sink1;
134 VideoSinkWants wants1;
135 wants1.black_frames = true;
136 broadcaster.AddOrUpdateSink(&sink1, wants1);
137
138 FakeVideoRenderer sink2;
139 VideoSinkWants wants2;
nisseefec5902016-06-09 00:31:39 -0700140 wants2.black_frames = false;
perkjd6c39542016-03-17 10:35:23 +0100141 broadcaster.AddOrUpdateSink(&sink2, wants2);
142
nisseefec5902016-06-09 00:31:39 -0700143 rtc::scoped_refptr<webrtc::I420Buffer> buffer(
144 new rtc::RefCountedObject<webrtc::I420Buffer>(100, 200));
145 // Makes it not all black.
146 buffer->InitializeData();
147
nisseacd935b2016-11-11 03:55:13 -0800148 webrtc::VideoFrame frame1(buffer, webrtc::kVideoRotation_0,
149 10 /* timestamp_us */);
perkjd6c39542016-03-17 10:35:23 +0100150 broadcaster.OnFrame(frame1);
151 EXPECT_TRUE(sink1.black_frame());
nisse306d52b2016-09-06 07:52:40 -0700152 EXPECT_EQ(10, sink1.timestamp_us());
perkjd6c39542016-03-17 10:35:23 +0100153 EXPECT_FALSE(sink2.black_frame());
nisse306d52b2016-09-06 07:52:40 -0700154 EXPECT_EQ(10, sink2.timestamp_us());
perkjd6c39542016-03-17 10:35:23 +0100155
156 // Switch the sink wants.
157 wants1.black_frames = false;
158 broadcaster.AddOrUpdateSink(&sink1, wants1);
159 wants2.black_frames = true;
160 broadcaster.AddOrUpdateSink(&sink2, wants2);
161
nisseacd935b2016-11-11 03:55:13 -0800162 webrtc::VideoFrame frame2(buffer, webrtc::kVideoRotation_0,
163 30 /* timestamp_us */);
perkjd6c39542016-03-17 10:35:23 +0100164 broadcaster.OnFrame(frame2);
165 EXPECT_FALSE(sink1.black_frame());
nisse306d52b2016-09-06 07:52:40 -0700166 EXPECT_EQ(30, sink1.timestamp_us());
perkjd6c39542016-03-17 10:35:23 +0100167 EXPECT_TRUE(sink2.black_frame());
nisse306d52b2016-09-06 07:52:40 -0700168 EXPECT_EQ(30, sink2.timestamp_us());
perkjd6c39542016-03-17 10:35:23 +0100169}