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