Store interp_filter_stats into local variables
interp_filter_stats is used in interp filter search, which can be stored
in local variables. This change moved it out of macroblock struct.
Change-Id: I691df514fffe86bf581ebcecb84742dc47b00f33
diff --git a/av1/encoder/block.h b/av1/encoder/block.h
index f86fcc6..461bdec 100644
--- a/av1/encoder/block.h
+++ b/av1/encoder/block.h
@@ -182,16 +182,6 @@
// 4: NEAREST, NEW, NEAR, GLOBAL
#define SINGLE_REF_MODES ((REF_FRAMES - 1) * 4)
-#define MAX_INTERP_FILTER_STATS 64
-typedef struct {
- int_interpfilters filters;
- int_mv mv[2];
- int8_t ref_frames[2];
- COMPOUND_TYPE comp_type;
- int64_t rd;
- unsigned int pred_sse;
-} INTERPOLATION_FILTER_STATS;
-
#define MAX_COMP_RD_STATS 64
typedef struct {
int32_t rate[COMPOUND_TYPES];
@@ -226,10 +216,6 @@
// to select transform kernel.
int rd_model;
- // [comp_idx][saved stat_idx]
- INTERPOLATION_FILTER_STATS interp_filter_stats[2][MAX_INTERP_FILTER_STATS];
- int interp_filter_stats_idx[2];
-
// prune_comp_search_by_single_result (3:MAX_REF_MV_SEARCH)
SimpleRDState simple_rd_state[SINGLE_REF_MODES][3];
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index f2f76a0..dec84c5 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -8275,6 +8275,16 @@
return rd;
}
+#define MAX_INTERP_FILTER_STATS 64
+typedef struct {
+ int_interpfilters filters;
+ int_mv mv[2];
+ int8_t ref_frames[2];
+ COMPOUND_TYPE comp_type;
+ int64_t rd;
+ unsigned int pred_sse;
+} INTERPOLATION_FILTER_STATS;
+
typedef struct {
// OBMC secondary prediction buffers and respective strides
uint8_t *above_pred_buf[MAX_MB_PLANE];
@@ -8296,6 +8306,9 @@
INTERINTRA_MODE *inter_intra_mode;
int single_ref_first_pass;
SimpleRDState *simple_rd_state;
+ // [comp_idx][saved stat_idx]
+ INTERPOLATION_FILTER_STATS interp_filter_stats[2][MAX_INTERP_FILTER_STATS];
+ int interp_filter_stats_idx[2];
} HandleInterModeArgs;
/* If the current mode shares the same mv with other modes with higher cost,
@@ -8938,12 +8951,14 @@
return 1;
}
-static INLINE int find_interp_filter_in_stats(MACROBLOCK *x,
- MB_MODE_INFO *const mbmi) {
+static INLINE int find_interp_filter_in_stats(
+ MB_MODE_INFO *const mbmi,
+ INTERPOLATION_FILTER_STATS (*interp_filter_stats)[MAX_INTERP_FILTER_STATS],
+ int *interp_filter_stats_idx) {
const int comp_idx = mbmi->compound_idx;
- const int offset = x->interp_filter_stats_idx[comp_idx];
+ const int offset = interp_filter_stats_idx[comp_idx];
for (int j = 0; j < offset; ++j) {
- const INTERPOLATION_FILTER_STATS *st = &x->interp_filter_stats[comp_idx][j];
+ const INTERPOLATION_FILTER_STATS *st = &interp_filter_stats[comp_idx][j];
if (is_interp_filter_match(st, mbmi)) {
mbmi->interp_filters = st->filters;
return j;
@@ -8967,12 +8982,12 @@
return 0; // no match result found
}
-static INLINE void save_interp_filter_search_stat(MACROBLOCK *x,
- MB_MODE_INFO *const mbmi,
- int64_t rd,
- unsigned int pred_sse) {
+static INLINE void save_interp_filter_search_stat(
+ MB_MODE_INFO *const mbmi, int64_t rd, unsigned int pred_sse,
+ INTERPOLATION_FILTER_STATS (*interp_filter_stats)[MAX_INTERP_FILTER_STATS],
+ int *interp_filter_stats_idx) {
const int comp_idx = mbmi->compound_idx;
- const int offset = x->interp_filter_stats_idx[comp_idx];
+ const int offset = interp_filter_stats_idx[comp_idx];
if (offset < MAX_INTERP_FILTER_STATS) {
INTERPOLATION_FILTER_STATS stat = { mbmi->interp_filters,
{ mbmi->mv[0], mbmi->mv[1] },
@@ -8981,8 +8996,8 @@
mbmi->interinter_comp.type,
rd,
pred_sse };
- x->interp_filter_stats[comp_idx][offset] = stat;
- x->interp_filter_stats_idx[comp_idx]++;
+ interp_filter_stats[comp_idx][offset] = stat;
+ interp_filter_stats_idx[comp_idx]++;
}
}
@@ -9014,15 +9029,15 @@
}
}
-static INLINE int find_interp_filter_match(MACROBLOCK *const x,
- const AV1_COMP *const cpi,
- const InterpFilter assign_filter,
- const int need_search) {
- MACROBLOCKD *const xd = &x->e_mbd;
- MB_MODE_INFO *const mbmi = xd->mi[0];
+static INLINE int find_interp_filter_match(
+ MB_MODE_INFO *const mbmi, const AV1_COMP *const cpi,
+ const InterpFilter assign_filter, const int need_search,
+ INTERPOLATION_FILTER_STATS (*interp_filter_stats)[MAX_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(x, mbmi);
+ match_found_idx = find_interp_filter_in_stats(mbmi, interp_filter_stats,
+ interp_filter_stats_idx);
if (!need_search || match_found_idx == -1)
set_default_interp_filters(mbmi, assign_filter);
@@ -9103,14 +9118,15 @@
int match_found_idx = -1;
const InterpFilter assign_filter = cm->interp_filter;
- match_found_idx =
- find_interp_filter_match(x, cpi, assign_filter, need_search);
+ match_found_idx = find_interp_filter_match(
+ mbmi, cpi, assign_filter, need_search, args->interp_filter_stats,
+ args->interp_filter_stats_idx);
if (match_found_idx != -1) {
const int comp_idx = mbmi->compound_idx;
- *rd = x->interp_filter_stats[comp_idx][match_found_idx].rd;
+ *rd = args->interp_filter_stats[comp_idx][match_found_idx].rd;
x->pred_sse[ref_frame] =
- x->interp_filter_stats[comp_idx][match_found_idx].pred_sse;
+ args->interp_filter_stats[comp_idx][match_found_idx].pred_sse;
return 0;
}
@@ -9220,7 +9236,9 @@
// save search results
if (cpi->sf.skip_repeat_interpolation_filter_search) {
assert(match_found_idx == -1);
- save_interp_filter_search_stat(x, mbmi, *rd, x->pred_sse[ref_frame]);
+ save_interp_filter_search_stat(mbmi, *rd, x->pred_sse[ref_frame],
+ args->interp_filter_stats,
+ args->interp_filter_stats_idx);
}
return 0;
}
@@ -10927,7 +10945,9 @@
const int need_search = av1_is_interp_needed(xd);
const InterpFilter assign_filter = cm->interp_filter;
int is_luma_interp_done = 0;
- find_interp_filter_match(x, cpi, assign_filter, need_search);
+ find_interp_filter_match(mbmi, cpi, assign_filter, need_search,
+ args->interp_filter_stats,
+ args->interp_filter_stats_idx);
int64_t best_rd_compound;
int64_t rd_thresh;
@@ -11931,10 +11951,6 @@
// Set params for mode evaluation
set_mode_eval_params(cpi, x, MODE_EVAL);
- if (cpi->sf.skip_repeat_interpolation_filter_search) {
- x->interp_filter_stats_idx[0] = 0;
- x->interp_filter_stats_idx[1] = 0;
- }
x->comp_rd_stats_idx = 0;
}
@@ -12927,7 +12943,9 @@
0,
interintra_modes,
1,
- NULL };
+ NULL,
+ { { { { 0 }, { { 0 } }, { 0 }, 0, 0, 0 } } },
+ { 0 } };
for (i = 0; i < REF_FRAMES; ++i) x->pred_sse[i] = INT_MAX;
av1_invalid_rd_stats(rd_cost);
@@ -13539,10 +13557,6 @@
x->use_default_inter_tx_type = 1;
else
x->use_default_inter_tx_type = 0;
- if (cpi->sf.skip_repeat_interpolation_filter_search) {
- x->interp_filter_stats_idx[0] = 0;
- x->interp_filter_stats_idx[1] = 0;
- }
}
// TODO(kyslov): now this is very similar to av1_rd_pick_inter_mode_sb except:
@@ -13588,7 +13602,9 @@
0,
NULL,
1,
- NULL };
+ NULL,
+ { { { { 0 }, { { 0 } }, { 0 }, 0, 0, 0 } } },
+ { 0 } };
for (i = 0; i < REF_FRAMES; ++i) x->pred_sse[i] = INT_MAX;
av1_invalid_rd_stats(rd_cost);