Pack global motion speed features into their own struct

BUG=aomedia:2562

Change-Id: I7f68af69d2a51159a0c7b71a97b6d87073246078
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index 21ba8d8..b629afa 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -4686,7 +4686,7 @@
 
 static int do_gm_search_logic(SPEED_FEATURES *const sf, int frame) {
   (void)frame;
-  switch (sf->gm_search_type) {
+  switch (sf->gm_sf.gm_search_type) {
     case GM_FULL_SEARCH: return 1;
     case GM_REDUCED_REF_SEARCH_SKIP_L2_L3:
       return !(frame == LAST2_FRAME || frame == LAST3_FRAME);
@@ -4859,9 +4859,9 @@
 // TODO(Remya): Can include erroradv_prod_tr[] for threshold calculation
 static INLINE int64_t calc_erroradv_threshold(AV1_COMP *cpi,
                                               int64_t ref_frame_error) {
-  if (!cpi->sf.disable_adaptive_warp_error_thresh)
-    return (int64_t)(ref_frame_error * erroradv_tr[cpi->sf.gm_erroradv_type] +
-                     0.5);
+  if (!cpi->sf.gm_sf.disable_adaptive_warp_error_thresh)
+    return (int64_t)(
+        ref_frame_error * erroradv_tr[cpi->sf.gm_sf.gm_erroradv_type] + 0.5);
   else
     return INT64_MAX;
 }
@@ -4985,7 +4985,7 @@
             (double)best_warp_error / ref_frame_error,
             gm_get_params_cost(&cm->global_motion[frame], ref_params,
                                cm->allow_high_precision_mv),
-            cpi->sf.gm_erroradv_type)) {
+            cpi->sf.gm_sf.gm_erroradv_type)) {
       cm->global_motion[frame] = default_warp_params;
     }
 
@@ -5028,7 +5028,7 @@
         !prune_ref_by_selective_ref_frame(
             cpi, ref_frame, cm->cur_frame->ref_display_order_hint,
             cm->current_frame.display_order_hint) &&
