rtc: Extend prune_winner_mode_eval_level to preset 6

This patch extends pruning level of prune_winner_mode_eval_level
speed feature based on transform skip and quantizer. The newly
added levels are extended to speed 6.

          Instruction Count       BD-Rate Loss(%)
cpu-used    Reduction(%)     avg.psnr  ovr.psnr   ssim
   6          4.604           0.2178    0.2309    0.2252

Details of worst case drops:
cpu           Clip           BD-Rate Loss (%)
                               (avg. PSNR)
6        three_scene_cut_180p      1.733
6        mmstionaryvga             1.216
6        kirlandvga                1.176

STATS_CHANGED

Change-Id: Id64ad8a6baed8f7e3259cae5978371ada831d4ba
diff --git a/av1/encoder/rdopt_utils.h b/av1/encoder/rdopt_utils.h
index 917ee37..ece3da7 100644
--- a/av1/encoder/rdopt_utils.h
+++ b/av1/encoder/rdopt_utils.h
@@ -400,14 +400,33 @@
 static INLINE int bypass_winner_mode_processing(const MACROBLOCK *const x,
                                                 const SPEED_FEATURES *sf,
                                                 int use_txfm_skip,
-                                                int actual_txfm_skip) {
+                                                int actual_txfm_skip,
+                                                PREDICTION_MODE best_mode) {
+  const int prune_winner_mode_eval_level =
+      sf->winner_mode_sf.prune_winner_mode_eval_level;
+
   // Disable winner mode processing for blocks with low source variance.
   // The aggressiveness of this pruning logic reduces as qindex increases.
   // The threshold decreases linearly from 64 as qindex varies from 0 to 255.
-  if (sf->winner_mode_sf.prune_winner_mode_eval_level == 1) {
+  if (prune_winner_mode_eval_level == 1) {
     const unsigned int src_var_thresh = 64 - 48 * x->qindex / (MAXQ + 1);
     if (x->source_variance < src_var_thresh) return 1;
-  } else if (sf->winner_mode_sf.prune_winner_mode_eval_level >= 2) {
+  } else if (prune_winner_mode_eval_level == 2) {
+    // Skip winner mode processing of blocks for which transform turns out to be
+    // skip due to nature of eob alone except NEWMV mode.
+    if (!have_newmv_in_inter_mode(best_mode) && actual_txfm_skip) return 1;
+  } else if (prune_winner_mode_eval_level == 3) {
+    // Skip winner mode processing of blocks for which transform turns out to be
+    // skip except NEWMV mode and considered based on the quantizer.
+    // At high quantizers: Take conservative approach by considering transform
+    // skip based on eob alone.
+    // At low quantizers: Consider transform skip based on eob nature or RD cost
+    // evaluation.
+    const int is_txfm_skip =
+        x->qindex > 127 ? actual_txfm_skip : actual_txfm_skip || use_txfm_skip;
+
+    if (!have_newmv_in_inter_mode(best_mode) && is_txfm_skip) return 1;
+  } else if (prune_winner_mode_eval_level >= 4) {
     // Do not skip winner mode evaluation at low quantizers if normal mode's
     // transform search was too aggressive.
     if (sf->rd_sf.perform_coeff_opt >= 5 && x->qindex <= 70) return 0;
@@ -426,7 +445,8 @@
   const SPEED_FEATURES *sf = &cpi->sf;
   const PREDICTION_MODE best_mode = mbmi->mode;
 
-  if (bypass_winner_mode_processing(x, sf, mbmi->skip_txfm, actual_txfm_skip))
+  if (bypass_winner_mode_processing(x, sf, mbmi->skip_txfm, actual_txfm_skip,
+                                    best_mode))
     return 0;
 
   // TODO(any): Move block independent condition checks to frame level
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index 8f6138c..7fb6961 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -1071,7 +1071,7 @@
                 : gf_group->update_type[cpi->gf_frame_index] == INTNL_ARF_UPDATE
                       ? 1
                       : 2;
-    sf->winner_mode_sf.prune_winner_mode_eval_level = boosted ? 0 : 2;
+    sf->winner_mode_sf.prune_winner_mode_eval_level = boosted ? 0 : 4;
 
     // For screen content, "prune_sgr_based_on_wiener = 2" cause large quality
     // loss.
@@ -1226,6 +1226,8 @@
   if (!is_360p_or_larger) {
     sf->rt_sf.prune_intra_mode_based_on_mv_range = 1;
     sf->rt_sf.prune_inter_modes_wrt_gf_arf_based_on_sad = 1;
+    if (speed >= 6)
+      sf->winner_mode_sf.prune_winner_mode_eval_level = boosted ? 0 : 2;
     if (speed >= 7) sf->lpf_sf.cdef_pick_method = CDEF_PICK_FROM_Q;
     if (speed >= 8) {
       sf->rt_sf.use_nonrd_filter_search = 0;
@@ -1533,6 +1535,8 @@
     sf->rt_sf.var_part_split_threshold_shift = 7;
     if (!frame_is_intra_only(&cpi->common))
       sf->rt_sf.var_part_based_on_qidx = 2;
+
+    sf->winner_mode_sf.prune_winner_mode_eval_level = boosted ? 0 : 3;
   }
 
   if (speed >= 7) {
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index d429cfd..ba84f30 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -1252,11 +1252,17 @@
   // tx_search_best_inter_candidates.
   int winner_mode_ifs;
 
-  // Controls the disabling of winner mode processing. The method considered for
-  // disabling, depends on the sf level value and it is described as below.
+  // Controls the disabling of winner mode processing. Speed feature levels
+  // are ordered in increasing aggressiveness of pruning. The method considered
+  // for disabling, depends on the sf level value and it is described as below.
   // 0: Do not disable
   // 1: Disable for blocks with low source variance.
-  // 2: Disable for blocks which turn out to be transform skip during MODE_EVAL
+  // 2: Disable for blocks which turn out to be transform skip (skipped based on
+  // eob) during MODE_EVAL stage except NEWMV mode.
+  // 3: Disable for blocks which turn out to be transform skip during MODE_EVAL
+  // stage except NEWMV mode. For high quantizers, prune conservatively based on
+  // transform skip (skipped based on eob) except for NEWMV mode.
+  // 4: Disable for blocks which turn out to be transform skip during MODE_EVAL
   // stage.
   int prune_winner_mode_eval_level;
 } WINNER_MODE_SPEED_FEATURES;