diff --git a/vp9/encoder/vp9_rdopt.c b/vp9/encoder/vp9_rdopt.c index 6db47c34d2d823b61ebb9164f3f3856ff383f0e1..e221f3f176c2f8eacc6c15433cf1db10740cc945 100644 --- a/vp9/encoder/vp9_rdopt.c +++ b/vp9/encoder/vp9_rdopt.c @@ -2040,7 +2040,18 @@ static int64_t handle_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, uint8_t *orig_dst[MAX_MB_PLANE]; int orig_dst_stride[MAX_MB_PLANE]; int rs = 0; - INTERP_FILTER best_filter = cm->interp_filter; + INTERP_FILTER best_filter = SWITCHABLE; + + int bsl = mi_width_log2_lookup[bsize]; + int pred_filter_search = cpi->sf.cb_pred_filter_search ? + (((mi_row + mi_col) >> bsl)) & 0x01 : 0; + + if (pred_filter_search && this_mode != NEWMV) { + if (xd->up_available) + best_filter = xd->mi[-xd->mi_stride]->mbmi.interp_filter; + else if (xd->left_available) + best_filter = xd->mi[-1]->mbmi.interp_filter; + } if (is_comp_pred) { if (frame_mv[refs[0]].as_int == INVALID_MV || @@ -2124,10 +2135,9 @@ static int64_t handle_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, rd_opt->filter_cache[i] = INT64_MAX; if (cm->interp_filter != BILINEAR) { - best_filter = EIGHTTAP; if (x->source_variance < cpi->sf.disable_filter_search_var_thresh) { best_filter = EIGHTTAP; - } else { + } else if (best_filter == SWITCHABLE) { int newbest; int tmp_rate_sum = 0; int64_t tmp_dist_sum = 0; diff --git a/vp9/encoder/vp9_speed_features.c b/vp9/encoder/vp9_speed_features.c index 8fb4aa5666370004d745fe0c559c82dfad053bfc..7315dd45446772f0d700c566dc8afcb1520914a9 100644 --- a/vp9/encoder/vp9_speed_features.c +++ b/vp9/encoder/vp9_speed_features.c @@ -116,6 +116,7 @@ static void set_good_speed_feature(VP9_COMP *cpi, VP9_COMMON *cm, sf->disable_split_mask = DISABLE_ALL_INTER_SPLIT; sf->adaptive_pred_interp_filter = 0; + sf->cb_pred_filter_search = 1; sf->lf_motion_threshold = LOW_MOTION_THRESHOLD; sf->last_partitioning_redo_frequency = 3; @@ -332,6 +333,7 @@ void vp9_set_speed_features(VP9_COMP *cpi) { sf->use_lp32x32fdct = 0; sf->adaptive_motion_search = 0; sf->adaptive_pred_interp_filter = 0; + sf->cb_pred_filter_search = 0; sf->use_quant_fp = 0; sf->reference_masking = 0; sf->partition_search_type = SEARCH_PARTITION; diff --git a/vp9/encoder/vp9_speed_features.h b/vp9/encoder/vp9_speed_features.h index bdbbe5888a67fb950de2822851dd563b8f8dd82b..929acaf3e10845ead414b8bea0245e9550636882 100644 --- a/vp9/encoder/vp9_speed_features.h +++ b/vp9/encoder/vp9_speed_features.h @@ -283,6 +283,9 @@ typedef struct SPEED_FEATURES { // was selected, and 2 means we use 8 tap if no 8x8 filter mode was selected. int adaptive_pred_interp_filter; + // Chessboard pattern prediction filter type search + int cb_pred_filter_search; + // Fast quantization process path int use_quant_fp;