rtc: Introduce prune_hv_pred_modes_using_src_sad sf

For rtc speed <= 8, currently DC, H and V intra modes are
evaluated in inter frames for block sizes < 32x32. This CL
introduces a speed feature 'prune_hv_pred_modes_using_src_sad'
to conditionally prune H and V modes based on color sensitivity,
SB level sad,frame source sad and block boosted information from
segment id. Currently, this sf impacts speed 8 alone.

For real-time encoding,
                 Instruction Count       BD-Rate Loss(%)
cpu   Testset      Reduction(%)     avg.psnr   ovr.psnr   ssim
 8      rtc           2.020         0.1052     0.0911     0.0426
 8    rtc_derf        2.790         0.1722     0.2383     0.1797

No changes to rtc_screen testset.

STATS_CHANGED for --rt, speed=8

Change-Id: Ied0fd6cef23bf654e288f3a58f422dae58c3b05c
diff --git a/av1/encoder/nonrd_pickmode.c b/av1/encoder/nonrd_pickmode.c
index 04796bd..98dc8f6 100644
--- a/av1/encoder/nonrd_pickmode.c
+++ b/av1/encoder/nonrd_pickmode.c
@@ -2734,6 +2734,36 @@
   assert(use_last_ref_frame || use_golden_ref_frame || use_alt_ref_frame);
 }
 
+// Checks whether Intra mode needs to be pruned based on
+// 'intra_y_mode_bsize_mask_nrd' and 'prune_hv_pred_modes_using_blksad'
+// speed features.
+static INLINE bool is_prune_intra_mode(AV1_COMP *cpi, int mode_index,
+                                       int force_intra_check, BLOCK_SIZE bsize,
+                                       uint8_t segment_id,
+                                       SOURCE_SAD source_sad_nonrd,
+                                       uint8_t color_sensitivity[2]) {
+  const PREDICTION_MODE this_mode = intra_mode_list[mode_index];
+  if (mode_index > 2 || force_intra_check == 0) {
+    if (!((1 << this_mode) & cpi->sf.rt_sf.intra_y_mode_bsize_mask_nrd[bsize]))
+      return true;
+
+    if (this_mode == DC_PRED) return false;
+
+    if (!cpi->sf.rt_sf.prune_hv_pred_modes_using_src_sad) return false;
+
+    const bool has_color_sensitivity =
+        color_sensitivity[0] && color_sensitivity[1];
+    if (has_color_sensitivity &&
+        (cpi->rc.frame_source_sad > 1.1 * cpi->rc.avg_source_sad ||
+         cyclic_refresh_segment_id_boosted(segment_id) ||
+         source_sad_nonrd > kMedSad))
+      return false;
+
+    return true;
+  }
+  return false;
+}
+
 /*!\brief Estimates best intra mode for inter mode search
  *
  * \ingroup nonrd_mode_search
@@ -2893,11 +2923,10 @@
     const THR_MODES mode_index = mode_idx[INTRA_FRAME][mode_offset(this_mode)];
     const int64_t mode_rd_thresh = rd_threshes[mode_index];
 
-    if (i > 2 || force_intra_check == 0) {
-      if (!((1 << this_mode) &
-            cpi->sf.rt_sf.intra_y_mode_bsize_mask_nrd[bsize]))
-        continue;
-    }
+    if (is_prune_intra_mode(cpi, i, force_intra_check, bsize, segment_id,
+                            x->content_state_sb.source_sad_nonrd,
+                            x->color_sensitivity))
+      continue;
 
     if (is_screen_content && cpi->sf.rt_sf.source_metrics_sb_nonrd) {
       // For spatially flat blocks with zero motion only check
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index 8366c49..d2562bc 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -1451,6 +1451,7 @@
       sf->rt_sf.nonrd_check_partition_merge_mode = 3;
       sf->rt_sf.nonrd_prune_ref_frame_search = 1;
       sf->rt_sf.use_nonrd_filter_search = 0;
+      sf->rt_sf.prune_hv_pred_modes_using_src_sad = false;
     }
     if (speed >= 9) {
       sf->rt_sf.prune_idtx_nonrd = 1;
@@ -1763,6 +1764,7 @@
     sf->rt_sf.partition_direct_merging = 1;
     sf->rt_sf.prune_compoundmode_with_singlemode_var = false;
     sf->mv_sf.use_bsize_dependent_search_method = 2;
+    sf->rt_sf.prune_hv_pred_modes_using_src_sad = true;
   }
   if (speed >= 9) {
     sf->rt_sf.sse_early_term_inter_search = EARLY_TERM_IDX_3;
@@ -2087,6 +2089,7 @@
   rt_sf->fullpel_search_step_param = 0;
   for (int i = 0; i < BLOCK_SIZES; ++i)
     rt_sf->intra_y_mode_bsize_mask_nrd[i] = INTRA_ALL;
+  rt_sf->prune_hv_pred_modes_using_src_sad = false;
   rt_sf->nonrd_aggressive_skip = 0;
   rt_sf->skip_cdef_sb = 0;
   rt_sf->force_large_partition_blocks_intra = 0;
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index 707f8609..00c21e5 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -1485,9 +1485,20 @@
   int fullpel_search_step_param;
 
   // Bit mask to enable or disable intra modes for each prediction block size
-  // separately, for nonrd pickmode.
+  // separately, for nonrd_pickmode.  Currently, the sf is not respected when
+  // 'force_intra_check' is true in 'estimate_intra_mode()' function. Also, H
+  // and V pred modes allowed through this sf can be further pruned when
+  //'prune_hv_pred_modes_using_src_sad' sf is true.
   int intra_y_mode_bsize_mask_nrd[BLOCK_SIZES];
 
+  // Prune H and V intra predition modes evalution in inter frame.
+  // The sf does not have any impact.
+  // i. when frame_source_sad is 1.1 times greater than avg_source_sad
+  // ii. when cyclic_refresh_segment_id_boosted is enabled
+  // iii. when SB level source sad is greater than kMedSad
+  // iv. when color sensitivity is non zero for both the chroma channels
+  bool prune_hv_pred_modes_using_src_sad;
+
   // Skips mode checks more aggressively in nonRD mode
   int nonrd_aggressive_skip;