Pack loop filter speed features into their own struct

BUG=aomedia:2562

Change-Id: Idd78fa2de804a904b53131da6c74eed00fcda16a
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 7230aff..3812579 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -4581,7 +4581,7 @@
 #endif
     // Find CDEF parameters
     av1_cdef_search(&cm->cur_frame->buf, cpi->source, cm, xd,
-                    cpi->sf.cdef_pick_method, cpi->td.mb.rdmult);
+                    cpi->sf.lpf_sf.cdef_pick_method, cpi->td.mb.rdmult);
 
     // Apply the filter
     av1_cdef_frame(&cm->cur_frame->buf, cm, xd);
@@ -4644,7 +4644,7 @@
 #endif
   if (use_loopfilter) {
     aom_clear_system_state();
-    av1_pick_filter_level(cpi->source, cpi, cpi->sf.lpf_pick);
+    av1_pick_filter_level(cpi->source, cpi, cpi->sf.lpf_sf.lpf_pick);
   } else {
     lf->filter_level[0] = 0;
     lf->filter_level[1] = 0;
diff --git a/av1/encoder/pickrst.c b/av1/encoder/pickrst.c
index 520649bd..7b9d874 100644
--- a/av1/encoder/pickrst.c
+++ b/av1/encoder/pickrst.c
@@ -886,7 +886,7 @@
       dgd_start, limits->h_end - limits->h_start,
       limits->v_end - limits->v_start, rsc->dgd_stride, src_start,
       rsc->src_stride, highbd, bit_depth, procunit_width, procunit_height,
-      tmpbuf, rsc->sf->enable_sgr_ep_pruning);
+      tmpbuf, rsc->sf->lpf_sf.enable_sgr_ep_pruning);
 
   RestorationUnitInfo rui;
   rui.restoration_type = RESTORE_SGRPROJ;
@@ -903,7 +903,8 @@
   double cost_sgr =
       RDCOST_DBL(x->rdmult, bits_sgr >> 4, rusi->sse[RESTORE_SGRPROJ]);
   if (rusi->sgrproj.ep < 10)
-    cost_sgr *= (1 + DUAL_SGR_PENALTY_MULT * rsc->sf->dual_sgr_penalty_level);
+    cost_sgr *=
+        (1 + DUAL_SGR_PENALTY_MULT * rsc->sf->lpf_sf.dual_sgr_penalty_level);
 
   RestorationType rtype =
       (cost_sgr < cost_none) ? RESTORE_SGRPROJ : RESTORE_NONE;
@@ -1443,7 +1444,7 @@
       (rsc->plane == AOM_PLANE_Y) ? WIENER_WIN : WIENER_WIN_CHROMA;
 
   int reduced_wiener_win = wiener_win;
-  if (rsc->sf->reduce_wiener_window_size) {
+  if (rsc->sf->lpf_sf.reduce_wiener_window_size) {
     reduced_wiener_win =
         (rsc->plane == AOM_PLANE_Y) ? WIENER_WIN_REDUCED : WIENER_WIN_CHROMA;
   }
@@ -1477,7 +1478,7 @@
     rsc->sse += rusi->sse[RESTORE_NONE];
     rusi->best_rtype[RESTORE_WIENER - 1] = RESTORE_NONE;
     rusi->sse[RESTORE_WIENER] = INT64_MAX;
-    if (rsc->sf->prune_sgr_based_on_wiener == 2) rusi->skip_sgr_eval = 1;
+    if (rsc->sf->lpf_sf.prune_sgr_based_on_wiener == 2) rusi->skip_sgr_eval = 1;
     return;
   }
 
@@ -1496,7 +1497,7 @@
     rsc->sse += rusi->sse[RESTORE_NONE];
     rusi->best_rtype[RESTORE_WIENER - 1] = RESTORE_NONE;
     rusi->sse[RESTORE_WIENER] = INT64_MAX;
-    if (rsc->sf->prune_sgr_based_on_wiener == 2) rusi->skip_sgr_eval = 1;
+    if (rsc->sf->lpf_sf.prune_sgr_based_on_wiener == 2) rusi->skip_sgr_eval = 1;
     return;
   }
 
