diff --git a/vp9/encoder/vp9_rdopt.c b/vp9/encoder/vp9_rdopt.c index d3a1db8bd..d5b8ddc23 100644 --- a/vp9/encoder/vp9_rdopt.c +++ b/vp9/encoder/vp9_rdopt.c @@ -2794,6 +2794,10 @@ int64_t vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi, MACROBLOCK *x, } if (ref_frame == INTRA_FRAME) { + if (cpi->sf.adaptive_mode_search) + if ((x->source_variance << num_pels_log2_lookup[bsize]) > best_intra_rd) + continue; + if (!(intra_y_mode_mask & (1 << this_mode))) continue; if (this_mode != DC_PRED) { @@ -2966,6 +2970,8 @@ int64_t vp9_rd_pick_inter_mode_sb(VP9_COMP *cpi, MACROBLOCK *x, /* required for left and above block mv */ mbmi->mv[0].as_int = 0; max_plane = 1; + } else { + best_intra_rd = x->pred_sse[ref_frame]; } *returnrate = rate2; diff --git a/vp9/encoder/vp9_speed_features.c b/vp9/encoder/vp9_speed_features.c index 0bead48fe..36c02e031 100644 --- a/vp9/encoder/vp9_speed_features.c +++ b/vp9/encoder/vp9_speed_features.c @@ -144,6 +144,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->adaptive_mode_search = 1; sf->cb_partition_search = !boosted; sf->cb_pred_filter_search = 1; sf->alt_ref_search_fp = 1; @@ -386,6 +387,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->adaptive_mode_search = 0; sf->cb_pred_filter_search = 0; sf->cb_partition_search = 0; sf->motion_field_mode_search = 0; diff --git a/vp9/encoder/vp9_speed_features.h b/vp9/encoder/vp9_speed_features.h index e31185e59..33c441f62 100644 --- a/vp9/encoder/vp9_speed_features.h +++ b/vp9/encoder/vp9_speed_features.h @@ -291,6 +291,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; + // Adaptive prediction mode search + int adaptive_mode_search; + // Chessboard pattern prediction filter type search int cb_pred_filter_search;