Refactor WinnerModeParams from AV1_COMP

This CL groups winner mode processing related variables from
AV1_COMP into a new struct WinnerModeParams, and cleans up
function interfaces.

BUG=aomedia:2610

Change-Id: I4919e818fe7634e11076f82d0a90c33ce1dc6194
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index 44992c4..1c3038d 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -5915,9 +5915,9 @@
           ? WINNER_MODE_EVAL
           : DEFAULT_EVAL;
   const TX_SIZE_SEARCH_METHOD tx_search_type =
-      cpi->tx_size_search_methods[eval_type];
+      cpi->winner_mode_params.tx_size_search_methods[eval_type];
   assert(cpi->oxcf.enable_tx64 || tx_search_type != USE_LARGESTALL);
-  features->tx_mode = select_tx_mode(cpi, tx_search_type);
+  features->tx_mode = select_tx_mode(cm, tx_search_type);
 
   if (cpi->sf.tx_sf.tx_type_search.prune_tx_type_using_stats) {
     const FRAME_UPDATE_TYPE update_type = get_frame_update_type(&cpi->gf_group);
@@ -6288,7 +6288,8 @@
 
   // Initialize tx_mode and tx_size_search_method
   set_tx_size_search_method(
-      cpi, x, cpi->sf.winner_mode_sf.enable_winner_mode_for_tx_size_srch, 1);
+      cm, &cpi->winner_mode_params, x,
+      cpi->sf.winner_mode_sf.enable_winner_mode_for_tx_size_srch, 1);
 
   const int mi_row = xd->mi_row;
   const int mi_col = xd->mi_col;
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index 06c093a..539bd35 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -858,6 +858,47 @@
 } MotionVectorSearchParams;
 
 typedef struct {
+  // Threshold of transform domain distortion
+  // Index 0: Default mode evaluation, Winner mode processing is not applicable
+  // (Eg : IntraBc).
+  // Index 1: Mode evaluation.
+  // Index 2: Winner mode evaluation.
+  // Index 1 and 2 are applicable when enable_winner_mode_for_use_tx_domain_dist
+  // speed feature is ON
+  unsigned int tx_domain_dist_threshold[MODE_EVAL_TYPES];
+
+  // Factor to control R-D optimization of coeffs based on block
+  // mse.
+  // Index 0: Default mode evaluation, Winner mode processing is not applicable
+  // (Eg : IntraBc). Index 1: Mode evaluation.
+  // Index 2: Winner mode evaluation
+  // Index 1 and 2 are applicable when enable_winner_mode_for_coeff_opt speed
+  // feature is ON
+  unsigned int coeff_opt_dist_threshold[MODE_EVAL_TYPES];
+
+  // Transform size to be used in transform search
+  // Index 0: Default mode evaluation, Winner mode processing is not applicable
+  // (Eg : IntraBc).
+  // Index 1: Mode evaluation. Index 2: Winner mode evaluation
+  // Index 1 and 2 are applicable when enable_winner_mode_for_tx_size_srch speed
+  // feature is ON
+  TX_SIZE_SEARCH_METHOD tx_size_search_methods[MODE_EVAL_TYPES];
+
+  // Transform domain distortion levels
+  // Index 0: Default mode evaluation, Winner mode processing is not applicable
+  // (Eg : IntraBc).
+  // Index 1: Mode evaluation. Index 2: Winner mode evaluation
+  // Index 1 and 2 are applicable when enable_winner_mode_for_use_tx_domain_dist
+  // speed feature is ON
+  unsigned int use_transform_domain_distortion[MODE_EVAL_TYPES];
+
+  // Predict transform skip levels to be used for default, mode and winner mode
+  // evaluation. Index 0: Default mode evaluation, Winner mode processing is not
+  // applicable. Index 1: Mode evaluation, Index 2: Winner mode evaluation
+  unsigned int predict_skip_level[MODE_EVAL_TYPES];
+} WinnerModeParams;
+
+typedef struct {
   int arf_stack[FRAME_BUFFERS];
   int arf_stack_size;
   int lst_stack[FRAME_BUFFERS];
@@ -987,6 +1028,9 @@
   // Parameters related to global motion search.
   GlobalMotionInfo gm_info;
 
+  // Parameters related to winner mode processing.
+  WinnerModeParams winner_mode_params;
+
   int64_t last_time_stamp_seen;
   int64_t last_end_time_stamp_seen;
   int64_t first_time_stamp_ever;
@@ -1132,45 +1176,6 @@
   // Mark which ref frames can be skipped for encoding current frame druing RDO.
   int prune_ref_frame_mask;
 
-  // Threshold of transform domain distortion
-  // Index 0: Default mode evaluation, Winner mode processing is not applicable
-  // (Eg : IntraBc).
-  // Index 1: Mode evaluation.
-  // Index 2: Winner mode evaluation.
-  // Index 1 and 2 are applicable when enable_winner_mode_for_use_tx_domain_dist
-  // speed feature is ON
-  unsigned int tx_domain_dist_threshold[MODE_EVAL_TYPES];
-
-  // Factor to control R-D optimization of coeffs based on block
-  // mse.
-  // Index 0: Default mode evaluation, Winner mode processing is not applicable
-  // (Eg : IntraBc). Index 1: Mode evaluation.
-  // Index 2: Winner mode evaluation
-  // Index 1 and 2 are applicable when enable_winner_mode_for_coeff_opt speed
-  // feature is ON
-  unsigned int coeff_opt_dist_threshold[MODE_EVAL_TYPES];
-
-  // Transform size to be used in transform search
-  // Index 0: Default mode evaluation, Winner mode processing is not applicable
-  // (Eg : IntraBc).
-  // Index 1: Mode evaluation. Index 2: Winner mode evaluation
-  // Index 1 and 2 are applicable when enable_winner_mode_for_tx_size_srch speed
-  // feature is ON
-  TX_SIZE_SEARCH_METHOD tx_size_search_methods[MODE_EVAL_TYPES];
-
-  // Transform domain distortion levels
-  // Index 0: Default mode evaluation, Winner mode processing is not applicable
-  // (Eg : IntraBc).
-  // Index 1: Mode evaluation. Index 2: Winner mode evaluation
-  // Index 1 and 2 are applicable when enable_winner_mode_for_use_tx_domain_dist
-  // speed feature is ON
-  unsigned int use_transform_domain_distortion[MODE_EVAL_TYPES];
-
-  // Predict transform skip levels to be used for default, mode and winner mode
-  // evaluation. Index 0: Default mode evaluation, Winner mode processing is not
-  // applicable. Index 1: Mode evaluation, Index 2: Winner mode evaluation
-  unsigned int predict_skip_level[MODE_EVAL_TYPES];
-
   AV1LfSync lf_row_sync;
   AV1LrSync lr_row_sync;
   AV1LrStruct lr_ctxt;
diff --git a/av1/encoder/rdopt_utils.h b/av1/encoder/rdopt_utils.h
index 9c4f5899..53b410a 100644
--- a/av1/encoder/rdopt_utils.h
+++ b/av1/encoder/rdopt_utils.h
@@ -364,8 +364,8 @@
 }
 
 static TX_MODE select_tx_mode(
-    const AV1_COMP *cpi, const TX_SIZE_SEARCH_METHOD tx_size_search_method) {
-  if (cpi->common.features.coded_lossless) return ONLY_4X4;
+    const AV1_COMMON *cm, const TX_SIZE_SEARCH_METHOD tx_size_search_method) {
+  if (cm->features.coded_lossless) return ONLY_4X4;
   if (tx_size_search_method == USE_LARGESTALL) {
     return TX_MODE_LARGEST;
   } else {
@@ -403,17 +403,21 @@
 }
 
 static INLINE void set_tx_size_search_method(
-    const struct AV1_COMP *cpi, MACROBLOCK *x,
-    int enable_winner_mode_for_tx_size_srch, int is_winner_mode) {
+    const AV1_COMMON *cm, const WinnerModeParams *winner_mode_params,
+    MACROBLOCK *x, int enable_winner_mode_for_tx_size_srch,
+    int is_winner_mode) {
   // Populate transform size search method/transform mode appropriately
-  x->tx_size_search_method = cpi->tx_size_search_methods[DEFAULT_EVAL];
+  x->tx_size_search_method =
+      winner_mode_params->tx_size_search_methods[DEFAULT_EVAL];
   if (enable_winner_mode_for_tx_size_srch) {
     if (is_winner_mode)
-      x->tx_size_search_method = cpi->tx_size_search_methods[WINNER_MODE_EVAL];
+      x->tx_size_search_method =
+          winner_mode_params->tx_size_search_methods[WINNER_MODE_EVAL];
     else
-      x->tx_size_search_method = cpi->tx_size_search_methods[MODE_EVAL];
+      x->tx_size_search_method =
+          winner_mode_params->tx_size_search_methods[MODE_EVAL];
   }
-  x->tx_mode_search_type = select_tx_mode(cpi, x->tx_size_search_method);
+  x->tx_mode_search_type = select_tx_mode(cm, x->tx_size_search_method);
 }
 
 static INLINE void set_tx_type_prune(const SPEED_FEATURES *sf, MACROBLOCK *x,
@@ -430,24 +434,26 @@
 }
 
 static INLINE void set_tx_domain_dist_params(
-    const struct AV1_COMP *cpi, MACROBLOCK *x,
+    const WinnerModeParams *winner_mode_params, MACROBLOCK *x,
     int enable_winner_mode_for_tx_domain_dist, int is_winner_mode) {
   if (!enable_winner_mode_for_tx_domain_dist) {
     x->use_transform_domain_distortion =
-        cpi->use_transform_domain_distortion[DEFAULT_EVAL];
-    x->tx_domain_dist_threshold = cpi->tx_domain_dist_threshold[DEFAULT_EVAL];
+        winner_mode_params->use_transform_domain_distortion[DEFAULT_EVAL];
+    x->tx_domain_dist_threshold =
+        winner_mode_params->tx_domain_dist_threshold[DEFAULT_EVAL];
     return;
   }
 
   if (is_winner_mode) {
     x->use_transform_domain_distortion =
-        cpi->use_transform_domain_distortion[WINNER_MODE_EVAL];
+        winner_mode_params->use_transform_domain_distortion[WINNER_MODE_EVAL];
     x->tx_domain_dist_threshold =
-        cpi->tx_domain_dist_threshold[WINNER_MODE_EVAL];
+        winner_mode_params->tx_domain_dist_threshold[WINNER_MODE_EVAL];
   } else {
     x->use_transform_domain_distortion =
-        cpi->use_transform_domain_distortion[MODE_EVAL];
-    x->tx_domain_dist_threshold = cpi->tx_domain_dist_threshold[MODE_EVAL];
+        winner_mode_params->use_transform_domain_distortion[MODE_EVAL];
+    x->tx_domain_dist_threshold =
+        winner_mode_params->tx_domain_dist_threshold[MODE_EVAL];
   }
 }
 
@@ -455,21 +461,24 @@
 static INLINE void set_mode_eval_params(const struct AV1_COMP *cpi,
                                         MACROBLOCK *x,
                                         MODE_EVAL_TYPE mode_eval_type) {
+  const AV1_COMMON *cm = &cpi->common;
   const SPEED_FEATURES *sf = &cpi->sf;
+  const WinnerModeParams *winner_mode_params = &cpi->winner_mode_params;
 
   switch (mode_eval_type) {
     case DEFAULT_EVAL:
       x->use_default_inter_tx_type = 0;
       x->use_default_intra_tx_type = 0;
-      x->predict_skip_level = cpi->predict_skip_level[DEFAULT_EVAL];
+      x->predict_skip_level =
+          winner_mode_params->predict_skip_level[DEFAULT_EVAL];
       // Set default transform domain distortion type
-      set_tx_domain_dist_params(cpi, x, 0, 0);
+      set_tx_domain_dist_params(winner_mode_params, x, 0, 0);
 
       // Get default threshold for R-D optimization of coefficients
-      x->coeff_opt_dist_threshold =
-          get_rd_opt_coeff_thresh(cpi->coeff_opt_dist_threshold, 0, 0);
+      x->coeff_opt_dist_threshold = get_rd_opt_coeff_thresh(
+          winner_mode_params->coeff_opt_dist_threshold, 0, 0);
       // Set default transform size search method
-      set_tx_size_search_method(cpi, x, 0, 0);
+      set_tx_size_search_method(cm, winner_mode_params, x, 0, 0);
       // Set default transform type prune
       set_tx_type_prune(sf, x, 0, 0);
       break;
@@ -479,21 +488,22 @@
            cpi->oxcf.use_intra_default_tx_only);
       x->use_default_inter_tx_type =
           cpi->sf.tx_sf.tx_type_search.fast_inter_tx_type_search;
-      x->predict_skip_level = cpi->predict_skip_level[MODE_EVAL];
+      x->predict_skip_level = winner_mode_params->predict_skip_level[MODE_EVAL];
 
       // Set transform domain distortion type for mode evaluation
       set_tx_domain_dist_params(
-          cpi, x, sf->winner_mode_sf.enable_winner_mode_for_use_tx_domain_dist,
-          0);
+          winner_mode_params, x,
+          sf->winner_mode_sf.enable_winner_mode_for_use_tx_domain_dist, 0);
 
       // Get threshold for R-D optimization of coefficients during mode
       // evaluation
       x->coeff_opt_dist_threshold = get_rd_opt_coeff_thresh(
-          cpi->coeff_opt_dist_threshold,
+          winner_mode_params->coeff_opt_dist_threshold,
           sf->winner_mode_sf.enable_winner_mode_for_coeff_opt, 0);
       // Set the transform size search method for mode evaluation
       set_tx_size_search_method(
-          cpi, x, sf->winner_mode_sf.enable_winner_mode_for_tx_size_srch, 0);
+          cm, winner_mode_params, x,
+          sf->winner_mode_sf.enable_winner_mode_for_tx_size_srch, 0);
       // Set transform type prune for mode evaluation
       set_tx_type_prune(
           sf, x, sf->tx_sf.tx_type_search.enable_winner_mode_tx_type_pruning,
@@ -502,21 +512,23 @@
     case WINNER_MODE_EVAL:
       x->use_default_inter_tx_type = 0;
       x->use_default_intra_tx_type = 0;
-      x->predict_skip_level = cpi->predict_skip_level[WINNER_MODE_EVAL];
+      x->predict_skip_level =
+          winner_mode_params->predict_skip_level[WINNER_MODE_EVAL];
 
       // Set transform domain distortion type for winner mode evaluation
       set_tx_domain_dist_params(
-          cpi, x, sf->winner_mode_sf.enable_winner_mode_for_use_tx_domain_dist,
-          1);
+          winner_mode_params, x,
+          sf->winner_mode_sf.enable_winner_mode_for_use_tx_domain_dist, 1);
 
       // Get threshold for R-D optimization of coefficients for winner mode
       // evaluation
       x->coeff_opt_dist_threshold = get_rd_opt_coeff_thresh(
-          cpi->coeff_opt_dist_threshold,
+          winner_mode_params->coeff_opt_dist_threshold,
           sf->winner_mode_sf.enable_winner_mode_for_coeff_opt, 1);
       // Set the transform size search method for winner mode evaluation
       set_tx_size_search_method(
-          cpi, x, sf->winner_mode_sf.enable_winner_mode_for_tx_size_srch, 1);
+          cm, winner_mode_params, x,
+          sf->winner_mode_sf.enable_winner_mode_for_tx_size_srch, 1);
       // Set default transform type prune mode for winner mode evaluation
       set_tx_type_prune(
           sf, x, sf->tx_sf.tx_type_search.enable_winner_mode_tx_type_pruning,
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index a085e44..ecba055 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -1132,6 +1132,7 @@
   AV1_COMMON *const cm = &cpi->common;
   SPEED_FEATURES *const sf = &cpi->sf;
   MACROBLOCK *const x = &cpi->td.mb;
+  WinnerModeParams *const winner_mode_params = &cpi->winner_mode_params;
   const AV1EncoderConfig *const oxcf = &cpi->oxcf;
   int i;
 
@@ -1223,37 +1224,37 @@
   // assert ensures that tx_domain_dist_level is accessed correctly
   assert(cpi->sf.rd_sf.tx_domain_dist_thres_level >= 0 &&
          cpi->sf.rd_sf.tx_domain_dist_thres_level < 3);
-  memcpy(cpi->tx_domain_dist_threshold,
+  memcpy(winner_mode_params->tx_domain_dist_threshold,
          tx_domain_dist_thresholds[cpi->sf.rd_sf.tx_domain_dist_thres_level],
-         sizeof(cpi->tx_domain_dist_threshold));
+         sizeof(winner_mode_params->tx_domain_dist_threshold));
 
   assert(cpi->sf.rd_sf.tx_domain_dist_level >= 0 &&
          cpi->sf.rd_sf.tx_domain_dist_level < 3);
-  memcpy(cpi->use_transform_domain_distortion,
+  memcpy(winner_mode_params->use_transform_domain_distortion,
          tx_domain_dist_types[cpi->sf.rd_sf.tx_domain_dist_level],
-         sizeof(cpi->use_transform_domain_distortion));
+         sizeof(winner_mode_params->use_transform_domain_distortion));
 
   // assert ensures that coeff_opt_dist_thresholds is accessed correctly
   assert(cpi->sf.rd_sf.perform_coeff_opt >= 0 &&
          cpi->sf.rd_sf.perform_coeff_opt < 6);
-  memcpy(cpi->coeff_opt_dist_threshold,
+  memcpy(winner_mode_params->coeff_opt_dist_threshold,
          coeff_opt_dist_thresholds[cpi->sf.rd_sf.perform_coeff_opt],
-         sizeof(cpi->coeff_opt_dist_threshold));
+         sizeof(winner_mode_params->coeff_opt_dist_threshold));
 
   // assert ensures that predict_skip_levels is accessed correctly
   assert(cpi->sf.tx_sf.tx_type_search.use_skip_flag_prediction >= 0 &&
          cpi->sf.tx_sf.tx_type_search.use_skip_flag_prediction < 3);
-  memcpy(cpi->predict_skip_level,
+  memcpy(winner_mode_params->predict_skip_level,
          predict_skip_levels[cpi->sf.tx_sf.tx_type_search
                                  .use_skip_flag_prediction],
-         sizeof(cpi->predict_skip_level));
+         sizeof(winner_mode_params->predict_skip_level));
 
   // assert ensures that tx_size_search_level is accessed correctly
   assert(cpi->sf.winner_mode_sf.tx_size_search_level >= 0 &&
          cpi->sf.winner_mode_sf.tx_size_search_level < 3);
-  memcpy(cpi->tx_size_search_methods,
+  memcpy(winner_mode_params->tx_size_search_methods,
          tx_size_search_methods[cpi->sf.winner_mode_sf.tx_size_search_level],
-         sizeof(cpi->tx_size_search_methods));
+         sizeof(winner_mode_params->tx_size_search_methods));
 
   if (cpi->oxcf.row_mt == 1 && (cpi->oxcf.max_threads > 1)) {
     if (sf->inter_sf.inter_mode_rd_model_estimation == 1) {
@@ -1267,14 +1268,15 @@
 void av1_set_speed_features_qindex_dependent(AV1_COMP *cpi, int speed) {
   AV1_COMMON *const cm = &cpi->common;
   SPEED_FEATURES *const sf = &cpi->sf;
+  WinnerModeParams *const winner_mode_params = &cpi->winner_mode_params;
   const int boosted = frame_is_boosted(cpi);
   const int is_720p_or_larger = AOMMIN(cm->width, cm->height) >= 720;
   if (is_720p_or_larger && cpi->oxcf.mode == GOOD && speed == 0) {
     if (cm->quant_params.base_qindex <= 80) {
       sf->rd_sf.perform_coeff_opt = 2;
-      memcpy(cpi->coeff_opt_dist_threshold,
+      memcpy(winner_mode_params->coeff_opt_dist_threshold,
              coeff_opt_dist_thresholds[sf->rd_sf.perform_coeff_opt],
-             sizeof(cpi->coeff_opt_dist_threshold));
+             sizeof(winner_mode_params->coeff_opt_dist_threshold));
       sf->part_sf.simple_motion_search_split =
           cm->features.allow_screen_content_tools ? 1 : 2;
       sf->tx_sf.inter_tx_size_search_init_depth_rect = 1;