Add speed feature for interp filter search
Skipped sharp_filter evaluation based on regular and smooth filter rd for
dual_filter=0 case. This speed feature is turned on for speeds >= 4.
When tested for multiple test cases observed
1% average reduction in encoder time for speed=4 preset.
As per AWCY runs 0.01% average PSNR drop is seen for speed=4 preset.
STATS_CHANGED
Change-Id: I746e231b04cf0661754b782762abd02c45157970
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index c4876e5..55f5e35 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -8398,14 +8398,27 @@
skip_pred = (skip_hor & skip_ver);
}
} else {
+ int skip_pred = (skip_hor & skip_ver);
for (i = (SWITCHABLE_FILTERS + 1); i < filter_set_size;
i += (SWITCHABLE_FILTERS + 1)) {
// This assert tells that (filter_x == filter_y) for non-dual filter case
assert((filter_sets[i] & 0xffff) == (filter_sets[i] >> 16));
interpolation_filter_rd(x, cpi, bsize, mi_row, mi_col, orig_dst, rd,
switchable_rate, skip_txfm_sb, skip_sse_sb,
- dst_bufs, i, switchable_ctx,
- (skip_hor & skip_ver), rate, dist);
+ dst_bufs, i, switchable_ctx, skip_pred, rate,
+ dist);
+ // In first iteration, smooth filter is evaluated. If smooth filter
+ // (which is less sharper) is the winner among regular and smooth filters,
+ // sharp filter evaluation is skipped
+ // TODO(any): Refine this gating based on modelled rd only (i.e., by not
+ // accounting switchable filter rate)
+ if (cpi->sf.skip_sharp_interp_filter_search &&
+ skip_pred != cpi->default_interp_skip_flags) {
+ MACROBLOCKD *const xd = &x->e_mbd;
+ MB_MODE_INFO *const mbmi = xd->mi[0];
+ if (mbmi->interp_filters == filter_sets[(SWITCHABLE_FILTERS + 1)])
+ break;
+ }
}
}
}
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index 3f55d1f..41e4fde 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -294,6 +294,7 @@
sf->adaptive_mode_search = 1;
sf->cb_partition_search = !boosted;
sf->alt_ref_search_fp = 1;
+ sf->skip_sharp_interp_filter_search = 1;
}
if (speed >= 5) {
@@ -509,6 +510,7 @@
sf->inter_mode_rd_model_estimation = 0;
sf->obmc_full_pixel_search_level = 0;
+ sf->skip_sharp_interp_filter_search = 0;
if (oxcf->mode == GOOD)
set_good_speed_features_framesize_independent(cpi, sf, oxcf->speed);
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index a46a912..2b3e6e0 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -585,6 +585,10 @@
// identical
int skip_obmc_in_uniform_mv_field;
int skip_wm_in_uniform_mv_field;
+
+ // skip sharp_filter evaluation based on regular and smooth filter rd for
+ // dual_filter=0 case
+ int skip_sharp_interp_filter_search;
} SPEED_FEATURES;
struct AV1_COMP;