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) {