From 76885de5ad2eb02970231d0f92e9691d9a5beb24 Mon Sep 17 00:00:00 2001 From: Minghai Shang Date: Wed, 17 Sep 2014 17:39:16 -0700 Subject: [PATCH] [spatial svc] Use string for quantizers and scale-factors option in the test app 1. This is to align with the ffmpeg implementation 2. Remove APIs for setting quantizers and scale-factors Change-Id: I6e238d71db790a9fb3254baaeb61e2a5aac58f48 --- examples/vp9_spatial_svc_encoder.c | 11 +++++- test/svc_test.cc | 60 ++++++++---------------------- vpx/exports_enc | 2 - vpx/src/svc_encodeframe.c | 42 +-------------------- vpx/svc_context.h | 16 -------- 5 files changed, 26 insertions(+), 105 deletions(-) diff --git a/examples/vp9_spatial_svc_encoder.c b/examples/vp9_spatial_svc_encoder.c index 7ce3403f5..df8f4f1b5 100644 --- a/examples/vp9_spatial_svc_encoder.c +++ b/examples/vp9_spatial_svc_encoder.c @@ -119,6 +119,7 @@ static void parse_command_line(int argc, const char **argv_, const char *fpf_file_name = NULL; unsigned int min_bitrate = 0; unsigned int max_bitrate = 0; + char string_options[1024] = {0}; // initialize SvcContext with parameters that will be passed to vpx_svc_init svc_ctx->log_level = SVC_LOG_DEBUG; @@ -169,9 +170,11 @@ static void parse_command_line(int argc, const char **argv_, enc_cfg->kf_min_dist = arg_parse_uint(&arg); enc_cfg->kf_max_dist = enc_cfg->kf_min_dist; } else if (arg_match(&arg, &scale_factors_arg, argi)) { - vpx_svc_set_scale_factors(svc_ctx, arg.val); + snprintf(string_options, 1024, "%s scale-factors=%s", + string_options, arg.val); } else if (arg_match(&arg, &quantizers_arg, argi)) { - vpx_svc_set_quantizers(svc_ctx, arg.val); + snprintf(string_options, 1024, "%s quantizers=%s", + string_options, arg.val); } else if (arg_match(&arg, &passes_arg, argi)) { passes = arg_parse_uint(&arg); if (passes < 1 || passes > 2) { @@ -197,6 +200,10 @@ static void parse_command_line(int argc, const char **argv_, } } + // There will be a space in front of the string options + if (strlen(string_options) > 0) + vpx_svc_set_options(svc_ctx, string_options + 1); + if (passes == 0 || passes == 1) { if (pass) { fprintf(stderr, "pass is ignored since there's only one pass\n"); diff --git a/test/svc_test.cc b/test/svc_test.cc index 5035dee40..a877a9d75 100644 --- a/test/svc_test.cc +++ b/test/svc_test.cc @@ -399,11 +399,6 @@ TEST_F(SvcTest, SvcInit) { 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(); } @@ -440,6 +435,16 @@ TEST_F(SvcTest, SetScaleFactorsOption) { 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(); @@ -452,6 +457,11 @@ TEST_F(SvcTest, SetQuantizersOption) { 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_, "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_, "quantizers=40,45"); InitializeEncoder(); } @@ -472,42 +482,6 @@ TEST_F(SvcTest, SetAutoAltRefOption) { InitializeEncoder(); } -TEST_F(SvcTest, SetQuantizers) { - vpx_codec_err_t res = vpx_svc_set_quantizers(NULL, "40,30"); - 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"); - 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); - InitializeEncoder(); -} - -TEST_F(SvcTest, SetScaleFactors) { - vpx_codec_err_t res = vpx_svc_set_scale_factors(NULL, "4/16,16/16"); - 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"); - 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); - InitializeEncoder(); -} - // Test that decoder can handle an SVC frame as the first frame in a sequence. TEST_F(SvcTest, OnePassEncodeOneFrame) { codec_enc_.g_pass = VPX_RC_ONE_PASS; @@ -528,9 +502,7 @@ TEST_F(SvcTest, OnePassEncodeThreeFrames) { 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"); - + vpx_svc_set_options(&svc_, "scale-factors=4/16,8/16"); InitializeEncoder(); // ensure that requested layer is a valid layer diff --git a/vpx/exports_enc b/vpx/exports_enc index 40478eb42..fd66fb3ff 100644 --- a/vpx/exports_enc +++ b/vpx/exports_enc @@ -12,6 +12,4 @@ text vpx_svc_get_message text vpx_svc_init text vpx_svc_release text vpx_svc_set_options -text vpx_svc_set_quantizers -text vpx_svc_set_scale_factors text vpx_svc_get_layer_resolution diff --git a/vpx/src/svc_encodeframe.c b/vpx/src/svc_encodeframe.c index ff54b8d3f..7b36ff4e3 100644 --- a/vpx/src/svc_encodeframe.c +++ b/vpx/src/svc_encodeframe.c @@ -44,7 +44,7 @@ _CRTIMP char *__cdecl strtok_s(char *str, const char *delim, char **context); #define SVC_REFERENCE_FRAMES 8 #define SUPERFRAME_SLOTS (8) #define SUPERFRAME_BUFFER_SIZE (SUPERFRAME_SLOTS * sizeof(uint32_t) + 2) -#define OPTION_BUFFER_SIZE 256 +#define OPTION_BUFFER_SIZE 1024 #define COMPONENTS 4 // psnr & sse statistics maintained for total, y, u, v static const int DEFAULT_QUANTIZER_VALUES[VPX_SS_MAX_LAYERS] = { @@ -85,8 +85,6 @@ typedef struct FrameData { typedef struct SvcInternal { char options[OPTION_BUFFER_SIZE]; // set by vpx_svc_set_options - char quantizers[OPTION_BUFFER_SIZE]; // set by vpx_svc_set_quantizers - char scale_factors[OPTION_BUFFER_SIZE]; // set by vpx_svc_set_scale_factors // values extracted from option, quantizers int scaling_factor_num[VPX_SS_MAX_LAYERS]; @@ -316,28 +314,6 @@ vpx_codec_err_t vpx_svc_set_options(SvcContext *svc_ctx, const char *options) { return VPX_CODEC_OK; } -vpx_codec_err_t vpx_svc_set_quantizers(SvcContext *svc_ctx, - const char *quantizers) { - SvcInternal *const si = get_svc_internal(svc_ctx); - if (svc_ctx == NULL || quantizers == NULL || si == NULL) { - return VPX_CODEC_INVALID_PARAM; - } - strncpy(si->quantizers, quantizers, sizeof(si->quantizers)); - si->quantizers[sizeof(si->quantizers) - 1] = '\0'; - return VPX_CODEC_OK; -} - -vpx_codec_err_t vpx_svc_set_scale_factors(SvcContext *svc_ctx, - const char *scale_factors) { - SvcInternal *const si = get_svc_internal(svc_ctx); - if (svc_ctx == NULL || scale_factors == NULL || si == NULL) { - return VPX_CODEC_INVALID_PARAM; - } - strncpy(si->scale_factors, scale_factors, sizeof(si->scale_factors)); - si->scale_factors[sizeof(si->scale_factors) - 1] = '\0'; - return VPX_CODEC_OK; -} - void assign_layer_bitrates(const SvcContext *svc_ctx, vpx_codec_enc_cfg_t *const enc_cfg) { int i; @@ -411,22 +387,6 @@ vpx_codec_err_t vpx_svc_init(SvcContext *svc_ctx, vpx_codec_ctx_t *codec_ctx, si->scaling_factor_den[i] = DEFAULT_SCALE_FACTORS_DEN[i]; } - if (strlen(si->quantizers) > 0) { - res = parse_layer_options_from_string(svc_ctx, QUANTIZER, si->quantizers, - si->quantizer, NULL); - if (res != VPX_CODEC_OK) - return res; - } - - if (strlen(si->scale_factors) > 0) { - res = parse_layer_options_from_string(svc_ctx, SCALE_FACTOR, - si->scale_factors, - si->scaling_factor_num, - si->scaling_factor_den); - if (res != VPX_CODEC_OK) - return res; - } - // Parse aggregate command line options. Options must start with // "layers=xx" then followed by other options res = parse_options(svc_ctx, si->options); diff --git a/vpx/svc_context.h b/vpx/svc_context.h index fe638e416..8e9871724 100644 --- a/vpx/svc_context.h +++ b/vpx/svc_context.h @@ -51,22 +51,6 @@ typedef struct { */ vpx_codec_err_t vpx_svc_set_options(SvcContext *svc_ctx, const char *options); -/** - * Set SVC quantizer values - * values comma separated, ordered from lowest resolution to highest - * e.g., "60,53,39,33,27" - */ -vpx_codec_err_t vpx_svc_set_quantizers(SvcContext *svc_ctx, - const char *quantizer_values); - -/** - * Set SVC scale factors - * values comma separated, ordered from lowest resolution to highest - * e.g., "4/16,5/16,7/16,11/16,16/16" - */ -vpx_codec_err_t vpx_svc_set_scale_factors(SvcContext *svc_ctx, - const char *scale_factors); - /** * initialize SVC encoding */