@@ -1529,9 +1530,9 @@
 
   // Set 'skip_sgr_eval' based on rdcost ratio of RESTORE_WIENER and
   // RESTORE_NONE or based on best_rtype
-  if (rsc->sf->prune_sgr_based_on_wiener == 1) {
+  if (rsc->sf->lpf_sf.prune_sgr_based_on_wiener == 1) {
     rusi->skip_sgr_eval = cost_wiener > (1.01 * cost_none);
-  } else if (rsc->sf->prune_sgr_based_on_wiener == 2) {
+  } else if (rsc->sf->lpf_sf.prune_sgr_based_on_wiener == 2) {
     rusi->skip_sgr_eval = rusi->best_rtype[RESTORE_WIENER - 1] == RESTORE_NONE;
   }
 
@@ -1606,7 +1607,8 @@
     const int64_t bits = x->switchable_restore_cost[r] + coeff_bits;
     double cost = RDCOST_DBL(x->rdmult, bits >> 4, sse);
     if (r == RESTORE_SGRPROJ && rusi->sgrproj.ep < 10)
-      cost *= (1 + DUAL_SGR_PENALTY_MULT * rsc->sf->dual_sgr_penalty_level);
+      cost *=
+          (1 + DUAL_SGR_PENALTY_MULT * rsc->sf->lpf_sf.dual_sgr_penalty_level);
     if (r == 0 || cost < best_cost) {
       best_cost = cost;
       best_bits = bits;
@@ -1687,7 +1689,7 @@
     RestorationType best_rtype = RESTORE_NONE;
 
     const int highbd = rsc.cm->seq_params.use_highbitdepth;
-    if (!cpi->sf.disable_loop_restoration_chroma || !plane) {
+    if (!cpi->sf.lpf_sf.disable_loop_restoration_chroma || !plane) {
       av1_extend_frame(rsc.dgd_buffer, rsc.plane_width, rsc.plane_height,
                        rsc.dgd_stride, RESTORATION_BORDER, RESTORATION_BORDER,
                        highbd);
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index 05edcfb..1afd941 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -318,7 +318,7 @@
     sf->tx_sf.tx_type_search.ml_tx_split_thresh = 4000;
     sf->tx_sf.adaptive_txb_search_level = 2;
     sf->tx_sf.use_intra_txb_hash = 1;
-    sf->dual_sgr_penalty_level = 1;
+    sf->lpf_sf.dual_sgr_penalty_level = 1;
     sf->mv_sf.use_accurate_subpel_search = USE_4_TAPS;
     sf->inter_sf.reuse_inter_intra_mode = 1;
     sf->inter_sf.prune_comp_search_by_single_result = boosted ? 2 : 1;
@@ -345,10 +345,10 @@
             : (boosted ? 1 : 2);
     sf->part_sf.intra_cnn_split = 1;
 
-    sf->enable_sgr_ep_pruning = 1;
+    sf->lpf_sf.enable_sgr_ep_pruning = 1;
     sf->tx_sf.inter_tx_size_search_init_depth_rect = 1;
     sf->tx_sf.inter_tx_size_search_init_depth_sqr = 1;
-    sf->cdef_pick_method = CDEF_FAST_SEARCH;
+    sf->lpf_sf.cdef_pick_method = CDEF_FAST_SEARCH;
     sf->interp_sf.cb_pred_filter_search = 0;
     sf->tx_sf.model_based_prune_tx_search_level = 0;
     sf->inter_sf.reduce_inter_modes = boosted ? 1 : 2;
@@ -361,7 +361,8 @@
     sf->gm_erroradv_type = GM_ERRORADV_TR_2;
 
     sf->inter_sf.selective_ref_frame = 3;
-    sf->prune_sgr_based_on_wiener = cm->allow_screen_content_tools ? 0 : 1;
+    sf->lpf_sf.prune_sgr_based_on_wiener =
+        cm->allow_screen_content_tools ? 0 : 1;
 
     // TODO(chiyotsai@google.com): We can get 10% speed up if we move
     // adaptive_rd_thresh to speed 1. But currently it performs poorly on some
@@ -419,8 +420,9 @@
         frame_is_intra_only(&cpi->common) ? 0 : 1;
     sf->winner_mode_sf.enable_winner_mode_for_use_tx_domain_dist =
         cm->allow_screen_content_tools ? 0 : 1;
-    sf->reduce_wiener_window_size = is_boosted_arf2_bwd_type ? 0 : 1;
-    sf->prune_sgr_based_on_wiener = cm->allow_screen_content_tools ? 0 : 2;
+    sf->lpf_sf.reduce_wiener_window_size = is_boosted_arf2_bwd_type ? 0 : 1;
+    sf->lpf_sf.prune_sgr_based_on_wiener =
+        cm->allow_screen_content_tools ? 0 : 2;
     sf->mv_sf.subpel_search_method = SUBPEL_TREE_PRUNED;
     sf->part_sf.simple_motion_search_prune_agg = 1;
     sf->inter_sf.disable_sb_level_mv_cost_upd = 1;
@@ -440,9 +442,9 @@
     // is reset during winner mode processing
     sf->tx_sf.use_intra_txb_hash = 0;
     sf->tx_sf.tx_type_search.fast_intra_tx_type_search = 1;
-    sf->disable_loop_restoration_chroma =
+    sf->lpf_sf.disable_loop_restoration_chroma =
         (boosted || cm->allow_screen_content_tools) ? 0 : 1;
-    sf->reduce_wiener_window_size = !boosted;
+    sf->lpf_sf.reduce_wiener_window_size = !boosted;
     sf->interp_sf.cb_pred_filter_search = 1;
     sf->inter_sf.adaptive_mode_search = 1;
     sf->inter_sf.alt_ref_search_fp = 1;
@@ -493,7 +495,7 @@
   }
 
   if (speed >= 5) {
-    sf->disable_lr_filter = 1;
+    sf->lpf_sf.disable_lr_filter = 1;
     sf->inter_sf.disable_obmc = 1;
     sf->inter_sf.disable_interinter_wedge = 1;
     sf->inter_sf.disable_smooth_interintra = 1;
@@ -568,7 +570,7 @@
     sf->tx_sf.adaptive_txb_search_level = 2;
     sf->tx_sf.use_intra_txb_hash = 1;
     sf->rd_sf.optimize_b_precheck = 1;
-    sf->dual_sgr_penalty_level = 1;
+    sf->lpf_sf.dual_sgr_penalty_level = 1;
     sf->mv_sf.use_accurate_subpel_search = USE_4_TAPS;
     sf->inter_sf.reuse_inter_intra_mode = 1;
     sf->inter_sf.prune_comp_search_by_single_result = 1;
@@ -597,7 +599,7 @@
     sf->inter_sf.selective_ref_frame = 3;
     sf->tx_sf.inter_tx_size_search_init_depth_rect = 1;
     sf->tx_sf.inter_tx_size_search_init_depth_sqr = 1;
-    sf->cdef_pick_method = CDEF_FAST_SEARCH;
+    sf->lpf_sf.cdef_pick_method = CDEF_FAST_SEARCH;
 
     sf->inter_sf.adaptive_rd_thresh = 1;
     sf->mv_sf.auto_mv_step_size = 1;
@@ -686,7 +688,7 @@
     }
     sf->part_sf.partition_search_breakout_rate_thr = 500;
     sf->rd_sf.simple_model_rd_from_var = 1;
-    sf->lpf_pick = LPF_PICK_FROM_Q;
+    sf->lpf_sf.lpf_pick = LPF_PICK_FROM_Q;
     sf->mv_sf.subpel_force_stop = QUARTER_PEL;
     sf->part_sf.default_max_partition_size = BLOCK_128X128;
     sf->part_sf.default_min_partition_size = BLOCK_8X8;
@@ -699,7 +701,7 @@
     sf->winner_mode_sf.tx_size_search_level = 1;
     sf->rt_sf.use_comp_ref_nonrd = 0;
     sf->inter_sf.inter_mode_rd_model_estimation = 2;
-    sf->cdef_pick_method = CDEF_PICK_FROM_Q;
+    sf->lpf_sf.cdef_pick_method = CDEF_PICK_FROM_Q;
     sf->part_sf.max_intra_bsize = BLOCK_32X32;
     sf->tx_sf.use_inter_txb_hash = 0;
     sf->rt_sf.skip_interp_filter_search = 1;
@@ -709,7 +711,7 @@
     sf->rt_sf.use_simple_rd_model = 1;
   }
   if (speed >= 7) {
-    sf->lpf_pick = LPF_PICK_FROM_Q;
+    sf->lpf_sf.lpf_pick = LPF_PICK_FROM_Q;
     sf->mv_sf.subpel_force_stop = QUARTER_PEL;
     sf->part_sf.default_max_partition_size = BLOCK_128X128;
     sf->part_sf.default_min_partition_size = BLOCK_8X8;
@@ -720,7 +722,7 @@
     sf->rt_sf.use_nonrd_pick_mode = 1;
     sf->rt_sf.use_comp_ref_nonrd = 0;
     sf->inter_sf.inter_mode_rd_model_estimation = 2;
-    sf->cdef_pick_method = CDEF_PICK_FROM_Q;
+    sf->lpf_sf.cdef_pick_method = CDEF_PICK_FROM_Q;
     sf->rt_sf.skip_interp_filter_search = 0;
     sf->rt_sf.short_circuit_low_temp_var = 0;
     sf->rt_sf.reuse_inter_pred_nonrd = 0;
@@ -922,6 +924,18 @@
   winner_mode_sf->enable_multiwinner_mode_process = 0;
 }
 
+static AOM_INLINE void init_lpf_sf(LOOP_FILTER_SPEED_FEATURES *lpf_sf) {
+  lpf_sf->disable_loop_restoration_chroma = 0;
+  lpf_sf->prune_sgr_based_on_wiener = 0;
+  lpf_sf->enable_sgr_ep_pruning = 0;
+  lpf_sf->reduce_wiener_window_size = 0;
+  lpf_sf->lpf_pick = LPF_PICK_FROM_FULL_IMAGE;
+  lpf_sf->cdef_pick_method = CDEF_FULL_SEARCH;
+  // Set decoder side speed feature to use less dual sgr modes
+  lpf_sf->dual_sgr_penalty_level = 0;
+  lpf_sf->disable_lr_filter = 0;
+}
+
 static AOM_INLINE void init_rt_sf(REAL_TIME_SPEED_FEATURES *rt_sf) {
   rt_sf->mode_search_skip_flags = 0;
   rt_sf->skip_interp_filter_search = 0;
@@ -970,16 +984,10 @@
   sf->gm_erroradv_type = GM_ERRORADV_TR_0;
   sf->disable_adaptive_warp_error_thresh = 1;
   sf->selective_ref_gm = 1;
-  sf->disable_loop_restoration_chroma = 0;
-  sf->prune_sgr_based_on_wiener = 0;
-  sf->enable_sgr_ep_pruning = 0;
-  sf->reduce_wiener_window_size = 0;
   sf->reduce_high_precision_mv_usage = 0;
   sf->disable_overlay_frames = 0;
   // TODO(yunqing): turn it on for speed 0 if there is gain.
   sf->adaptive_overlay_encoding = 1;
-  sf->lpf_pick = LPF_PICK_FROM_FULL_IMAGE;
-  sf->cdef_pick_method = CDEF_FULL_SEARCH;
   // Recode loop tolerance %.
   sf->recode_tolerance = 25;
 
@@ -989,10 +997,6 @@
   sf->tpl_sf.prune_intra_modes = 0;
   sf->tpl_sf.reduce_first_step_size = 0;
 
-  // Set decoder side speed feature to use less dual sgr modes
-  sf->dual_sgr_penalty_level = 0;
-  sf->disable_lr_filter = 0;
-
   init_part_sf(&sf->part_sf);
   init_mv_sf(&sf->mv_sf);
   init_inter_sf(&sf->inter_sf);
@@ -1001,6 +1005,7 @@
   init_tx_sf(&sf->tx_sf);
   init_rd_sf(&sf->rd_sf, cpi);
   init_winner_mode_sf(&sf->winner_mode_sf);
+  init_lpf_sf(&sf->lpf_sf);
   init_rt_sf(&sf->rt_sf);
 
   if (oxcf->mode == GOOD)
@@ -1011,7 +1016,7 @@
   if (!cpi->seq_params_locked) {
     cpi->common.seq_params.enable_dual_filter &=
         !sf->interp_sf.disable_dual_filter;
-    cpi->common.seq_params.enable_restoration &= !sf->disable_lr_filter;
+    cpi->common.seq_params.enable_restoration &= !sf->lpf_sf.disable_lr_filter;
   }
 
   // sf->part_sf.partition_search_breakout_dist_thr is set assuming max 64x64
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index 7b64ca8..a3ba756 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -730,6 +730,38 @@
   int motion_mode_for_winner_cand;
 } WINNER_MODE_SPEED_FEATURES;
 
+typedef struct LOOP_FILTER_SPEED_FEATURES {
+  // This feature controls how the loop filter level is determined.
+  LPF_PICK_METHOD lpf_pick;
+
+  // Control how the CDEF strength is determined.
+  CDEF_PICK_METHOD cdef_pick_method;
+
+  // Decoder side speed feature to add penalty for use of dual-sgr filters.
+  // Takes values 0 - 10, 0 indicating no penalty and each additional level
+  // adding a penalty of 1%
+  int dual_sgr_penalty_level;
+
+  // prune sgr ep using binary search like mechanism
+  int enable_sgr_ep_pruning;
+
+  // Disable loop restoration for Chroma plane
+  int disable_loop_restoration_chroma;
+
+  // Prune self-guided loop restoration based on wiener search results
+  // 0 : no pruning
+  // 1 : pruning based on rdcost ratio of RESTORE_WIENER and RESTORE_NONE
+  // 2 : pruning based on winner restoration type among RESTORE_WIENER and
+  // RESTORE_NONE
+  int prune_sgr_based_on_wiener;
+
+  // Reduce the wiener filter win size for luma
+  int reduce_wiener_window_size;
+
+  // Disable loop restoration filter
+  int disable_lr_filter;
+} LOOP_FILTER_SPEED_FEATURES;
+
 typedef struct REAL_TIME_SPEED_FEATURES {
   // check intra prediction for non-RD mode.
   int check_intra_pred_nonrd;
@@ -896,35 +928,7 @@
   /*
    * In-loop filter speed features:
    */
-  // This feature controls how the loop filter level is determined.
-  LPF_PICK_METHOD lpf_pick;
-
-  // Control how the CDEF strength is determined.
-  CDEF_PICK_METHOD cdef_pick_method;
-
-  // Decoder side speed feature to add penalty for use of dual-sgr filters.
-  // Takes values 0 - 10, 0 indicating no penalty and each additional level
-  // adding a penalty of 1%
-  int dual_sgr_penalty_level;
-
-  // prune sgr ep using binary search like mechanism
-  int enable_sgr_ep_pruning;
-
-  // Disable loop restoration for Chroma plane
-  int disable_loop_restoration_chroma;
-
-  // Prune self-guided loop restoration based on wiener search results
-  // 0 : no pruning
-  // 1 : pruning based on rdcost ratio of RESTORE_WIENER and RESTORE_NONE
-  // 2 : pruning based on winner restoration type among RESTORE_WIENER and
-  // RESTORE_NONE
-  int prune_sgr_based_on_wiener;
-
-  // Reduce the wiener filter win size for luma
-  int reduce_wiener_window_size;
-
-  // Disable loop restoration filter
-  int disable_lr_filter;
+  LOOP_FILTER_SPEED_FEATURES lpf_sf;
 
   /*
    * Real-time mode speed features: