OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |