Introduce adjust_num_frames_for_arf_filtering sf for speed 6
For temporal filtering, the number of frames required for
filtering is adjusted based on frame update type, q index,
arf-boost and a sf 'num_frames_used_in_tf'. This CL introduces
a sf 'adjust_num_frames_for_arf_filtering' to adjust the frame
count based on the noise level of the current frame. The
adjustment is done such that low-noise frame considers more
frames to provide a filtered frame which can be used for better
prediction and vice versa for high-noise frames. Currently, the
sf is enabled only for speed 6.
Instruction Count BD-Rate Loss(%)
cpu Reduction(%) avg.psnr ovr.psnr ssim
6 1.795 -0.1979 -0.1324 -0.2099
STATS_CHANGED
Change-Id: I010554b3cd0a15dee83af9a3572243137b67cec7
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c
index 594ecb7..3e37288 100644
--- a/av1/encoder/speed_features.c
+++ b/av1/encoder/speed_features.c
@@ -886,7 +886,6 @@
sf->lpf_sf.cdef_pick_method = CDEF_FAST_SEARCH_LVL4;
sf->hl_sf.recode_tolerance = 55;
- if (!is_480p_or_larger) sf->hl_sf.num_frames_used_in_tf = 3;
}
}
@@ -1246,6 +1245,8 @@
if (speed >= 6) {
sf->hl_sf.disable_extra_sc_testing = 1;
sf->hl_sf.second_alt_ref_filtering = 0;
+ sf->hl_sf.adjust_num_frames_for_arf_filtering =
+ allow_screen_content_tools ? 0 : 1;
sf->inter_sf.prune_inter_modes_based_on_tpl = boosted ? 0 : 3;
sf->inter_sf.selective_ref_frame = 6;
@@ -1868,7 +1869,7 @@
hl_sf->superres_auto_search_type = SUPERRES_AUTO_ALL;
hl_sf->disable_extra_sc_testing = 0;
hl_sf->second_alt_ref_filtering = 1;
- hl_sf->num_frames_used_in_tf = INT_MAX;
+ hl_sf->adjust_num_frames_for_arf_filtering = 0;
hl_sf->accurate_bit_estimate = 0;
hl_sf->weight_calc_level_in_tf = 0;
}
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h
index 910e191..2392a35 100644
--- a/av1/encoder/speed_features.h
+++ b/av1/encoder/speed_features.h
@@ -432,10 +432,10 @@
int second_alt_ref_filtering;
/*!
- * Number of frames to be used in temporal filtering controlled based on noise
- * levels and arf-q.
+ * The number of frames to be used during temporal filtering of an ARF frame
+ * is adjusted based on noise level of the current frame.
*/
- int num_frames_used_in_tf;
+ int adjust_num_frames_for_arf_filtering;
/*!
* Decide the bit estimation approach used in qindex decision.
diff --git a/av1/encoder/temporal_filter.c b/av1/encoder/temporal_filter.c
index 76897e8..91a0c78 100644
--- a/av1/encoder/temporal_filter.c
+++ b/av1/encoder/temporal_filter.c
@@ -1051,6 +1051,18 @@
adjust_num = 0;
} else if ((update_type == KF_UPDATE) && q <= 10) {
adjust_num = 0;
+ } else if (cpi->sf.hl_sf.adjust_num_frames_for_arf_filtering &&
+ update_type != KF_UPDATE) {
+ // Adjust number of frames to be considered for filtering based on noise
+ // level of the current frame. For low-noise frame, use more frames to
+ // filter such that the filtered frame can provide better predictions for
+ // subsequent frames and vice versa.
+ if (noise_levels[AOM_PLANE_Y] < 0.5)
+ adjust_num = 4;
+ else if (noise_levels[AOM_PLANE_Y] < 1.0)
+ adjust_num = 2;
+ else
+ adjust_num = 0;
}
num_frames = AOMMIN(num_frames + adjust_num, lookahead_depth);
@@ -1066,10 +1078,6 @@
num_frames = AOMMIN(num_frames, gfu_boost / 150);
num_frames += !(num_frames & 1); // Make the number odd.
- // Limit the number of frames if noise levels are low and high quantizers.
- if (noise_levels[AOM_PLANE_Y] < 1.9 && cpi->ppi->p_rc.arf_q > 40)
- num_frames = AOMMIN(num_frames, cpi->sf.hl_sf.num_frames_used_in_tf);
-
// Only use 2 neighbours for the second ARF.
if (update_type == INTNL_ARF_UPDATE) num_frames = AOMMIN(num_frames, 3);
if (AOMMIN(max_after, max_before) >= num_frames / 2) {