OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2016 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 2016 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include "webrtc/base/gunit.h" | 11 #include "webrtc/base/gunit.h" |
| 12 #include "webrtc/media/base/fakevideorenderer.h" |
12 #include "webrtc/media/base/videobroadcaster.h" | 13 #include "webrtc/media/base/videobroadcaster.h" |
13 #include "webrtc/media/engine/webrtcvideoframe.h" | 14 #include "webrtc/media/engine/webrtcvideoframe.h" |
14 | 15 |
15 using rtc::VideoBroadcaster; | 16 using rtc::VideoBroadcaster; |
16 using rtc::VideoSinkWants; | 17 using rtc::VideoSinkWants; |
| 18 using cricket::FakeVideoRenderer; |
17 using cricket::WebRtcVideoFrame; | 19 using cricket::WebRtcVideoFrame; |
18 | 20 |
19 namespace { | |
20 | |
21 class TestSink : public rtc::VideoSinkInterface<cricket::VideoFrame> { | |
22 public: | |
23 void OnFrame(const cricket::VideoFrame& frame) override { | |
24 ++number_of_rendered_frames_; | |
25 } | |
26 | |
27 int number_of_rendered_frames_ = 0; | |
28 }; | |
29 | |
30 } // namespace | |
31 | 21 |
32 TEST(VideoBroadcasterTest, frame_wanted) { | 22 TEST(VideoBroadcasterTest, frame_wanted) { |
33 VideoBroadcaster broadcaster; | 23 VideoBroadcaster broadcaster; |
34 EXPECT_FALSE(broadcaster.frame_wanted()); | 24 EXPECT_FALSE(broadcaster.frame_wanted()); |
35 | 25 |
36 TestSink sink; | 26 FakeVideoRenderer sink; |
37 broadcaster.AddOrUpdateSink(&sink, rtc::VideoSinkWants()); | 27 broadcaster.AddOrUpdateSink(&sink, rtc::VideoSinkWants()); |
38 EXPECT_TRUE(broadcaster.frame_wanted()); | 28 EXPECT_TRUE(broadcaster.frame_wanted()); |
39 | 29 |
40 broadcaster.RemoveSink(&sink); | 30 broadcaster.RemoveSink(&sink); |
41 EXPECT_FALSE(broadcaster.frame_wanted()); | 31 EXPECT_FALSE(broadcaster.frame_wanted()); |
42 } | 32 } |
43 | 33 |
44 TEST(VideoBroadcasterTest, OnFrame) { | 34 TEST(VideoBroadcasterTest, OnFrame) { |
45 VideoBroadcaster broadcaster; | 35 VideoBroadcaster broadcaster; |
46 | 36 |
47 TestSink sink1; | 37 FakeVideoRenderer sink1; |
48 TestSink sink2; | 38 FakeVideoRenderer sink2; |
49 broadcaster.AddOrUpdateSink(&sink1, rtc::VideoSinkWants()); | 39 broadcaster.AddOrUpdateSink(&sink1, rtc::VideoSinkWants()); |
50 broadcaster.AddOrUpdateSink(&sink2, rtc::VideoSinkWants()); | 40 broadcaster.AddOrUpdateSink(&sink2, rtc::VideoSinkWants()); |
51 | 41 |
52 WebRtcVideoFrame frame; | 42 WebRtcVideoFrame frame; |
53 | 43 |
54 broadcaster.OnFrame(frame); | 44 broadcaster.OnFrame(frame); |
55 EXPECT_EQ(1, sink1.number_of_rendered_frames_); | 45 EXPECT_EQ(1, sink1.num_rendered_frames()); |
56 EXPECT_EQ(1, sink2.number_of_rendered_frames_); | 46 EXPECT_EQ(1, sink2.num_rendered_frames()); |
57 | 47 |
58 broadcaster.RemoveSink(&sink1); | 48 broadcaster.RemoveSink(&sink1); |
59 broadcaster.OnFrame(frame); | 49 broadcaster.OnFrame(frame); |
60 EXPECT_EQ(1, sink1.number_of_rendered_frames_); | 50 EXPECT_EQ(1, sink1.num_rendered_frames()); |
61 EXPECT_EQ(2, sink2.number_of_rendered_frames_); | 51 EXPECT_EQ(2, sink2.num_rendered_frames()); |
62 | 52 |
63 broadcaster.AddOrUpdateSink(&sink1, rtc::VideoSinkWants()); | 53 broadcaster.AddOrUpdateSink(&sink1, rtc::VideoSinkWants()); |
64 broadcaster.OnFrame(frame); | 54 broadcaster.OnFrame(frame); |
65 EXPECT_EQ(2, sink1.number_of_rendered_frames_); | 55 EXPECT_EQ(2, sink1.num_rendered_frames()); |
66 EXPECT_EQ(3, sink2.number_of_rendered_frames_); | 56 EXPECT_EQ(3, sink2.num_rendered_frames()); |
67 } | 57 } |
68 | 58 |
69 TEST(VideoBroadcasterTest, AppliesRotationIfAnySinkWantsRotationApplied) { | 59 TEST(VideoBroadcasterTest, AppliesRotationIfAnySinkWantsRotationApplied) { |
70 VideoBroadcaster broadcaster; | 60 VideoBroadcaster broadcaster; |
71 EXPECT_TRUE(broadcaster.wants().rotation_applied); | 61 EXPECT_TRUE(broadcaster.wants().rotation_applied); |
72 | 62 |
73 TestSink sink1; | 63 FakeVideoRenderer sink1; |
74 VideoSinkWants wants1; | 64 VideoSinkWants wants1; |
75 wants1.rotation_applied = false; | 65 wants1.rotation_applied = false; |
76 | 66 |
77 broadcaster.AddOrUpdateSink(&sink1, wants1); | 67 broadcaster.AddOrUpdateSink(&sink1, wants1); |
78 EXPECT_FALSE(broadcaster.wants().rotation_applied); | 68 EXPECT_FALSE(broadcaster.wants().rotation_applied); |
79 | 69 |
80 TestSink sink2; | 70 FakeVideoRenderer sink2; |
81 VideoSinkWants wants2; | 71 VideoSinkWants wants2; |
82 wants2.rotation_applied = true; | 72 wants2.rotation_applied = true; |
83 | 73 |
84 broadcaster.AddOrUpdateSink(&sink2, wants2); | 74 broadcaster.AddOrUpdateSink(&sink2, wants2); |
85 EXPECT_TRUE(broadcaster.wants().rotation_applied); | 75 EXPECT_TRUE(broadcaster.wants().rotation_applied); |
86 | 76 |
87 broadcaster.RemoveSink(&sink2); | 77 broadcaster.RemoveSink(&sink2); |
88 EXPECT_FALSE(broadcaster.wants().rotation_applied); | 78 EXPECT_FALSE(broadcaster.wants().rotation_applied); |
89 } | 79 } |
90 | 80 |
91 TEST(VideoBroadcasterTest, AppliesMinOfSinkWantsMaxPixelCount) { | 81 TEST(VideoBroadcasterTest, AppliesMinOfSinkWantsMaxPixelCount) { |
92 VideoBroadcaster broadcaster; | 82 VideoBroadcaster broadcaster; |
93 EXPECT_TRUE(!broadcaster.wants().max_pixel_count); | 83 EXPECT_TRUE(!broadcaster.wants().max_pixel_count); |
94 | 84 |
95 TestSink sink1; | 85 FakeVideoRenderer sink1; |
96 VideoSinkWants wants1; | 86 VideoSinkWants wants1; |
97 wants1.max_pixel_count = rtc::Optional<int>(1280 * 720); | 87 wants1.max_pixel_count = rtc::Optional<int>(1280 * 720); |
98 | 88 |
99 broadcaster.AddOrUpdateSink(&sink1, wants1); | 89 broadcaster.AddOrUpdateSink(&sink1, wants1); |
100 EXPECT_EQ(1280 * 720, *broadcaster.wants().max_pixel_count); | 90 EXPECT_EQ(1280 * 720, *broadcaster.wants().max_pixel_count); |
101 | 91 |
102 TestSink sink2; | 92 FakeVideoRenderer sink2; |
103 VideoSinkWants wants2; | 93 VideoSinkWants wants2; |
104 wants2.max_pixel_count = rtc::Optional<int>(640 * 360); | 94 wants2.max_pixel_count = rtc::Optional<int>(640 * 360); |
105 broadcaster.AddOrUpdateSink(&sink2, wants2); | 95 broadcaster.AddOrUpdateSink(&sink2, wants2); |
106 EXPECT_EQ(640 * 360, *broadcaster.wants().max_pixel_count); | 96 EXPECT_EQ(640 * 360, *broadcaster.wants().max_pixel_count); |
107 | 97 |
108 broadcaster.RemoveSink(&sink2); | 98 broadcaster.RemoveSink(&sink2); |
109 EXPECT_EQ(1280 * 720, *broadcaster.wants().max_pixel_count); | 99 EXPECT_EQ(1280 * 720, *broadcaster.wants().max_pixel_count); |
110 } | 100 } |
111 | 101 |
112 TEST(VideoBroadcasterTest, AppliesMinOfSinkWantsMaxPixelCountStepUp) { | 102 TEST(VideoBroadcasterTest, AppliesMinOfSinkWantsMaxPixelCountStepUp) { |
113 VideoBroadcaster broadcaster; | 103 VideoBroadcaster broadcaster; |
114 EXPECT_TRUE(!broadcaster.wants().max_pixel_count_step_up); | 104 EXPECT_TRUE(!broadcaster.wants().max_pixel_count_step_up); |
115 | 105 |
116 TestSink sink1; | 106 FakeVideoRenderer sink1; |
117 VideoSinkWants wants1; | 107 VideoSinkWants wants1; |
118 wants1.max_pixel_count_step_up = rtc::Optional<int>(1280 * 720); | 108 wants1.max_pixel_count_step_up = rtc::Optional<int>(1280 * 720); |
119 | 109 |
120 broadcaster.AddOrUpdateSink(&sink1, wants1); | 110 broadcaster.AddOrUpdateSink(&sink1, wants1); |
121 EXPECT_EQ(1280 * 720, *broadcaster.wants().max_pixel_count_step_up); | 111 EXPECT_EQ(1280 * 720, *broadcaster.wants().max_pixel_count_step_up); |
122 | 112 |
123 TestSink sink2; | 113 FakeVideoRenderer sink2; |
124 VideoSinkWants wants2; | 114 VideoSinkWants wants2; |
125 wants2.max_pixel_count_step_up = rtc::Optional<int>(640 * 360); | 115 wants2.max_pixel_count_step_up = rtc::Optional<int>(640 * 360); |
126 broadcaster.AddOrUpdateSink(&sink2, wants2); | 116 broadcaster.AddOrUpdateSink(&sink2, wants2); |
127 EXPECT_EQ(640 * 360, *broadcaster.wants().max_pixel_count_step_up); | 117 EXPECT_EQ(640 * 360, *broadcaster.wants().max_pixel_count_step_up); |
128 | 118 |
129 broadcaster.RemoveSink(&sink2); | 119 broadcaster.RemoveSink(&sink2); |
130 EXPECT_EQ(1280 * 720, *broadcaster.wants().max_pixel_count_step_up); | 120 EXPECT_EQ(1280 * 720, *broadcaster.wants().max_pixel_count_step_up); |
131 } | 121 } |
| 122 |
| 123 TEST(VideoBroadcasterTest, SinkWantsBlackFrames) { |
| 124 VideoBroadcaster broadcaster; |
| 125 EXPECT_TRUE(!broadcaster.wants().black_frames); |
| 126 |
| 127 FakeVideoRenderer sink1; |
| 128 VideoSinkWants wants1; |
| 129 wants1.black_frames = true; |
| 130 broadcaster.AddOrUpdateSink(&sink1, wants1); |
| 131 |
| 132 FakeVideoRenderer sink2; |
| 133 VideoSinkWants wants2; |
| 134 wants1.black_frames = false; |
| 135 broadcaster.AddOrUpdateSink(&sink2, wants2); |
| 136 |
| 137 cricket::WebRtcVideoFrame frame1; |
| 138 frame1.InitToBlack(100, 200, 10 /*ts*/); |
| 139 // Make it not all-black |
| 140 frame1.GetUPlane()[0] = 0; |
| 141 broadcaster.OnFrame(frame1); |
| 142 EXPECT_TRUE(sink1.black_frame()); |
| 143 EXPECT_EQ(10, sink1.timestamp()); |
| 144 EXPECT_FALSE(sink2.black_frame()); |
| 145 EXPECT_EQ(10, sink2.timestamp()); |
| 146 |
| 147 // Switch the sink wants. |
| 148 wants1.black_frames = false; |
| 149 broadcaster.AddOrUpdateSink(&sink1, wants1); |
| 150 wants2.black_frames = true; |
| 151 broadcaster.AddOrUpdateSink(&sink2, wants2); |
| 152 |
| 153 cricket::WebRtcVideoFrame frame2; |
| 154 frame2.InitToBlack(100, 200, 30 /*ts*/); |
| 155 // Make it not all-black |
| 156 frame2.GetUPlane()[0] = 0; |
| 157 broadcaster.OnFrame(frame2); |
| 158 EXPECT_FALSE(sink1.black_frame()); |
| 159 EXPECT_EQ(30, sink1.timestamp()); |
| 160 EXPECT_TRUE(sink2.black_frame()); |
| 161 EXPECT_EQ(30, sink2.timestamp()); |
| 162 } |
OLD | NEW |