Index: source/libvpx/test/svc_test.cc |
=================================================================== |
--- source/libvpx/test/svc_test.cc (revision 292072) |
+++ source/libvpx/test/svc_test.cc (working copy) |
@@ -74,6 +74,7 @@ |
const vpx_codec_err_t res = |
vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); |
EXPECT_EQ(VPX_CODEC_OK, res); |
+ vpx_codec_control(&codec_, VP8E_SET_CPUUSED, 4); // Make the test faster |
codec_initialized_ = true; |
} |
@@ -83,11 +84,23 @@ |
codec_initialized_ = false; |
} |
+ void GetStatsData(std::string *const stats_buf) { |
+ vpx_codec_iter_t iter = NULL; |
+ const vpx_codec_cx_pkt_t *cx_pkt; |
+ |
+ while ((cx_pkt = vpx_codec_get_cx_data(&codec_, &iter)) != NULL) { |
+ if (cx_pkt->kind == VPX_CODEC_STATS_PKT) { |
+ EXPECT_GT(cx_pkt->data.twopass_stats.sz, 0U); |
+ ASSERT_TRUE(cx_pkt->data.twopass_stats.buf != NULL); |
+ stats_buf->append(static_cast<char*>(cx_pkt->data.twopass_stats.buf), |
+ cx_pkt->data.twopass_stats.sz); |
+ } |
+ } |
+ } |
+ |
void Pass1EncodeNFrames(const int n, const int layers, |
std::string *const stats_buf) { |
vpx_codec_err_t res; |
- size_t stats_size = 0; |
- const char *stats_data = NULL; |
ASSERT_GT(n, 0); |
ASSERT_GT(layers, 0); |
@@ -104,22 +117,15 @@ |
res = vpx_svc_encode(&svc_, &codec_, video.img(), video.pts(), |
video.duration(), VPX_DL_GOOD_QUALITY); |
ASSERT_EQ(VPX_CODEC_OK, res); |
- stats_size = vpx_svc_get_rc_stats_buffer_size(&svc_); |
- EXPECT_GT(stats_size, 0U); |
- stats_data = vpx_svc_get_rc_stats_buffer(&svc_); |
- ASSERT_TRUE(stats_data != NULL); |
- stats_buf->append(stats_data, stats_size); |
+ GetStatsData(stats_buf); |
video.Next(); |
} |
// Flush encoder and test EOS packet. |
res = vpx_svc_encode(&svc_, &codec_, NULL, video.pts(), |
video.duration(), VPX_DL_GOOD_QUALITY); |
- stats_size = vpx_svc_get_rc_stats_buffer_size(&svc_); |
- EXPECT_GT(stats_size, 0U); |
- stats_data = vpx_svc_get_rc_stats_buffer(&svc_); |
- ASSERT_TRUE(stats_data != NULL); |
- stats_buf->append(stats_data, stats_size); |
+ ASSERT_EQ(VPX_CODEC_OK, res); |
+ GetStatsData(stats_buf); |
ReleaseEncoder(); |
} |
@@ -127,20 +133,27 @@ |
void StoreFrames(const size_t max_frame_received, |
struct vpx_fixed_buf *const outputs, |
size_t *const frame_received) { |
- size_t frame_size; |
- while ((frame_size = vpx_svc_get_frame_size(&svc_)) > 0) { |
- ASSERT_LT(*frame_received, max_frame_received); |
+ vpx_codec_iter_t iter = NULL; |
+ const vpx_codec_cx_pkt_t *cx_pkt; |
- if (*frame_received == 0) { |
- EXPECT_EQ(1, vpx_svc_is_keyframe(&svc_)); |
- } |
+ while ((cx_pkt = vpx_codec_get_cx_data(&codec_, &iter)) != NULL) { |
+ if (cx_pkt->kind == VPX_CODEC_CX_FRAME_PKT) { |
+ const size_t frame_size = cx_pkt->data.frame.sz; |
- outputs[*frame_received].buf = malloc(frame_size + 16); |
- ASSERT_TRUE(outputs[*frame_received].buf != NULL); |
- memcpy(outputs[*frame_received].buf, vpx_svc_get_buffer(&svc_), |
- frame_size); |
- outputs[*frame_received].sz = frame_size; |
- ++(*frame_received); |
+ EXPECT_GT(frame_size, 0U); |
+ ASSERT_TRUE(cx_pkt->data.frame.buf != NULL); |
+ ASSERT_LT(*frame_received, max_frame_received); |
+ |
+ if (*frame_received == 0) |
+ EXPECT_EQ(1, !!(cx_pkt->data.frame.flags & VPX_FRAME_IS_KEY)); |
+ |
+ outputs[*frame_received].buf = malloc(frame_size + 16); |
+ ASSERT_TRUE(outputs[*frame_received].buf != NULL); |
+ memcpy(outputs[*frame_received].buf, cx_pkt->data.frame.buf, |
+ frame_size); |
+ outputs[*frame_received].sz = frame_size; |
+ ++(*frame_received); |
+ } |
} |
} |
@@ -386,11 +399,6 @@ |
TEST_F(SvcTest, InitTwoLayers) { |
svc_.spatial_layers = 2; |
- vpx_svc_set_scale_factors(&svc_, "4/16,16*16"); // invalid scale values |
- vpx_codec_err_t res = vpx_svc_init(&svc_, &codec_, codec_iface_, &codec_enc_); |
- EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); |
- |
- vpx_svc_set_scale_factors(&svc_, "4/16,16/16"); // valid scale values |
InitializeEncoder(); |
} |
@@ -427,6 +435,16 @@ |
res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); |
EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); |
+ res = vpx_svc_set_options(&svc_, "scale-factors=1/3, 3*3"); |
+ EXPECT_EQ(VPX_CODEC_OK, res); |
+ res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); |
+ EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); |
+ |
+ res = vpx_svc_set_options(&svc_, "scale-factors=1/3"); |
+ EXPECT_EQ(VPX_CODEC_OK, res); |
+ res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); |
+ EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); |
+ |
res = vpx_svc_set_options(&svc_, "scale-factors=1/3,2/3"); |
EXPECT_EQ(VPX_CODEC_OK, res); |
InitializeEncoder(); |
@@ -434,64 +452,48 @@ |
TEST_F(SvcTest, SetQuantizersOption) { |
svc_.spatial_layers = 2; |
- vpx_codec_err_t res = vpx_svc_set_options(&svc_, "quantizers=not-quantizers"); |
+ vpx_codec_err_t res = vpx_svc_set_options(&svc_, "max-quantizers=nothing"); |
EXPECT_EQ(VPX_CODEC_OK, res); |
res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); |
EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); |
- vpx_svc_set_options(&svc_, "quantizers=40,45"); |
- InitializeEncoder(); |
-} |
- |
-TEST_F(SvcTest, SetAutoAltRefOption) { |
- svc_.spatial_layers = 5; |
- vpx_codec_err_t res = vpx_svc_set_options(&svc_, "auto-alt-refs=none"); |
+ res = vpx_svc_set_options(&svc_, "min-quantizers=nothing"); |
EXPECT_EQ(VPX_CODEC_OK, res); |
res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); |
EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); |
- res = vpx_svc_set_options(&svc_, "auto-alt-refs=1,1,1,1,0"); |
+ res = vpx_svc_set_options(&svc_, "max-quantizers=40"); |
EXPECT_EQ(VPX_CODEC_OK, res); |
res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); |
EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); |
- vpx_svc_set_options(&svc_, "auto-alt-refs=0,1,1,1,0"); |
- InitializeEncoder(); |
-} |
- |
-TEST_F(SvcTest, SetQuantizers) { |
- vpx_codec_err_t res = vpx_svc_set_quantizers(NULL, "40,30"); |
+ res = vpx_svc_set_options(&svc_, "min-quantizers=40"); |
+ EXPECT_EQ(VPX_CODEC_OK, res); |
+ res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); |
EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); |
- res = vpx_svc_set_quantizers(&svc_, NULL); |
- EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); |
- |
- svc_.spatial_layers = 2; |
- res = vpx_svc_set_quantizers(&svc_, "40"); |
+ res = vpx_svc_set_options(&svc_, "max-quantizers=30,30 min-quantizers=40,40"); |
EXPECT_EQ(VPX_CODEC_OK, res); |
res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); |
EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); |
- res = vpx_svc_set_quantizers(&svc_, "40,30"); |
- EXPECT_EQ(VPX_CODEC_OK, res); |
+ res = vpx_svc_set_options(&svc_, "max-quantizers=40,40 min-quantizers=30,30"); |
InitializeEncoder(); |
} |
-TEST_F(SvcTest, SetScaleFactors) { |
- vpx_codec_err_t res = vpx_svc_set_scale_factors(NULL, "4/16,16/16"); |
+TEST_F(SvcTest, SetAutoAltRefOption) { |
+ svc_.spatial_layers = 5; |
+ vpx_codec_err_t res = vpx_svc_set_options(&svc_, "auto-alt-refs=none"); |
+ EXPECT_EQ(VPX_CODEC_OK, res); |
+ res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); |
EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); |
- res = vpx_svc_set_scale_factors(&svc_, NULL); |
- EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); |
- |
- svc_.spatial_layers = 2; |
- res = vpx_svc_set_scale_factors(&svc_, "4/16"); |
+ res = vpx_svc_set_options(&svc_, "auto-alt-refs=1,1,1,1,0"); |
EXPECT_EQ(VPX_CODEC_OK, res); |
res = vpx_svc_init(&svc_, &codec_, vpx_codec_vp9_cx(), &codec_enc_); |
EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); |
- res = vpx_svc_set_scale_factors(&svc_, "4/16,16/16"); |
- EXPECT_EQ(VPX_CODEC_OK, res); |
+ vpx_svc_set_options(&svc_, "auto-alt-refs=0,1,1,1,0"); |
InitializeEncoder(); |
} |
@@ -513,39 +515,6 @@ |
FreeBitstreamBuffers(&outputs[0], 3); |
} |
-TEST_F(SvcTest, GetLayerResolution) { |
- svc_.spatial_layers = 2; |
- vpx_svc_set_scale_factors(&svc_, "4/16,8/16"); |
- vpx_svc_set_quantizers(&svc_, "40,30"); |
- |
- InitializeEncoder(); |
- |
- // ensure that requested layer is a valid layer |
- uint32_t layer_width, layer_height; |
- vpx_codec_err_t res = vpx_svc_get_layer_resolution(&svc_, svc_.spatial_layers, |
- &layer_width, &layer_height); |
- EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); |
- |
- res = vpx_svc_get_layer_resolution(NULL, 0, &layer_width, &layer_height); |
- EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); |
- |
- res = vpx_svc_get_layer_resolution(&svc_, 0, NULL, &layer_height); |
- EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); |
- |
- res = vpx_svc_get_layer_resolution(&svc_, 0, &layer_width, NULL); |
- EXPECT_EQ(VPX_CODEC_INVALID_PARAM, res); |
- |
- res = vpx_svc_get_layer_resolution(&svc_, 0, &layer_width, &layer_height); |
- EXPECT_EQ(VPX_CODEC_OK, res); |
- EXPECT_EQ(kWidth * 4 / 16, layer_width); |
- EXPECT_EQ(kHeight * 4 / 16, layer_height); |
- |
- res = vpx_svc_get_layer_resolution(&svc_, 1, &layer_width, &layer_height); |
- EXPECT_EQ(VPX_CODEC_OK, res); |
- EXPECT_EQ(kWidth * 8 / 16, layer_width); |
- EXPECT_EQ(kHeight * 8 / 16, layer_height); |
-} |
- |
TEST_F(SvcTest, TwoPassEncode10Frames) { |
// First pass encode |
std::string stats_buf; |