Modularize interp filter search params in AV1_COMP
This CL gropus interpolation filter search related variables from
AV1_COMP into a new struct InterpSearchFlags, and cleans up related
function interfaces.
BUG=aomedia:2610
Change-Id: Ib88245ece6de3de1fa4eeec7f7ffd60fdaacbd37
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index cf92f21..d2f9d95 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -5294,11 +5294,12 @@
return 0;
}
-static AOM_INLINE void set_default_interp_skip_flags(AV1_COMP *cpi) {
- const int num_planes = av1_num_planes(&cpi->common);
- cpi->default_interp_skip_flags = (num_planes == 1)
- ? INTERP_SKIP_LUMA_EVAL_CHROMA
- : INTERP_SKIP_LUMA_SKIP_CHROMA;
+static AOM_INLINE void set_default_interp_skip_flags(
+ const AV1_COMMON *cm, InterpSearchFlags *interp_search_flags) {
+ const int num_planes = av1_num_planes(cm);
+ interp_search_flags->default_interp_skip_flags =
+ (num_planes == 1) ? INTERP_SKIP_LUMA_EVAL_CHROMA
+ : INTERP_SKIP_LUMA_SKIP_CHROMA;
}
// TODO(Remya): Can include erroradv_prod_tr[] for threshold calculation
@@ -5766,7 +5767,7 @@
av1_initialize_me_consts(cpi, x, quant_params->base_qindex);
init_encode_frame_mb_context(cpi);
- set_default_interp_skip_flags(cpi);
+ set_default_interp_skip_flags(cm, &cpi->interp_search_flags);
if (cm->prev_frame && cm->prev_frame->seg.enabled)
cm->last_frame_seg_map = cm->prev_frame->seg_map;
else
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 43f85a3..73e7b58 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -5399,7 +5399,8 @@
set_size_independent_vars(cpi);
if (is_stat_consumption_stage_twopass(cpi) &&
cpi->sf.interp_sf.adaptive_interp_filter_search)
- cpi->interp_filter_search_mask = setup_interp_filter_search_mask(cpi);
+ cpi->interp_search_flags.interp_filter_search_mask =
+ setup_interp_filter_search_mask(cpi);
cpi->source->buf_8bit_valid = 0;
av1_setup_frame_size(cpi);
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index 6eadff3..f1d51f7 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -845,6 +845,14 @@
} GlobalMotionInfo;
typedef struct {
+ // Stores the default value of skip flag depending on chroma format
+ // Set as 1 for monochrome and 3 for other color formats
+ int default_interp_skip_flags;
+ // Filter mask to allow certain interp_filter type.
+ uint16_t interp_filter_search_mask;
+} InterpSearchFlags;
+
+typedef struct {
// Largest MV component used in a frame.
// The value from the previous frame is used to set the full pixel search
// range for the current frame.
@@ -1204,11 +1212,9 @@
#if CONFIG_DENOISE
struct aom_denoise_and_model_t *denoise_and_model;
#endif
- // Stores the default value of skip flag depending on chroma format
- // Set as 1 for monochrome and 3 for other color formats
- int default_interp_skip_flags;
- // Filter mask to allow certain interp_filter type.
- uint16_t interp_filter_search_mask;
+
+ // Flags related to interpolation filter search.
+ InterpSearchFlags interp_search_flags;
MultiThreadHandle multi_thread_ctxt;
void (*row_mt_sync_read_ptr)(AV1RowMTSync *const, int, int);
diff --git a/av1/encoder/interp_search.c b/av1/encoder/interp_search.c
index 151281f..377eb66 100644
--- a/av1/encoder/interp_search.c
+++ b/av1/encoder/interp_search.c
@@ -163,6 +163,7 @@
const BUFFER_SET *dst_bufs[2], int filter_idx, const int switchable_ctx[2],
const int skip_pred) {
const AV1_COMMON *cm = &cpi->common;
+ const InterpSearchFlags *interp_search_flags = &cpi->interp_search_flags;
const int num_planes = av1_num_planes(cm);
MACROBLOCKD *const xd = &x->e_mbd;
MB_MODE_INFO *const mbmi = xd->mi[0];
@@ -190,7 +191,8 @@
assert((rd_stats_luma->sse >= 0) && (rd_stats->sse >= 0));
assert((rd_stats_luma->skip == 0) || (rd_stats_luma->skip == 1));
assert((rd_stats->skip == 0) || (rd_stats->skip == 1));
- assert((skip_pred >= 0) && (skip_pred <= cpi->default_interp_skip_flags));
+ assert((skip_pred >= 0) &&
+ (skip_pred <= interp_search_flags->default_interp_skip_flags));
// When skip pred is equal to default_interp_skip_flags,
// skip both luma and chroma MC.
@@ -199,9 +201,10 @@
// skip_pred = 1: skip both luma and chroma
// skip_pred = 0: Evaluate luma and as num_planes=1,
// skip chroma evaluation
- int tmp_skip_pred = (skip_pred == cpi->default_interp_skip_flags)
- ? INTERP_SKIP_LUMA_SKIP_CHROMA
- : skip_pred;
+ int tmp_skip_pred =
+ (skip_pred == interp_search_flags->default_interp_skip_flags)
+ ? INTERP_SKIP_LUMA_SKIP_CHROMA
+ : skip_pred;
switch (tmp_skip_pred) {
case INTERP_EVAL_LUMA_EVAL_CHROMA:
@@ -244,7 +247,7 @@
if (tmp_rd < *rd) {
*rd = tmp_rd;
*switchable_rate = tmp_rs;
- if (skip_pred != cpi->default_interp_skip_flags) {
+ if (skip_pred != interp_search_flags->default_interp_skip_flags) {
if (skip_pred == INTERP_EVAL_LUMA_EVAL_CHROMA) {
// Overwrite the data as current filter is the best one
*rd_stats_luma = this_rd_stats_luma;
@@ -318,7 +321,9 @@
// If no filter are set to be evaluated, return from function
if (allow_interp_mask == 0x0) return best_filt_type;
// For block width or height is 4, skip the pred evaluation of SHARP_SHARP
- tmp_skip_pred = is_w4_or_h4 ? cpi->default_interp_skip_flags : skip_pred;
+ tmp_skip_pred = is_w4_or_h4
+ ? cpi->interp_search_flags.default_interp_skip_flags
+ : skip_pred;
// Loop over the all filter types and evaluate for only allowed filter types
for (int filt_type = SHARP_SHARP; filt_type >= REG_REG; --filt_type) {
@@ -379,6 +384,7 @@
RD_STATS *rd_stats, int *const switchable_rate,
const BUFFER_SET *dst_bufs[2], const int switchable_ctx[2],
const int skip_hor, const int skip_ver) {
+ const InterpSearchFlags *interp_search_flags = &cpi->interp_search_flags;
MACROBLOCKD *const xd = &x->e_mbd;
MB_MODE_INFO *const mbmi = xd->mi[0];
INTERP_PRED_TYPE pred_filter_type = INTERP_HORZ_NEQ_VERT_NEQ;
@@ -398,7 +404,8 @@
const int bw = block_size_wide[bsize];
const int bh = block_size_high[bsize];
int best_dual_mode = 0;
- int skip_pred = bw <= 4 ? cpi->default_interp_skip_flags : skip_hor;
+ int skip_pred =
+ bw <= 4 ? interp_search_flags->default_interp_skip_flags : skip_hor;
// TODO(any): Make use of find_best_interp_rd_facade()
// if speed impact is negligible
for (int i = (SWITCHABLE_FILTERS - 1); i >= 1; --i) {
@@ -410,7 +417,8 @@
skip_pred = skip_hor;
}
// From best of horizontal EIGHTTAP_REGULAR modes, check vertical modes
- skip_pred = bh <= 4 ? cpi->default_interp_skip_flags : skip_ver;
+ skip_pred =
+ bh <= 4 ? interp_search_flags->default_interp_skip_flags : skip_ver;
for (int i = (best_dual_mode + (SWITCHABLE_FILTERS * 2));
i >= (best_dual_mode + SWITCHABLE_FILTERS); i -= SWITCHABLE_FILTERS) {
interpolation_filter_rd(x, cpi, tile_data, bsize, orig_dst, rd,
@@ -429,11 +437,13 @@
RD_STATS *rd_stats, int *const switchable_rate,
const BUFFER_SET *dst_bufs[2], const int switchable_ctx[2],
const int skip_ver, const int skip_hor) {
+ const InterpSearchFlags *interp_search_flags = &cpi->interp_search_flags;
int8_t i;
MACROBLOCKD *const xd = &x->e_mbd;
MB_MODE_INFO *const mbmi = xd->mi[0];
- uint16_t interp_filter_search_mask = cpi->interp_filter_search_mask;
+ uint16_t interp_filter_search_mask =
+ interp_search_flags->interp_filter_search_mask;
if (cpi->sf.interp_sf.adaptive_interp_filter_search == 2) {
const FRAME_UPDATE_TYPE update_type = get_frame_update_type(&cpi->gf_group);
@@ -459,7 +469,7 @@
// Regular filter evaluation should have been done and hence the same should
// be the winner
assert(x->e_mbd.mi[0]->interp_filters.as_int == filter_sets[0].as_int);
- if ((skip_hor & skip_ver) != cpi->default_interp_skip_flags) {
+ if ((skip_hor & skip_ver) != interp_search_flags->default_interp_skip_flags) {
INTERP_PRED_TYPE pred_filter_type = INTERP_HORZ_NEQ_VERT_NEQ;
int_interpfilters af = av1_broadcast_interp_filter(INTERP_INVALID);
int_interpfilters lf = af;
@@ -497,9 +507,9 @@
if ((bsize == BLOCK_4X4) ||
(block_size_wide[bsize] == 4 &&
- skip_ver == cpi->default_interp_skip_flags) ||
+ skip_ver == interp_search_flags->default_interp_skip_flags) ||
(block_size_high[bsize] == 4 &&
- skip_hor == cpi->default_interp_skip_flags)) {
+ skip_hor == interp_search_flags->default_interp_skip_flags)) {
int skip_pred = skip_hor & skip_ver;
uint16_t allowed_interp_mask = 0;
@@ -533,7 +543,7 @@
// TODO(any): Refine this gating based on modelled rd only (i.e., by not
// accounting switchable filter rate)
if (cpi->sf.interp_sf.skip_sharp_interp_filter_search &&
- skip_pred != cpi->default_interp_skip_flags) {
+ skip_pred != interp_search_flags->default_interp_skip_flags) {
if (mbmi->interp_filters.as_int == filter_sets[SMOOTH_SMOOTH].as_int)
break;
}
@@ -600,6 +610,7 @@
int64_t *const rd, int *const switchable_rate, int *skip_build_pred,
HandleInterModeArgs *args, int64_t ref_best_rd) {
const AV1_COMMON *cm = &cpi->common;
+ const InterpSearchFlags *interp_search_flags = &cpi->interp_search_flags;
const int num_planes = av1_num_planes(cm);
MACROBLOCKD *const xd = &x->e_mbd;
MB_MODE_INFO *const mbmi = xd->mi[0];
@@ -686,8 +697,8 @@
// luma and chroma MC" Skip flag=1 corresponds to "Skip Luma MC only"
// Skip_flag=2 is not a valid case
// skip_flag=3 corresponds to "Skip both luma and chroma MC"
- int skip_hor = cpi->default_interp_skip_flags;
- int skip_ver = cpi->default_interp_skip_flags;
+ int skip_hor = interp_search_flags->default_interp_skip_flags;
+ int skip_ver = interp_search_flags->default_interp_skip_flags;
calc_interp_skip_pred_flag(x, cpi, &skip_hor, &skip_ver);
// do interp_filter search