summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--vp9/encoder/vp9_rdopt.c20
-rw-r--r--vp9/encoder/vp9_speed_features.c13
-rw-r--r--vp9/encoder/vp9_speed_features.h6
3 files changed, 24 insertions, 15 deletions
diff --git a/vp9/encoder/vp9_rdopt.c b/vp9/encoder/vp9_rdopt.c
index 309341682..f87ab3e0b 100644
--- a/vp9/encoder/vp9_rdopt.c
+++ b/vp9/encoder/vp9_rdopt.c
@@ -2801,13 +2801,12 @@ static int64_t handle_inter_mode(
uint8_t skip_txfm[MAX_MB_PLANE << 2] = { 0 };
int64_t bsse[MAX_MB_PLANE << 2] = { 0 };
- int bsl = mi_width_log2_lookup[bsize];
- int pred_filter_search =
- cpi->sf.cb_pred_filter_search
- ? (((mi_row + mi_col) >> bsl) +
- get_chessboard_index(cm->current_video_frame)) &
- 0x1
- : 0;
+ const int bsl = mi_width_log2_lookup[bsize];
+ const int blk_parity = (((mi_row + mi_col) >> bsl) +
+ get_chessboard_index(cm->current_video_frame)) &
+ 0x1;
+ const int pred_filter_search =
+ (cpi->sf.cb_pred_filter_search >= 2) && blk_parity;
int skip_txfm_sb = 0;
int64_t skip_sse_sb = INT64_MAX;
@@ -2947,9 +2946,14 @@ static int64_t handle_inter_mode(
for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; ++i) filter_cache[i] = INT64_MAX;
if (cm->interp_filter != BILINEAR) {
+ // Use cb pattern for filter eval when filter is not switchable
+ const int enable_interp_search =
+ (cpi->sf.cb_pred_filter_search && cm->interp_filter != SWITCHABLE)
+ ? blk_parity
+ : 1;
if (x->source_variance < cpi->sf.disable_filter_search_var_thresh) {
best_filter = EIGHTTAP;
- } else if (best_filter == SWITCHABLE) {
+ } else if (best_filter == SWITCHABLE && enable_interp_search) {
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 f19385b6a..f47e3d71c 100644
--- a/vp9/encoder/vp9_speed_features.c
+++ b/vp9/encoder/vp9_speed_features.c
@@ -159,7 +159,7 @@ static void set_good_speed_feature_framesize_dependent(VP9_COMP *cpi,
sf->intra_y_mode_mask[TX_32X32] = INTRA_DC;
sf->intra_uv_mode_mask[TX_32X32] = INTRA_DC;
sf->alt_ref_search_fp = 1;
- sf->cb_pred_filter_search = 1;
+ sf->cb_pred_filter_search = 2;
sf->adaptive_interp_filter_search = 1;
sf->disable_split_mask = DISABLE_ALL_SPLIT;
}
@@ -228,6 +228,7 @@ static void set_good_speed_feature_framesize_independent(VP9_COMP *cpi,
sf->tx_size_search_breakout = 1;
sf->use_square_partition_only = !boosted;
sf->early_term_interp_search_plane_rd = 1;
+ sf->cb_pred_filter_search = 1;
sf->intra_y_mode_mask[TX_32X32] = INTRA_DC_H_V;
@@ -346,7 +347,7 @@ static void set_good_speed_feature_framesize_independent(VP9_COMP *cpi,
sf->adaptive_pred_interp_filter = 0;
sf->adaptive_mode_search = 1;
sf->cb_partition_search = !boosted;
- sf->cb_pred_filter_search = 1;
+ sf->cb_pred_filter_search = 2;
sf->alt_ref_search_fp = 1;
sf->recode_loop = ALLOW_RECODE_KFMAXBW;
sf->adaptive_rd_thresh = 3;
@@ -639,7 +640,7 @@ static void set_rt_speed_feature_framesize_independent(
sf->use_altref_onepass = 1;
sf->use_compound_nonrd_pickmode = 1;
}
- if (cm->width * cm->height > 1280 * 720) sf->cb_pred_filter_search = 1;
+ if (cm->width * cm->height > 1280 * 720) sf->cb_pred_filter_search = 2;
if (!cpi->external_resize) sf->use_source_sad = 1;
}
@@ -729,7 +730,7 @@ static void set_rt_speed_feature_framesize_independent(
if (cpi->use_svc && svc->use_gf_temporal_ref_current_layer &&
svc->temporal_layer_id > 0)
cpi->ref_frame_flags &= (~VP9_GOLD_FLAG);
- if (cm->width * cm->height > 640 * 480) sf->cb_pred_filter_search = 1;
+ if (cm->width * cm->height > 640 * 480) sf->cb_pred_filter_search = 2;
}
if (speed >= 8) {
@@ -773,7 +774,7 @@ static void set_rt_speed_feature_framesize_independent(
}
sf->limit_newmv_early_exit = 0;
sf->use_simple_block_yrd = 1;
- if (cm->width * cm->height > 352 * 288) sf->cb_pred_filter_search = 1;
+ if (cm->width * cm->height > 352 * 288) sf->cb_pred_filter_search = 2;
}
if (speed >= 9) {
@@ -783,7 +784,7 @@ static void set_rt_speed_feature_framesize_independent(
for (i = 0; i < BLOCK_SIZES; ++i)
sf->intra_y_mode_bsize_mask[i] = INTRA_DC;
}
- sf->cb_pred_filter_search = 1;
+ sf->cb_pred_filter_search = 2;
sf->mv.enable_adaptive_subpel_force_stop = 1;
sf->mv.adapt_subpel_force_stop.mv_thresh = 1;
sf->mv.adapt_subpel_force_stop.force_stop_below = QUARTER_PEL;
diff --git a/vp9/encoder/vp9_speed_features.h b/vp9/encoder/vp9_speed_features.h
index bd8e658cf..e30a26084 100644
--- a/vp9/encoder/vp9_speed_features.h
+++ b/vp9/encoder/vp9_speed_features.h
@@ -399,7 +399,11 @@ typedef struct SPEED_FEATURES {
// Adaptive prediction mode search
int adaptive_mode_search;
- // Chessboard pattern prediction filter type search
+ // Chessboard pattern prediction for interp filter. Aggressiveness increases
+ // with levels.
+ // 0: disable
+ // 1: cb pattern in eval when filter is not switchable
+ // 2: cb pattern prediction for filter search
int cb_pred_filter_search;
// This variable enables an early termination of interpolation filter eval