diff --git a/vp9/encoder/vp9_encodeframe.c b/vp9/encoder/vp9_encodeframe.c index 984f98a91..f55804c97 100644 --- a/vp9/encoder/vp9_encodeframe.c +++ b/vp9/encoder/vp9_encodeframe.c @@ -1299,11 +1299,8 @@ static void set_mode_info_seg_skip(MACROBLOCK *x, TX_MODE tx_mode, MODE_INFO *const mi = xd->mi[0]; INTERP_FILTER filter_ref; - if (xd->above_mi) - filter_ref = xd->above_mi->interp_filter; - else if (xd->left_mi) - filter_ref = xd->left_mi->interp_filter; - else + filter_ref = vp9_get_pred_context_switchable_interp(xd); + if (filter_ref == SWITCHABLE_FILTERS) filter_ref = EIGHTTAP; mi->sb_type = bsize; diff --git a/vp9/encoder/vp9_pickmode.c b/vp9/encoder/vp9_pickmode.c index 3fdb0fe9a..f1fbd69ab 100644 --- a/vp9/encoder/vp9_pickmode.c +++ b/vp9/encoder/vp9_pickmode.c @@ -1410,9 +1410,13 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, x->skip_encode = cpi->sf.skip_encode_frame && x->q_index < QIDX_SKIP_THRESH; x->skip = 0; - if (xd->above_mi) + // Instead of using vp9_get_pred_context_switchable_interp(xd) to assign + // filter_ref, we use a less strict condition on assigning filter_ref. + // This is to reduce the probabily of entering the flow of not assigning + // filter_ref and then skip filter search. + if (xd->above_mi && is_inter_block(xd->above_mi)) filter_ref = xd->above_mi->interp_filter; - else if (xd->left_mi) + else if (xd->left_mi && is_inter_block(xd->left_mi)) filter_ref = xd->left_mi->interp_filter; else filter_ref = cm->interp_filter; @@ -1977,6 +1981,10 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, mi->ref_frame[0] = best_ref_frame; x->skip_txfm[0] = best_mode_skip_txfm; + if (!is_inter_block(mi)) { + mi->interp_filter = SWITCHABLE_FILTERS; + } + if (reuse_inter_pred && best_pred != NULL) { if (best_pred->data != orig_dst.buf && is_inter_mode(mi->mode)) { #if CONFIG_VP9_HIGHBITDEPTH