Bias towards sharp filter for non-boosted frames

Saw 1.5 - 2.2% vmaf gain. This is enabled for speed <=3
except LC mode due to the decoder time impact.

Bug: 503081456

STATS_CHANGED

Change-Id: I7e2db661d5d4a25b00f74f6cacdb7131dd9eb3a6
diff --git a/av1/encoder/interp_search.c b/av1/encoder/interp_search.c
index 0135d23..994c78b 100644
--- a/av1/encoder/interp_search.c
+++ b/av1/encoder/interp_search.c
@@ -169,12 +169,19 @@
   this_rd_stats = *rd_stats_luma;
   const int_interpfilters last_best = mbmi->interp_filters;
   mbmi->interp_filters = filter_sets[filter_idx];
+
+  const int is_sharp =
+      (mbmi->interp_filters.as_filters.x_filter == MULTITAP_SHARP ||
+       mbmi->interp_filters.as_filters.y_filter == MULTITAP_SHARP);
+  const int mul =
+      (is_sharp && cpi->sf.interp_sf.use_more_sharp_interp) ? 90 : 100;
+
   const int tmp_rs =
       get_switchable_rate(x, mbmi->interp_filters, switchable_ctx,
                           cm->seq_params->enable_dual_filter);
 
   int64_t min_rd = RDCOST(x->rdmult, tmp_rs, 0);
-  if (min_rd > *rd) {
+  if (min_rd * mul / 100 > *rd) {
     mbmi->interp_filters = last_best;
     return 0;
   }
@@ -222,7 +229,7 @@
       for (int plane = 1; plane < num_planes; ++plane) {
         int64_t tmp_rd =
             RDCOST(x->rdmult, tmp_rs + this_rd_stats.rate, this_rd_stats.dist);
-        if (tmp_rd >= *rd) {
+        if (tmp_rd * mul / 100 >= *rd) {
           mbmi->interp_filters = last_best;
           return 0;
         }
@@ -240,7 +247,7 @@
   int64_t tmp_rd =
       RDCOST(x->rdmult, tmp_rs + this_rd_stats.rate, this_rd_stats.dist);
 
-  if (tmp_rd < *rd) {
+  if (tmp_rd * mul / 100 < *rd) {
     *rd = tmp_rd;
     *switchable_rate = tmp_rs;
     if (skip_pred != interp_search_flags->default_interp_skip_flags) {
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index 3f00173..ac031e2 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -647,6 +647,9 @@
   const int boosted = frame_is_boosted(cpi);
   const int is_key_frame = frame_is_intra_only(cm);
 
+  // Need to study the decoder time impact.
+  sf->interp_sf.use_more_sharp_interp = 0;
+
   // Speed features for vertical videos
   if (is_vertical_video && is_between_608p_and_1080p) {
     const int leaf_and_overlay_frames =
@@ -691,6 +694,9 @@
     const AV1_COMP *const cpi, SPEED_FEATURES *const sf, int speed) {
   if (speed < 1 || speed > 3) return;
 
+  // Need to study the decoder time impact.
+  sf->interp_sf.use_more_sharp_interp = 0;
+
   const FRAME_UPDATE_TYPE update_type =
       get_frame_update_type(&cpi->ppi->gf_group, cpi->gf_frame_index);
 
@@ -1131,6 +1137,7 @@
 
   sf->interp_sf.use_fast_interpolation_filter_search = 1;
   sf->interp_sf.disable_dual_filter = 1;
+  sf->interp_sf.use_more_sharp_interp = boosted ? 0 : 1;
 
   sf->intra_sf.intra_pruning_with_hog = 1;
 
@@ -1378,6 +1385,7 @@
     sf->interp_sf.cb_pred_filter_search = 1;
     sf->interp_sf.skip_sharp_interp_filter_search = 1;
     sf->interp_sf.use_interp_filter = 2;
+    sf->interp_sf.use_more_sharp_interp = 0;
 
     sf->intra_sf.intra_uv_mode_mask[TX_16X16] = UV_INTRA_DC_H_V_CFL;
     sf->intra_sf.intra_uv_mode_mask[TX_32X32] = UV_INTRA_DC_H_V_CFL;
@@ -2407,6 +2415,7 @@
   interp_sf->use_fast_interpolation_filter_search = 0;
   interp_sf->use_interp_filter = 0;
   interp_sf->skip_interp_filter_search = 0;
+  interp_sf->use_more_sharp_interp = 0;
 }
 
 static inline void init_intra_sf(INTRA_MODE_SPEED_FEATURES *intra_sf) {
@@ -2843,6 +2852,9 @@
                                          AOMMIN(cm->width, cm->height) <= 1080;
   const bool is_vertical_video = cm->width < cm->height;
 
+  // Need to study the decoder time impact.
+  sf->interp_sf.use_more_sharp_interp = 0;
+
   // Speed features for vertical videos
   if (is_vertical_video && is_between_608p_and_1080p) {
     sf->lpf_sf.min_lr_unit_size = RESTORATION_UNITSIZE_MAX >> 1;
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index 1af82a8..05db0a9 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -1276,6 +1276,9 @@
   // Forces interpolation filter to EIGHTTAP_REGULAR and skips interpolation
   // filter search.
   int skip_interp_filter_search;
+
+  // Bias towards sharp filter
+  int use_more_sharp_interp;
 } INTERP_FILTER_SPEED_FEATURES;
 
 typedef struct INTRA_MODE_SPEED_FEATURES {