Add speed feature to perform coarser lf level search
Added the speed feature 'use_coarse_filter_level_search'
to skip some final iterations in loop filter level search.
This speed feature is enabled for speed 5 and 6.
Instruction Count BD-Rate Loss(%)
cpu-used Reduction(%) avg.psnr ovr.psnr ssim
5 0.9 0.0012 -0.0004 0.0187
6 1.2 0.0304 0.0327 0.0248
Change-Id: I41ef2985d7180f4743b57d68977e632ea2af00fe
diff --git a/av1/encoder/picklpf.c b/av1/encoder/picklpf.c
index 594c070..cbb093c 100644
--- a/av1/encoder/picklpf.c
+++ b/av1/encoder/picklpf.c
@@ -131,6 +131,13 @@
// Sum squared error at each filter level
int64_t ss_err[MAX_LOOP_FILTER + 1];
+ const int use_coarse_search = cpi->sf.lpf_sf.use_coarse_filter_level_search;
+ assert(use_coarse_search <= 1);
+ static const int min_filter_step_lookup[2] = { 0, 2 };
+ // min_filter_step_thesh determines the stopping criteria for the search.
+ // The search is terminated when filter_step equals min_filter_step_thesh.
+ const int min_filter_step_thesh = min_filter_step_lookup[use_coarse_search];
+
// Set each entry to -1
memset(ss_err, 0xFF, sizeof(ss_err));
yv12_copy_plane(&cm->cur_frame->buf, &cpi->last_frame_uf, plane);
@@ -138,7 +145,7 @@
filt_best = filt_mid;
ss_err[filt_mid] = best_err;
- while (filter_step > 0) {
+ while (filter_step > min_filter_step_thesh) {
const int filt_high = AOMMIN(filt_mid + filter_step, max_filter_level);
const int filt_low = AOMMAX(filt_mid - filter_step, min_filter_level);
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index 428a3c7..dc07fc6 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -648,6 +648,8 @@
frame_is_intra_only(&cpi->common) ? MULTI_WINNER_MODE_FAST
: MULTI_WINNER_MODE_OFF;
+ sf->lpf_sf.use_coarse_filter_level_search =
+ frame_is_intra_only(&cpi->common) ? 0 : 1;
sf->lpf_sf.disable_lr_filter = 1;
sf->mv_sf.prune_mesh_search = 1;
@@ -1215,6 +1217,7 @@
lpf_sf->enable_sgr_ep_pruning = 0;
lpf_sf->reduce_wiener_window_size = 0;
lpf_sf->lpf_pick = LPF_PICK_FROM_FULL_IMAGE;
+ lpf_sf->use_coarse_filter_level_search = 0;
lpf_sf->cdef_pick_method = CDEF_FULL_SEARCH;
// Set decoder side speed feature to use less dual sgr modes
lpf_sf->dual_sgr_penalty_level = 0;
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index 48475ac..a453c84 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -898,6 +898,10 @@
// This feature controls how the loop filter level is determined.
LPF_PICK_METHOD lpf_pick;
+ // Skip some final iterations in the determination of the best loop filter
+ // level.
+ int use_coarse_filter_level_search;
+
// Control how the CDEF strength is determined.
CDEF_PICK_METHOD cdef_pick_method;