Clean up interp filter prediction speed feature
Created function for common code.
Change-Id: I5dbc30980871062614a3a100e003c8b4b35539b3
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index 5e6054e..012bee8 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -8325,6 +8325,23 @@
return 0;
}
+static INLINE int is_pred_filter_search_allowed(
+ const AV1_COMP *const cpi, BLOCK_SIZE bsize, int mi_row, int mi_col,
+ InterpFilters af_horiz, InterpFilters af_vert, InterpFilters lf_horiz,
+ InterpFilters lf_vert) {
+ const AV1_COMMON *cm = &cpi->common;
+ const int bsl = mi_size_wide_log2[bsize];
+ int pred_filter_search =
+ cpi->sf.cb_pred_filter_search
+ ? (((mi_row + mi_col) >> bsl) +
+ get_chessboard_index(cm->current_frame.frame_number)) &
+ 0x1
+ : 0;
+ pred_filter_search &= ((af_horiz == lf_horiz) && (af_horiz != SWITCHABLE)) ||
+ ((af_vert == lf_vert) && (af_vert != SWITCHABLE));
+ return pred_filter_search;
+}
+
static INLINE void pred_dual_interp_filter_rd(
MACROBLOCK *const x, const AV1_COMP *const cpi,
const TileDataEnc *tile_data, BLOCK_SIZE bsize, int mi_row, int mi_col,
@@ -8385,25 +8402,18 @@
assert(x->e_mbd.mi[0]->interp_filters == filter_sets[0]);
assert(filter_set_size == DUAL_FILTER_SET_SIZE);
if ((skip_hor & skip_ver) != cpi->default_interp_skip_flags) {
- const AV1_COMMON *cm = &cpi->common;
- int bsl, pred_filter_search;
+ int pred_filter_search;
InterpFilters af = SWITCHABLE, lf = SWITCHABLE, filter_idx = 0;
const MB_MODE_INFO *const above_mbmi = xd->above_mbmi;
const MB_MODE_INFO *const left_mbmi = xd->left_mbmi;
- bsl = mi_size_wide_log2[bsize];
- pred_filter_search =
- cpi->sf.cb_pred_filter_search
- ? (((mi_row + mi_col) >> bsl) +
- get_chessboard_index(cm->current_frame.frame_number)) &
- 0x1
- : 0;
if (above_mbmi && is_inter_block(above_mbmi)) {
af = above_mbmi->interp_filters;
}
if (left_mbmi && is_inter_block(left_mbmi)) {
lf = left_mbmi->interp_filters;
}
- pred_filter_search &= ((af == lf) && (af != SWITCHABLE));
+ pred_filter_search = is_pred_filter_search_allowed(cpi, bsize, mi_row,
+ mi_col, af, af, lf, lf);
if (pred_filter_search) {
filter_idx = SWITCHABLE * (af & 0xf);
// This assert tells that (filter_x == filter_y) for non-dual filter case
@@ -8781,30 +8791,23 @@
const int bw = block_size_wide[bsize];
const int bh = block_size_high[bsize];
int skip_pred;
- int bsl, pred_filter_search;
+ int pred_filter_search = 0;
InterpFilters af_horiz = SWITCHABLE, af_vert = SWITCHABLE,
lf_horiz = SWITCHABLE, lf_vert = SWITCHABLE, filter_idx = 0;
- const MB_MODE_INFO *const above_mbmi = xd->above_mbmi;
- const MB_MODE_INFO *const left_mbmi = xd->left_mbmi;
- bsl = mi_size_wide_log2[bsize];
- pred_filter_search =
- cpi->sf.cb_pred_filter_search
- ? (((mi_row + mi_col) >> bsl) +
- get_chessboard_index(cm->current_frame.frame_number)) &
- 0x1
- : 0;
- if (above_mbmi && is_inter_block(above_mbmi)) {
- af_horiz = av1_extract_interp_filter(above_mbmi->interp_filters, 1);
- af_vert = av1_extract_interp_filter(above_mbmi->interp_filters, 0);
+ if (!have_newmv_in_inter_mode(mbmi->mode)) {
+ const MB_MODE_INFO *const above_mbmi = xd->above_mbmi;
+ const MB_MODE_INFO *const left_mbmi = xd->left_mbmi;
+ if (above_mbmi && is_inter_block(above_mbmi)) {
+ af_horiz = av1_extract_interp_filter(above_mbmi->interp_filters, 1);
+ af_vert = av1_extract_interp_filter(above_mbmi->interp_filters, 0);
+ }
+ if (left_mbmi && is_inter_block(left_mbmi)) {
+ lf_horiz = av1_extract_interp_filter(left_mbmi->interp_filters, 1);
+ lf_vert = av1_extract_interp_filter(left_mbmi->interp_filters, 0);
+ }
+ pred_filter_search = is_pred_filter_search_allowed(
+ cpi, bsize, mi_row, mi_col, af_horiz, af_vert, lf_horiz, lf_vert);
}
- if (left_mbmi && is_inter_block(left_mbmi)) {
- lf_horiz = av1_extract_interp_filter(left_mbmi->interp_filters, 1);
- lf_vert = av1_extract_interp_filter(left_mbmi->interp_filters, 0);
- }
- pred_filter_search &= !have_newmv_in_inter_mode(mbmi->mode);
- pred_filter_search &=
- ((af_horiz == lf_horiz) && (af_horiz != SWITCHABLE)) ||
- ((af_vert == lf_vert) && (af_vert != SWITCHABLE));
if (pred_filter_search) {
pred_dual_interp_filter_rd(
x, cpi, tile_data, bsize, mi_row, mi_col, orig_dst, rd,