Refactor InterpFilters variable
Replacing packed filter variable with union
for better readability.
Change-Id: I455e391d75826503cb8e34b01f5ee856ca8e2674
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index 1178f82..af496d5 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -620,9 +620,10 @@
FRAME_CONTEXT *ec_ctx = xd->tile_ctx;
if (!av1_is_interp_needed(xd)) {
- assert(mbmi->interp_filters ==
- av1_broadcast_interp_filter(
- av1_unswitchable_filter(cm->interp_filter)));
+ int_interpfilters filters =
+ av1_broadcast_interp_filter(av1_unswitchable_filter(cm->interp_filter));
+ assert(mbmi->interp_filters.as_int == filters.as_int);
+ (void)filters;
return;
}
if (cm->interp_filter == SWITCHABLE) {
diff --git a/av1/encoder/block.h b/av1/encoder/block.h
index 1d1cbbe..35b4705 100644
--- a/av1/encoder/block.h
+++ b/av1/encoder/block.h
@@ -153,7 +153,7 @@
#define MAX_INTERP_FILTER_STATS 64
typedef struct {
- InterpFilters filters;
+ int_interpfilters filters;
int_mv mv[2];
int8_t ref_frames[2];
COMPOUND_TYPE comp_type;
@@ -171,7 +171,7 @@
int_mv mv[2];
MV_REFERENCE_FRAME ref_frames[2];
PREDICTION_MODE mode;
- InterpFilters filter;
+ int_interpfilters filter;
int ref_mv_idx;
int is_global[2];
} COMP_RD_STATS;
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index d9f8292..a351cac 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -2769,7 +2769,7 @@
if (cpi->sf.adaptive_pred_interp_filter && bsize == BLOCK_8X8 &&
partition_none_allowed) {
pc_tree->horizontal[0].pred_interp_filter =
- av1_extract_interp_filter(ctx_none->mic.interp_filters, 0);
+ ctx_none->mic.interp_filters.as_filters.y_filter;
}
sum_rdc.rate = partition_cost[PARTITION_HORZ];
sum_rdc.rdcost = RDCOST(x->rdmult, sum_rdc.rate, 0);
@@ -2814,7 +2814,7 @@
if (cpi->sf.adaptive_pred_interp_filter && bsize == BLOCK_8X8 &&
partition_none_allowed) {
pc_tree->horizontal[1].pred_interp_filter =
- av1_extract_interp_filter(ctx_h->mic.interp_filters, 0);
+ ctx_h->mic.interp_filters.as_filters.y_filter;
}
av1_rd_stats_subtraction(x->rdmult, &best_rdc, &sum_rdc,
@@ -2868,7 +2868,7 @@
if (cpi->sf.adaptive_pred_interp_filter && bsize == BLOCK_8X8 &&
partition_none_allowed) {
pc_tree->vertical[0].pred_interp_filter =
- av1_extract_interp_filter(ctx_none->mic.interp_filters, 0);
+ ctx_none->mic.interp_filters.as_filters.y_filter;
}
sum_rdc.rate = partition_cost[PARTITION_VERT];
sum_rdc.rdcost = RDCOST(x->rdmult, sum_rdc.rate, 0);
@@ -2912,7 +2912,7 @@
if (cpi->sf.adaptive_pred_interp_filter && bsize == BLOCK_8X8 &&
partition_none_allowed) {
pc_tree->vertical[1].pred_interp_filter =
- av1_extract_interp_filter(ctx_none->mic.interp_filters, 0);
+ ctx_none->mic.interp_filters.as_filters.y_filter;
}
av1_rd_stats_subtraction(x->rdmult, &best_rdc, &sum_rdc,
diff --git a/av1/encoder/nonrd_pickmode.c b/av1/encoder/nonrd_pickmode.c
index 8463ba1..f1395fa 100644
--- a/av1/encoder/nonrd_pickmode.c
+++ b/av1/encoder/nonrd_pickmode.c
@@ -51,7 +51,7 @@
MV_REFERENCE_FRAME best_ref_frame;
MV_REFERENCE_FRAME best_second_ref_frame;
uint8_t best_mode_skip_txfm;
- InterpFilters best_pred_filter;
+ int_interpfilters best_pred_filter;
} BEST_PICKMODE;
typedef struct {
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index 52958d5..524c3a9 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -158,10 +158,10 @@
#define MODELRD_TYPE_MOTION_MODE_RD 1
#define DUAL_FILTER_SET_SIZE (SWITCHABLE_FILTERS * SWITCHABLE_FILTERS)
-static const InterpFilters filter_sets[DUAL_FILTER_SET_SIZE] = {
- 0x00000000, 0x00010000, 0x00020000, // y = 0
- 0x00000001, 0x00010001, 0x00020001, // y = 1
- 0x00000002, 0x00010002, 0x00020002, // y = 2
+static const int_interpfilters filter_sets[DUAL_FILTER_SET_SIZE] = {
+ { 0x00000000 }, { 0x00010000 }, { 0x00020000 }, // y = 0
+ { 0x00000001 }, { 0x00010001 }, { 0x00020001 }, // y = 1
+ { 0x00000002 }, { 0x00010002 }, { 0x00020002 }, // y = 2
};
typedef struct {
@@ -6625,7 +6625,7 @@
ref_yv12[1] = xd->plane[plane].pre[1];
// Get the prediction block from the 'other' reference frame.
- const InterpFilters interp_filters =
+ const int_interpfilters interp_filters =
av1_broadcast_interp_filter(EIGHTTAP_REGULAR);
// Since we have scaled the reference frames to match the size of the
@@ -8113,11 +8113,11 @@
}
static INLINE int get_switchable_rate(MACROBLOCK *const x,
- const InterpFilters filters,
+ const int_interpfilters filters,
const int ctx[2]) {
int inter_filter_cost;
- const InterpFilter filter0 = av1_extract_interp_filter(filters, 0);
- const InterpFilter filter1 = av1_extract_interp_filter(filters, 1);
+ const InterpFilter filter0 = filters.as_filters.y_filter;
+ const InterpFilter filter1 = filters.as_filters.x_filter;
inter_filter_cost = x->switchable_interp_costs[ctx[0]][filter0];
inter_filter_cost += x->switchable_interp_costs[ctx[1]][filter1];
return SWITCHABLE_INTERP_RATE_FACTOR * inter_filter_cost;
@@ -8139,7 +8139,7 @@
int tmp_rate[2], tmp_skip_sb[2] = { 1, 1 };
int64_t tmp_dist[2], tmp_skip_sse[2] = { 0, 0 };
- const InterpFilters last_best = mbmi->interp_filters;
+ const int_interpfilters last_best = mbmi->interp_filters;
mbmi->interp_filters = filter_sets[filter_idx];
const int tmp_rs =
get_switchable_rate(x, mbmi->interp_filters, switchable_ctx);
@@ -8320,7 +8320,7 @@
// Regular filter evaluation should have been done and hence the same should
// be the winner
- assert(x->e_mbd.mi[0]->interp_filters == filter_sets[0]);
+ assert(x->e_mbd.mi[0]->interp_filters.as_int == filter_sets[0].as_int);
assert(filter_set_size == DUAL_FILTER_SET_SIZE);
if ((skip_hor & skip_ver) != cpi->default_interp_skip_flags) {
int pred_filter_search;
@@ -8329,10 +8329,10 @@
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_horiz = above_mbmi->interp_filters.as_filters.x_filter;
}
if (left_mbmi && is_inter_block(left_mbmi)) {
- lf_horiz = av1_extract_interp_filter(left_mbmi->interp_filters, 1);
+ lf_horiz = left_mbmi->interp_filters.as_filters.x_filter;
}
pred_filter_search = is_pred_filter_search_allowed(
cpi, bsize, mi_row, mi_col, af_horiz, af_horiz, lf_horiz, lf_horiz);
@@ -8340,8 +8340,8 @@
assert(af_horiz != INTERP_INVALID);
filter_idx = SWITCHABLE * af_horiz;
// This assert tells that (filter_x == filter_y) for non-dual filter case
- assert((filter_sets[filter_idx] & 0xffff) ==
- (filter_sets[filter_idx] >> 16));
+ assert(filter_sets[filter_idx].as_filters.x_filter ==
+ filter_sets[filter_idx].as_filters.y_filter);
if (cpi->sf.adaptive_interp_filter_search &&
(cpi->sf.interp_filter_search_mask & (1 << (filter_idx >> 2)))) {
return;
@@ -8373,7 +8373,8 @@
int skip_pred = cpi->default_interp_skip_flags;
for (i = filter_set_size - 1; i > 0; i -= (SWITCHABLE_FILTERS + 1)) {
// This assert tells that (filter_x == filter_y) for non-dual filter case
- assert((filter_sets[i] & 0xffff) == (filter_sets[i] >> 16));
+ assert(filter_sets[i].as_filters.x_filter ==
+ filter_sets[i].as_filters.y_filter);
if (cpi->sf.adaptive_interp_filter_search &&
(cpi->sf.interp_filter_search_mask & (1 << (i >> 2)))) {
continue;
@@ -8389,7 +8390,8 @@
for (i = (SWITCHABLE_FILTERS + 1); i < filter_set_size;
i += (SWITCHABLE_FILTERS + 1)) {
// This assert tells that (filter_x == filter_y) for non-dual filter case
- assert((filter_sets[i] & 0xffff) == (filter_sets[i] >> 16));
+ assert(filter_sets[i].as_filters.x_filter ==
+ filter_sets[i].as_filters.y_filter);
if (cpi->sf.adaptive_interp_filter_search &&
(cpi->sf.interp_filter_search_mask & (1 << (i >> 2)))) {
continue;
@@ -8405,7 +8407,8 @@
// accounting switchable filter rate)
if (cpi->sf.skip_sharp_interp_filter_search &&
skip_pred != cpi->default_interp_skip_flags) {
- if (mbmi->interp_filters == filter_sets[(SWITCHABLE_FILTERS + 1)])
+ if (mbmi->interp_filters.as_int ==
+ filter_sets[(SWITCHABLE_FILTERS + 1)].as_int)
break;
}
}
@@ -8435,7 +8438,7 @@
// TODO(ranjit): Ensure that compound type search use regular filter always
// and check if following check can be removed
// Check if interp filter matches with previous case
- if (st->filter != mi->interp_filters) return 0;
+ if (st->filter.as_int != mi->interp_filters.as_int) return 0;
const MACROBLOCKD *const xd = &x->e_mbd;
// Match MV and reference indices
@@ -8632,8 +8635,9 @@
return 0;
}
if (!need_search) {
- assert(mbmi->interp_filters ==
- av1_broadcast_interp_filter(EIGHTTAP_REGULAR));
+ int_interpfilters filters = av1_broadcast_interp_filter(EIGHTTAP_REGULAR);
+ assert(mbmi->interp_filters.as_int == filters.as_int);
+ (void)filters;
return 0;
}
if (args->modelled_rd != NULL) {
@@ -8722,12 +8726,12 @@
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);
+ af_horiz = above_mbmi->interp_filters.as_filters.x_filter;
+ af_vert = above_mbmi->interp_filters.as_filters.y_filter;
}
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);
+ lf_horiz = left_mbmi->interp_filters.as_filters.x_filter;
+ lf_vert = left_mbmi->interp_filters.as_filters.y_filter;
}
pred_filter_search = is_pred_filter_search_allowed(
cpi, bsize, mi_row, mi_col, af_horiz, af_vert, lf_horiz, lf_vert);
@@ -9218,7 +9222,7 @@
if (nb_mi->ref_frame[0] != current_mi->ref_frame[0] ||
nb_mi->mv[0].as_int != current_mi->mv[0].as_int ||
- nb_mi->interp_filters != current_mi->interp_filters) {
+ nb_mi->interp_filters.as_int != current_mi->interp_filters.as_int) {
ctxt->mv_field_check_result = 0;
}
}
@@ -10577,7 +10581,7 @@
if (!is_comp_pred)
args->single_filter[this_mode][refs[0]] =
- av1_extract_interp_filter(mbmi->interp_filters, 0);
+ mbmi->interp_filters.as_filters.y_filter;
if (args->modelled_rd != NULL) {
if (is_comp_pred) {
@@ -13026,16 +13030,14 @@
return;
}
- assert(
- (cm->interp_filter == SWITCHABLE) ||
- (cm->interp_filter ==
- av1_extract_interp_filter(search_state.best_mbmode.interp_filters, 0)) ||
- !is_inter_block(&search_state.best_mbmode));
- assert(
- (cm->interp_filter == SWITCHABLE) ||
- (cm->interp_filter ==
- av1_extract_interp_filter(search_state.best_mbmode.interp_filters, 1)) ||
- !is_inter_block(&search_state.best_mbmode));
+ assert((cm->interp_filter == SWITCHABLE) ||
+ (cm->interp_filter ==
+ search_state.best_mbmode.interp_filters.as_filters.y_filter) ||
+ !is_inter_block(&search_state.best_mbmode));
+ assert((cm->interp_filter == SWITCHABLE) ||
+ (cm->interp_filter ==
+ search_state.best_mbmode.interp_filters.as_filters.x_filter) ||
+ !is_inter_block(&search_state.best_mbmode));
if (!cpi->rc.is_src_frame_alt_ref)
av1_update_rd_thresh_fact(cm, tile_data->thresh_freq_fact,
@@ -13051,9 +13053,10 @@
if (mbmi->mode == GLOBALMV || mbmi->mode == GLOBAL_GLOBALMV) {
// Correct the interp filters for GLOBALMV
if (is_nontrans_global_motion(xd, xd->mi[0])) {
- assert(mbmi->interp_filters ==
- av1_broadcast_interp_filter(
- av1_unswitchable_filter(cm->interp_filter)));
+ int_interpfilters filters = av1_broadcast_interp_filter(
+ av1_unswitchable_filter(cm->interp_filter));
+ assert(mbmi->interp_filters.as_int == filters.as_int);
+ (void)filters;
}
}
@@ -13604,16 +13607,14 @@
return;
}
- assert(
- (cm->interp_filter == SWITCHABLE) ||
- (cm->interp_filter ==
- av1_extract_interp_filter(search_state.best_mbmode.interp_filters, 0)) ||
- !is_inter_block(&search_state.best_mbmode));
- assert(
- (cm->interp_filter == SWITCHABLE) ||
- (cm->interp_filter ==
- av1_extract_interp_filter(search_state.best_mbmode.interp_filters, 1)) ||
- !is_inter_block(&search_state.best_mbmode));
+ assert((cm->interp_filter == SWITCHABLE) ||
+ (cm->interp_filter ==
+ search_state.best_mbmode.interp_filters.as_filters.y_filter) ||
+ !is_inter_block(&search_state.best_mbmode));
+ assert((cm->interp_filter == SWITCHABLE) ||
+ (cm->interp_filter ==
+ search_state.best_mbmode.interp_filters.as_filters.x_filter) ||
+ !is_inter_block(&search_state.best_mbmode));
if (!cpi->rc.is_src_frame_alt_ref)
av1_update_rd_thresh_fact(cm, tile_data->thresh_freq_fact,
@@ -13629,9 +13630,10 @@
if (mbmi->mode == GLOBALMV || mbmi->mode == GLOBAL_GLOBALMV) {
// Correct the interp filters for GLOBALMV
if (is_nontrans_global_motion(xd, xd->mi[0])) {
- assert(mbmi->interp_filters ==
- av1_broadcast_interp_filter(
- av1_unswitchable_filter(cm->interp_filter)));
+ int_interpfilters filters = av1_broadcast_interp_filter(
+ av1_unswitchable_filter(cm->interp_filter));
+ assert(mbmi->interp_filters.as_int == filters.as_int);
+ (void)filters;
}
}
@@ -13735,7 +13737,7 @@
rs = av1_get_switchable_rate(cm, x, xd);
if (rs < best_rs) {
best_rs = rs;
- best_filter = av1_extract_interp_filter(mbmi->interp_filters, 0);
+ best_filter = mbmi->interp_filters.as_filters.y_filter;
}
}
}
@@ -13763,8 +13765,7 @@
}
assert((cm->interp_filter == SWITCHABLE) ||
- (cm->interp_filter ==
- av1_extract_interp_filter(mbmi->interp_filters, 0)));
+ (cm->interp_filter == mbmi->interp_filters.as_filters.y_filter));
av1_update_rd_thresh_fact(cm, tile_data->thresh_freq_fact,
cpi->sf.adaptive_rd_thresh, bsize, THR_GLOBALMV);
diff --git a/av1/encoder/reconinter_enc.c b/av1/encoder/reconinter_enc.c
index 9198901..4ac2de1 100644
--- a/av1/encoder/reconinter_enc.c
+++ b/av1/encoder/reconinter_enc.c
@@ -281,7 +281,7 @@
int dst_stride, const MV *src_mv,
const struct scale_factors *sf, int w, int h,
ConvolveParams *conv_params,
- InterpFilters interp_filters,
+ int_interpfilters interp_filters,
const WarpTypesAllowed *warp_types, int p_col,
int p_row, int plane, int ref,
mv_precision precision, int x, int y,
diff --git a/av1/encoder/reconinter_enc.h b/av1/encoder/reconinter_enc.h
index 5687168..3104600 100644
--- a/av1/encoder/reconinter_enc.h
+++ b/av1/encoder/reconinter_enc.h
@@ -32,7 +32,7 @@
int dst_stride, const MV *src_mv,
const struct scale_factors *sf, int w, int h,
ConvolveParams *conv_params,
- InterpFilters interp_filters,
+ int_interpfilters interp_filters,
const WarpTypesAllowed *warp_types, int p_col,
int p_row, int plane, int ref,
mv_precision precision, int x, int y,
diff --git a/av1/encoder/temporal_filter.c b/av1/encoder/temporal_filter.c
index 1c5550e..6c353b1 100644
--- a/av1/encoder/temporal_filter.c
+++ b/av1/encoder/temporal_filter.c
@@ -61,8 +61,8 @@
int uv_stride;
// TODO(angiebird): change plane setting accordingly
ConvolveParams conv_params = get_conv_params(0, 0, xd->bd);
- const InterpFilters interp_filters =
- av1_make_interp_filters(MULTITAP_SHARP, MULTITAP_SHARP);
+ const int_interpfilters interp_filters =
+ av1_broadcast_interp_filter(MULTITAP_SHARP);
WarpTypesAllowed warp_types;
memset(&warp_types, 0, sizeof(WarpTypesAllowed));
diff --git a/av1/encoder/tpl_model.c b/av1/encoder/tpl_model.c
index b1a9fb5..4f98c09 100644
--- a/av1/encoder/tpl_model.c
+++ b/av1/encoder/tpl_model.c
@@ -113,8 +113,8 @@
const int bw = 4 << mi_size_wide_log2[bsize];
const int bh = 4 << mi_size_high_log2[bsize];
const int pix_num = bw * bh;
- const InterpFilters kernel =
- av1_make_interp_filters(EIGHTTAP_REGULAR, EIGHTTAP_REGULAR);
+ const int_interpfilters kernel =
+ av1_broadcast_interp_filter(EIGHTTAP_REGULAR);
int64_t best_intra_cost = INT64_MAX;
int64_t intra_cost;
@@ -747,8 +747,8 @@
ConvolveParams conv_params = get_conv_params(0, 0, xd->bd);
WarpTypesAllowed warp_types;
memset(&warp_types, 0, sizeof(WarpTypesAllowed));
- const InterpFilters kernel =
- av1_make_interp_filters(EIGHTTAP_REGULAR, EIGHTTAP_REGULAR);
+ const int_interpfilters kernel =
+ av1_broadcast_interp_filter(EIGHTTAP_REGULAR);
xd->above_mbmi = NULL;
xd->left_mbmi = NULL;
xd->mi[0]->sb_type = bsize;
diff --git a/av1/encoder/var_based_part.c b/av1/encoder/var_based_part.c
index a5772dc..0aaac58 100644
--- a/av1/encoder/var_based_part.c
+++ b/av1/encoder/var_based_part.c
@@ -501,7 +501,7 @@
mi->ref_frame[1] = NONE_FRAME;
mi->sb_type = cm->seq_params.sb_size;
mi->mv[0].as_int = 0;
- mi->interp_filters = av1_make_interp_filters(BILINEAR, BILINEAR);
+ mi->interp_filters = av1_broadcast_interp_filter(BILINEAR);
if (cpi->sf.estimate_motion_for_var_based_partition) {
if (xd->mb_to_right_edge >= 0 && xd->mb_to_bottom_edge >= 0) {
const MV dummy_mv = { 0, 0 };