Add speed feature to reduce wiener_win size

This patch will introduce a speed feature to reduce window
size of wiener filter search for all frames except boosted
frames. This speed feature is enabled for preset 4 and above.

                Quality drop(AWCY)
Preset   Cb      Cr      Overall    Encode time reduction
   4    0.07%   0.06%     0.05%      2.85%
Encode time is averaged across multiple test cases

STATS_CHANGED

Change-Id: I9f5716e0e8baa064b2ca255fac3c22fbaac1b249
diff --git a/av1/common/restoration.h b/av1/common/restoration.h
index 6d6ba37..81ad3ba 100644
--- a/av1/common/restoration.h
+++ b/av1/common/restoration.h
@@ -122,6 +122,7 @@
 // If WIENER_WIN_CHROMA == WIENER_WIN - 2, that implies 5x5 filters are used for
 // chroma. To use 7x7 for chroma set WIENER_WIN_CHROMA to WIENER_WIN.
 #define WIENER_WIN_CHROMA (WIENER_WIN - 2)
+#define WIENER_WIN_REDUCED (WIENER_WIN - 2)
 #define WIENER_WIN2_CHROMA ((WIENER_WIN_CHROMA) * (WIENER_WIN_CHROMA))
 
 #define WIENER_FILT_PREC_BITS 7
diff --git a/av1/encoder/pickrst.c b/av1/encoder/pickrst.c
index 1b4f26c..b62789e 100644
--- a/av1/encoder/pickrst.c
+++ b/av1/encoder/pickrst.c
@@ -1191,18 +1191,24 @@
   const int wiener_win =
       (rsc->plane == AOM_PLANE_Y) ? WIENER_WIN : WIENER_WIN_CHROMA;
 
+  int reduced_wiener_win = wiener_win;
+  if (rsc->sf->reduce_wiener_window_size) {
+    reduced_wiener_win =
+        (rsc->plane == AOM_PLANE_Y) ? WIENER_WIN_REDUCED : WIENER_WIN_CHROMA;
+  }
+
   int64_t M[WIENER_WIN2];
   int64_t H[WIENER_WIN2 * WIENER_WIN2];
   int32_t vfilter[WIENER_WIN], hfilter[WIENER_WIN];
 
   const AV1_COMMON *const cm = rsc->cm;
   if (cm->seq_params.use_highbitdepth) {
-    av1_compute_stats_highbd(wiener_win, rsc->dgd_buffer, rsc->src_buffer,
-                             limits->h_start, limits->h_end, limits->v_start,
-                             limits->v_end, rsc->dgd_stride, rsc->src_stride, M,
-                             H, cm->seq_params.bit_depth);
+    av1_compute_stats_highbd(reduced_wiener_win, rsc->dgd_buffer,
+                             rsc->src_buffer, limits->h_start, limits->h_end,
+                             limits->v_start, limits->v_end, rsc->dgd_stride,
+                             rsc->src_stride, M, H, cm->seq_params.bit_depth);
   } else {
-    av1_compute_stats(wiener_win, rsc->dgd_buffer, rsc->src_buffer,
+    av1_compute_stats(reduced_wiener_win, rsc->dgd_buffer, rsc->src_buffer,
                       limits->h_start, limits->h_end, limits->v_start,
                       limits->v_end, rsc->dgd_stride, rsc->src_stride, M, H);
   }
@@ -1210,7 +1216,7 @@
   const MACROBLOCK *const x = rsc->x;
   const int64_t bits_none = x->wiener_restore_cost[0];
 
-  if (!wiener_decompose_sep_sym(wiener_win, M, H, vfilter, hfilter)) {
+  if (!wiener_decompose_sep_sym(reduced_wiener_win, M, H, vfilter, hfilter)) {
     rsc->bits += bits_none;
     rsc->sse += rusi->sse[RESTORE_NONE];
     rusi->best_rtype[RESTORE_WIENER - 1] = RESTORE_NONE;
@@ -1221,13 +1227,13 @@
   RestorationUnitInfo rui;
   memset(&rui, 0, sizeof(rui));
   rui.restoration_type = RESTORE_WIENER;
-  finalize_sym_filter(wiener_win, vfilter, rui.wiener_info.vfilter);
-  finalize_sym_filter(wiener_win, hfilter, rui.wiener_info.hfilter);
+  finalize_sym_filter(reduced_wiener_win, vfilter, rui.wiener_info.vfilter);
+  finalize_sym_filter(reduced_wiener_win, hfilter, rui.wiener_info.hfilter);
 
   // Filter score computes the value of the function x'*A*x - x'*b for the
   // learned filter and compares it against identity filer. If there is no
   // reduction in the function, the filter is reverted back to identity
-  if (compute_score(wiener_win, M, H, rui.wiener_info.vfilter,
+  if (compute_score(reduced_wiener_win, M, H, rui.wiener_info.vfilter,
                     rui.wiener_info.hfilter) > 0) {
     rsc->bits += bits_none;
     rsc->sse += rusi->sse[RESTORE_NONE];
@@ -1238,11 +1244,11 @@
 
   aom_clear_system_state();
 
-  rusi->sse[RESTORE_WIENER] =
-      finer_tile_search_wiener(rsc, limits, tile_rect, &rui, wiener_win);
+  rusi->sse[RESTORE_WIENER] = finer_tile_search_wiener(
+      rsc, limits, tile_rect, &rui, reduced_wiener_win);
   rusi->wiener = rui.wiener_info;
 
-  if (wiener_win != WIENER_WIN) {
+  if (reduced_wiener_win != WIENER_WIN) {
     assert(rui.wiener_info.vfilter[0] == 0 &&
            rui.wiener_info.vfilter[WIENER_WIN - 1] == 0);
     assert(rui.wiener_info.hfilter[0] == 0 &&
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index 51a52bc..7f81d50 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -354,6 +354,7 @@
     sf->tx_type_search.fast_intra_tx_type_search = 1;
     sf->disable_loop_restoration_chroma =
         (boosted || cm->allow_screen_content_tools) ? 0 : 1;
+    sf->reduce_wiener_window_size = !boosted;
     sf->mv.subpel_search_method = SUBPEL_TREE_PRUNED;
     sf->adaptive_pred_interp_filter = 0;
     sf->cb_pred_filter_search = 1;
@@ -720,6 +721,7 @@
   sf->use_first_partition_pass_interintra_stats = 0;
   sf->disable_wedge_search_var_thresh = 0;
   sf->disable_loop_restoration_chroma = 0;
+  sf->reduce_wiener_window_size = 0;
   sf->fast_wedge_sign_estimate = 0;
   sf->prune_wedge_pred_diff_based = 0;
   sf->drop_ref = 0;
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index 59c0015..32d8f5f 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -678,6 +678,9 @@
   // Disable loop restoration for Chroma plane
   int disable_loop_restoration_chroma;
 
+  // Reduce the wiener filter win size for luma
+  int reduce_wiener_window_size;
+
   // Flag used to control the extent of coeff R-D optimization
   int perform_coeff_opt;