Gate intra eval if best of inter is skip

If the best inter turns out to be skip, skip the evaluation of intra
modes altogether if the source variance is higher than a threshold.
Applicable for cpu-used 4.

           Encode Time
cpu-used     Reduction      Quality Loss
   4           1.5%           0.0239%

STATS_CHANGED

Change-Id: Ia9f5520dbe1851e93ad87c586aa150dcf3905127
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index a44568e..885d3a7 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -12906,6 +12906,13 @@
 #if CONFIG_COLLECT_COMPONENT_TIMING
   start_timing(cpi, handle_intra_mode_time);
 #endif
+
+  // Gate intra mode evaluation if best of inter is skip except when source
+  // variance is extremely low
+  if ((search_state.best_mbmode.skip) && (sf->skip_intra_in_interframe >= 2) &&
+      (x->source_variance > sf->src_var_thresh_intra_skip))
+    search_state.skip_intra_modes = 1;
+
   const int intra_ref_frame_cost = ref_costs_single[INTRA_FRAME];
   for (int j = 0; j < intra_mode_num; ++j) {
     if (sf->skip_intra_in_interframe && search_state.skip_intra_modes) break;
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index 3ad1139..7eddc50 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -396,6 +396,9 @@
     sf->perform_coeff_opt = is_boosted_arf2_bwd_type ? 2 : 4;
     sf->adaptive_txb_search_level = boosted ? 2 : 3;
     sf->mv.subpel_search_method = SUBPEL_TREE_PRUNED_MORE;
+    // TODO(any): Experiment with this speed feature set to 2 for higher quality
+    // presets as well
+    sf->skip_intra_in_interframe = 2;
   }
 
   if (speed >= 5) {
@@ -791,6 +794,7 @@
   sf->skip_wm_in_uniform_mv_field = 0;
   sf->adaptive_interp_filter_search = 0;
   sf->interp_filter_search_mask = ALLOW_ALL_INTERP_FILT_MASK;
+  sf->src_var_thresh_intra_skip = 1;
 
   for (i = 0; i < TX_SIZES; i++) {
     sf->intra_y_mode_mask[i] = INTRA_ALL;
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index 96a1384..008bc61 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -537,6 +537,10 @@
   // flag to allow skipping intra mode for inter frame prediction
   int skip_intra_in_interframe;
 
+  // variance threshold for intra mode gating when inter turned out to be skip
+  // in inter frame prediction
+  unsigned int src_var_thresh_intra_skip;
+
   // Use hash table to store intra(keyframe only) txb transform search results
   // to avoid repeated search on the same residue signal.
   int use_intra_txb_hash;