Consolidate use_interp_filter code Consolidated and cleaned up use_interp_filter related code. Change-Id: I40b028c46ce93eb419b28ce40c4985ac3078ef51
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c index 10b1377..2effddb 100644 --- a/av1/encoder/rdopt.c +++ b/av1/encoder/rdopt.c
@@ -8940,38 +8940,27 @@ } } -// check if there is saved result match with this search -static INLINE int is_interp_filter_exact_match( - const INTERPOLATION_FILTER_STATS *st, MB_MODE_INFO *const mi) { - for (int i = 0; i < 2; ++i) { - if ((st->ref_frames[i] != mi->ref_frame[i]) || - (st->mv[i].as_int != mi->mv[i].as_int)) { - return 0; - } - } - if (has_second_ref(mi) && st->comp_type != mi->interinter_comp.type) return 0; - if (has_second_ref(mi) && st->compound_idx != mi->compound_idx) return 0; - return 1; -} - // return mv_diff static INLINE int is_interp_filter_good_match( - const INTERPOLATION_FILTER_STATS *st, MB_MODE_INFO *const mi) { + const INTERPOLATION_FILTER_STATS *st, MB_MODE_INFO *const mi, + int skip_level) { const int is_comp = has_second_ref(mi); int i; for (i = 0; i < 1 + is_comp; ++i) { - if (st->ref_frames[i] != mi->ref_frame[i]) return -1; + if (st->ref_frames[i] != mi->ref_frame[i]) return INT_MAX; } - const int thr = is_comp ? 7 : 3; + if (skip_level == 1 && is_comp) { + if (st->comp_type != mi->interinter_comp.type) return INT_MAX; + if (st->compound_idx != mi->compound_idx) return INT_MAX; + } + int mv_diff = 0; for (i = 0; i < 1 + is_comp; ++i) { mv_diff += abs(st->mv[i].as_mv.row - mi->mv[i].as_mv.row) + abs(st->mv[i].as_mv.col - mi->mv[i].as_mv.col); } - if (mv_diff > thr) return -1; - return mv_diff; } @@ -9024,35 +9013,31 @@ static INLINE int find_interp_filter_in_stats( MB_MODE_INFO *const mbmi, INTERPOLATION_FILTER_STATS *interp_filter_stats, int interp_filter_stats_idx, int skip_level) { - if (skip_level < 2) { - // Find exact match. - // TODO(yunqing): Use a small threshold instead. Combine this with finding - // good enough match. - for (int j = 0; j < interp_filter_stats_idx; ++j) { - const INTERPOLATION_FILTER_STATS *st = &interp_filter_stats[j]; - if (is_interp_filter_exact_match(st, mbmi)) { - mbmi->interp_filters = st->filters; - return j; - } + // [skip_levels][single or comp] + const int thr[2][2] = { { 0, 0 }, { 3, 7 } }; + const int is_comp = has_second_ref(mbmi); + + // Find good enough match. + // TODO(yunqing): Separate single-ref mode and comp mode stats for fast + // search. + int best = INT_MAX; + int match = -1; + for (int j = 0; j < interp_filter_stats_idx; ++j) { + const INTERPOLATION_FILTER_STATS *st = &interp_filter_stats[j]; + const int mv_diff = is_interp_filter_good_match(st, mbmi, skip_level); + // Exact match is found. + if (mv_diff == 0) { + match = j; + break; + } else if (mv_diff < best && mv_diff <= thr[skip_level - 1][is_comp]) { + best = mv_diff; + match = j; } - } else { - // Find good enough match. - // TODO(yunqing): Separate single-ref mode and comp mode stats for fast - // search. - int best = INT_MAX; - int match = -1; - for (int j = 0; j < interp_filter_stats_idx; ++j) { - const INTERPOLATION_FILTER_STATS *st = &interp_filter_stats[j]; - const int mv_diff = is_interp_filter_good_match(st, mbmi); - if (mv_diff != -1 && mv_diff < best) { - best = mv_diff; - match = j; - } - } - if (match != -1) { - mbmi->interp_filters = interp_filter_stats[match].filters; - return match; - } + } + + if (match != -1) { + mbmi->interp_filters = interp_filter_stats[match].filters; + return match; } return -1; // no match result found } @@ -9125,10 +9110,10 @@ INTERPOLATION_FILTER_STATS *interp_filter_stats, int interp_filter_stats_idx) { int match_found_idx = -1; - if (cpi->sf.skip_repeat_interpolation_filter_search && need_search) - match_found_idx = find_interp_filter_in_stats( - mbmi, interp_filter_stats, interp_filter_stats_idx, - cpi->sf.skip_repeat_interpolation_filter_search); + if (cpi->sf.use_interp_filter && need_search) + match_found_idx = find_interp_filter_in_stats(mbmi, interp_filter_stats, + interp_filter_stats_idx, + cpi->sf.use_interp_filter); if (!need_search || match_found_idx == -1) set_default_interp_filters(mbmi, assign_filter); @@ -9325,7 +9310,7 @@ x->pred_sse[ref_frame] = (unsigned int)(rd_stats_luma.sse >> 4); // save search results - if (cpi->sf.skip_repeat_interpolation_filter_search) { + if (cpi->sf.use_interp_filter) { assert(match_found_idx == -1); args->interp_filter_stats_idx = save_interp_filter_search_stat( mbmi, *rd, x->pred_sse[ref_frame], args->interp_filter_stats,
diff --git a/av1/encoder/speed_features.c b/av1/encoder/speed_features.c index 2b432c1..4979c95 100644 --- a/av1/encoder/speed_features.c +++ b/av1/encoder/speed_features.c
@@ -300,7 +300,7 @@ sf->prune_ref_frame_for_gm_search = boosted ? 0 : 1; sf->intra_tx_size_search_init_depth_rect = 1; - sf->skip_repeat_interpolation_filter_search = 1; + sf->use_interp_filter = 1; sf->tx_type_search.skip_tx_search = 1; sf->tx_type_search.ml_tx_split_thresh = 4000; sf->adaptive_txb_search_level = 2; @@ -463,7 +463,7 @@ // sf->tx_domain_dist_level = 2; sf->tx_domain_dist_thres_level = 2; sf->simple_motion_search_prune_agg = 2; - sf->skip_repeat_interpolation_filter_search = 2; + sf->use_interp_filter = 2; sf->prune_ref_mv_idx_search = 1; } @@ -533,7 +533,7 @@ sf->intra_tx_size_search_init_depth_rect = 1; sf->tx_size_search_lgr_block = 1; sf->prune_ext_partition_types_search_level = 2; - sf->skip_repeat_interpolation_filter_search = 1; + sf->use_interp_filter = 1; sf->tx_type_search.skip_tx_search = 1; sf->tx_type_search.ml_tx_split_thresh = 4000; sf->adaptive_txb_search_level = 2; @@ -898,7 +898,7 @@ sf->prune_ref_frame_for_gm_search = 0; sf->use_fast_interpolation_filter_search = 0; sf->disable_dual_filter = 0; - sf->skip_repeat_interpolation_filter_search = 0; + sf->use_interp_filter = 0; sf->use_hash_based_trellis = 0; sf->prune_comp_search_by_single_result = 0; sf->skip_repeated_newmv = 0;
diff --git a/av1/encoder/speed_features.h b/av1/encoder/speed_features.h index 7433eb5..d4e9070 100644 --- a/av1/encoder/speed_features.h +++ b/av1/encoder/speed_features.h
@@ -539,9 +539,9 @@ int disable_dual_filter; // Save results of interpolation_filter_search for a block - // Check mv and ref_frames before search, if they are same with previous - // saved results, it can be skipped. - int skip_repeat_interpolation_filter_search; + // Check mv and ref_frames before search, if they are very close with previous + // saved results, filter search can be skipped. + int use_interp_filter; // Use a hash table to store previously computed optimized qcoeffs from // expensive calls to optimize_txb.