Add speed feature smooth interintra for speed >= 4
Added a speed feature to disable smooth interintra mode for inter frames
in highest layer while speed >= 4
For speed 4 preset, BD-rate drop is seen by 0.03% (as per AWCY runs)
with encode time reduction of 2% (averaged across multiple test cases).
STATS_CHANGED
Change-Id: I3ffede30ec5658b2068749cd4bae77eb43ebec27
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index fe1a2ac..4d9bb7a 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -8953,7 +8953,8 @@
mbmi->ref_frame[1] = INTRA_FRAME;
best_interintra_mode = args->inter_intra_mode[mbmi->ref_frame[0]];
- if (cpi->oxcf.enable_smooth_interintra) {
+ if (cpi->oxcf.enable_smooth_interintra &&
+ !cpi->sf.disable_smooth_interintra) {
mbmi->use_wedge_interintra = 0;
int j = 0;
if (cpi->sf.reuse_inter_intra_mode == 0 ||
@@ -8978,7 +8979,8 @@
}
args->inter_intra_mode[mbmi->ref_frame[0]] = best_interintra_mode;
}
- assert(IMPLIES(!cpi->oxcf.enable_smooth_interintra,
+ assert(IMPLIES(!cpi->oxcf.enable_smooth_interintra ||
+ cpi->sf.disable_smooth_interintra,
best_interintra_mode != II_SMOOTH_PRED));
rmode = interintra_mode_cost[best_interintra_mode];
if (j == 0 || best_interintra_mode != II_SMOOTH_PRED) {
@@ -9010,7 +9012,8 @@
rwedge = av1_cost_literal(get_interintra_wedge_bits(bsize)) +
x->wedge_interintra_cost[bsize][1];
- if (!cpi->oxcf.enable_smooth_interintra) {
+ if (!cpi->oxcf.enable_smooth_interintra ||
+ cpi->sf.disable_smooth_interintra) {
if (best_interintra_mode == INTERINTRA_MODES) {
mbmi->interintra_mode = II_SMOOTH_PRED;
best_interintra_mode = II_SMOOTH_PRED;
@@ -9091,7 +9094,8 @@
rd_stats.dist);
}
best_interintra_rd_wedge = rd;
- if (!cpi->oxcf.enable_smooth_interintra &&
+ if ((!cpi->oxcf.enable_smooth_interintra ||
+ cpi->sf.disable_smooth_interintra) &&
best_interintra_rd_wedge == INT64_MAX)
return -1;
if (best_interintra_rd_wedge < best_interintra_rd_nowedge) {
@@ -9106,10 +9110,14 @@
AOM_PLANE_Y, AOM_PLANE_Y);
}
} else {
- if (!cpi->oxcf.enable_smooth_interintra) return -1;
+ if (!cpi->oxcf.enable_smooth_interintra ||
+ cpi->sf.disable_smooth_interintra)
+ return -1;
mbmi->use_wedge_interintra = 0;
}
- } // if (is_wedge_used)
+ } else {
+ if (best_interintra_rd == INT64_MAX) return -1;
+ }
if (num_planes > 1) {
av1_enc_build_inter_predictor(cm, xd, mi_row, mi_col, orig_dst, bsize,
AOM_PLANE_U, num_planes - 1);
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index 5237b03..93d6ea4 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -344,6 +344,13 @@
sf->mv.subpel_search_method = SUBPEL_TREE_PRUNED;
sf->adaptive_pred_interp_filter = 0;
sf->adaptive_mode_search = 1;
+ // TODO(any): evaluate this speed feature for 2 and 3
+ if (cpi->oxcf.enable_smooth_interintra) {
+ sf->disable_smooth_interintra =
+ (boosted || cpi->refresh_bwd_ref_frame || cpi->refresh_alt2_ref_frame)
+ ? 0
+ : 1;
+ }
sf->cb_partition_search = !boosted;
sf->alt_ref_search_fp = 1;
sf->skip_sharp_interp_filter_search = 1;
@@ -774,6 +781,7 @@
sf->skip_sharp_interp_filter_search = 0;
sf->prune_comp_type_by_comp_avg = 0;
sf->disable_interinter_wedge_newmv_search = 0;
+ sf->disable_smooth_interintra = 0;
sf->prune_motion_mode_level = 0;
sf->prune_warp_using_wmtype = 0;
sf->disable_wedge_interintra_search = 0;
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index b055904..66c096d 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -615,6 +615,9 @@
// Enable/disable ME for interinter wedge search.
int disable_interinter_wedge_newmv_search;
+ // Enable/disable smooth inter-intra mode
+ int disable_smooth_interintra;
+
// skip sharp_filter evaluation based on regular and smooth filter rd for
// dual_filter=0 case
int skip_sharp_interp_filter_search;