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

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

Powered by Google App Engine
This is Rietveld 408576698