ref: c19de35ed2b772fd21092c727c5e090034876d4f
parent: d55cab425d57b7e73894ac62e28ac505b6b4d6f1
	author: Cheng Chen <chengchen@google.com>
	date: Tue Mar 16 17:27:18 EDT 2021
	
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
--- a/vp8/vp8_cx_iface.c
+++ b/vp8/vp8_cx_iface.c
@@ -1281,14 +1281,26 @@
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 */} },
};
--- a/vp9/vp9_cx_iface.c
+++ b/vp9/vp9_cx_iface.c
@@ -1883,14 +1883,26 @@
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} },
};
--- a/vpx/vpx_encoder.h
+++ b/vpx/vpx_encoder.h
@@ -693,6 +693,90 @@
*
*/
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
--- a/vpxenc.c
+++ b/vpxenc.c
@@ -287,6 +287,46 @@
&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 @@
#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 @@
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 @@
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,
--
⑨