Update conditions for disabling wedge search

Also disable edge computation if it is not used; add in variables in
speed_features for enabling at different cpu-used settings (to make testing
easier)

Change-Id: Ic319bbc1412a56f71a20c5f4fea2e1216b1745a6
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index 8bf16dd..04b9ac9 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -609,10 +609,15 @@
     x->source_variance =
         av1_get_sby_perpixel_variance(cpi, &x->plane[0].src, bsize);
   }
-  x->edge_strength =
-      edge_strength(&x->plane[0].src, bsize,
-                    xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH, xd->bd);
-
+  // If the threshold for disabling wedge search is zero, it means the feature
+  // should not be used. Use a value that will always succeed in the check.
+  if (cpi->sf.disable_wedge_search_edge_thresh == 0) {
+    x->edge_strength = UINT16_MAX;
+  } else {
+    x->edge_strength =
+        edge_strength(&x->plane[0].src, bsize,
+                      xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH, xd->bd);
+  }
   // Save rdmult before it might be changed, so it can be restored later.
   orig_rdmult = x->rdmult;
 
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index 0d72d15..8ec16d2 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -11,6 +11,7 @@
 
 #include <assert.h>
 #include <math.h>
+#include <stdbool.h>
 
 #include "config/aom_dsp_rtcd.h"
 #include "config/av1_rtcd.h"
@@ -8764,6 +8765,14 @@
   return 1;
 }
 
+static INLINE bool enable_wedge_search(MACROBLOCK *const x,
+                                       const AV1_COMP *const cpi) {
+  // Enable wedge search if source variance and edge strength are above
+  // the thresholds.
+  return x->source_variance > cpi->sf.disable_wedge_search_var_thresh &&
+         x->edge_strength > cpi->sf.disable_wedge_search_edge_thresh;
+}
+
 static int handle_inter_intra_mode(const AV1_COMP *const cpi,
                                    MACROBLOCK *const x, BLOCK_SIZE bsize,
                                    int mi_row, int mi_col, MB_MODE_INFO *mbmi,
@@ -8839,8 +8848,7 @@
     int64_t best_interintra_rd_nowedge = rd;
     int64_t best_interintra_rd_wedge = INT64_MAX;
     int_mv tmp_mv;
-    // Disable wedge search if source variance is small
-    if (x->source_variance > cpi->sf.disable_wedge_search_var_thresh) {
+    if (enable_wedge_search(x, cpi)) {
       mbmi->use_wedge_interintra = 1;
 
       rwedge = av1_cost_literal(get_interintra_wedge_bits(bsize)) +
@@ -9516,8 +9524,7 @@
       masked_type_cost += x->comp_group_idx_cost[comp_group_idx_ctx][1];
       masked_type_cost += x->compound_type_cost[bsize][cur_type - 1];
       rs2 = masked_type_cost;
-      if (x->source_variance > cpi->sf.disable_wedge_search_var_thresh &&
-          *rd / 3 < ref_best_rd) {
+      if (enable_wedge_search(x, cpi) && *rd / 3 < ref_best_rd) {
         best_rd_cur = build_and_cost_compound_type(
             cpi, x, cur_mv, bsize, this_mode, &rs2, *rate_mv, orig_dst,
             &tmp_rate_mv, preds0, preds1, buffers->residual1, buffers->diff10,
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index 41e4fde..fd0368e 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -200,6 +200,8 @@
   sf->intra_angle_estimation = 1;
   sf->selective_ref_frame = 1;
   sf->prune_wedge_pred_diff_based = 1;
+  sf->disable_wedge_search_var_thresh = 0;
+  sf->disable_wedge_search_edge_thresh = 0;
 
   if (speed >= 1) {
     sf->gm_erroradv_type = GM_ERRORADV_TR_1;
@@ -237,6 +239,8 @@
     sf->prune_single_motion_modes_by_simple_trans = 1;
 
     sf->full_pixel_motion_search_based_split = 1;
+    sf->disable_wedge_search_var_thresh = 0;
+    sf->disable_wedge_search_edge_thresh = 0;
   }
 
   if (speed >= 2) {
@@ -257,6 +261,7 @@
     // sf->auto_min_max_partition_size = RELAXED_NEIGHBORING_MIN_MAX;
     sf->allow_partition_search_skip = 1;
     sf->disable_wedge_search_var_thresh = 100;
+    sf->disable_wedge_search_edge_thresh = 0;
     sf->fast_wedge_sign_estimate = 1;
     sf->disable_dual_filter = 1;
     sf->use_jnt_comp_flag = JNT_COMP_DISABLED;
@@ -448,6 +453,7 @@
   sf->disable_filter_search_var_thresh = 0;
   sf->allow_partition_search_skip = 0;
   sf->use_accurate_subpel_search = USE_8_TAPS;
+  sf->disable_wedge_search_edge_thresh = 0;
   sf->disable_wedge_search_var_thresh = 0;
   sf->fast_wedge_sign_estimate = 0;
   sf->prune_wedge_pred_diff_based = 0;
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index 2b3e6e0..f71dcbf 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -440,7 +440,11 @@
   // Choose a very large value (UINT_MAX) to use 8-tap always
   unsigned int disable_filter_search_var_thresh;
 
-  // A source variance threshold below which wedge search is disabled
+  // Only enable wedge search if the edge strength is greater than
+  // this threshold. A value of 0 signals that this check is disabled.
+  unsigned int disable_wedge_search_edge_thresh;
+
+  // Only enable wedge search if the variance is above this threshold.
   unsigned int disable_wedge_search_var_thresh;
 
   // Whether fast wedge sign estimate is used