OLD | NEW |
---|---|
(Empty) | |
1 /* | |
2 * Copyright (c) 2015 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 <limits> | |
12 | |
13 #include "testing/gtest/include/gtest/gtest.h" | |
14 #include "vpx/vp8cx.h" | |
15 #include "webrtc/base/logging.h" | |
16 #include "webrtc/modules/video_coding/codecs/vp9/screenshare_layers.h" | |
17 #include "webrtc/modules/video_coding/codecs/vp9/vp9_impl.h" | |
18 #include "webrtc/system_wrappers/include/clock.h" | |
19 | |
20 namespace webrtc { | |
21 | |
22 typedef VP9EncoderImpl::SuperFrameRefSettings Settings; | |
23 | |
24 const uint32_t kTickFrequency = 90000; | |
25 | |
26 class ScreenshareLayerTestVP9 : public ::testing::Test { | |
27 protected: | |
28 ScreenshareLayerTestVP9() : clock_(0) {} | |
29 virtual ~ScreenshareLayerTestVP9() {} | |
30 | |
31 void InitScreenshareLayers(int layers) { | |
32 layers_.reset(new ScreenshareLayersVP9(layers)); | |
33 } | |
34 | |
35 void ConfigureBitrateForLayer(int kbps, uint8_t layer_id) { | |
36 layers_->ConfigureBitrate(kbps, layer_id); | |
37 } | |
38 | |
39 void AdvanceTime(int64_t milliseconds) { | |
40 clock_.AdvanceTimeMilliseconds(milliseconds); | |
41 } | |
42 | |
43 void AddKilobitsToLayer(int kilobits, uint8_t layer_id) { | |
44 // 1000 bits = 125 bytes | |
45 layers_->LayerFrameEncoded(kilobits * 125, layer_id); | |
stefan-webrtc
2015/11/09 17:01:27
Write kilobits * 8 / 1000 and remove the comment.
philipel1
2015/11/09 17:17:50
Done.
| |
46 } | |
47 | |
48 void EqualRefsForLayer(const Settings& actual, uint8_t layer_id) { | |
49 EXPECT_EQ(expected_.layer[layer_id].upd_buf, | |
50 actual.layer[layer_id].upd_buf); | |
51 EXPECT_EQ(expected_.layer[layer_id].ref_buf1, | |
52 actual.layer[layer_id].ref_buf1); | |
53 EXPECT_EQ(expected_.layer[layer_id].ref_buf2, | |
54 actual.layer[layer_id].ref_buf2); | |
55 EXPECT_EQ(expected_.layer[layer_id].ref_buf3, | |
56 actual.layer[layer_id].ref_buf3); | |
57 } | |
58 | |
59 void EqualRefs(const Settings& actual) { | |
60 for (unsigned int layer_id = 0; layer_id < kMaxVp9NumberOfSpatialLayers; | |
61 ++layer_id) { | |
62 EqualRefsForLayer(actual, layer_id); | |
63 } | |
64 } | |
65 | |
66 void EqualStartStopKeyframe(const Settings& actual) { | |
67 EXPECT_EQ(expected_.start_layer, actual.start_layer); | |
68 EXPECT_EQ(expected_.stop_layer, actual.stop_layer); | |
69 EXPECT_EQ(expected_.is_keyframe, actual.is_keyframe); | |
70 } | |
71 | |
72 // Check that the settings returned by GetSuperFrameSettings() is | |
73 // equal to the expected_ settings. | |
74 void EqualToExpected() { | |
75 uint32_t frame_timestamp_ = | |
76 clock_.TimeInMilliseconds() * (kTickFrequency / 1000); | |
77 Settings actual = | |
78 layers_->GetSuperFrameSettings(frame_timestamp_, expected_.is_keyframe); | |
79 EqualRefs(actual); | |
80 EqualStartStopKeyframe(actual); | |
81 } | |
82 | |
83 Settings expected_; | |
84 SimulatedClock clock_; | |
85 rtc::scoped_ptr<ScreenshareLayersVP9> layers_; | |
86 }; | |
87 | |
88 TEST_F(ScreenshareLayerTestVP9, NoRefsOnKeyFrame) { | |
89 const int kNumLayers = kMaxVp9NumberOfSpatialLayers; | |
90 InitScreenshareLayers(kNumLayers); | |
91 expected_.start_layer = 0; | |
92 expected_.stop_layer = kNumLayers - 1; | |
93 | |
94 for (int l = 0; l < kNumLayers; ++l) { | |
95 expected_.layer[l].upd_buf = l; | |
96 } | |
97 expected_.is_keyframe = true; | |
98 EqualToExpected(); | |
99 | |
100 for (int l = 0; l < kNumLayers; ++l) { | |
101 expected_.layer[l].ref_buf1 = l; | |
102 } | |
103 expected_.is_keyframe = false; | |
104 EqualToExpected(); | |
105 } | |
106 | |
107 // Test if it is possible to send at a high bitrate (over the threshold) | |
108 // after a longer period of low bitrate. This should not be possible. | |
109 TEST_F(ScreenshareLayerTestVP9, DontAccumelateAvailableBitsOverTime) { | |
110 InitScreenshareLayers(2); | |
111 ConfigureBitrateForLayer(100, 0); | |
112 | |
113 expected_.layer[0].upd_buf = 0; | |
114 expected_.layer[0].ref_buf1 = 0; | |
115 expected_.layer[1].upd_buf = 1; | |
116 expected_.layer[1].ref_buf1 = 1; | |
117 expected_.start_layer = 0; | |
118 expected_.stop_layer = 1; | |
119 | |
120 // Send 10 frames at a low bitrate (50 kbps) | |
121 for (int i = 0; i < 10; ++i) { | |
122 AdvanceTime(200); | |
123 EqualToExpected(); | |
124 AddKilobitsToLayer(10, 0); | |
125 } | |
126 | |
127 AdvanceTime(200); | |
128 EqualToExpected(); | |
129 AddKilobitsToLayer(301, 0); | |
130 | |
131 // Send 10 frames at a high bitrate (200 kbps) | |
132 expected_.start_layer = 1; | |
133 for (int i = 0; i < 10; ++i) { | |
134 AdvanceTime(200); | |
135 EqualToExpected(); | |
136 AddKilobitsToLayer(40, 1); | |
137 } | |
138 } | |
139 | |
140 // Test if used bits are accumelated over layers, as they should; | |
141 TEST_F(ScreenshareLayerTestVP9, AccumelateUsedBitsOverLayers) { | |
142 const int kNumLayers = kMaxVp9NumberOfSpatialLayers; | |
143 InitScreenshareLayers(kNumLayers); | |
144 for (int l = 0; l < kNumLayers - 1; ++l) | |
145 ConfigureBitrateForLayer(100, l); | |
146 for (int l = 0; l < kNumLayers; ++l) { | |
147 expected_.layer[l].upd_buf = l; | |
148 expected_.layer[l].ref_buf1 = l; | |
149 } | |
150 | |
151 expected_.start_layer = 0; | |
152 expected_.stop_layer = kNumLayers - 1; | |
153 EqualToExpected(); | |
154 | |
155 for (int layer = 0; layer < kNumLayers - 1; ++layer) { | |
156 expected_.start_layer = layer; | |
157 EqualToExpected(); | |
158 AddKilobitsToLayer(101, layer); | |
159 } | |
160 } | |
161 | |
162 // General testing of the bitrate controller. | |
163 TEST_F(ScreenshareLayerTestVP9, 2LayerBitrate) { | |
164 InitScreenshareLayers(2); | |
165 ConfigureBitrateForLayer(100, 0); | |
166 | |
167 expected_.layer[0].upd_buf = 0; | |
168 expected_.layer[1].upd_buf = 1; | |
169 expected_.layer[0].ref_buf1 = -1; | |
170 expected_.layer[1].ref_buf1 = -1; | |
171 expected_.start_layer = 0; | |
172 expected_.stop_layer = 1; | |
173 | |
174 expected_.is_keyframe = true; | |
175 EqualToExpected(); | |
176 AddKilobitsToLayer(100, 0); | |
177 | |
178 expected_.layer[0].ref_buf1 = 0; | |
179 expected_.layer[1].ref_buf1 = 1; | |
180 expected_.is_keyframe = false; | |
181 AdvanceTime(199); | |
182 EqualToExpected(); | |
183 AddKilobitsToLayer(100, 0); | |
184 | |
185 expected_.start_layer = 1; | |
186 for (int frame = 0; frame < 3; ++frame) { | |
187 AdvanceTime(200); | |
188 EqualToExpected(); | |
189 AddKilobitsToLayer(100, 1); | |
190 } | |
191 | |
192 // Just before enough bits become available for L0 @0.999 seconds. | |
193 AdvanceTime(199); | |
194 EqualToExpected(); | |
195 AddKilobitsToLayer(100, 1); | |
196 | |
197 // Just after enough bits become available for L0 @1.0001 seconds. | |
198 expected_.start_layer = 0; | |
199 AdvanceTime(2); | |
200 EqualToExpected(); | |
201 AddKilobitsToLayer(100, 0); | |
202 | |
203 // Keyframes always encode all layers, even if it is over budget. | |
204 expected_.layer[0].ref_buf1 = -1; | |
205 expected_.layer[1].ref_buf1 = -1; | |
206 expected_.is_keyframe = true; | |
207 AdvanceTime(499); | |
208 EqualToExpected(); | |
209 expected_.layer[0].ref_buf1 = 0; | |
210 expected_.layer[1].ref_buf1 = 1; | |
211 expected_.start_layer = 1; | |
212 expected_.is_keyframe = false; | |
213 EqualToExpected(); | |
214 AddKilobitsToLayer(100, 0); | |
215 | |
216 // 400 kb in L0 --> @3 second mark to fall below the threshold.. | |
217 // just before @2.999 seconds. | |
218 expected_.is_keyframe = false; | |
219 AdvanceTime(1499); | |
220 EqualToExpected(); | |
221 AddKilobitsToLayer(100, 1); | |
222 | |
223 // just after @3.001 seconds. | |
224 expected_.start_layer = 0; | |
225 AdvanceTime(2); | |
226 EqualToExpected(); | |
227 AddKilobitsToLayer(100, 0); | |
228 } | |
229 | |
230 // General testing of the bitrate controller. | |
231 TEST_F(ScreenshareLayerTestVP9, 3LayerBitrate) { | |
232 InitScreenshareLayers(3); | |
233 ConfigureBitrateForLayer(100, 0); | |
234 ConfigureBitrateForLayer(100, 1); | |
235 | |
236 for (int l = 0; l < 3; ++l) { | |
237 expected_.layer[l].upd_buf = l; | |
238 expected_.layer[l].ref_buf1 = l; | |
239 } | |
240 expected_.start_layer = 0; | |
241 expected_.stop_layer = 2; | |
242 | |
243 EqualToExpected(); | |
244 AddKilobitsToLayer(105, 0); | |
245 AddKilobitsToLayer(30, 1); | |
246 | |
247 AdvanceTime(199); | |
248 EqualToExpected(); | |
249 AddKilobitsToLayer(105, 0); | |
250 AddKilobitsToLayer(30, 1); | |
251 | |
252 expected_.start_layer = 1; | |
253 AdvanceTime(200); | |
254 EqualToExpected(); | |
255 AddKilobitsToLayer(130, 1); | |
256 | |
257 expected_.start_layer = 2; | |
258 AdvanceTime(200); | |
259 EqualToExpected(); | |
260 | |
261 // 400 kb in L1 --> @1.0 second mark to fall below threshold. | |
262 // 210 kb in L0 --> @1.1 second mark to fall below threshold. | |
263 // Just before L1 @0.999 seconds. | |
264 AdvanceTime(399); | |
265 EqualToExpected(); | |
266 | |
267 // Just after L1 @1.001 seconds. | |
268 expected_.start_layer = 1; | |
269 AdvanceTime(2); | |
270 EqualToExpected(); | |
271 | |
272 // Just before L0 @1.099 seconds. | |
273 AdvanceTime(99); | |
274 EqualToExpected(); | |
275 | |
276 // Just after L0 @1.101 seconds. | |
277 expected_.start_layer = 0; | |
278 AdvanceTime(2); | |
279 EqualToExpected(); | |
280 | |
281 // @1.1 seconds | |
282 AdvanceTime(99); | |
283 EqualToExpected(); | |
284 AddKilobitsToLayer(200, 1); | |
285 | |
286 expected_.is_keyframe = true; | |
287 for (int l = 0; l < 3; ++l) | |
288 expected_.layer[l].ref_buf1 = -1; | |
289 AdvanceTime(200); | |
290 EqualToExpected(); | |
291 | |
292 expected_.is_keyframe = false; | |
293 expected_.start_layer = 2; | |
294 for (int l = 0; l < 3; ++l) | |
295 expected_.layer[l].ref_buf1 = l; | |
296 AdvanceTime(200); | |
297 EqualToExpected(); | |
298 } | |
299 | |
300 // Test that the bitrate calculations are | |
301 // correct when the timestamp wrap. | |
302 TEST_F(ScreenshareLayerTestVP9, TimestampWrap) { | |
303 InitScreenshareLayers(2); | |
304 ConfigureBitrateForLayer(100, 0); | |
305 | |
306 expected_.layer[0].upd_buf = 0; | |
307 expected_.layer[0].ref_buf1 = 0; | |
308 expected_.layer[1].upd_buf = 1; | |
309 expected_.layer[1].ref_buf1 = 1; | |
310 expected_.start_layer = 0; | |
311 expected_.stop_layer = 1; | |
312 | |
313 // Advance time to just before the timestamp wraps. | |
314 AdvanceTime(std::numeric_limits<uint32_t>::max() / (kTickFrequency / 1000)); | |
315 EqualToExpected(); | |
316 AddKilobitsToLayer(200, 0); | |
317 | |
318 // Wrap | |
319 expected_.start_layer = 1; | |
320 AdvanceTime(1); | |
321 EqualToExpected(); | |
322 } | |
323 | |
324 } // namespace webrtc | |
OLD | NEW |