AV1 RT: Implement more agressive mode check skip

Based on analysis of the difference between av1 and vp9 nonRD pick mode.
Overall BDRate regression on lowres is 1.8% with 5-7% speed up vs
current speed 9

Change-Id: Ic17a1ae396751b7636b4004da5960b1d27becd3f
diff --git a/av1/encoder/nonrd_pickmode.c b/av1/encoder/nonrd_pickmode.c
index b5ffe2f..92d8a67 100644
--- a/av1/encoder/nonrd_pickmode.c
+++ b/av1/encoder/nonrd_pickmode.c
@@ -1250,14 +1250,18 @@
                                            MV_REFERENCE_FRAME ref_frame,
                                            THR_MODES best_mode_idx,
                                            PREDICTION_MODE mode) {
-  THR_MODES thr_mode_idx = mode_idx[ref_frame][mode_offset(mode)];
-  int *freq_fact = &x->thresh_freq_fact[bsize][thr_mode_idx];
-  if (thr_mode_idx == best_mode_idx) {
-    *freq_fact -= (*freq_fact >> 4);
-  } else {
-    *freq_fact =
-        AOMMIN(*freq_fact + RD_THRESH_INC,
-               cpi->sf.inter_sf.adaptive_rd_thresh * RD_THRESH_MAX_FACT);
+  const THR_MODES thr_mode_idx = mode_idx[ref_frame][mode_offset(mode)];
+  const BLOCK_SIZE min_size = AOMMAX(bsize - 3, BLOCK_4X4);
+  const BLOCK_SIZE max_size = AOMMIN(bsize + 6, BLOCK_128X128);
+  for (BLOCK_SIZE bs = min_size; bs <= max_size; bs += 3) {
+    int *freq_fact = &x->thresh_freq_fact[bsize][thr_mode_idx];
+    if (thr_mode_idx == best_mode_idx) {
+      *freq_fact -= (*freq_fact >> 4);
+    } else {
+      *freq_fact =
+          AOMMIN(*freq_fact + RD_THRESH_INC,
+                 cpi->sf.inter_sf.adaptive_rd_thresh * RD_THRESH_MAX_FACT);
+    }
   }
 }
 
@@ -1869,18 +1873,19 @@
 static AOM_INLINE int skip_mode_by_threshold(
     PREDICTION_MODE mode, MV_REFERENCE_FRAME ref_frame, int_mv mv,
     int frames_since_golden, const int *const rd_threshes,
-    const int *const rd_thresh_freq_fact, int64_t best_cost, int best_skip) {
+    const int *const rd_thresh_freq_fact, int64_t best_cost, int best_skip,
+    int extra_shift) {
   int skip_this_mode = 0;
   const THR_MODES mode_index = mode_idx[ref_frame][INTER_OFFSET(mode)];
-  int mode_rd_thresh =
-      best_skip ? rd_threshes[mode_index] << 1 : rd_threshes[mode_index];
+  int mode_rd_thresh = best_skip ? rd_threshes[mode_index] << (extra_shift + 1)
+                                 : rd_threshes[mode_index] << extra_shift;
 
   // Increase mode_rd_thresh value for non-LAST for improved encoding
   // speed
   if (ref_frame != LAST_FRAME) {
     mode_rd_thresh = mode_rd_thresh << 1;
     if (ref_frame == GOLDEN_FRAME && frames_since_golden > 4)
-      mode_rd_thresh = mode_rd_thresh << 1;
+      mode_rd_thresh = mode_rd_thresh << (extra_shift + 1);
   }
 
   if (rd_less_than_thresh(best_cost, mode_rd_thresh,
@@ -1964,6 +1969,7 @@
   PRED_BUFFER *this_mode_pred = NULL;
   const int reuse_inter_pred =
       cpi->sf.rt_sf.reuse_inter_pred_nonrd && cm->seq_params.bit_depth == 8;
+
   const int bh = block_size_high[bsize];
   const int bw = block_size_wide[bsize];
   const int pixels_in_block = bh * bw;
@@ -2125,7 +2131,8 @@
     if (skip_mode_by_threshold(
             this_mode, ref_frame, frame_mv[this_mode][ref_frame],
             cpi->rc.frames_since_golden, rd_threshes, rd_thresh_freq_fact,
-            best_rdc.rdcost, best_pickmode.best_mode_skip_txfm))
+            best_rdc.rdcost, best_pickmode.best_mode_skip_txfm,
+            (cpi->sf.rt_sf.nonrd_agressive_skip ? 1 : 0)))
       continue;
 
     // Select prediction reference frames.
@@ -2294,7 +2301,7 @@
     } else {
       if (reuse_inter_pred) free_pred_buffer(this_mode_pred);
     }
-    if (best_early_term && idx > 0) {
+    if (best_early_term && (idx > 0 || cpi->sf.rt_sf.nonrd_agressive_skip)) {
       txfm_info->skip_txfm = 1;
       break;
     }
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index 9154d0c..cc8cf88 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -334,6 +334,7 @@
     }
     if (speed >= 9) {
       sf->rt_sf.use_modeled_non_rd_cost = 1;
+      sf->rt_sf.nonrd_agressive_skip = 1;
 // TODO(kyslov) Re-enable when AV1 models are trained
 #if 0
       if (!frame_is_intra_only(cm)) {
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index 43408ef..688402f 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -1076,6 +1076,9 @@
   // Bit mask to enable or disable intra modes for each prediction block size
   // separately, for nonrd pickmode.
   int intra_y_mode_bsize_mask_nrd[BLOCK_SIZES];
+
+  // Skips mode checks more agressively in nonRD mode
+  int nonrd_agressive_skip;
 } REAL_TIME_SPEED_FEATURES;
 
 /*!\endcond */