| 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 |