Modularize quant-dequant related parameters in AV1_COMP
This CL groups encoder specific quantization and
dequantization related structures from AV1_COMP
into a new structure EncQuantDequantParams. Also,
the variables min_qmlevel, max_qmlevel and
use_quant_b_adapt are removed from cpi.
BUG=aomedia:2610
Change-Id: I4d704eecb07982eddf95f375d3cbcc0407e91ec7
diff --git a/av1/encoder/av1_quantize.c b/av1/encoder/av1_quantize.c
index 789590f..1be5163 100644
--- a/av1/encoder/av1_quantize.c
+++ b/av1/encoder/av1_quantize.c
@@ -648,12 +648,12 @@
}
}
-void av1_init_quantizer(AV1_COMP *cpi) {
- const AV1_COMMON *const cm = &cpi->common;
- const CommonQuantParams *const quant_params = &cm->quant_params;
- QUANTS *const quants = &cpi->quants;
- Dequants *const dequants = &cpi->dequants;
- av1_build_quantizer(cm->seq_params.bit_depth, quant_params->y_dc_delta_q,
+void av1_init_quantizer(EncQuantDequantParams *const enc_quant_dequant_params,
+ const CommonQuantParams *quant_params,
+ aom_bit_depth_t bit_depth) {
+ QUANTS *const quants = &enc_quant_dequant_params->quants;
+ Dequants *const dequants = &enc_quant_dequant_params->dequants;
+ av1_build_quantizer(bit_depth, quant_params->y_dc_delta_q,
quant_params->u_dc_delta_q, quant_params->u_ac_delta_q,
quant_params->v_dc_delta_q, quant_params->v_ac_delta_q,
quants, dequants);
@@ -664,7 +664,8 @@
const AV1_COMMON *const cm = &cpi->common;
const CommonQuantParams *const quant_params = &cm->quant_params;
MACROBLOCKD *const xd = &x->e_mbd;
- const QUANTS *const quants = &cpi->quants;
+ const QUANTS *const quants = &cpi->enc_quant_dequant_params.quants;
+ const Dequants *const dequants = &cpi->enc_quant_dequant_params.dequants;
const int current_qindex =
AOMMAX(0, AOMMIN(QINDEX_RANGE - 1,
@@ -685,7 +686,7 @@
x->plane[0].quant_shift_QTX = quants->y_quant_shift[qindex];
x->plane[0].zbin_QTX = quants->y_zbin[qindex];
x->plane[0].round_QTX = quants->y_round[qindex];
- x->plane[0].dequant_QTX = cpi->dequants.y_dequant_QTX[qindex];
+ x->plane[0].dequant_QTX = dequants->y_dequant_QTX[qindex];
memcpy(&xd->plane[0].seg_qmatrix[segment_id],
quant_params->gqmatrix[qmlevel_y][0],
sizeof(quant_params->gqmatrix[qmlevel_y][0]));
@@ -702,7 +703,7 @@
x->plane[1].quant_shift_QTX = quants->u_quant_shift[qindex];
x->plane[1].zbin_QTX = quants->u_zbin[qindex];
x->plane[1].round_QTX = quants->u_round[qindex];
- x->plane[1].dequant_QTX = cpi->dequants.u_dequant_QTX[qindex];
+ x->plane[1].dequant_QTX = dequants->u_dequant_QTX[qindex];
memcpy(&xd->plane[1].seg_qmatrix[segment_id],
quant_params->gqmatrix[qmlevel_u][1],
sizeof(quant_params->gqmatrix[qmlevel_u][1]));
@@ -718,7 +719,7 @@
x->plane[2].quant_shift_QTX = quants->v_quant_shift[qindex];
x->plane[2].zbin_QTX = quants->v_zbin[qindex];
x->plane[2].round_QTX = quants->v_round[qindex];
- x->plane[2].dequant_QTX = cpi->dequants.v_dequant_QTX[qindex];
+ x->plane[2].dequant_QTX = dequants->v_dequant_QTX[qindex];
memcpy(&xd->plane[2].seg_qmatrix[segment_id],
quant_params->gqmatrix[qmlevel_v][2],
sizeof(quant_params->gqmatrix[qmlevel_v][2]));
@@ -739,10 +740,10 @@
av1_init_plane_quantizers(cpi, x, xd->mi[0]->segment_id);
}
-void av1_set_quantizer(AV1_COMP *cpi, int q) {
+void av1_set_quantizer(AV1_COMMON *const cm, int min_qmlevel, int max_qmlevel,
+ int q) {
// quantizer has to be reinitialized with av1_init_quantizer() if any
// delta_q changes.
- AV1_COMMON *const cm = &cpi->common;
CommonQuantParams *quant_params = &cm->quant_params;
quant_params->base_qindex = AOMMAX(cm->delta_q_info.delta_q_present_flag, q);
quant_params->y_dc_delta_q = 0;
@@ -750,18 +751,18 @@
quant_params->u_ac_delta_q = 0;
quant_params->v_dc_delta_q = 0;
quant_params->v_ac_delta_q = 0;
- quant_params->qmatrix_level_y = aom_get_qmlevel(
- quant_params->base_qindex, cpi->min_qmlevel, cpi->max_qmlevel);
+ quant_params->qmatrix_level_y =
+ aom_get_qmlevel(quant_params->base_qindex, min_qmlevel, max_qmlevel);
quant_params->qmatrix_level_u =
aom_get_qmlevel(quant_params->base_qindex + quant_params->u_ac_delta_q,
- cpi->min_qmlevel, cpi->max_qmlevel);
+ min_qmlevel, max_qmlevel);
if (!cm->seq_params.separate_uv_delta_q)
quant_params->qmatrix_level_v = quant_params->qmatrix_level_u;
else
quant_params->qmatrix_level_v =
aom_get_qmlevel(quant_params->base_qindex + quant_params->v_ac_delta_q,
- cpi->min_qmlevel, cpi->max_qmlevel);
+ min_qmlevel, max_qmlevel);
}
// Table that converts 0-63 Q-range values passed in outside to the Qindex
diff --git a/av1/encoder/av1_quantize.h b/av1/encoder/av1_quantize.h
index 0279105..40fb4be 100644
--- a/av1/encoder/av1_quantize.h
+++ b/av1/encoder/av1_quantize.h
@@ -84,6 +84,13 @@
v_dequant_QTX[QINDEX_RANGE][8]); // 8: SIMD width
} Dequants;
+typedef struct {
+ // Quantization parameters for internal quantizer setup.
+ QUANTS quants;
+ // Dequantization parameters for internal quantizer setup.
+ Dequants dequants;
+} EncQuantDequantParams;
+
struct AV1_COMP;
struct AV1Common;
@@ -97,9 +104,12 @@
int v_ac_delta_q, QUANTS *const quants,
Dequants *const deq);
-void av1_init_quantizer(struct AV1_COMP *cpi);
+void av1_init_quantizer(EncQuantDequantParams *const enc_quant_dequant_params,
+ const CommonQuantParams *quant_params,
+ aom_bit_depth_t bit_depth);
-void av1_set_quantizer(struct AV1_COMP *cpi, int q);
+void av1_set_quantizer(struct AV1Common *const cm, int min_qmlevel,
+ int max_qmlevel, int q);
int av1_quantizer_to_qindex(int quantizer);
diff --git a/av1/encoder/encode_strategy.c b/av1/encoder/encode_strategy.c
index 8a064f1..c202fe8 100644
--- a/av1/encoder/encode_strategy.c
+++ b/av1/encoder/encode_strategy.c
@@ -1256,8 +1256,6 @@
if (!frame_params.show_existing_frame) {
cm->quant_params.using_qmatrix = cpi->oxcf.using_qm;
- cpi->min_qmlevel = cpi->oxcf.qm_minlevel;
- cpi->max_qmlevel = cpi->oxcf.qm_maxlevel;
#if !CONFIG_REALTIME_ONLY
if (oxcf->lag_in_frames > 0 && !is_stat_generation_stage(cpi)) {
if (cpi->gf_group.index == 1 && cpi->oxcf.enable_tpl_model) {
diff --git a/av1/encoder/encodemb.c b/av1/encoder/encodemb.c
index 906f9de..ec33362 100644
--- a/av1/encoder/encodemb.c
+++ b/av1/encoder/encodemb.c
@@ -383,7 +383,7 @@
quant_idx =
USE_B_QUANT_NO_TRELLIS ? AV1_XFORM_QUANT_B : AV1_XFORM_QUANT_FP;
av1_setup_xform(cm, x, tx_size, tx_type, &txfm_param);
- av1_setup_quant(tx_size, use_trellis, quant_idx, cpi->use_quant_b_adapt,
+ av1_setup_quant(tx_size, use_trellis, quant_idx, cpi->oxcf.quant_b_adapt,
&quant_param);
av1_setup_qmatrix(&cm->quant_params, xd, plane, tx_size, tx_type,
&quant_param);
@@ -574,7 +574,7 @@
QUANT_PARAM quant_param;
av1_setup_xform(cm, x, tx_size, DCT_DCT, &txfm_param);
- av1_setup_quant(tx_size, 0, AV1_XFORM_QUANT_B, cpi->use_quant_b_adapt,
+ av1_setup_quant(tx_size, 0, AV1_XFORM_QUANT_B, cpi->oxcf.quant_b_adapt,
&quant_param);
av1_setup_qmatrix(&cm->quant_params, xd, plane, tx_size, DCT_DCT,
&quant_param);
@@ -716,7 +716,7 @@
USE_B_QUANT_NO_TRELLIS ? AV1_XFORM_QUANT_B : AV1_XFORM_QUANT_FP;
av1_setup_xform(cm, x, tx_size, tx_type, &txfm_param);
- av1_setup_quant(tx_size, use_trellis, quant_idx, cpi->use_quant_b_adapt,
+ av1_setup_quant(tx_size, use_trellis, quant_idx, cpi->oxcf.quant_b_adapt,
&quant_param);
av1_setup_qmatrix(&cm->quant_params, xd, plane, tx_size, tx_type,
&quant_param);
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 178baf5..32e552f 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -3470,7 +3470,8 @@
* called later when needed. This will avoid unnecessary calls of
* av1_init_quantizer() for every frame.
*/
- av1_init_quantizer(cpi);
+ av1_init_quantizer(&cpi->enc_quant_dequant_params, &cm->quant_params,
+ cm->seq_params.bit_depth);
av1_qm_init(&cm->quant_params, av1_num_planes(cm));
av1_loop_filter_init(cm);
@@ -5361,15 +5362,19 @@
cpi->oxcf.tuning == AOM_TUNE_VMAF_WITHOUT_PREPROCESSING ||
cpi->oxcf.tuning == AOM_TUNE_VMAF_MAX_GAIN) {
av1_set_quantizer(
- cpi, av1_get_vmaf_base_qindex(cpi, q_for_screen_content_quick_run));
+ cm, cpi->oxcf.qm_minlevel, cpi->oxcf.qm_maxlevel,
+ av1_get_vmaf_base_qindex(cpi, q_for_screen_content_quick_run));
} else {
#endif
- av1_set_quantizer(cpi, q_for_screen_content_quick_run);
+ av1_set_quantizer(cm, cpi->oxcf.qm_minlevel, cpi->oxcf.qm_maxlevel,
+ q_for_screen_content_quick_run);
#if CONFIG_TUNE_VMAF
}
#endif
av1_set_speed_features_qindex_dependent(cpi, cpi->oxcf.speed);
- if (cpi->oxcf.deltaq_mode != NO_DELTA_Q) av1_init_quantizer(cpi);
+ if (cpi->oxcf.deltaq_mode != NO_DELTA_Q)
+ av1_init_quantizer(&cpi->enc_quant_dequant_params, &cm->quant_params,
+ cm->seq_params.bit_depth);
av1_set_variance_partition_thresholds(cpi, q_for_screen_content_quick_run,
0);
@@ -5504,16 +5509,19 @@
if (cpi->oxcf.tuning == AOM_TUNE_VMAF_WITH_PREPROCESSING ||
cpi->oxcf.tuning == AOM_TUNE_VMAF_WITHOUT_PREPROCESSING ||
cpi->oxcf.tuning == AOM_TUNE_VMAF_MAX_GAIN) {
- av1_set_quantizer(cpi, av1_get_vmaf_base_qindex(cpi, q));
+ av1_set_quantizer(cm, cpi->oxcf.qm_minlevel, cpi->oxcf.qm_maxlevel,
+ av1_get_vmaf_base_qindex(cpi, q));
} else {
#endif
- av1_set_quantizer(cpi, q);
+ av1_set_quantizer(cm, cpi->oxcf.qm_minlevel, cpi->oxcf.qm_maxlevel, q);
#if CONFIG_TUNE_VMAF
}
#endif
av1_set_speed_features_qindex_dependent(cpi, cpi->oxcf.speed);
- if (cpi->oxcf.deltaq_mode != NO_DELTA_Q) av1_init_quantizer(cpi);
+ if (cpi->oxcf.deltaq_mode != NO_DELTA_Q)
+ av1_init_quantizer(&cpi->enc_quant_dequant_params, &cm->quant_params,
+ cm->seq_params.bit_depth);
av1_set_variance_partition_thresholds(cpi, q, 0);
@@ -6816,10 +6824,6 @@
av1_one_pass_cbr_svc_start_layer(cpi);
}
- // Indicates whether or not to use an adaptive quantize b rather than
- // the traditional version
- cpi->use_quant_b_adapt = cpi->oxcf.quant_b_adapt;
-
cm->showable_frame = 0;
*size = 0;
#if CONFIG_INTERNAL_STATS
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index 80096a2..4e053a8 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -1002,7 +1002,9 @@
} TimeStamps;
typedef struct AV1_COMP {
- QUANTS quants;
+ // Quantization and dequantization parameters for internal quantizer setup
+ // in the encoder.
+ EncQuantDequantParams enc_quant_dequant_params;
ThreadData td;
FRAME_COUNTS counts;
@@ -1010,7 +1012,6 @@
MBMIExtFrameBufferInfo mbmi_ext_info;
CB_COEFF_BUFFER *coeff_buffer_base;
- Dequants dequants;
AV1_COMMON common;
AV1EncoderConfig oxcf;
struct lookahead_ctx *lookahead;
@@ -1294,9 +1295,6 @@
// Frame type of the last frame. May be used in some heuristics for speeding
// up the encoding.
FRAME_TYPE last_frame_type;
- int min_qmlevel;
- int max_qmlevel;
- int use_quant_b_adapt;
int num_tg;
// Super-resolution mode currently being used by the encoder.
diff --git a/av1/encoder/firstpass.c b/av1/encoder/firstpass.c
index 8894397..245ae7d 100644
--- a/av1/encoder/firstpass.c
+++ b/av1/encoder/firstpass.c
@@ -915,7 +915,7 @@
// Do not use periodic key frames.
cpi->rc.frames_to_key = INT_MAX;
- av1_set_quantizer(cpi, qindex);
+ av1_set_quantizer(cm, cpi->oxcf.qm_minlevel, cpi->oxcf.qm_maxlevel, qindex);
av1_setup_block_planes(xd, seq_params->subsampling_x,
seq_params->subsampling_y, num_planes);
diff --git a/av1/encoder/tx_search.c b/av1/encoder/tx_search.c
index d3a9f1a..aeb8f58 100644
--- a/av1/encoder/tx_search.c
+++ b/av1/encoder/tx_search.c
@@ -1099,7 +1099,7 @@
? (USE_B_QUANT_NO_TRELLIS ? AV1_XFORM_QUANT_B
: AV1_XFORM_QUANT_FP)
: AV1_XFORM_QUANT_FP,
- cpi->use_quant_b_adapt, &quant_param_intra);
+ cpi->oxcf.quant_b_adapt, &quant_param_intra);
av1_setup_qmatrix(&cm->quant_params, xd, plane, tx_size, best_tx_type,
&quant_param_intra);
av1_xform_quant(x, plane, block, blk_row, blk_col, plane_bsize,
@@ -1374,7 +1374,7 @@
QUANT_PARAM quant_param;
TxfmParam txfm_param;
av1_setup_xform(cm, x, tx_size, DCT_DCT, &txfm_param);
- av1_setup_quant(tx_size, 1, AV1_XFORM_QUANT_B, cpi->use_quant_b_adapt,
+ av1_setup_quant(tx_size, 1, AV1_XFORM_QUANT_B, cpi->oxcf.quant_b_adapt,
&quant_param);
int tx_type;
// to ensure we can try ones even outside of ext_tx_set of current block
@@ -1489,7 +1489,7 @@
TxfmParam txfm_param;
QUANT_PARAM quant_param;
av1_setup_xform(cm, x, tx_size, DCT_DCT, &txfm_param);
- av1_setup_quant(tx_size, 1, AV1_XFORM_QUANT_B, cpi->use_quant_b_adapt,
+ av1_setup_quant(tx_size, 1, AV1_XFORM_QUANT_B, cpi->oxcf.quant_b_adapt,
&quant_param);
for (int idx = 0; idx < TX_TYPES; idx++) {
@@ -2214,7 +2214,7 @@
skip_trellis ? (USE_B_QUANT_NO_TRELLIS ? AV1_XFORM_QUANT_B
: AV1_XFORM_QUANT_FP)
: AV1_XFORM_QUANT_FP,
- cpi->use_quant_b_adapt, &quant_param);
+ cpi->oxcf.quant_b_adapt, &quant_param);
// Iterate through all transform type candidates.
for (int idx = 0; idx < TX_TYPES; ++idx) {
diff --git a/av1/encoder/var_based_part.c b/av1/encoder/var_based_part.c
index be762ae..c6b0042 100644
--- a/av1/encoder/var_based_part.c
+++ b/av1/encoder/var_based_part.c
@@ -348,7 +348,8 @@
const int is_key_frame = frame_is_intra_only(cm);
const int threshold_multiplier = is_key_frame ? 40 : 1;
int64_t threshold_base =
- (int64_t)(threshold_multiplier * cpi->dequants.y_dequant_QTX[q][1]);
+ (int64_t)(threshold_multiplier *
+ cpi->enc_quant_dequant_params.dequants.y_dequant_QTX[q][1]);
if (is_key_frame) {
thresholds[0] = threshold_base;