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

Side by Side Diff: source/libvpx/test/svc_test.cc

Issue 375983002: libvpx: Pull from upstream (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 6 years, 5 months 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 | Annotate | Revision Log
« no previous file with comments | « source/libvpx/test/md5_helper.h ('k') | source/libvpx/test/test.mk » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2013 The WebM project authors. All Rights Reserved. 2 * Copyright (c) 2013 The WebM 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
(...skipping 23 matching lines...) Expand all
34 codec_initialized_(false), 34 codec_initialized_(false),
35 decoder_(0) { 35 decoder_(0) {
36 memset(&svc_, 0, sizeof(svc_)); 36 memset(&svc_, 0, sizeof(svc_));
37 memset(&codec_, 0, sizeof(codec_)); 37 memset(&codec_, 0, sizeof(codec_));
38 memset(&codec_enc_, 0, sizeof(codec_enc_)); 38 memset(&codec_enc_, 0, sizeof(codec_enc_));
39 } 39 }
40 40
41 virtual ~SvcTest() {} 41 virtual ~SvcTest() {}
42 42
43 virtual void SetUp() { 43 virtual void SetUp() {
44 svc_.encoding_mode = INTER_LAYER_PREDICTION_IP;
45 svc_.log_level = SVC_LOG_DEBUG; 44 svc_.log_level = SVC_LOG_DEBUG;
46 svc_.log_print = 0; 45 svc_.log_print = 0;
47 46
48 codec_iface_ = vpx_codec_vp9_cx(); 47 codec_iface_ = vpx_codec_vp9_cx();
49 const vpx_codec_err_t res = 48 const vpx_codec_err_t res =
50 vpx_codec_enc_config_default(codec_iface_, &codec_enc_, 0); 49 vpx_codec_enc_config_default(codec_iface_, &codec_enc_, 0);
51 EXPECT_EQ(VPX_CODEC_OK, res); 50 EXPECT_EQ(VPX_CODEC_OK, res);
52 51
53 codec_enc_.g_w = kWidth; 52 codec_enc_.g_w = kWidth;
54 codec_enc_.g_h = kHeight; 53 codec_enc_.g_h = kHeight;
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
124 123
125 TEST_F(SvcTest, SetLayersOption) { 124 TEST_F(SvcTest, SetLayersOption) {
126 vpx_codec_err_t res = vpx_svc_set_options(&svc_, "layers=3"); 125 vpx_codec_err_t res = vpx_svc_set_options(&svc_, "layers=3");
127 EXPECT_EQ(VPX_CODEC_OK, res); 126 EXPECT_EQ(VPX_CODEC_OK, res);
128 res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); 127 res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_);
129 EXPECT_EQ(VPX_CODEC_OK, res); 128 EXPECT_EQ(VPX_CODEC_OK, res);
130 codec_initialized_ = true; 129 codec_initialized_ = true;
131 EXPECT_EQ(3, svc_.spatial_layers); 130 EXPECT_EQ(3, svc_.spatial_layers);
132 } 131 }
133 132
134 TEST_F(SvcTest, SetEncodingMode) {
135 vpx_codec_err_t res = vpx_svc_set_options(&svc_, "encoding-mode=alt-ip");
136 EXPECT_EQ(VPX_CODEC_OK, res);
137 res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_);
138 EXPECT_EQ(VPX_CODEC_OK, res);
139 codec_initialized_ = true;
140 EXPECT_EQ(ALT_INTER_LAYER_PREDICTION_IP, svc_.encoding_mode);
141 }
142
143 TEST_F(SvcTest, SetMultipleOptions) { 133 TEST_F(SvcTest, SetMultipleOptions) {
144 vpx_codec_err_t res = vpx_svc_set_options(&svc_, "layers=2 encoding-mode=ip"); 134 vpx_codec_err_t res =
135 vpx_svc_set_options(&svc_, "layers=2 scale-factors=1/3,2/3");
145 res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); 136 res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_);
146 EXPECT_EQ(VPX_CODEC_OK, res); 137 EXPECT_EQ(VPX_CODEC_OK, res);
147 codec_initialized_ = true; 138 codec_initialized_ = true;
148 EXPECT_EQ(2, svc_.spatial_layers); 139 EXPECT_EQ(2, svc_.spatial_layers);
149 EXPECT_EQ(INTER_LAYER_PREDICTION_IP, svc_.encoding_mode);
150 } 140 }
151 141
152 TEST_F(SvcTest, SetScaleFactorsOption) { 142 TEST_F(SvcTest, SetScaleFactorsOption) {
153 svc_.spatial_layers = 2; 143 svc_.spatial_layers = 2;
154 vpx_codec_err_t res = 144 vpx_codec_err_t res =
155 vpx_svc_set_options(&svc_, "scale-factors=not-scale-factors"); 145 vpx_svc_set_options(&svc_, "scale-factors=not-scale-factors");
156 EXPECT_EQ(VPX_CODEC_OK, res); 146 EXPECT_EQ(VPX_CODEC_OK, res);
157 res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); 147 res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_);
158 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); 148 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res);
159 149
(...skipping 10 matching lines...) Expand all
170 EXPECT_EQ(VPX_CODEC_OK, res); 160 EXPECT_EQ(VPX_CODEC_OK, res);
171 res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); 161 res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_);
172 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); 162 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res);
173 163
174 vpx_svc_set_options(&svc_, "quantizers=40,45"); 164 vpx_svc_set_options(&svc_, "quantizers=40,45");
175 res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); 165 res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_);
176 EXPECT_EQ(VPX_CODEC_OK, res); 166 EXPECT_EQ(VPX_CODEC_OK, res);
177 codec_initialized_ = true; 167 codec_initialized_ = true;
178 } 168 }
179 169
180 TEST_F(SvcTest, SetKeyFrameQuantizersOption) { 170 TEST_F(SvcTest, SetQuantizers) {
171 vpx_codec_err_t res = vpx_svc_set_quantizers(NULL, "40,30");
172 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res);
173
174 res = vpx_svc_set_quantizers(&svc_, NULL);
175 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res);
176
181 svc_.spatial_layers = 2; 177 svc_.spatial_layers = 2;
182 vpx_codec_err_t res = vpx_svc_set_options(&svc_, 178 res = vpx_svc_set_quantizers(&svc_, "40");
183 "quantizers-keyframe=not-quantizers");
184 EXPECT_EQ(VPX_CODEC_OK, res); 179 EXPECT_EQ(VPX_CODEC_OK, res);
185 res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); 180 res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_);
186 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); 181 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res);
187 182
188 vpx_svc_set_options(&svc_, "quantizers-keyframe=40,45"); 183 res = vpx_svc_set_quantizers(&svc_, "40,30");
189 res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_);
190 EXPECT_EQ(VPX_CODEC_OK, res);
191 codec_initialized_ = true;
192 }
193
194 TEST_F(SvcTest, SetQuantizers) {
195 vpx_codec_err_t res = vpx_svc_set_quantizers(NULL, "40,30", 0);
196 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res);
197
198 res = vpx_svc_set_quantizers(&svc_, NULL, 0);
199 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res);
200
201 svc_.spatial_layers = 2;
202 res = vpx_svc_set_quantizers(&svc_, "40", 0);
203 EXPECT_EQ(VPX_CODEC_OK, res);
204 res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_);
205 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res);
206
207 res = vpx_svc_set_quantizers(&svc_, "40,30", 0);
208 EXPECT_EQ(VPX_CODEC_OK, res);
209 res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_);
210 EXPECT_EQ(VPX_CODEC_OK, res);
211 codec_initialized_ = true;
212 }
213
214 TEST_F(SvcTest, SetKeyFrameQuantizers) {
215 vpx_codec_err_t res = vpx_svc_set_quantizers(NULL, "40,31", 1);
216 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res);
217
218 res = vpx_svc_set_quantizers(&svc_, NULL, 1);
219 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res);
220
221 res = vpx_svc_set_quantizers(&svc_, "40,30", 1);
222 EXPECT_EQ(VPX_CODEC_OK, res); 184 EXPECT_EQ(VPX_CODEC_OK, res);
223 res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); 185 res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_);
224 EXPECT_EQ(VPX_CODEC_OK, res); 186 EXPECT_EQ(VPX_CODEC_OK, res);
225 codec_initialized_ = true; 187 codec_initialized_ = true;
226 } 188 }
227 189
228 TEST_F(SvcTest, SetScaleFactors) { 190 TEST_F(SvcTest, SetScaleFactors) {
229 vpx_codec_err_t res = vpx_svc_set_scale_factors(NULL, "4/16,16/16"); 191 vpx_codec_err_t res = vpx_svc_set_scale_factors(NULL, "4/16,16/16");
230 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); 192 EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res);
231 193
(...skipping 10 matching lines...) Expand all
242 EXPECT_EQ(VPX_CODEC_OK, res); 204 EXPECT_EQ(VPX_CODEC_OK, res);
243 res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); 205 res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_);
244 EXPECT_EQ(VPX_CODEC_OK, res); 206 EXPECT_EQ(VPX_CODEC_OK, res);
245 codec_initialized_ = true; 207 codec_initialized_ = true;
246 } 208 }
247 209
248 // Test that decoder can handle an SVC frame as the first frame in a sequence. 210 // Test that decoder can handle an SVC frame as the first frame in a sequence.
249 TEST_F(SvcTest, FirstFrameHasLayers) { 211 TEST_F(SvcTest, FirstFrameHasLayers) {
250 svc_.spatial_layers = 2; 212 svc_.spatial_layers = 2;
251 vpx_svc_set_scale_factors(&svc_, "4/16,16/16"); 213 vpx_svc_set_scale_factors(&svc_, "4/16,16/16");
252 vpx_svc_set_quantizers(&svc_, "40,30", 0); 214 vpx_svc_set_quantizers(&svc_, "40,30");
253 215
254 vpx_codec_err_t res = 216 vpx_codec_err_t res =
255 vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); 217 vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_);
256 EXPECT_EQ(VPX_CODEC_OK, res); 218 EXPECT_EQ(VPX_CODEC_OK, res);
257 codec_initialized_ = true; 219 codec_initialized_ = true;
258 220
259 libvpx_test::I420VideoSource video(test_file_name_, kWidth, kHeight, 221 libvpx_test::I420VideoSource video(test_file_name_, kWidth, kHeight,
260 codec_enc_.g_timebase.den, 222 codec_enc_.g_timebase.den,
261 codec_enc_.g_timebase.num, 0, 30); 223 codec_enc_.g_timebase.num, 0, 30);
262 video.Begin(); 224 video.Begin();
263 225
264 res = vpx_svc_encode(&svc_, &codec_, video.img(), video.pts(), 226 res = vpx_svc_encode(&svc_, &codec_, video.img(), video.pts(),
265 video.duration(), VPX_DL_GOOD_QUALITY); 227 video.duration(), VPX_DL_GOOD_QUALITY);
266 EXPECT_EQ(VPX_CODEC_OK, res); 228 EXPECT_EQ(VPX_CODEC_OK, res);
267 229
230 if (vpx_svc_get_frame_size(&svc_) == 0) {
231 // Flush encoder
232 res = vpx_svc_encode(&svc_, &codec_, NULL, 0,
233 video.duration(), VPX_DL_GOOD_QUALITY);
234 EXPECT_EQ(VPX_CODEC_OK, res);
235 }
236
237 int frame_size = vpx_svc_get_frame_size(&svc_);
238 EXPECT_GT(frame_size, 0);
268 const vpx_codec_err_t res_dec = decoder_->DecodeFrame( 239 const vpx_codec_err_t res_dec = decoder_->DecodeFrame(
269 static_cast<const uint8_t *>(vpx_svc_get_buffer(&svc_)), 240 static_cast<const uint8_t *>(vpx_svc_get_buffer(&svc_)), frame_size);
270 vpx_svc_get_frame_size(&svc_));
271 241
272 // this test fails with a decoder error 242 // this test fails with a decoder error
273 ASSERT_EQ(VPX_CODEC_OK, res_dec) << decoder_->DecodeError(); 243 ASSERT_EQ(VPX_CODEC_OK, res_dec) << decoder_->DecodeError();
274 } 244 }
275 245
276 TEST_F(SvcTest, EncodeThreeFrames) { 246 TEST_F(SvcTest, EncodeThreeFrames) {
277 svc_.spatial_layers = 2; 247 svc_.spatial_layers = 2;
278 vpx_svc_set_scale_factors(&svc_, "4/16,16/16"); 248 vpx_svc_set_scale_factors(&svc_, "4/16,16/16");
279 vpx_svc_set_quantizers(&svc_, "40,30", 0); 249 vpx_svc_set_quantizers(&svc_, "40,30");
250 int decoded_frames = 0;
251 vpx_codec_err_t res_dec;
252 int frame_size;
280 253
281 vpx_codec_err_t res = 254 vpx_codec_err_t res =
282 vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); 255 vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_);
283 ASSERT_EQ(VPX_CODEC_OK, res); 256 ASSERT_EQ(VPX_CODEC_OK, res);
284 codec_initialized_ = true; 257 codec_initialized_ = true;
285 258
286 libvpx_test::I420VideoSource video(test_file_name_, kWidth, kHeight, 259 libvpx_test::I420VideoSource video(test_file_name_, kWidth, kHeight,
287 codec_enc_.g_timebase.den, 260 codec_enc_.g_timebase.den,
288 codec_enc_.g_timebase.num, 0, 30); 261 codec_enc_.g_timebase.num, 0, 30);
289 // FRAME 0 262 // FRAME 0
290 video.Begin(); 263 video.Begin();
291 // This frame is a keyframe. 264 // This frame is a keyframe.
292 res = vpx_svc_encode(&svc_, &codec_, video.img(), video.pts(), 265 res = vpx_svc_encode(&svc_, &codec_, video.img(), video.pts(),
293 video.duration(), VPX_DL_GOOD_QUALITY); 266 video.duration(), VPX_DL_GOOD_QUALITY);
294 ASSERT_EQ(VPX_CODEC_OK, res);
295 EXPECT_EQ(1, vpx_svc_is_keyframe(&svc_));
296 267
297 vpx_codec_err_t res_dec = decoder_->DecodeFrame( 268 if ((frame_size = vpx_svc_get_frame_size(&svc_)) > 0) {
298 static_cast<const uint8_t *>(vpx_svc_get_buffer(&svc_)), 269 EXPECT_EQ((decoded_frames == 0), vpx_svc_is_keyframe(&svc_));
299 vpx_svc_get_frame_size(&svc_)); 270 res_dec = decoder_->DecodeFrame(
300 ASSERT_EQ(VPX_CODEC_OK, res_dec) << decoder_->DecodeError(); 271 static_cast<const uint8_t *>(vpx_svc_get_buffer(&svc_)), frame_size);
272 ASSERT_EQ(VPX_CODEC_OK, res_dec) << decoder_->DecodeError();
273 ++decoded_frames;
274 }
301 275
302 // FRAME 1 276 // FRAME 1
303 video.Next(); 277 video.Next();
304 // This is a P-frame. 278 // This is a P-frame.
305 res = vpx_svc_encode(&svc_, &codec_, video.img(), video.pts(), 279 res = vpx_svc_encode(&svc_, &codec_, video.img(), video.pts(),
306 video.duration(), VPX_DL_GOOD_QUALITY); 280 video.duration(), VPX_DL_GOOD_QUALITY);
307 ASSERT_EQ(VPX_CODEC_OK, res); 281 ASSERT_EQ(VPX_CODEC_OK, res);
308 EXPECT_EQ(0, vpx_svc_is_keyframe(&svc_));
309 282
310 res_dec = decoder_->DecodeFrame( 283 if ((frame_size = vpx_svc_get_frame_size(&svc_)) > 0) {
311 static_cast<const uint8_t *>(vpx_svc_get_buffer(&svc_)), 284 EXPECT_EQ((decoded_frames == 0), vpx_svc_is_keyframe(&svc_));
312 vpx_svc_get_frame_size(&svc_)); 285 res_dec = decoder_->DecodeFrame(
313 ASSERT_EQ(VPX_CODEC_OK, res_dec) << decoder_->DecodeError(); 286 static_cast<const uint8_t *>(vpx_svc_get_buffer(&svc_)), frame_size);
287 ASSERT_EQ(VPX_CODEC_OK, res_dec) << decoder_->DecodeError();
288 ++decoded_frames;
289 }
314 290
315 // FRAME 2 291 // FRAME 2
316 video.Next(); 292 video.Next();
317 // This is a P-frame. 293 // This is a P-frame.
318 res = vpx_svc_encode(&svc_, &codec_, video.img(), video.pts(), 294 res = vpx_svc_encode(&svc_, &codec_, video.img(), video.pts(),
319 video.duration(), VPX_DL_GOOD_QUALITY); 295 video.duration(), VPX_DL_GOOD_QUALITY);
320 ASSERT_EQ(VPX_CODEC_OK, res); 296 ASSERT_EQ(VPX_CODEC_OK, res);
321 EXPECT_EQ(0, vpx_svc_is_keyframe(&svc_));
322 297
323 res_dec = decoder_->DecodeFrame( 298 if ((frame_size = vpx_svc_get_frame_size(&svc_)) > 0) {
324 static_cast<const uint8_t *>(vpx_svc_get_buffer(&svc_)), 299 EXPECT_EQ((decoded_frames == 0), vpx_svc_is_keyframe(&svc_));
325 vpx_svc_get_frame_size(&svc_)); 300 res_dec = decoder_->DecodeFrame(
326 ASSERT_EQ(VPX_CODEC_OK, res_dec) << decoder_->DecodeError(); 301 static_cast<const uint8_t *>(vpx_svc_get_buffer(&svc_)), frame_size);
302 ASSERT_EQ(VPX_CODEC_OK, res_dec) << decoder_->DecodeError();
303 ++decoded_frames;
304 }
305
306 // Flush encoder
307 res = vpx_svc_encode(&svc_, &codec_, NULL, 0,
308 video.duration(), VPX_DL_GOOD_QUALITY);
309 EXPECT_EQ(VPX_CODEC_OK, res);
310
311 while ((frame_size = vpx_svc_get_frame_size(&svc_)) > 0) {
312 EXPECT_EQ((decoded_frames == 0), vpx_svc_is_keyframe(&svc_));
313 res_dec = decoder_->DecodeFrame(
314 static_cast<const uint8_t *>(vpx_svc_get_buffer(&svc_)), frame_size);
315 ASSERT_EQ(VPX_CODEC_OK, res_dec) << decoder_->DecodeError();
316 ++decoded_frames;
317 }
318
319 EXPECT_EQ(decoded_frames, 3);
327 } 320 }
328 321
329 TEST_F(SvcTest, GetLayerResolution) { 322 TEST_F(SvcTest, GetLayerResolution) {
330 svc_.spatial_layers = 2; 323 svc_.spatial_layers = 2;
331 vpx_svc_set_scale_factors(&svc_, "4/16,8/16"); 324 vpx_svc_set_scale_factors(&svc_, "4/16,8/16");
332 vpx_svc_set_quantizers(&svc_, "40,30", 0); 325 vpx_svc_set_quantizers(&svc_, "40,30");
333 326
334 vpx_codec_err_t res = 327 vpx_codec_err_t res =
335 vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); 328 vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_);
336 EXPECT_EQ(VPX_CODEC_OK, res); 329 EXPECT_EQ(VPX_CODEC_OK, res);
337 codec_initialized_ = true; 330 codec_initialized_ = true;
338 331
339 // ensure that requested layer is a valid layer 332 // ensure that requested layer is a valid layer
340 uint32_t layer_width, layer_height; 333 uint32_t layer_width, layer_height;
341 res = vpx_svc_get_layer_resolution(&svc_, svc_.spatial_layers, 334 res = vpx_svc_get_layer_resolution(&svc_, svc_.spatial_layers,
342 &layer_width, &layer_height); 335 &layer_width, &layer_height);
(...skipping 18 matching lines...) Expand all
361 EXPECT_EQ(kWidth * 8 / 16, layer_width); 354 EXPECT_EQ(kWidth * 8 / 16, layer_width);
362 EXPECT_EQ(kHeight * 8 / 16, layer_height); 355 EXPECT_EQ(kHeight * 8 / 16, layer_height);
363 } 356 }
364 357
365 TEST_F(SvcTest, TwoPassEncode) { 358 TEST_F(SvcTest, TwoPassEncode) {
366 // First pass encode 359 // First pass encode
367 std::string stats_buf; 360 std::string stats_buf;
368 svc_.spatial_layers = 2; 361 svc_.spatial_layers = 2;
369 codec_enc_.g_pass = VPX_RC_FIRST_PASS; 362 codec_enc_.g_pass = VPX_RC_FIRST_PASS;
370 vpx_svc_set_scale_factors(&svc_, "4/16,16/16"); 363 vpx_svc_set_scale_factors(&svc_, "4/16,16/16");
371 vpx_svc_set_quantizers(&svc_, "40,30", 0); 364 vpx_svc_set_quantizers(&svc_, "40,30");
372 365
373 vpx_codec_err_t res = 366 vpx_codec_err_t res =
374 vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); 367 vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_);
375 ASSERT_EQ(VPX_CODEC_OK, res); 368 ASSERT_EQ(VPX_CODEC_OK, res);
376 codec_initialized_ = true; 369 codec_initialized_ = true;
377 370
378 libvpx_test::I420VideoSource video(test_file_name_, kWidth, kHeight, 371 libvpx_test::I420VideoSource video(test_file_name_, kWidth, kHeight,
379 codec_enc_.g_timebase.den, 372 codec_enc_.g_timebase.den,
380 codec_enc_.g_timebase.num, 0, 30); 373 codec_enc_.g_timebase.num, 0, 30);
381 // FRAME 0 374 // FRAME 0
(...skipping 24 matching lines...) Expand all
406 EXPECT_GT(stats_size, 0U); 399 EXPECT_GT(stats_size, 0U);
407 stats_data = vpx_svc_get_rc_stats_buffer(&svc_); 400 stats_data = vpx_svc_get_rc_stats_buffer(&svc_);
408 ASSERT_TRUE(stats_data != NULL); 401 ASSERT_TRUE(stats_data != NULL);
409 stats_buf.append(stats_data, stats_size); 402 stats_buf.append(stats_data, stats_size);
410 403
411 // Tear down encoder 404 // Tear down encoder
412 vpx_svc_release(&svc_); 405 vpx_svc_release(&svc_);
413 vpx_codec_destroy(&codec_); 406 vpx_codec_destroy(&codec_);
414 407
415 // Second pass encode 408 // Second pass encode
409 int decoded_frames = 0;
410 vpx_codec_err_t res_dec;
411 int frame_size;
416 codec_enc_.g_pass = VPX_RC_LAST_PASS; 412 codec_enc_.g_pass = VPX_RC_LAST_PASS;
417 codec_enc_.rc_twopass_stats_in.buf = &stats_buf[0]; 413 codec_enc_.rc_twopass_stats_in.buf = &stats_buf[0];
418 codec_enc_.rc_twopass_stats_in.sz = stats_buf.size(); 414 codec_enc_.rc_twopass_stats_in.sz = stats_buf.size();
419 415
420 res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); 416 res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_);
421 ASSERT_EQ(VPX_CODEC_OK, res); 417 ASSERT_EQ(VPX_CODEC_OK, res);
422 codec_initialized_ = true; 418 codec_initialized_ = true;
423 419
424 // FRAME 0 420 // FRAME 0
425 video.Begin(); 421 video.Begin();
426 // This frame is a keyframe. 422 // This frame is a keyframe.
427 res = vpx_svc_encode(&svc_, &codec_, video.img(), video.pts(), 423 res = vpx_svc_encode(&svc_, &codec_, video.img(), video.pts(),
428 video.duration(), VPX_DL_GOOD_QUALITY); 424 video.duration(), VPX_DL_GOOD_QUALITY);
429 ASSERT_EQ(VPX_CODEC_OK, res); 425 ASSERT_EQ(VPX_CODEC_OK, res);
430 EXPECT_EQ(1, vpx_svc_is_keyframe(&svc_));
431 426
432 vpx_codec_err_t res_dec = decoder_->DecodeFrame( 427 if ((frame_size = vpx_svc_get_frame_size(&svc_)) > 0) {
433 static_cast<const uint8_t *>(vpx_svc_get_buffer(&svc_)), 428 EXPECT_EQ((decoded_frames == 0), vpx_svc_is_keyframe(&svc_));
434 vpx_svc_get_frame_size(&svc_)); 429 res_dec = decoder_->DecodeFrame(
435 ASSERT_EQ(VPX_CODEC_OK, res_dec) << decoder_->DecodeError(); 430 static_cast<const uint8_t *>(vpx_svc_get_buffer(&svc_)), frame_size);
431 ASSERT_EQ(VPX_CODEC_OK, res_dec) << decoder_->DecodeError();
432 ++decoded_frames;
433 }
436 434
437 // FRAME 1 435 // FRAME 1
438 video.Next(); 436 video.Next();
439 // This is a P-frame. 437 // This is a P-frame.
440 res = vpx_svc_encode(&svc_, &codec_, video.img(), video.pts(), 438 res = vpx_svc_encode(&svc_, &codec_, video.img(), video.pts(),
441 video.duration(), VPX_DL_GOOD_QUALITY); 439 video.duration(), VPX_DL_GOOD_QUALITY);
442 ASSERT_EQ(VPX_CODEC_OK, res); 440 ASSERT_EQ(VPX_CODEC_OK, res);
443 EXPECT_EQ(0, vpx_svc_is_keyframe(&svc_));
444 441
445 res_dec = decoder_->DecodeFrame( 442 if ((frame_size = vpx_svc_get_frame_size(&svc_)) > 0) {
446 static_cast<const uint8_t *>(vpx_svc_get_buffer(&svc_)), 443 EXPECT_EQ((decoded_frames == 0), vpx_svc_is_keyframe(&svc_));
447 vpx_svc_get_frame_size(&svc_)); 444 res_dec = decoder_->DecodeFrame(
448 ASSERT_EQ(VPX_CODEC_OK, res_dec) << decoder_->DecodeError(); 445 static_cast<const uint8_t *>(vpx_svc_get_buffer(&svc_)), frame_size);
446 ASSERT_EQ(VPX_CODEC_OK, res_dec) << decoder_->DecodeError();
447 ++decoded_frames;
448 }
449 449
450 // FRAME 2 450 // FRAME 2
451 video.Next(); 451 video.Next();
452 // This is a P-frame. 452 // This is a P-frame.
453 res = vpx_svc_encode(&svc_, &codec_, video.img(), video.pts(), 453 res = vpx_svc_encode(&svc_, &codec_, video.img(), video.pts(),
454 video.duration(), VPX_DL_GOOD_QUALITY); 454 video.duration(), VPX_DL_GOOD_QUALITY);
455 ASSERT_EQ(VPX_CODEC_OK, res); 455 ASSERT_EQ(VPX_CODEC_OK, res);
456 EXPECT_EQ(0, vpx_svc_is_keyframe(&svc_));
457 456
458 res_dec = decoder_->DecodeFrame( 457 if ((frame_size = vpx_svc_get_frame_size(&svc_)) > 0) {
459 static_cast<const uint8_t *>(vpx_svc_get_buffer(&svc_)), 458 EXPECT_EQ((decoded_frames == 0), vpx_svc_is_keyframe(&svc_));
460 vpx_svc_get_frame_size(&svc_)); 459 res_dec = decoder_->DecodeFrame(
461 ASSERT_EQ(VPX_CODEC_OK, res_dec) << decoder_->DecodeError(); 460 static_cast<const uint8_t *>(vpx_svc_get_buffer(&svc_)), frame_size);
461 ASSERT_EQ(VPX_CODEC_OK, res_dec) << decoder_->DecodeError();
462 ++decoded_frames;
463 }
464
465 // Flush encoder
466 res = vpx_svc_encode(&svc_, &codec_, NULL, 0,
467 video.duration(), VPX_DL_GOOD_QUALITY);
468 EXPECT_EQ(VPX_CODEC_OK, res);
469
470 while ((frame_size = vpx_svc_get_frame_size(&svc_)) > 0) {
471 EXPECT_EQ((decoded_frames == 0), vpx_svc_is_keyframe(&svc_));
472 res_dec = decoder_->DecodeFrame(
473 static_cast<const uint8_t *>(vpx_svc_get_buffer(&svc_)), frame_size);
474 ASSERT_EQ(VPX_CODEC_OK, res_dec) << decoder_->DecodeError();
475 ++decoded_frames;
476 }
477
478 EXPECT_EQ(decoded_frames, 3);
462 } 479 }
463 480
464 } // namespace 481 } // namespace
OLDNEW
« no previous file with comments | « source/libvpx/test/md5_helper.h ('k') | source/libvpx/test/test.mk » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698