Add speed feature for interp filter search

Skipped sharp_filter evaluation based on regular and smooth filter rd for
dual_filter=0 case. This speed feature is turned on for speeds >= 4.

When tested for multiple test cases observed
1% average reduction in encoder time for speed=4 preset.

As per AWCY runs 0.01% average PSNR drop is seen for speed=4 preset.

STATS_CHANGED

Change-Id: I746e231b04cf0661754b782762abd02c45157970
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index c4876e5..55f5e35 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -8398,14 +8398,27 @@
       skip_pred = (skip_hor & skip_ver);
     }
   } else {
+    int skip_pred = (skip_hor & skip_ver);
     for (i = (SWITCHABLE_FILTERS + 1); i < filter_set_size;
          i += (SWITCHABLE_FILTERS + 1)) {
       // This assert tells that (filter_x == filter_y) for non-dual filter case
       assert((filter_sets[i] & 0xffff) == (filter_sets[i] >> 16));
       interpolation_filter_rd(x, cpi, bsize, mi_row, mi_col, orig_dst, rd,
                               switchable_rate, skip_txfm_sb, skip_sse_sb,
-                              dst_bufs, i, switchable_ctx,
-                              (skip_hor & skip_ver), rate, dist);
+                              dst_bufs, i, switchable_ctx, skip_pred, rate,
+                              dist);
+      // In first iteration, smooth filter is evaluated. If smooth filter
+      // (which is less sharper) is the winner among regular and smooth filters,
+      // sharp filter evaluation is skipped
+      // TODO(any): Refine this gating based on modelled rd only (i.e., by not
+      // accounting switchable filter rate)
+      if (cpi->sf.skip_sharp_interp_filter_search &&
+          skip_pred != cpi->default_interp_skip_flags) {
+        MACROBLOCKD *const xd = &x->e_mbd;
+        MB_MODE_INFO *const mbmi = xd->mi[0];
+        if (mbmi->interp_filters == filter_sets[(SWITCHABLE_FILTERS + 1)])
+          break;
+      }
     }
   }
 }
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index 3f55d1f..41e4fde 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -294,6 +294,7 @@
     sf->adaptive_mode_search = 1;
     sf->cb_partition_search = !boosted;
     sf->alt_ref_search_fp = 1;
+    sf->skip_sharp_interp_filter_search = 1;
   }
 
   if (speed >= 5) {
@@ -509,6 +510,7 @@
 
   sf->inter_mode_rd_model_estimation = 0;
   sf->obmc_full_pixel_search_level = 0;
+  sf->skip_sharp_interp_filter_search = 0;
 
   if (oxcf->mode == GOOD)
     set_good_speed_features_framesize_independent(cpi, sf, oxcf->speed);
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index a46a912..2b3e6e0 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -585,6 +585,10 @@
   // identical
   int skip_obmc_in_uniform_mv_field;
   int skip_wm_in_uniform_mv_field;
+
+  // skip sharp_filter evaluation based on regular and smooth filter rd for
+  // dual_filter=0 case
+  int skip_sharp_interp_filter_search;
 } SPEED_FEATURES;
 
 struct AV1_COMP;