From: Cheng Chen Date: Wed, 17 Mar 2021 04:27:18 +0000 (-0700) Subject: Add command line options for a few rc parameters X-Git-Tag: v1.11.0-rc1~72 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c19de35ed2b772fd21092c727c5e090034876d4f;p=libvpx Add command line options for a few rc parameters These rate control parameters are for the Vizier experiment. They are defined as rational numbers. Change-Id: I23f382dd49158db463b75b5ad8a82d8e0d536308 --- diff --git a/vp8/vp8_cx_iface.c b/vp8/vp8_cx_iface.c index 32dd3c770..32bb1d04f 100644 --- a/vp8/vp8_cx_iface.c +++ b/vp8/vp8_cx_iface.c @@ -1281,14 +1281,26 @@ static vpx_codec_enc_cfg_map_t vp8e_usage_cfg_map[] = { VPX_SS_DEFAULT_LAYERS, /* ss_number_layers */ { 0 }, - { 0 }, /* ss_target_bitrate */ - 1, /* ts_number_layers */ - { 0 }, /* ts_target_bitrate */ - { 0 }, /* ts_rate_decimator */ - 0, /* ts_periodicity */ - { 0 }, /* ts_layer_id */ - { 0 }, /* layer_target_bitrate */ - 0 /* temporal_layering_mode */ + { 0 }, /* ss_target_bitrate */ + 1, /* ts_number_layers */ + { 0 }, /* ts_target_bitrate */ + { 0 }, /* ts_rate_decimator */ + 0, /* ts_periodicity */ + { 0 }, /* ts_layer_id */ + { 0 }, /* layer_target_bitrate */ + 0, /* temporal_layering_mode */ + { 0, 0 }, /* active_wq_factor */ + { 0, 0 }, /* base_err_per_mb */ + { 0, 0 }, /* sr_default_decay_limit */ + { 0, 0 }, /* sr_diff_factor */ + { 0, 0 }, /* kf_err_per_mb */ + { 0, 0 }, /* kf_frame_min_boost */ + { 0, 0 }, /* kf_frame_max_boost_first */ + { 0, 0 }, /* kf_frame_max_boost_subs */ + { 0, 0 }, /* kf_max_total_boost */ + { 0, 0 }, /* gf_max_total_boost */ + { 0, 0 }, /* gf_frame_max_boost */ + { 0, 0 }, /* zm_power_factor */ } }, }; diff --git a/vp9/vp9_cx_iface.c b/vp9/vp9_cx_iface.c index ecfacfaf4..75dda0bed 100644 --- a/vp9/vp9_cx_iface.c +++ b/vp9/vp9_cx_iface.c @@ -1883,14 +1883,26 @@ static vpx_codec_enc_cfg_map_t encoder_usage_cfg_map[] = { VPX_SS_DEFAULT_LAYERS, // ss_number_layers { 0 }, - { 0 }, // ss_target_bitrate - 1, // ts_number_layers - { 0 }, // ts_target_bitrate - { 0 }, // ts_rate_decimator - 0, // ts_periodicity - { 0 }, // ts_layer_id - { 0 }, // layer_taget_bitrate - 0 // temporal_layering_mode + { 0 }, // ss_target_bitrate + 1, // ts_number_layers + { 0 }, // ts_target_bitrate + { 0 }, // ts_rate_decimator + 0, // ts_periodicity + { 0 }, // ts_layer_id + { 0 }, // layer_taget_bitrate + 0, // temporal_layering_mode + { 0, 0 }, // active_wq_factor + { 0, 0 }, // base_err_per_mb + { 0, 0 }, // sr_default_decay_limit + { 0, 0 }, // sr_diff_factor + { 0, 0 }, // kf_err_per_mb + { 0, 0 }, // kf_frame_min_boost + { 0, 0 }, // kf_frame_max_boost_first + { 0, 0 }, // kf_frame_max_boost_subs + { 0, 0 }, // kf_max_total_boost + { 0, 0 }, // gf_max_total_boost + { 0, 0 }, // gf_frame_max_boost + { 0, 0 }, // zm_power_factor } }, }; diff --git a/vpx/vpx_encoder.h b/vpx/vpx_encoder.h index da3609577..accc127f6 100644 --- a/vpx/vpx_encoder.h +++ b/vpx/vpx_encoder.h @@ -693,6 +693,90 @@ typedef struct vpx_codec_enc_cfg { * */ int temporal_layering_mode; + + /*!\brief Active worst quality factor. + * + * Rate control parameters, set from external experiment results. + * + */ + vpx_rational_t active_wq_factor; + + /*!\brief Base error per macroblock. + * + * Rate control parameters, set from external experiment results. + * + */ + vpx_rational_t base_err_per_mb; + + /*!\brief Second reference default decay limit. + * + * Rate control parameters, set from external experiment results. + * + */ + vpx_rational_t sr_default_decay_limit; + + /*!\brief Second reference difference factor. + * + * Rate control parameters, set from external experiment results. + * + */ + vpx_rational_t sr_diff_factor; + + /*!\brief Keyframe error per macroblock. + * + * Rate control parameters, set from external experiment results. + * + */ + vpx_rational_t kf_err_per_mb; + + /*!\brief Keyframe minimum boost. + * + * Rate control parameters, set from external experiment results. + * + */ + vpx_rational_t kf_frame_min_boost; + + /*!\brief Keyframe maximum boost, for the first keyframe in a chunk. + * + * Rate control parameters, set from external experiment results. + * + */ + vpx_rational_t kf_frame_max_boost_first; + + /*!\brief Keyframe maximum boost, for subsequent keyframes. + * + * Rate control parameters, set from external experiment results. + * + */ + vpx_rational_t kf_frame_max_boost_subs; + + /*!\brief Keyframe maximum total boost. + * + * Rate control parameters, set from external experiment results. + * + */ + vpx_rational_t kf_max_total_boost; + + /*!\brief Golden frame maximum total boost. + * + * Rate control parameters, set from external experiment results. + * + */ + vpx_rational_t gf_max_total_boost; + + /*!\brief Golden frame maximum boost. + * + * Rate control parameters, set from external experiment results. + * + */ + vpx_rational_t gf_frame_max_boost; + + /*!\brief Zero motion power factor. + * + * Rate control parameters, set from external experiment results. + * + */ + vpx_rational_t zm_power_factor; } vpx_codec_enc_cfg_t; /**< alias for struct vpx_codec_enc_cfg */ /*!\brief vp9 svc extra configure parameters diff --git a/vpxenc.c b/vpxenc.c index 5042e688c..3c04c64b3 100644 --- a/vpxenc.c +++ b/vpxenc.c @@ -287,6 +287,46 @@ static const arg_def_t *rc_args[] = { &buf_sz, &buf_initial_sz, &buf_optimal_sz, NULL }; +#if CONFIG_VP9_ENCODER +static const arg_def_t active_wq_factor = + ARG_DEF(NULL, "active-wq-factor", 1, "Active worst quality factor"); +static const arg_def_t base_err_per_mb = + ARG_DEF(NULL, "base-err-per-mb", 1, "Base error per macroblock"); +static const arg_def_t sr_default_decay_limit = ARG_DEF( + NULL, "sr-default-decay-limit", 1, "Second reference default decay limit"); +static const arg_def_t sr_diff_factor = + ARG_DEF(NULL, "sr-diff-factor", 1, "Second reference diff factor"); +static const arg_def_t kf_err_per_mb = + ARG_DEF(NULL, "kf-err-per-mb", 1, "Keyframe error per macroblock"); +static const arg_def_t kf_frame_min_boost = + ARG_DEF(NULL, "kf-frame-min-boost", 1, "Keyframe min boost"); +static const arg_def_t kf_frame_max_boost_first = ARG_DEF( + NULL, "kf-frame-max-boost-first", 1, "Max for the first keyframe boost"); +static const arg_def_t kf_frame_max_boost_subs = ARG_DEF( + NULL, "kf-frame-max-boost-subs", 1, "Max for subsequent keyframe boost"); +static const arg_def_t kf_max_total_boost = + ARG_DEF(NULL, "kf-max-total-boost", 1, "Keyframe max total boost"); +static const arg_def_t gf_max_total_boost = + ARG_DEF(NULL, "gf-max-total-boost", 1, "Golden frame max total boost"); +static const arg_def_t gf_frame_max_boost = + ARG_DEF(NULL, "gf-frame-max-boost", 1, "Golden frame max boost"); +static const arg_def_t zm_power_factor = + ARG_DEF(NULL, "zm-power-factor", 1, "Zero motion power factor"); +static const arg_def_t *vizier_rc_args[] = { &active_wq_factor, + &base_err_per_mb, + &sr_default_decay_limit, + &sr_diff_factor, + &kf_err_per_mb, + &kf_frame_min_boost, + &kf_frame_max_boost_first, + &kf_frame_max_boost_subs, + &kf_max_total_boost, + &gf_max_total_boost, + &gf_frame_max_boost, + &zm_power_factor, + NULL }; +#endif + static const arg_def_t bias_pct = ARG_DEF(NULL, "bias-pct", 1, "CBR/VBR bias (0=CBR, 100=VBR)"); static const arg_def_t minsection_pct = @@ -573,6 +613,8 @@ static void show_help(FILE *fout, int shorthelp) { #if CONFIG_VP9_ENCODER fprintf(fout, "\nVP9 Specific Options:\n"); arg_show_usage(fout, vp9_args); + fprintf(fout, "\nVizier Rate Control Options:\n"); + arg_show_usage(fout, vizier_rc_args); #endif fprintf(fout, "\nStream timebase (--timebase):\n" @@ -983,6 +1025,32 @@ static int parse_stream_params(struct VpxEncoderConfig *global, config->cfg.kf_max_dist = arg_parse_uint(&arg); } else if (arg_match(&arg, &kf_disabled, argi)) { config->cfg.kf_mode = VPX_KF_DISABLED; +#if CONFIG_VP9_ENCODER + } else if (arg_match(&arg, &active_wq_factor, argi)) { + config->cfg.active_wq_factor = arg_parse_rational(&arg); + } else if (arg_match(&arg, &base_err_per_mb, argi)) { + config->cfg.base_err_per_mb = arg_parse_rational(&arg); + } else if (arg_match(&arg, &sr_default_decay_limit, argi)) { + config->cfg.sr_default_decay_limit = arg_parse_rational(&arg); + } else if (arg_match(&arg, &sr_diff_factor, argi)) { + config->cfg.sr_diff_factor = arg_parse_rational(&arg); + } else if (arg_match(&arg, &kf_err_per_mb, argi)) { + config->cfg.kf_err_per_mb = arg_parse_rational(&arg); + } else if (arg_match(&arg, &kf_frame_min_boost, argi)) { + config->cfg.kf_frame_min_boost = arg_parse_rational(&arg); + } else if (arg_match(&arg, &kf_frame_max_boost_first, argi)) { + config->cfg.kf_frame_max_boost_first = arg_parse_rational(&arg); + } else if (arg_match(&arg, &kf_frame_max_boost_subs, argi)) { + config->cfg.kf_frame_max_boost_subs = arg_parse_rational(&arg); + } else if (arg_match(&arg, &kf_max_total_boost, argi)) { + config->cfg.kf_max_total_boost = arg_parse_rational(&arg); + } else if (arg_match(&arg, &gf_max_total_boost, argi)) { + config->cfg.gf_max_total_boost = arg_parse_rational(&arg); + } else if (arg_match(&arg, &gf_frame_max_boost, argi)) { + config->cfg.gf_frame_max_boost = arg_parse_rational(&arg); + } else if (arg_match(&arg, &zm_power_factor, argi)) { + config->cfg.zm_power_factor = arg_parse_rational(&arg); +#endif #if CONFIG_VP9_HIGHBITDEPTH } else if (arg_match(&arg, &test16bitinternalarg, argi)) { if (strcmp(global->codec->name, "vp9") == 0) { @@ -1177,6 +1245,9 @@ static void show_stream_config(struct stream_state *stream, SHOW(kf_mode); SHOW(kf_min_dist); SHOW(kf_max_dist); + // Temporary use for debug + SHOW(active_wq_factor.num); + SHOW(active_wq_factor.den); } static void open_output_file(struct stream_state *stream,