vpxenc: add --aq-mode flag to control adaptive quantization
Change-Id: I57e1ad4bed3487df12893ced77c49093f8755706
This commit is contained in:
parent
d1899557eb
commit
17084657e6
@ -64,6 +64,12 @@ extern "C"
|
||||
FRAMEFLAGS_ALTREF = 4,
|
||||
} FRAMETYPE_FLAGS;
|
||||
|
||||
typedef enum {
|
||||
NO_AQ = 0,
|
||||
VARIANCE_AQ = 1,
|
||||
AQ_MODES_COUNT // This should always be the last member of the enum
|
||||
} AQ_MODES;
|
||||
|
||||
typedef struct {
|
||||
int version; // 4 versions of bitstream defined:
|
||||
// 0 - best quality/slowest decode,
|
||||
@ -128,6 +134,7 @@ extern "C"
|
||||
int best_allowed_q;
|
||||
int cq_level;
|
||||
int lossless;
|
||||
int aq_mode; // Adaptive Quantization mode
|
||||
|
||||
// two pass datarate control
|
||||
int two_pass_vbrbias; // two pass datarate control tweaks
|
||||
|
@ -400,7 +400,7 @@ static void update_state(VP9_COMP *cpi, PICK_MODE_CONTEXT *ctx,
|
||||
&& (xd->mb_to_bottom_edge >> (3 + MI_SIZE_LOG2)) + mi_height > y)
|
||||
xd->mi_8x8[x_idx + y * mis] = mi_addr;
|
||||
|
||||
if (cpi->sf.variance_adaptive_quantization) {
|
||||
if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
|
||||
vp9_mb_init_quantizer(cpi, x);
|
||||
}
|
||||
|
||||
@ -549,7 +549,7 @@ static void set_offsets(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
|
||||
/* segment ID */
|
||||
if (seg->enabled) {
|
||||
if (!cpi->sf.variance_adaptive_quantization) {
|
||||
if (!cpi->oxcf.aq_mode == VARIANCE_AQ) {
|
||||
uint8_t *map = seg->update_map ? cpi->segmentation_map
|
||||
: cm->last_frame_seg_map;
|
||||
mbmi->segment_id = vp9_get_segment_id(cm, map, bsize, mi_row, mi_col);
|
||||
@ -625,7 +625,7 @@ static void pick_sb_modes(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
|
||||
x->source_variance = get_sby_perpixel_variance(cpi, x, bsize);
|
||||
|
||||
if (cpi->sf.variance_adaptive_quantization) {
|
||||
if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
|
||||
int energy;
|
||||
if (bsize <= BLOCK_16X16) {
|
||||
energy = x->mb_energy;
|
||||
@ -641,7 +641,7 @@ static void pick_sb_modes(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
if (cpi->oxcf.tuning == VP8_TUNE_SSIM)
|
||||
vp9_activity_masking(cpi, x);
|
||||
|
||||
if (cpi->sf.variance_adaptive_quantization) {
|
||||
if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
|
||||
vp9_clear_system_state(); // __asm emms;
|
||||
x->rdmult = round(x->rdmult * rdmult_ratio);
|
||||
}
|
||||
@ -660,7 +660,7 @@ static void pick_sb_modes(VP9_COMP *cpi, const TileInfo *const tile,
|
||||
totaldist, bsize, ctx, best_rd);
|
||||
}
|
||||
|
||||
if (cpi->sf.variance_adaptive_quantization) {
|
||||
if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
|
||||
x->rdmult = orig_rdmult;
|
||||
if (*totalrate != INT_MAX) {
|
||||
vp9_clear_system_state(); // __asm emms;
|
||||
|
@ -601,14 +601,14 @@ void vp9_first_pass(VP9_COMP *cpi) {
|
||||
num_8x8_blocks_wide_lookup[xd->mi_8x8[0]->mbmi.sb_type],
|
||||
cm->mi_rows, cm->mi_cols);
|
||||
|
||||
if (cpi->sf.variance_adaptive_quantization) {
|
||||
if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
|
||||
int energy = vp9_block_energy(cpi, x, xd->mi_8x8[0]->mbmi.sb_type);
|
||||
error_weight = vp9_vaq_inv_q_ratio(energy);
|
||||
}
|
||||
|
||||
// do intra 16x16 prediction
|
||||
this_error = vp9_encode_intra(x, use_dc_pred);
|
||||
if (cpi->sf.variance_adaptive_quantization) {
|
||||
if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
|
||||
vp9_clear_system_state(); // __asm emms;
|
||||
this_error *= error_weight;
|
||||
}
|
||||
@ -646,7 +646,7 @@ void vp9_first_pass(VP9_COMP *cpi) {
|
||||
first_pass_motion_search(cpi, x, &best_ref_mv,
|
||||
&mv.as_mv, lst_yv12,
|
||||
&motion_error, recon_yoffset);
|
||||
if (cpi->sf.variance_adaptive_quantization) {
|
||||
if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
|
||||
vp9_clear_system_state(); // __asm emms;
|
||||
motion_error *= error_weight;
|
||||
}
|
||||
@ -657,7 +657,7 @@ void vp9_first_pass(VP9_COMP *cpi) {
|
||||
tmp_err = INT_MAX;
|
||||
first_pass_motion_search(cpi, x, &zero_ref_mv, &tmp_mv.as_mv,
|
||||
lst_yv12, &tmp_err, recon_yoffset);
|
||||
if (cpi->sf.variance_adaptive_quantization) {
|
||||
if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
|
||||
vp9_clear_system_state(); // __asm emms;
|
||||
tmp_err *= error_weight;
|
||||
}
|
||||
@ -677,7 +677,7 @@ void vp9_first_pass(VP9_COMP *cpi) {
|
||||
first_pass_motion_search(cpi, x, &zero_ref_mv,
|
||||
&tmp_mv.as_mv, gld_yv12,
|
||||
&gf_motion_error, recon_yoffset);
|
||||
if (cpi->sf.variance_adaptive_quantization) {
|
||||
if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
|
||||
vp9_clear_system_state(); // __asm emms;
|
||||
gf_motion_error *= error_weight;
|
||||
}
|
||||
|
@ -764,8 +764,6 @@ void vp9_set_speed_features(VP9_COMP *cpi) {
|
||||
sf->static_segmentation = 0;
|
||||
#endif
|
||||
|
||||
sf->variance_adaptive_quantization = 0;
|
||||
|
||||
switch (mode) {
|
||||
case 0: // This is the best quality mode.
|
||||
break;
|
||||
@ -3195,7 +3193,7 @@ static void encode_frame_to_data_rate(VP9_COMP *cpi,
|
||||
}
|
||||
}
|
||||
|
||||
if (cpi->sf.variance_adaptive_quantization) {
|
||||
if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
|
||||
vp9_vaq_frame_setup(cpi);
|
||||
}
|
||||
|
||||
@ -3980,7 +3978,7 @@ int vp9_get_compressed_data(VP9_PTR ptr, unsigned int *frame_flags,
|
||||
|
||||
vp9_setup_interp_filters(&cpi->mb.e_mbd, DEFAULT_INTERP_FILTER, cm);
|
||||
|
||||
if (cpi->sf.variance_adaptive_quantization) {
|
||||
if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
|
||||
vp9_vaq_init();
|
||||
}
|
||||
|
||||
|
@ -248,7 +248,6 @@ typedef struct {
|
||||
int auto_mv_step_size;
|
||||
int optimize_coefficients;
|
||||
int static_segmentation;
|
||||
int variance_adaptive_quantization;
|
||||
int comp_inter_joint_search_thresh;
|
||||
int adaptive_rd_thresh;
|
||||
int skip_encode_sb;
|
||||
|
@ -38,6 +38,7 @@ struct vp9_extracfg {
|
||||
unsigned int rc_max_intra_bitrate_pct;
|
||||
unsigned int lossless;
|
||||
unsigned int frame_parallel_decoding_mode;
|
||||
unsigned int aq_mode;
|
||||
};
|
||||
|
||||
struct extraconfig_map {
|
||||
@ -66,6 +67,7 @@ static const struct extraconfig_map extracfg_map[] = {
|
||||
0, /* rc_max_intra_bitrate_pct */
|
||||
0, /* lossless */
|
||||
0, /* frame_parallel_decoding_mode */
|
||||
0, /* aq_mode */
|
||||
}
|
||||
}
|
||||
};
|
||||
@ -157,6 +159,7 @@ static vpx_codec_err_t validate_config(vpx_codec_alg_priv_t *ctx,
|
||||
RANGE_CHECK_HI(cfg, rc_max_quantizer, 0);
|
||||
RANGE_CHECK_HI(cfg, rc_min_quantizer, 0);
|
||||
}
|
||||
RANGE_CHECK(vp8_cfg, aq_mode, 0, AQ_MODES_COUNT - 1);
|
||||
|
||||
RANGE_CHECK_HI(cfg, g_threads, 64);
|
||||
RANGE_CHECK_HI(cfg, g_lag_in_frames, MAX_LAG_BUFFERS);
|
||||
@ -335,6 +338,8 @@ static vpx_codec_err_t set_vp9e_config(VP9_CONFIG *oxcf,
|
||||
oxcf->error_resilient_mode = cfg.g_error_resilient;
|
||||
oxcf->frame_parallel_decoding_mode = vp8_cfg.frame_parallel_decoding_mode;
|
||||
|
||||
oxcf->aq_mode = vp8_cfg.aq_mode;
|
||||
|
||||
oxcf->ss_number_layers = cfg.ss_number_layers;
|
||||
/*
|
||||
printf("Current VP9 Settings: \n");
|
||||
@ -445,6 +450,7 @@ static vpx_codec_err_t set_param(vpx_codec_alg_priv_t *ctx,
|
||||
MAP(VP8E_SET_MAX_INTRA_BITRATE_PCT, xcfg.rc_max_intra_bitrate_pct);
|
||||
MAP(VP9E_SET_LOSSLESS, xcfg.lossless);
|
||||
MAP(VP9E_SET_FRAME_PARALLEL_DECODING, xcfg.frame_parallel_decoding_mode);
|
||||
MAP(VP9E_SET_AQ_MODE, xcfg.aq_mode);
|
||||
}
|
||||
|
||||
res = validate_config(ctx, &ctx->cfg, &xcfg);
|
||||
@ -1071,6 +1077,7 @@ static vpx_codec_ctrl_fn_map_t vp9e_ctf_maps[] = {
|
||||
{VP8E_SET_MAX_INTRA_BITRATE_PCT, set_param},
|
||||
{VP9E_SET_LOSSLESS, set_param},
|
||||
{VP9E_SET_FRAME_PARALLEL_DECODING, set_param},
|
||||
{VP9E_SET_AQ_MODE, set_param},
|
||||
{VP9_GET_REFERENCE, get_reference},
|
||||
{VP9E_SET_SVC, vp9e_set_svc},
|
||||
{VP9E_SET_SVC_PARAMETERS, vp9e_set_svc_parameters},
|
||||
|
@ -193,6 +193,7 @@ enum vp8e_enc_control_id {
|
||||
VP9E_SET_TILE_COLUMNS,
|
||||
VP9E_SET_TILE_ROWS,
|
||||
VP9E_SET_FRAME_PARALLEL_DECODING,
|
||||
VP9E_SET_AQ_MODE,
|
||||
|
||||
VP9E_SET_SVC,
|
||||
VP9E_SET_SVC_PARAMETERS
|
||||
@ -343,6 +344,8 @@ VPX_CTRL_USE_TYPE(VP9E_SET_LOSSLESS, unsigned int)
|
||||
|
||||
VPX_CTRL_USE_TYPE(VP9E_SET_FRAME_PARALLEL_DECODING, unsigned int)
|
||||
|
||||
VPX_CTRL_USE_TYPE(VP9E_SET_AQ_MODE, unsigned int)
|
||||
|
||||
/*! @} - end defgroup vp8_encoder */
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
|
7
vpxenc.c
7
vpxenc.c
@ -561,6 +561,9 @@ static const arg_def_t lossless = ARG_DEF(NULL, "lossless", 1, "Lossless mode");
|
||||
#if CONFIG_VP9_ENCODER
|
||||
static const arg_def_t frame_parallel_decoding = ARG_DEF(
|
||||
NULL, "frame-parallel", 1, "Enable frame parallel decodability features");
|
||||
static const arg_def_t aq_mode = ARG_DEF(
|
||||
NULL, "aq-mode", 1,
|
||||
"Adaptive quantization mode (0: disabled (by default), 1: variance based)");
|
||||
#endif
|
||||
|
||||
#if CONFIG_VP8_ENCODER
|
||||
@ -585,7 +588,7 @@ static const arg_def_t *vp9_args[] = {
|
||||
&cpu_used, &auto_altref, &noise_sens, &sharpness, &static_thresh,
|
||||
&tile_cols, &tile_rows, &arnr_maxframes, &arnr_strength, &arnr_type,
|
||||
&tune_ssim, &cq_level, &max_intra_rate_pct, &lossless,
|
||||
&frame_parallel_decoding,
|
||||
&frame_parallel_decoding, &aq_mode,
|
||||
NULL
|
||||
};
|
||||
static const int vp9_arg_ctrl_map[] = {
|
||||
@ -594,7 +597,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,
|
||||
VP9E_SET_LOSSLESS, VP9E_SET_FRAME_PARALLEL_DECODING,
|
||||
VP9E_SET_LOSSLESS, VP9E_SET_FRAME_PARALLEL_DECODING, VP9E_SET_AQ_MODE,
|
||||
0
|
||||
};
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user