summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--vp8/vp8_cx_iface.c2
-rw-r--r--vp9/encoder/vp9_firstpass.c125
-rw-r--r--vp9/encoder/vp9_firstpass.h4
-rw-r--r--vp9/vp9_cx_iface.c4
-rw-r--r--vpx/vpx_encoder.h30
-rw-r--r--vpxenc.c10
6 files changed, 72 insertions, 103 deletions
diff --git a/vp8/vp8_cx_iface.c b/vp8/vp8_cx_iface.c
index 1ffd81924..64d01e535 100644
--- a/vp8/vp8_cx_iface.c
+++ b/vp8/vp8_cx_iface.c
@@ -258,6 +258,7 @@ static vpx_codec_err_t validate_config(vpx_codec_alg_priv_t *ctx,
#endif
// The range below shall be further tuned.
+ RANGE_CHECK(cfg, use_vizier_rc_params, 0, 1);
RANGE_CHECK(cfg, active_wq_factor.den, 1, 1000);
RANGE_CHECK(cfg, base_err_per_mb.den, 1, 1000);
RANGE_CHECK(cfg, sr_default_decay_limit.den, 1, 1000);
@@ -1302,6 +1303,7 @@ static vpx_codec_enc_cfg_map_t vp8e_usage_cfg_map[] = {
{ 0 }, /* ts_layer_id */
{ 0 }, /* layer_target_bitrate */
0, /* temporal_layering_mode */
+ 0, /* use_vizier_rc_params */
{ 0, 1 }, /* active_wq_factor */
{ 0, 1 }, /* base_err_per_mb */
{ 0, 1 }, /* sr_default_decay_limit */
diff --git a/vp9/encoder/vp9_firstpass.c b/vp9/encoder/vp9_firstpass.c
index c364687d4..76ef11909 100644
--- a/vp9/encoder/vp9_firstpass.c
+++ b/vp9/encoder/vp9_firstpass.c
@@ -3492,109 +3492,32 @@ static int is_skippable_frame(const VP9_COMP *cpi) {
// Configure image size specific vizier parameters.
// Later these will be set via additional command line options
static void init_vizier_params(TWO_PASS *const twopass, int screen_area) {
- if (1) {
- // Force defaults for now
- twopass->active_wq_factor = AV_WQ_FACTOR;
- twopass->base_err_per_mb = BASELINE_ERR_PER_MB;
- twopass->sr_default_decay_limit = DEFAULT_DECAY_LIMIT;
- twopass->sr_diff_factor = 1.0;
- twopass->gf_frame_max_boost = GF_MAX_FRAME_BOOST;
- twopass->gf_max_total_boost = MAX_GF_BOOST;
- if (screen_area < 1280 * 720) {
- twopass->kf_err_per_mb = 2000.0;
- } else if (screen_area < 1920 * 1080) {
- twopass->kf_err_per_mb = 500.0;
- } else {
- twopass->kf_err_per_mb = 250.0;
- }
- twopass->kf_frame_min_boost = KF_MIN_FRAME_BOOST;
- twopass->kf_frame_max_boost_first = KF_MAX_FRAME_BOOST;
- twopass->kf_frame_max_boost_subs = twopass->kf_frame_max_boost_first;
- twopass->kf_max_total_boost = MAX_KF_TOT_BOOST;
- twopass->zm_factor = 1.0;
+ // When |use_vizier_rc_params| is 1, we expect the rc parameters have been
+ // initialized by the pass in values.
+ // Be careful that parameters below are only initialized to 0, if we do not
+ // pass values to them. It is desired to take care of each parameter when
+ // using |use_vizier_rc_params|.
+ if (twopass->use_vizier_rc_params) return;
+
+ // When |use_vizier_rc_params| is 0, use defaults for now.
+ twopass->active_wq_factor = AV_WQ_FACTOR;
+ twopass->base_err_per_mb = BASELINE_ERR_PER_MB;
+ twopass->sr_default_decay_limit = DEFAULT_DECAY_LIMIT;
+ twopass->sr_diff_factor = 1.0;
+ twopass->gf_frame_max_boost = GF_MAX_FRAME_BOOST;
+ twopass->gf_max_total_boost = MAX_GF_BOOST;
+ if (screen_area < 1280 * 720) {
+ twopass->kf_err_per_mb = 2000.0;
+ } else if (screen_area < 1920 * 1080) {
+ twopass->kf_err_per_mb = 500.0;
} else {
- // Vizer experimental parameters from training.
- // Later these will be set via the command line.
- if (screen_area <= 176 * 144) {
- twopass->active_wq_factor = 46.0;
- twopass->base_err_per_mb = 37597.399760969536;
- twopass->sr_default_decay_limit = 0.3905639800962774;
- twopass->sr_diff_factor = 6.4;
- twopass->gf_frame_max_boost = 87.27362648627846;
- twopass->gf_max_total_boost = MAX_GF_BOOST;
- twopass->kf_err_per_mb = 1854.8255436877148;
- twopass->kf_frame_min_boost = KF_MIN_FRAME_BOOST;
- twopass->kf_frame_max_boost_first = 25.5;
- twopass->kf_frame_max_boost_subs = twopass->kf_frame_max_boost_first;
- twopass->kf_max_total_boost = MAX_KF_TOT_BOOST;
- twopass->zm_factor = 1.0;
- } else if (screen_area <= 320 * 240) {
- twopass->active_wq_factor = 55.0;
- twopass->base_err_per_mb = 34525.33177195309;
- twopass->sr_default_decay_limit = 0.23901360046804604;
- twopass->sr_diff_factor = 5.73;
- twopass->gf_frame_max_boost = 127.34978204980285;
- twopass->gf_max_total_boost = MAX_GF_BOOST;
- twopass->kf_err_per_mb = 723.8337508755031;
- twopass->kf_frame_min_boost = KF_MIN_FRAME_BOOST;
- twopass->kf_frame_max_boost_first = 185.0;
- twopass->kf_frame_max_boost_subs = twopass->kf_frame_max_boost_first;
- twopass->kf_max_total_boost = MAX_KF_TOT_BOOST;
- twopass->zm_factor = 1.0;
- } else if (screen_area <= 640 * 360) {
- twopass->active_wq_factor = 12.5;
- twopass->base_err_per_mb = 18823.978018028298;
- twopass->sr_default_decay_limit = 0.6043527690301296;
- twopass->sr_diff_factor = 2.28;
- twopass->gf_frame_max_boost = 75.17672317013668;
- twopass->gf_max_total_boost = MAX_GF_BOOST;
- twopass->kf_err_per_mb = 422.2871502380377;
- twopass->kf_frame_min_boost = KF_MIN_FRAME_BOOST;
- twopass->kf_frame_max_boost_first = 224.5;
- twopass->kf_frame_max_boost_subs = twopass->kf_frame_max_boost_first;
- twopass->kf_max_total_boost = MAX_KF_TOT_BOOST;
- twopass->zm_factor = 1.0;
- } else if (screen_area <= 854 * 480) {
- twopass->active_wq_factor = 51.5;
- twopass->base_err_per_mb = 33718.98307662595;
- twopass->sr_default_decay_limit = 0.33633414970713393;
- twopass->sr_diff_factor = 5.8;
- twopass->gf_frame_max_boost = 85.2868528581522;
- twopass->gf_max_total_boost = MAX_GF_BOOST;
- twopass->kf_err_per_mb = 1513.4883914008383;
- twopass->kf_frame_min_boost = KF_MIN_FRAME_BOOST;
- twopass->kf_frame_max_boost_first = 28.0;
- twopass->kf_frame_max_boost_subs = twopass->kf_frame_max_boost_first;
- twopass->kf_max_total_boost = MAX_KF_TOT_BOOST;
- twopass->zm_factor = 1.0;
- } else if (screen_area <= 1280 * 720) {
- twopass->active_wq_factor = 41.5;
- twopass->base_err_per_mb = 29527.46375825401;
- twopass->sr_default_decay_limit = 0.5009117586299728;
- twopass->sr_diff_factor = 3.33;
- twopass->gf_frame_max_boost = 81.00472969483079;
- twopass->gf_max_total_boost = MAX_GF_BOOST;
- twopass->kf_err_per_mb = 998.6342911785146;
- twopass->kf_frame_min_boost = KF_MIN_FRAME_BOOST;
- twopass->kf_frame_max_boost_first = 53.0;
- twopass->kf_frame_max_boost_subs = twopass->kf_frame_max_boost_first;
- twopass->kf_max_total_boost = MAX_KF_TOT_BOOST;
- twopass->zm_factor = 1.0;
- } else {
- twopass->active_wq_factor = 31.0;
- twopass->base_err_per_mb = 34474.723463367416;
- twopass->sr_default_decay_limit = 0.23346886902707745;
- twopass->sr_diff_factor = 7.6;
- twopass->gf_frame_max_boost = 213.2940230360479;
- twopass->gf_max_total_boost = MAX_GF_BOOST;
- twopass->kf_err_per_mb = 35931.25734431429;
- twopass->kf_frame_min_boost = KF_MIN_FRAME_BOOST;
- twopass->kf_frame_max_boost_first = 419.5;
- twopass->kf_frame_max_boost_subs = twopass->kf_frame_max_boost_first;
- twopass->kf_max_total_boost = MAX_KF_TOT_BOOST;
- twopass->zm_factor = 1.0;
- }
+ twopass->kf_err_per_mb = 250.0;
}
+ twopass->kf_frame_min_boost = KF_MIN_FRAME_BOOST;
+ twopass->kf_frame_max_boost_first = KF_MAX_FRAME_BOOST;
+ twopass->kf_frame_max_boost_subs = twopass->kf_frame_max_boost_first;
+ twopass->kf_max_total_boost = MAX_KF_TOT_BOOST;
+ twopass->zm_factor = 1.0;
}
void vp9_rc_get_second_pass_params(VP9_COMP *cpi) {
diff --git a/vp9/encoder/vp9_firstpass.h b/vp9/encoder/vp9_firstpass.h
index 441859a34..1418b67a4 100644
--- a/vp9/encoder/vp9_firstpass.h
+++ b/vp9/encoder/vp9_firstpass.h
@@ -223,6 +223,10 @@ typedef struct {
GF_GROUP gf_group;
// Vizeir project experimental two pass rate control parameters.
+ // When |use_vizier_rc_params| is 1, the following parameters will
+ // be overwritten by pass in values. Otherwise, they are initialized
+ // by default values.
+ int use_vizier_rc_params;
double active_wq_factor;
double base_err_per_mb;
double sr_default_decay_limit;
diff --git a/vp9/vp9_cx_iface.c b/vp9/vp9_cx_iface.c
index 94b1afbcc..e35b6f1e2 100644
--- a/vp9/vp9_cx_iface.c
+++ b/vp9/vp9_cx_iface.c
@@ -350,6 +350,7 @@ static vpx_codec_err_t validate_config(vpx_codec_alg_priv_t *ctx,
RANGE_CHECK(extra_cfg, color_range, VPX_CR_STUDIO_RANGE, VPX_CR_FULL_RANGE);
// The range below shall be further tuned.
+ RANGE_CHECK(cfg, use_vizier_rc_params, 0, 1);
RANGE_CHECK(cfg, active_wq_factor.den, 1, 1000);
RANGE_CHECK(cfg, base_err_per_mb.den, 1, 1000);
RANGE_CHECK(cfg, sr_default_decay_limit.den, 1, 1000);
@@ -654,8 +655,10 @@ static vpx_codec_err_t set_encoder_config(
static vpx_codec_err_t set_twopass_params_from_config(
const vpx_codec_enc_cfg_t *const cfg, struct VP9_COMP *cpi) {
+ if (!cfg->use_vizier_rc_params) return VPX_CODEC_OK;
if (cpi == NULL) return VPX_CODEC_ERROR;
+ cpi->twopass.use_vizier_rc_params = cfg->use_vizier_rc_params;
cpi->twopass.active_wq_factor =
(double)cfg->active_wq_factor.num / (double)cfg->active_wq_factor.den;
cpi->twopass.base_err_per_mb =
@@ -1943,6 +1946,7 @@ static vpx_codec_enc_cfg_map_t encoder_usage_cfg_map[] = {
{ 0 }, // ts_layer_id
{ 0 }, // layer_taget_bitrate
0, // temporal_layering_mode
+ 0, // use_vizier_rc_params
{ 0, 1 }, // active_wq_factor
{ 0, 1 }, // base_err_per_mb
{ 0, 1 }, // sr_default_decay_limit
diff --git a/vpx/vpx_encoder.h b/vpx/vpx_encoder.h
index 497051e03..3c9304b37 100644
--- a/vpx/vpx_encoder.h
+++ b/vpx/vpx_encoder.h
@@ -694,9 +694,17 @@ typedef struct vpx_codec_enc_cfg {
*/
int temporal_layering_mode;
+ /*!\brief A flag indicating whether to use external rate control parameters.
+ * By default is 0. If set to 1, the following parameters will be used in the
+ * rate control system.
+ */
+ int use_vizier_rc_params;
+
/*!\brief Active worst quality factor.
*
* Rate control parameters, set from external experiment results.
+ * Only when |use_vizier_rc_params| is set to 1, the pass in value will be
+ * used. Otherwise, the default value is used.
*
*/
vpx_rational_t active_wq_factor;
@@ -704,6 +712,8 @@ typedef struct vpx_codec_enc_cfg {
/*!\brief Base error per macroblock.
*
* Rate control parameters, set from external experiment results.
+ * Only when |use_vizier_rc_params| is set to 1, the pass in value will be
+ * used. Otherwise, the default value is used.
*
*/
vpx_rational_t base_err_per_mb;
@@ -711,6 +721,8 @@ typedef struct vpx_codec_enc_cfg {
/*!\brief Second reference default decay limit.
*
* Rate control parameters, set from external experiment results.
+ * Only when |use_vizier_rc_params| is set to 1, the pass in value will be
+ * used. Otherwise, the default value is used.
*
*/
vpx_rational_t sr_default_decay_limit;
@@ -718,6 +730,8 @@ typedef struct vpx_codec_enc_cfg {
/*!\brief Second reference difference factor.
*
* Rate control parameters, set from external experiment results.
+ * Only when |use_vizier_rc_params| is set to 1, the pass in value will be
+ * used. Otherwise, the default value is used.
*
*/
vpx_rational_t sr_diff_factor;
@@ -725,6 +739,8 @@ typedef struct vpx_codec_enc_cfg {
/*!\brief Keyframe error per macroblock.
*
* Rate control parameters, set from external experiment results.
+ * Only when |use_vizier_rc_params| is set to 1, the pass in value will be
+ * used. Otherwise, the default value is used.
*
*/
vpx_rational_t kf_err_per_mb;
@@ -732,6 +748,8 @@ typedef struct vpx_codec_enc_cfg {
/*!\brief Keyframe minimum boost.
*
* Rate control parameters, set from external experiment results.
+ * Only when |use_vizier_rc_params| is set to 1, the pass in value will be
+ * used. Otherwise, the default value is used.
*
*/
vpx_rational_t kf_frame_min_boost;
@@ -739,6 +757,8 @@ typedef struct vpx_codec_enc_cfg {
/*!\brief Keyframe maximum boost, for the first keyframe in a chunk.
*
* Rate control parameters, set from external experiment results.
+ * Only when |use_vizier_rc_params| is set to 1, the pass in value will be
+ * used. Otherwise, the default value is used.
*
*/
vpx_rational_t kf_frame_max_boost_first;
@@ -746,6 +766,8 @@ typedef struct vpx_codec_enc_cfg {
/*!\brief Keyframe maximum boost, for subsequent keyframes.
*
* Rate control parameters, set from external experiment results.
+ * Only when |use_vizier_rc_params| is set to 1, the pass in value will be
+ * used. Otherwise, the default value is used.
*
*/
vpx_rational_t kf_frame_max_boost_subs;
@@ -753,6 +775,8 @@ typedef struct vpx_codec_enc_cfg {
/*!\brief Keyframe maximum total boost.
*
* Rate control parameters, set from external experiment results.
+ * Only when |use_vizier_rc_params| is set to 1, the pass in value will be
+ * used. Otherwise, the default value is used.
*
*/
vpx_rational_t kf_max_total_boost;
@@ -760,6 +784,8 @@ typedef struct vpx_codec_enc_cfg {
/*!\brief Golden frame maximum total boost.
*
* Rate control parameters, set from external experiment results.
+ * Only when |use_vizier_rc_params| is set to 1, the pass in value will be
+ * used. Otherwise, the default value is used.
*
*/
vpx_rational_t gf_max_total_boost;
@@ -767,6 +793,8 @@ typedef struct vpx_codec_enc_cfg {
/*!\brief Golden frame maximum boost.
*
* Rate control parameters, set from external experiment results.
+ * Only when |use_vizier_rc_params| is set to 1, the pass in value will be
+ * used. Otherwise, the default value is used.
*
*/
vpx_rational_t gf_frame_max_boost;
@@ -774,6 +802,8 @@ typedef struct vpx_codec_enc_cfg {
/*!\brief Zero motion power factor.
*
* Rate control parameters, set from external experiment results.
+ * Only when |use_vizier_rc_params| is set to 1, the pass in value will be
+ * used. Otherwise, the default value is used.
*
*/
vpx_rational_t zm_factor;
diff --git a/vpxenc.c b/vpxenc.c
index 874dddb13..c9e386a06 100644
--- a/vpxenc.c
+++ b/vpxenc.c
@@ -288,6 +288,8 @@ static const arg_def_t *rc_args[] = {
};
#if CONFIG_VP9_ENCODER
+static const arg_def_t use_vizier_rc_params =
+ ARG_DEF(NULL, "use-vizier-rc-params", 1, "Use vizier rc params");
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 =
@@ -311,8 +313,9 @@ static const arg_def_t gf_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_factor =
- ARG_DEF(NULL, "zm-power-factor", 1, "Zero motion power factor");
-static const arg_def_t *vizier_rc_args[] = { &active_wq_factor,
+ ARG_DEF(NULL, "zm-factor", 1, "Zero motion power factor");
+static const arg_def_t *vizier_rc_args[] = { &use_vizier_rc_params,
+ &active_wq_factor,
&base_err_per_mb,
&sr_default_decay_limit,
&sr_diff_factor,
@@ -1026,6 +1029,8 @@ static int parse_stream_params(struct VpxEncoderConfig *global,
} else if (arg_match(&arg, &kf_disabled, argi)) {
config->cfg.kf_mode = VPX_KF_DISABLED;
#if CONFIG_VP9_ENCODER
+ } else if (arg_match(&arg, &use_vizier_rc_params, argi)) {
+ config->cfg.use_vizier_rc_params = arg_parse_int(&arg);
} 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)) {
@@ -1246,6 +1251,7 @@ static void show_stream_config(struct stream_state *stream,
SHOW(kf_min_dist);
SHOW(kf_max_dist);
// Temporary use for debug
+ SHOW(use_vizier_rc_params);
SHOW(active_wq_factor.num);
SHOW(active_wq_factor.den);
}