From d9c417cb49a155f8403254aa23c403af81ccbcf8 Mon Sep 17 00:00:00 2001 From: Angie Chiang Date: Tue, 21 Jun 2016 12:16:03 -0700 Subject: [PATCH] set interp_filter to SWITCHABLE_FILTER for intra block In vp9_pick_inter_mode(), 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 skipping filter search. Overall PSNR gain 0.074% for rtc dataset Details: Low Mid High 0.185% -0.008% -0.082% Change-Id: Id5c5ab38d3766c213d5681e17b4d1afd1529e676 --- vp9/encoder/vp9_encodeframe.c | 7 ++----- vp9/encoder/vp9_pickmode.c | 12 ++++++++++-- 2 files changed, 12 insertions(+), 7 deletions(-) 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 c13f24fb0..6fcc2a70f 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