[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
This commit is contained in:
Родитель
d3a7e677e6
Коммит
76885de5ad
|
@ -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");
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
Загрузка…
Ссылка в новой задаче