Extend sf prune_inter_modes_based_on_tpl for 3 & 4

Extended the speed feature 'prune_inter_modes_based_on_tpl'
for speed presets 3 and 4 for non-newmv modes.

cpu-used   Instruction Count      BD-Rate Drop
              Reduction        avg.psnr   ovr.psnr   ssim
    3          1.201%           0.031%    0.028%    0.022%
    4          1.541%           0.044%    0.039%    0.033%

STATS_CHANGED

Change-Id: Ife61190baa27eeccafe1cd7979366dd1f355c43e
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index 0b570d6..217bde2 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -2173,19 +2173,25 @@
 
 static AOM_INLINE int prune_modes_based_on_tpl_stats(
     PruneInfoFromTpl *inter_cost_info_from_tpl, const int *refs, int ref_mv_idx,
-    const PREDICTION_MODE this_mode) {
+    const PREDICTION_MODE this_mode, int prune_mode_level) {
+  int have_newmv = have_newmv_in_inter_mode(this_mode);
+  if ((prune_mode_level < 3) && have_newmv) return 0;
+
+  const int prune_level_idx[3] = { 0, 1, 1 };
+  int prune_level = prune_level_idx[prune_mode_level - 1];
   int64_t cur_inter_cost;
 
   int is_globalmv = (this_mode == GLOBALMV) || (this_mode == GLOBAL_GLOBALMV);
   int prune_index = is_globalmv ? MAX_REF_MV_SEARCH : ref_mv_idx;
 
   // Thresholds used for pruning:
-  // Lower value indicates aggressive pruning for ref_mv indices 1, 2 and for
-  // GLOBAL/GLOBAL_GLOBALMV. Higher value indicates conservative pruning for
-  // ref_mv_idx 0. 'prune_index' 0, 1, 2 corresponds to ref_mv indices 0, 1
-  // and 2. prune_index 3 corresponds to GLOBALMV/GLOBAL_GLOBALMV
-  const int tpl_inter_mode_prune_mul_factor[MAX_REF_MV_SEARCH + 1] = { 3, 2, 2,
-                                                                       2 };
+  // Lower value indicates aggressive pruning and higher value indicates
+  // conservative pruning which is set based on ref_mv_idx and speed feature.
+  // 'prune_index' 0, 1, 2 corresponds to ref_mv indices 0, 1 and 2. prune_index
+  // 3 corresponds to GLOBALMV/GLOBAL_GLOBALMV
+  const int tpl_inter_mode_prune_mul_factor[2][MAX_REF_MV_SEARCH + 1] = {
+    { 3, 3, 3, 2 }, { 3, 2, 2, 2 }
+  };
 
   int is_comp_pred = (refs[1] > INTRA_FRAME);
 
@@ -2205,7 +2211,9 @@
   // best_inter_cost
   int64_t best_inter_cost = inter_cost_info_from_tpl->best_inter_cost;
   if (cur_inter_cost >
-      ((tpl_inter_mode_prune_mul_factor[prune_index] * best_inter_cost) >> 1))
+      ((tpl_inter_mode_prune_mul_factor[prune_level][prune_index] *
+        best_inter_cost) >>
+       1))
     return 1;
   return 0;
 }
@@ -2303,8 +2311,9 @@
     }
     if (prune_modes_based_on_tpl && !ref_match_found_in_above_nb &&
         !ref_match_found_in_left_nb && (ref_best_rd != INT64_MAX)) {
-      if (prune_modes_based_on_tpl_stats(inter_cost_info_from_tpl, refs,
-                                         ref_mv_idx, this_mode))
+      if (prune_modes_based_on_tpl_stats(
+              inter_cost_info_from_tpl, refs, ref_mv_idx, this_mode,
+              cpi->sf.inter_sf.prune_inter_modes_based_on_tpl))
         continue;
     }
     av1_init_rd_stats(rd_stats);
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index 11e2d61..95b4736 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -455,6 +455,7 @@
     // TODO(any): Experiment with the early exit mechanism for speeds 0, 1 and 2
     // and clean-up the speed feature
     sf->inter_sf.perform_best_rd_based_gating_for_chroma = 1;
+    sf->inter_sf.prune_inter_modes_based_on_tpl = boosted ? 0 : 1;
     sf->inter_sf.prune_comp_search_by_single_result = boosted ? 4 : 2;
     sf->inter_sf.prune_motion_mode_level = boosted ? 2 : 3;
     sf->inter_sf.selective_ref_frame = 4;
@@ -514,6 +515,7 @@
     sf->inter_sf.txfm_rd_gate_level =
         (boosted || cm->allow_screen_content_tools) ? 0 : 3;
 
+    sf->inter_sf.prune_inter_modes_based_on_tpl = boosted ? 0 : 2;
     sf->inter_sf.disable_smooth_interintra = 1;
 
     sf->interp_sf.cb_pred_filter_search = 1;
@@ -575,7 +577,7 @@
     sf->part_sf.ext_partition_eval_thresh =
         cm->allow_screen_content_tools ? BLOCK_8X8 : BLOCK_16X16;
 
-    sf->inter_sf.prune_inter_modes_based_on_tpl = boosted ? 0 : 1;
+    sf->inter_sf.prune_inter_modes_based_on_tpl = boosted ? 0 : 3;
     sf->inter_sf.disable_interinter_wedge = 1;
     sf->inter_sf.disable_obmc = 1;
     sf->inter_sf.disable_onesided_comp = 1;
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index acb1e35..86bea9f 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -657,6 +657,8 @@
   int disable_sb_level_mv_cost_upd;
 
   // Prune inter modes based on tpl stats
+  // 0 : no pruning
+  // 1 - 3 indicate increasing aggressiveness in order.
   int prune_inter_modes_based_on_tpl;
 
   // Model based breakout after interpolation filter search