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;