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;