Extend SF alt_ref_search_fp to speed 2 and 3
Extended SF alt_ref_search_fp. It is made less
aggressive in speed 2 and 3.
cpu-used Instruction Count BD-Rate Loss(%)
Reduction(%) avg.psnr ovr.psnr ssim
2 0.893 -0.2168 -0.2230 -0.2102
3 1.289 -0.1578 -0.1605 -0.1981
STATS_CHANGED
Change-Id: Iaef03e4d560cbc2ad20d1a0f4291b1c00ab89132
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index c88cab2..8ecb4de 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -3821,11 +3821,23 @@
int sad_thresh = x->best_pred_mv_sad + (x->best_pred_mv_sad >> 3);
// Conservatively skip the modes w.r.t. BWDREF, ALTREF2 and ALTREF, if
// those are past frames
- for (ref_frame = BWDREF_FRAME; ref_frame <= ALTREF_FRAME; ref_frame++) {
+ MV_REFERENCE_FRAME start_frame =
+ sf->inter_sf.alt_ref_search_fp == 1 ? ALTREF2_FRAME : BWDREF_FRAME;
+ for (ref_frame = start_frame; ref_frame <= ALTREF_FRAME; ref_frame++) {
if (cpi->ref_frame_dist_info.ref_relative_dist[ref_frame - LAST_FRAME] <
- 0)
+ 0) {
+ // Prune inter modes when relative dist of ALTREF2 and ALTREF is close
+ // to the relative dist of LAST_FRAME.
+ if (sf->inter_sf.alt_ref_search_fp == 1 &&
+ (abs(cpi->ref_frame_dist_info
+ .ref_relative_dist[ref_frame - LAST_FRAME]) >
+ 1.5 * abs(cpi->ref_frame_dist_info
+ .ref_relative_dist[LAST_FRAME - LAST_FRAME]))) {
+ continue;
+ }
if (x->pred_mv_sad[ref_frame] > sad_thresh)
mask->pred_modes[ref_frame] |= INTER_ALL;
+ }
}
}
}
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index 45634b1..c275ac6 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -936,6 +936,7 @@
sf->inter_sf.disable_interinter_wedge_newmv_search =
is_boosted_arf2_bwd_type ? 0 : 1;
sf->inter_sf.inter_mode_txfm_breakout = boosted ? 0 : 1;
+ sf->inter_sf.alt_ref_search_fp = 1;
sf->interp_sf.adaptive_interp_filter_search = 1;
sf->interp_sf.disable_dual_filter = 1;
@@ -1049,7 +1050,7 @@
(allow_screen_content_tools || frame_is_intra_only(&cpi->common)) ? 0
: 1;
- sf->inter_sf.alt_ref_search_fp = 1;
+ sf->inter_sf.alt_ref_search_fp = 2;
sf->inter_sf.txfm_rd_gate_level = boosted ? 0 : 3;
sf->inter_sf.prune_inter_modes_based_on_tpl = boosted ? 0 : 2;
@@ -1288,7 +1289,7 @@
sf->inter_sf.disable_interintra_wedge_var_thresh = UINT_MAX;
sf->inter_sf.prune_comp_search_by_single_result = 2;
sf->inter_sf.selective_ref_frame = 4;
- sf->inter_sf.alt_ref_search_fp = 1;
+ sf->inter_sf.alt_ref_search_fp = 2;
sf->inter_sf.txfm_rd_gate_level = boosted ? 0 : 4;
sf->inter_sf.adaptive_rd_thresh = 4;
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index 0df28e0..3f9a025 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -753,6 +753,10 @@
// 2 implies prune horiz, vert and extended partition
int prune_ref_frame_for_rect_partitions;
+ // Prune inter modes w.r.t past reference frames
+ // 0 no pruning
+ // 1 prune inter modes w.r.t ALTREF2 and ALTREF reference frames
+ // 2 prune inter modes w.r.t BWDREF, ALTREF2 and ALTREF reference frames
int alt_ref_search_fp;
// Skip the current ref_mv in NEW_MV mode based on mv, rate cost, etc.