Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(135)

Side by Side Diff: webrtc/modules/video_coding/codecs/vp9/screenshare_layers_unittest.cc

Issue 1328113004: Work on flexible mode and screen sharing. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Initialization compile fix android Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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);
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698