-        !(cpi->sf.selective_ref_gm && skip_gm_frame(cm, frame))) {
+        !(cpi->sf.gm_sf.selective_ref_gm && skip_gm_frame(cm, frame))) {
       assert(ref_buf[frame] != NULL);
       int relative_frame_dist = av1_encoder_get_relative_dist(
           order_hint_info, buf->display_order_hint,
@@ -5099,7 +5099,7 @@
     // the remaining ref frames in that direction. The below exit is disabled
     // when ref frame distance w.r.t. current frame is zero. E.g.:
     // source_alt_ref_frame w.r.t. ARF frames
-    if (cpi->sf.prune_ref_frame_for_gm_search &&
+    if (cpi->sf.gm_sf.prune_ref_frame_for_gm_search &&
         reference_frame[frame].distance != 0 &&
         cm->global_motion[ref_frame].wmtype != ROTZOOM)
       break;
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 3812579..ff1ec9d 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -5171,7 +5171,7 @@
       loop = 0;
     }
 
-    if (allow_recode && !cpi->sf.gm_disable_recode &&
+    if (allow_recode && !cpi->sf.gm_sf.gm_disable_recode &&
         recode_loop_test_global_motion(cpi)) {
       loop = 1;
     }
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index 1afd941..397a529 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -291,8 +291,8 @@
           ? 0
           : (is_boosted_arf2_bwd_type ? 1 : 2);
   sf->part_sf.less_rectangular_check_level = 1;
-  sf->gm_search_type = GM_REDUCED_REF_SEARCH_SKIP_L2_L3;
-  sf->gm_disable_recode = 1;
+  sf->gm_sf.gm_search_type = GM_REDUCED_REF_SEARCH_SKIP_L2_L3;
+  sf->gm_sf.gm_disable_recode = 1;
   sf->interp_sf.use_fast_interpolation_filter_search = 1;
   sf->tx_sf.intra_tx_size_search_init_depth_sqr = 1;
   sf->intra_sf.intra_pruning_with_hog = 1;
@@ -310,7 +310,7 @@
   if (speed >= 1) {
     sf->inter_sf.selective_ref_frame = 2;
 
-    sf->prune_ref_frame_for_gm_search = boosted ? 0 : 1;
+    sf->gm_sf.prune_ref_frame_for_gm_search = boosted ? 0 : 1;
     sf->tx_sf.intra_tx_size_search_init_depth_rect = 1;
 
     sf->interp_sf.use_interp_filter = 1;
@@ -334,8 +334,8 @@
     sf->inter_sf.disable_interinter_wedge_newmv_search = boosted ? 0 : 1;
     sf->inter_sf.prune_comp_type_by_comp_avg = 1;
     sf->inter_sf.prune_motion_mode_level = 2;
-    sf->gm_search_type = GM_REDUCED_REF_SEARCH_SKIP_L2_L3_ARF2;
-    sf->disable_adaptive_warp_error_thresh = 0;
+    sf->gm_sf.gm_search_type = GM_REDUCED_REF_SEARCH_SKIP_L2_L3_ARF2;
+    sf->gm_sf.disable_adaptive_warp_error_thresh = 0;
     sf->rd_sf.tx_domain_dist_level = boosted ? 1 : 2;
     sf->rd_sf.tx_domain_dist_thres_level = 1;
     sf->rd_sf.perform_coeff_opt = boosted ? 1 : 2;
@@ -358,7 +358,7 @@
   }
 
   if (speed >= 2) {
-    sf->gm_erroradv_type = GM_ERRORADV_TR_2;
+    sf->gm_sf.gm_erroradv_type = GM_ERRORADV_TR_2;
 
     sf->inter_sf.selective_ref_frame = 3;
     sf->lpf_sf.prune_sgr_based_on_wiener =
@@ -403,7 +403,7 @@
     sf->mv_sf.use_accurate_subpel_search = USE_2_TAPS;
     if (cpi->oxcf.enable_smooth_interintra)
       sf->inter_sf.disable_smooth_interintra = boosted ? 0 : 1;
-    sf->gm_search_type = GM_DISABLE_SEARCH;
+    sf->gm_sf.gm_search_type = GM_DISABLE_SEARCH;
     sf->inter_sf.prune_comp_search_by_single_result = boosted ? 4 : 2;
     sf->inter_sf.prune_motion_mode_level = boosted ? 2 : 3;
     // TODO(yunqing): evaluate this speed feature for speed 1 & 2, and combine
@@ -533,8 +533,8 @@
 
   sf->inter_sf.prune_ref_frame_for_rect_partitions = !boosted;
   sf->part_sf.less_rectangular_check_level = 1;
-  sf->gm_search_type = GM_REDUCED_REF_SEARCH_SKIP_L2_L3;
-  sf->gm_disable_recode = 1;
+  sf->gm_sf.gm_search_type = GM_REDUCED_REF_SEARCH_SKIP_L2_L3;
+  sf->gm_sf.gm_disable_recode = 1;
   sf->interp_sf.use_fast_interpolation_filter_search = 1;
   sf->tx_sf.intra_tx_size_search_init_depth_sqr = 1;
   sf->intra_sf.intra_pruning_with_hog = 1;
@@ -558,7 +558,7 @@
   sf->rt_sf.hybrid_intra_pickmode = 0;
 
   if (speed >= 1) {
-    sf->gm_erroradv_type = GM_ERRORADV_TR_1;
+    sf->gm_sf.gm_erroradv_type = GM_ERRORADV_TR_1;
     sf->inter_sf.selective_ref_frame = 2;
 
     sf->tx_sf.intra_tx_size_search_init_depth_rect = 1;
@@ -587,14 +587,14 @@
     sf->inter_sf.disable_wedge_search_edge_thresh = 0;
     sf->inter_sf.prune_comp_type_by_comp_avg = 1;
     sf->inter_sf.prune_motion_mode_level = 2;
-    sf->gm_search_type = GM_REDUCED_REF_SEARCH_SKIP_L2_L3_ARF2;
+    sf->gm_sf.gm_search_type = GM_REDUCED_REF_SEARCH_SKIP_L2_L3_ARF2;
     sf->interp_sf.cb_pred_filter_search = 1;
     sf->rd_sf.tx_domain_dist_level = boosted ? 0 : 1;
     sf->rd_sf.tx_domain_dist_thres_level = 1;
   }
 
   if (speed >= 2) {
-    sf->gm_erroradv_type = GM_ERRORADV_TR_2;
+    sf->gm_sf.gm_erroradv_type = GM_ERRORADV_TR_2;
 
     sf->inter_sf.selective_ref_frame = 3;
     sf->tx_sf.inter_tx_size_search_init_depth_rect = 1;
@@ -633,7 +633,7 @@
     sf->mv_sf.use_accurate_subpel_search = USE_2_TAPS;
     sf->inter_sf.adaptive_rd_thresh = 2;
     sf->tx_sf.tx_type_search.prune_mode = PRUNE_2D_FAST;
-    sf->gm_search_type = GM_DISABLE_SEARCH;
+    sf->gm_sf.gm_search_type = GM_DISABLE_SEARCH;
     sf->inter_sf.prune_comp_search_by_single_result = 2;
     sf->inter_sf.prune_motion_mode_level = boosted ? 2 : 3;
     sf->inter_sf.prune_warp_using_wmtype = 1;
@@ -750,6 +750,15 @@
   }
 }
 
+static AOM_INLINE void init_gm_sf(GLOBAL_MOTION_SPEED_FEATURES *gm_sf) {
+  gm_sf->gm_erroradv_type = GM_ERRORADV_TR_0;
+  gm_sf->disable_adaptive_warp_error_thresh = 1;
+  gm_sf->selective_ref_gm = 1;
+  gm_sf->gm_search_type = GM_FULL_SEARCH;
+  gm_sf->gm_disable_recode = 0;
+  gm_sf->prune_ref_frame_for_gm_search = 0;
+}
+
 static AOM_INLINE void init_part_sf(PARTITION_SPEED_FEATURES *part_sf) {
   part_sf->partition_search_type = SEARCH_PARTITION;
   part_sf->less_rectangular_check_level = 0;
@@ -981,9 +990,6 @@
   // best quality defaults
   sf->frame_parameter_update = 1;
   sf->recode_loop = ALLOW_RECODE;
-  sf->gm_erroradv_type = GM_ERRORADV_TR_0;
-  sf->disable_adaptive_warp_error_thresh = 1;
-  sf->selective_ref_gm = 1;
   sf->reduce_high_precision_mv_usage = 0;
   sf->disable_overlay_frames = 0;
   // TODO(yunqing): turn it on for speed 0 if there is gain.
@@ -991,12 +997,10 @@
   // Recode loop tolerance %.
   sf->recode_tolerance = 25;
 
-  sf->gm_search_type = GM_FULL_SEARCH;
-  sf->gm_disable_recode = 0;
-  sf->prune_ref_frame_for_gm_search = 0;
   sf->tpl_sf.prune_intra_modes = 0;
   sf->tpl_sf.reduce_first_step_size = 0;
 
+  init_gm_sf(&sf->gm_sf);
   init_part_sf(&sf->part_sf);
   init_mv_sf(&sf->mv_sf);
   init_inter_sf(&sf->inter_sf);
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index a3ba756..fe2b6a3 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -261,6 +261,38 @@
   ADAPT_PRED
 } UENUM1BYTE(MAX_PART_PRED_MODE);
 
+typedef struct TPL_SPEED_FEATURES {
+  // Prune the intra modes search by tpl.
+  // If set to 0, we will search all intra modes from DC_PRED to PAETH_PRED.
+  // If set to 1, we only search DC_PRED, V_PRED, and H_PRED.
+  int prune_intra_modes;
+  // This parameter controls which step in the n-step process we start at.
+  int reduce_first_step_size;
+} TPL_SPEED_FEATURES;
+
+typedef struct GLOBAL_MOTION_SPEED_FEATURES {
+  // Global motion warp error threshold
+  GM_ERRORADV_TYPE gm_erroradv_type;
+
+  // Disable adaptive threshold for global motion warp error
+  int disable_adaptive_warp_error_thresh;
+
+  // Do not compute the global motion parameters for a LAST2_FRAME or
+  // LAST3_FRAME if the GOLDEN_FRAME is closer and it has a non identity
+  // global model.
+  int selective_ref_gm;
+
+  GM_SEARCH_TYPE gm_search_type;
+
+  // whether to disable the global motion recode loop
+  int gm_disable_recode;
+
+  // During global motion estimation, prune remaining reference frames in a
+  // given direction(past/future), if the evaluated ref_frame in that direction
+  // yields gm_type as INVALID/TRANSLATION/IDENTITY
+  int prune_ref_frame_for_gm_search;
+} GLOBAL_MOTION_SPEED_FEATURES;
+
 typedef struct PARTITION_SPEED_FEATURES {
   PARTITION_SEARCH_TYPE partition_search_type;
 
@@ -554,15 +586,6 @@
   int model_based_post_interp_filter_breakout;
 } INTER_MODE_SPEED_FEATURES;
 
-typedef struct TPL_SPEED_FEATURES {
-  // Prune the intra modes search by tpl.
-  // If set to 0, we will search all intra modes from DC_PRED to PAETH_PRED.
-  // If set to 1, we only search DC_PRED, V_PRED, and H_PRED.
-  int prune_intra_modes;
-  // This parameter controls which step in the n-step process we start at.
-  int reduce_first_step_size;
-} TPL_SPEED_FEATURES;
-
 typedef struct INTERP_FILTER_SPEED_FEATURES {
   // A source variance threshold below which filter search is disabled
   // Choose a very large value (UINT_MAX) to use 8-tap always
@@ -864,26 +887,7 @@
   /*
    * Global motion speed features:
    */
-  // Global motion warp error threshold
-  GM_ERRORADV_TYPE gm_erroradv_type;
-
-  // Disable adaptive threshold for global motion warp error
-  int disable_adaptive_warp_error_thresh;
-
-  // Do not compute the global motion parameters for a LAST2_FRAME or
-  // LAST3_FRAME if the GOLDEN_FRAME is closer and it has a non identity
-  // global model.
-  int selective_ref_gm;
-
-  GM_SEARCH_TYPE gm_search_type;
-
-  // whether to disable the global motion recode loop
-  int gm_disable_recode;
-
-  // During global motion estimation, prune remaining reference frames in a
-  // given direction(past/future), if the evaluated ref_frame in that direction
-  // yields gm_type as INVALID/TRANSLATION/IDENTITY
-  int prune_ref_frame_for_gm_search;
+  GLOBAL_MOTION_SPEED_FEATURES gm_sf;
 
   /*
    * Partition search speed features: