Add a new control of golden frame boost in CBR mode
0 means that golden boost is off, and uses average frame target rate, a non-zero number means the percentage of boost over average frame bitrate is given initially to golden frames in CBR mode. Change-Id: If4334fe2cc424b65ae0cce27f71b5561bf1e577d
This commit is contained in:
@@ -126,6 +126,8 @@ typedef struct VP9EncoderConfig {
|
||||
unsigned int rc_max_intra_bitrate_pct;
|
||||
// maximum allowed bitrate for any inter frame in % of bitrate target.
|
||||
unsigned int rc_max_inter_bitrate_pct;
|
||||
// percent of rate boost for golden frame in CBR mode.
|
||||
unsigned int gf_cbr_boost_pct;
|
||||
|
||||
MODE mode;
|
||||
int pass;
|
||||
|
@@ -34,6 +34,7 @@ struct vp9_extracfg {
|
||||
unsigned int cq_level; // constrained quality level
|
||||
unsigned int rc_max_intra_bitrate_pct;
|
||||
unsigned int rc_max_inter_bitrate_pct;
|
||||
unsigned int gf_cbr_boost_pct;
|
||||
unsigned int lossless;
|
||||
unsigned int frame_parallel_decoding_mode;
|
||||
AQ_MODE aq_mode;
|
||||
@@ -56,6 +57,7 @@ static struct vp9_extracfg default_extra_cfg = {
|
||||
10, // cq_level
|
||||
0, // rc_max_intra_bitrate_pct
|
||||
0, // rc_max_inter_bitrate_pct
|
||||
0, // gf_cbr_boost_pct
|
||||
0, // lossless
|
||||
0, // frame_parallel_decoding_mode
|
||||
NO_AQ, // aq_mode
|
||||
@@ -383,6 +385,7 @@ static vpx_codec_err_t set_encoder_config(
|
||||
oxcf->target_bandwidth = 1000 * cfg->rc_target_bitrate;
|
||||
oxcf->rc_max_intra_bitrate_pct = extra_cfg->rc_max_intra_bitrate_pct;
|
||||
oxcf->rc_max_inter_bitrate_pct = extra_cfg->rc_max_inter_bitrate_pct;
|
||||
oxcf->gf_cbr_boost_pct = extra_cfg->gf_cbr_boost_pct;
|
||||
|
||||
oxcf->best_allowed_q =
|
||||
extra_cfg->lossless ? 0 : vp9_quantizer_to_qindex(cfg->rc_min_quantizer);
|
||||
@@ -660,6 +663,14 @@ static vpx_codec_err_t ctrl_set_rc_max_inter_bitrate_pct(
|
||||
return update_extra_cfg(ctx, &extra_cfg);
|
||||
}
|
||||
|
||||
static vpx_codec_err_t ctrl_set_rc_gf_cbr_boost_pct(
|
||||
vpx_codec_alg_priv_t *ctx, va_list args) {
|
||||
struct vp9_extracfg extra_cfg = ctx->extra_cfg;
|
||||
extra_cfg.gf_cbr_boost_pct =
|
||||
CAST(VP8E_SET_GF_CBR_BOOST_PCT, args);
|
||||
return update_extra_cfg(ctx, &extra_cfg);
|
||||
}
|
||||
|
||||
static vpx_codec_err_t ctrl_set_lossless(vpx_codec_alg_priv_t *ctx,
|
||||
va_list args) {
|
||||
struct vp9_extracfg extra_cfg = ctx->extra_cfg;
|
||||
@@ -1278,6 +1289,7 @@ static vpx_codec_ctrl_fn_map_t encoder_ctrl_maps[] = {
|
||||
{VP8E_SET_CQ_LEVEL, ctrl_set_cq_level},
|
||||
{VP8E_SET_MAX_INTRA_BITRATE_PCT, ctrl_set_rc_max_intra_bitrate_pct},
|
||||
{VP8E_SET_MAX_INTER_BITRATE_PCT, ctrl_set_rc_max_inter_bitrate_pct},
|
||||
{VP8E_SET_GF_CBR_BOOST_PCT, ctrl_set_rc_gf_cbr_boost_pct},
|
||||
{VP9E_SET_LOSSLESS, ctrl_set_lossless},
|
||||
{VP9E_SET_FRAME_PARALLEL_DECODING, ctrl_set_frame_parallel_decoding_mode},
|
||||
{VP9E_SET_AQ_MODE, ctrl_set_aq_mode},
|
||||
|
14
vpx/vp8cx.h
14
vpx/vp8cx.h
@@ -208,6 +208,19 @@ enum vp8e_enc_control_id {
|
||||
*/
|
||||
VP8E_SET_MAX_INTER_BITRATE_PCT,
|
||||
|
||||
/*!\brief Boost percentage for Golden Frame in CBR mode
|
||||
*
|
||||
* This value controls the amount of boost given to Golden Frame in
|
||||
* CBR mode. It is expressed as a percentage of the average
|
||||
* per-frame bitrate, with the special (and default) value 0 meaning
|
||||
* the feature is off, i.e., no golden frame boost in CBR mode and
|
||||
* average bitrate target is used.
|
||||
*
|
||||
* For example, to allow 100% more bits, i.e, 2X, in a golden frame
|
||||
* than average frame, set this to 100.
|
||||
*
|
||||
*/
|
||||
VP8E_SET_GF_CBR_BOOST_PCT,
|
||||
|
||||
/* TODO(jkoleszar): Move to vp9cx.h */
|
||||
VP9E_SET_LOSSLESS,
|
||||
@@ -376,6 +389,7 @@ VPX_CTRL_USE_TYPE(VP8E_GET_LAST_QUANTIZER_64, int *)
|
||||
VPX_CTRL_USE_TYPE(VP8E_SET_MAX_INTRA_BITRATE_PCT, unsigned int)
|
||||
VPX_CTRL_USE_TYPE(VP8E_SET_MAX_INTER_BITRATE_PCT, unsigned int)
|
||||
|
||||
VPX_CTRL_USE_TYPE(VP8E_SET_GF_CBR_BOOST_PCT, unsigned int)
|
||||
VPX_CTRL_USE_TYPE(VP9E_SET_LOSSLESS, unsigned int)
|
||||
|
||||
VPX_CTRL_USE_TYPE(VP9E_SET_FRAME_PARALLEL_DECODING, unsigned int)
|
||||
|
7
vpxenc.c
7
vpxenc.c
@@ -351,6 +351,8 @@ static const arg_def_t max_intra_rate_pct = ARG_DEF(
|
||||
NULL, "max-intra-rate", 1, "Max I-frame bitrate (pct)");
|
||||
static const arg_def_t max_inter_rate_pct = ARG_DEF(
|
||||
NULL, "max-inter-rate", 1, "Max P-frame bitrate (pct)");
|
||||
static const arg_def_t gf_cbr_boost_pct = ARG_DEF(
|
||||
NULL, "gf-cbr-boost", 1, "Boost for Golden Frame in CBR mode (pct)");
|
||||
|
||||
#if CONFIG_VP8_ENCODER
|
||||
static const arg_def_t token_parts = ARG_DEF(
|
||||
@@ -416,7 +418,8 @@ static const arg_def_t tune_content = ARG_DEF_ENUM(
|
||||
static const arg_def_t *vp9_args[] = {
|
||||
&cpu_used, &auto_altref, &sharpness, &static_thresh,
|
||||
&tile_cols, &tile_rows, &arnr_maxframes, &arnr_strength, &arnr_type,
|
||||
&tune_ssim, &cq_level, &max_intra_rate_pct, &max_inter_rate_pct, &lossless,
|
||||
&tune_ssim, &cq_level, &max_intra_rate_pct, &max_inter_rate_pct,
|
||||
&gf_cbr_boost_pct, &lossless,
|
||||
&frame_parallel_decoding, &aq_mode, &frame_periodic_boost,
|
||||
&noise_sens, &tune_content,
|
||||
#if CONFIG_VP9 && CONFIG_VP9_HIGHBITDEPTH
|
||||
@@ -430,7 +433,7 @@ static const int vp9_arg_ctrl_map[] = {
|
||||
VP9E_SET_TILE_COLUMNS, VP9E_SET_TILE_ROWS,
|
||||
VP8E_SET_ARNR_MAXFRAMES, VP8E_SET_ARNR_STRENGTH, VP8E_SET_ARNR_TYPE,
|
||||
VP8E_SET_TUNING, VP8E_SET_CQ_LEVEL, VP8E_SET_MAX_INTRA_BITRATE_PCT,
|
||||
VP8E_SET_MAX_INTER_BITRATE_PCT,
|
||||
VP8E_SET_MAX_INTER_BITRATE_PCT, VP8E_SET_GF_CBR_BOOST_PCT,
|
||||
VP9E_SET_LOSSLESS, VP9E_SET_FRAME_PARALLEL_DECODING, VP9E_SET_AQ_MODE,
|
||||
VP9E_SET_FRAME_PERIODIC_BOOST, VP9E_SET_NOISE_SENSITIVITY,
|
||||
VP9E_SET_TUNE_CONTENT,
|
||||
|
Reference in New Issue
Block a user