rtc: Modify interpol filter search for nonrd
Always enable the filter search for the segment block,
and for blocks where filter search is not done
(cb/checker-board flag on) force smooth if top/left
were selected as smooth.
bdrate gain on sp 9: avg_psnr/ovr_psnr/sssim:0.67/0.61/0.83,
most clips have small bdrate gain.
Negligible speed change observed.
Change-Id: I1ab899b03165d111fbd4d45464012d0400f17e68
diff --git a/av1/encoder/nonrd_pickmode.c b/av1/encoder/nonrd_pickmode.c
index d817627..f264665 100644
--- a/av1/encoder/nonrd_pickmode.c
+++ b/av1/encoder/nonrd_pickmode.c
@@ -2083,7 +2083,8 @@
}
static AOM_INLINE int is_filter_search_enabled(const AV1_COMP *cpi, int mi_row,
- int mi_col, BLOCK_SIZE bsize) {
+ int mi_col, BLOCK_SIZE bsize,
+ int segment_id) {
const AV1_COMMON *const cm = &cpi->common;
int enable_filter_search = 0;
@@ -2095,6 +2096,8 @@
(((mi_row + mi_col) >> bsl) +
get_chessboard_index(cm->current_frame.frame_number)) &
0x1;
+ if (cyclic_refresh_segment_id_boosted(segment_id))
+ enable_filter_search = 1;
}
}
return enable_filter_search;
@@ -2438,7 +2441,7 @@
quant_params->base_qindex && cm->seq_params->bit_depth == 8;
const int enable_filter_search =
- is_filter_search_enabled(cpi, mi_row, mi_col, bsize);
+ is_filter_search_enabled(cpi, mi_row, mi_col, bsize, segment_id);
// TODO(marpan): Look into reducing these conditions. For now constrain
// it to avoid significant bdrate loss.
@@ -2684,6 +2687,20 @@
if (force_mv_inter_layer)
mi->interp_filters = av1_broadcast_interp_filter(EIGHTTAP_REGULAR);
+ // If it is sub-pel motion and best filter was not selected in
+ // search_filter_ref() for all blocks, then check top and left values and
+ // force smooth if both were selected to be smooth.
+ if (cpi->sf.interp_sf.cb_pred_filter_search &&
+ (mi->mv[0].as_mv.row & 0x07 || mi->mv[0].as_mv.col & 0x07)) {
+ if (xd->left_mbmi && xd->above_mbmi) {
+ if ((xd->left_mbmi->interp_filters.as_filters.x_filter ==
+ EIGHTTAP_SMOOTH &&
+ xd->above_mbmi->interp_filters.as_filters.x_filter ==
+ EIGHTTAP_SMOOTH))
+ mi->interp_filters = av1_broadcast_interp_filter(EIGHTTAP_SMOOTH);
+ }
+ }
+
av1_enc_build_inter_predictor(cm, xd, mi_row, mi_col, NULL, bsize, 0, 0);
if (use_model_yrd_large) {