Reduce memory used for MACROBLOCK::mbmi_ext
The mbmi_ext struct in MACROBLOCK was previously an dynamically
allocated array whose size is the number of mi's in a superblock.
However, only the first element of the array was ever used.
This commit change the member struct from a dynamically allocated array
to a simple struct allocated on the stack.
This change reduces the memory consumption by 2.8% on a lowres clip.
Change-Id: I61a33577f0ff6ef63ce883bb9c46fb3efb48a8e8
diff --git a/av1/encoder/block.h b/av1/encoder/block.h
index 442d9fb..12a4598 100644
--- a/av1/encoder/block.h
+++ b/av1/encoder/block.h
@@ -817,7 +817,7 @@
* Contains extra information not transmitted in the bitstream but are
* derived. For example, this contains the stack of ref_mvs.
*/
- MB_MODE_INFO_EXT *mbmi_ext;
+ MB_MODE_INFO_EXT mbmi_ext;
/*! \brief Finalized mbmi_ext for the whole frame.
*
diff --git a/av1/encoder/encodeframe_utils.c b/av1/encoder/encodeframe_utils.c
index fc3bdd8..2deb78f 100644
--- a/av1/encoder/encodeframe_utils.c
+++ b/av1/encoder/encodeframe_utils.c
@@ -189,7 +189,7 @@
assert(mi->bsize == bsize);
*mi_addr = *mi;
- copy_mbmi_ext_frame_to_mbmi_ext(x->mbmi_ext, &ctx->mbmi_ext_best,
+ copy_mbmi_ext_frame_to_mbmi_ext(&x->mbmi_ext, &ctx->mbmi_ext_best,
av1_ref_frame_type(ctx->mic.ref_frame));
memcpy(txfm_info->blk_skip, ctx->blk_skip,
diff --git a/av1/encoder/encodemv.c b/av1/encoder/encodemv.c
index 167e9c0..86c6156 100644
--- a/av1/encoder/encodemv.c
+++ b/av1/encoder/encodemv.c
@@ -253,7 +253,7 @@
ref_mv_idx += 1;
}
return av1_get_ref_mv_from_stack(ref_idx, mbmi->ref_frame, ref_mv_idx,
- x->mbmi_ext);
+ &x->mbmi_ext);
}
void av1_find_best_ref_mvs_from_stack(int allow_hp,
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 35e37af..2be6443 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -972,8 +972,6 @@
}
#endif
- int sb_mi_size = av1_get_sb_mi_size(cm);
-
alloc_obmc_buffers(&cpi->td.mb.obmc_buffer, cm);
CHECK_MEM_ERROR(
@@ -990,9 +988,6 @@
cpi->td.mb.intrabc_hash_info.g_crc_initialized = 0;
- CHECK_MEM_ERROR(cm, cpi->td.mb.mbmi_ext,
- aom_calloc(sb_mi_size, sizeof(*cpi->td.mb.mbmi_ext)));
-
av1_set_speed_features_framesize_independent(cpi, oxcf->speed);
av1_set_speed_features_framesize_dependent(cpi, oxcf->speed);
@@ -1350,7 +1345,6 @@
}
}
aom_free(thread_data->td->counts);
- aom_free(thread_data->td->mbmi_ext);
av1_free_pmc(thread_data->td->firstpass_ctx, av1_num_planes(cm));
thread_data->td->firstpass_ctx = NULL;
av1_free_shared_coeff_buffer(&thread_data->td->shared_coeff_buf);
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index e1d0142..74edf04 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -1285,7 +1285,6 @@
int intrabc_used;
int deltaq_used;
FRAME_CONTEXT *tctx;
- MB_MODE_INFO_EXT *mbmi_ext;
VP64x64 *vt64x64;
int32_t num_64x64_blocks;
PICK_MODE_CONTEXT *firstpass_ctx;
diff --git a/av1/encoder/encoder_alloc.h b/av1/encoder/encoder_alloc.h
index 1e06e62..d70bde6 100644
--- a/av1/encoder/encoder_alloc.h
+++ b/av1/encoder/encoder_alloc.h
@@ -261,9 +261,6 @@
aom_free(cm->tpl_mvs);
cm->tpl_mvs = NULL;
- aom_free(cpi->td.mb.mbmi_ext);
- cpi->td.mb.mbmi_ext = NULL;
-
if (cpi->td.vt64x64) {
aom_free(cpi->td.vt64x64);
cpi->td.vt64x64 = NULL;
diff --git a/av1/encoder/ethread.c b/av1/encoder/ethread.c
index 42c8a64..82c747f 100644
--- a/av1/encoder/ethread.c
+++ b/av1/encoder/ethread.c
@@ -513,7 +513,6 @@
AV1_COMMON *const cm = &cpi->common;
const AVxWorkerInterface *const winterface = aom_get_worker_interface();
MultiThreadInfo *const mt_info = &cpi->mt_info;
- int sb_mi_size = av1_get_sb_mi_size(cm);
assert(mt_info->workers != NULL);
assert(mt_info->tile_thr_data != NULL);
@@ -584,10 +583,6 @@
sizeof(*thread_data->td->tmp_pred_bufs[j])));
}
- CHECK_MEM_ERROR(
- cm, thread_data->td->mbmi_ext,
- aom_calloc(sb_mi_size, sizeof(*thread_data->td->mbmi_ext)));
-
if (cpi->sf.part_sf.partition_search_type == VAR_BASED_PARTITION) {
const int num_64x64_blocks =
(cm->seq_params.sb_size == BLOCK_64X64) ? 1 : 4;
@@ -780,7 +775,6 @@
thread_data->td->hash_value_buffer[x][y];
}
}
- thread_data->td->mb.mbmi_ext = thread_data->td->mbmi_ext;
}
if (thread_data->td->counts != &cpi->counts) {
memcpy(thread_data->td->counts, &cpi->counts, sizeof(cpi->counts));
@@ -1265,7 +1259,6 @@
if (thread_data->td != &cpi->td) {
thread_data->td->mb = cpi->td.mb;
thread_data->td->mb.obmc_buffer = thread_data->td->obmc_buffer;
- thread_data->td->mb.mbmi_ext = thread_data->td->mbmi_ext;
}
}
}
diff --git a/av1/encoder/nonrd_pickmode.c b/av1/encoder/nonrd_pickmode.c
index 906811b..3f6a676 100644
--- a/av1/encoder/nonrd_pickmode.c
+++ b/av1/encoder/nonrd_pickmode.c
@@ -265,7 +265,7 @@
tmp_sad = av1_int_pro_motion_estimation(
cpi, x, bsize, mi_row, mi_col,
- &x->mbmi_ext->ref_mv_stack[ref_frame][0].this_mv.as_mv);
+ &x->mbmi_ext.ref_mv_stack[ref_frame][0].this_mv.as_mv);
if (tmp_sad > x->pred_mv_sad[LAST_FRAME]) return -1;
@@ -333,7 +333,7 @@
AV1_COMMON *const cm = &cpi->common;
MACROBLOCKD *const xd = &x->e_mbd;
MB_MODE_INFO *const mbmi = xd->mi[0];
- MB_MODE_INFO_EXT *const mbmi_ext = x->mbmi_ext;
+ MB_MODE_INFO_EXT *const mbmi_ext = &x->mbmi_ext;
const YV12_BUFFER_CONFIG *yv12 = get_ref_frame_yv12_buf(cm, ref_frame);
const int num_planes = av1_num_planes(cm);
(void)tile_data;
@@ -1008,7 +1008,7 @@
#endif // CONFIG_INTERNAL_STATS
ctx->mic = *xd->mi[0];
ctx->skippable = txfm_info->skip_txfm;
- av1_copy_mbmi_ext_to_mbmi_ext_frame(&ctx->mbmi_ext_best, x->mbmi_ext,
+ av1_copy_mbmi_ext_to_mbmi_ext_frame(&ctx->mbmi_ext_best, &x->mbmi_ext,
av1_ref_frame_type(xd->mi[0]->ref_frame));
ctx->comp_pred_diff = 0;
ctx->hybrid_pred_diff = 0;
@@ -2068,7 +2068,7 @@
int this_early_term = 0;
int skip_this_mv = 0;
PREDICTION_MODE this_mode;
- MB_MODE_INFO_EXT *const mbmi_ext = x->mbmi_ext;
+ MB_MODE_INFO_EXT *const mbmi_ext = &x->mbmi_ext;
RD_STATS nonskip_rdc;
av1_invalid_rd_stats(&nonskip_rdc);
diff --git a/av1/encoder/partition_search.c b/av1/encoder/partition_search.c
index e3798d5..a213738 100644
--- a/av1/encoder/partition_search.c
+++ b/av1/encoder/partition_search.c
@@ -714,7 +714,7 @@
MACROBLOCK *x = &td->mb;
MACROBLOCKD *const xd = &x->e_mbd;
const MB_MODE_INFO *const mbmi = xd->mi[0];
- const MB_MODE_INFO_EXT *const mbmi_ext = x->mbmi_ext;
+ const MB_MODE_INFO_EXT *const mbmi_ext = &x->mbmi_ext;
const CurrentFrame *const current_frame = &cm->current_frame;
const BLOCK_SIZE bsize = mbmi->bsize;
FRAME_CONTEXT *fc = xd->tile_ctx;
@@ -1275,7 +1275,7 @@
// level (x->mbmi_ext) to frame level (cpi->mbmi_ext_info.frame_base). This
// frame level buffer (cpi->mbmi_ext_info.frame_base) will be used during
// bitstream preparation.
- av1_copy_mbmi_ext_to_mbmi_ext_frame(x->mbmi_ext_frame, x->mbmi_ext,
+ av1_copy_mbmi_ext_to_mbmi_ext_frame(x->mbmi_ext_frame, &x->mbmi_ext,
av1_ref_frame_type(xd->mi[0]->ref_frame));
x->rdmult = origin_mult;
}
@@ -1804,7 +1804,7 @@
// level (x->mbmi_ext) to frame level (cpi->mbmi_ext_info.frame_base). This
// frame level buffer (cpi->mbmi_ext_info.frame_base) will be used during
// bitstream preparation.
- av1_copy_mbmi_ext_to_mbmi_ext_frame(x->mbmi_ext_frame, x->mbmi_ext,
+ av1_copy_mbmi_ext_to_mbmi_ext_frame(x->mbmi_ext_frame, &x->mbmi_ext,
av1_ref_frame_type(xd->mi[0]->ref_frame));
x->rdmult = origin_mult;
}
@@ -3882,7 +3882,7 @@
mi_col);
*(xd->mi[0]) = pc_tree->none->mic;
copy_mbmi_ext_frame_to_mbmi_ext(
- x->mbmi_ext, &pc_tree->none->mbmi_ext_best, LAST_FRAME);
+ &x->mbmi_ext, &pc_tree->none->mbmi_ext_best, LAST_FRAME);
duplicate_mode_info_in_sb(cm, xd, mi_row, mi_col, bsize);
break;
case PARTITION_SPLIT: {
diff --git a/av1/encoder/rd.c b/av1/encoder/rd.c
index 8c2449e..f054114 100644
--- a/av1/encoder/rd.c
+++ b/av1/encoder/rd.c
@@ -1004,9 +1004,9 @@
int ref_y_stride, int ref_frame, BLOCK_SIZE block_size) {
const MV_REFERENCE_FRAME ref_frames[2] = { ref_frame, NONE_FRAME };
const int_mv ref_mv =
- av1_get_ref_mv_from_stack(0, ref_frames, 0, x->mbmi_ext);
+ av1_get_ref_mv_from_stack(0, ref_frames, 0, &x->mbmi_ext);
const int_mv ref_mv1 =
- av1_get_ref_mv_from_stack(0, ref_frames, 1, x->mbmi_ext);
+ av1_get_ref_mv_from_stack(0, ref_frames, 1, &x->mbmi_ext);
MV pred_mv[MAX_MV_REF_CANDIDATES + 1];
int num_mv_refs = 0;
pred_mv[num_mv_refs++] = ref_mv.as_mv;
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index a66f51d..b10d910 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -904,7 +904,7 @@
ctx->best_mode_index = mode_index;
#endif // CONFIG_INTERNAL_STATS
ctx->mic = *xd->mi[0];
- av1_copy_mbmi_ext_to_mbmi_ext_frame(&ctx->mbmi_ext_best, x->mbmi_ext,
+ av1_copy_mbmi_ext_to_mbmi_ext_frame(&ctx->mbmi_ext_best, &x->mbmi_ext,
av1_ref_frame_type(xd->mi[0]->ref_frame));
ctx->single_pred_diff = (int)comp_pred_diff[SINGLE_REFERENCE];
ctx->comp_pred_diff = (int)comp_pred_diff[COMPOUND_REFERENCE];
@@ -920,7 +920,7 @@
av1_get_scaled_ref_frame(cpi, ref_frame);
MACROBLOCKD *const xd = &x->e_mbd;
MB_MODE_INFO *const mbmi = xd->mi[0];
- MB_MODE_INFO_EXT *const mbmi_ext = x->mbmi_ext;
+ MB_MODE_INFO_EXT *const mbmi_ext = &x->mbmi_ext;
const struct scale_factors *const sf =
get_ref_scale_factors_const(cm, ref_frame);
const YV12_BUFFER_CONFIG *yv12 = get_ref_frame_yv12_buf(cm, ref_frame);
@@ -978,7 +978,7 @@
InterModeSearchState *search_state) {
const int is_comp_pred = ref_frames[1] > INTRA_FRAME;
const uint8_t ref_frame_type = av1_ref_frame_type(ref_frames);
- const MB_MODE_INFO_EXT *const mbmi_ext = x->mbmi_ext;
+ const MB_MODE_INFO_EXT *const mbmi_ext = &x->mbmi_ext;
const int ref_mv_count = mbmi_ext->ref_mv_count[ref_frame_type];
PREDICTION_MODE compare_mode = MB_MODE_COUNT;
if (!is_comp_pred) {
@@ -1138,7 +1138,7 @@
MV prev_ref_mv[2] = { { 0 } };
for (int idx = 0; idx < mbmi->ref_mv_idx; ++idx) {
prev_ref_mv[idx] = av1_get_ref_mv_from_stack(ref_idx, mbmi->ref_frame,
- idx, x->mbmi_ext)
+ idx, &x->mbmi_ext)
.as_mv;
const int ref_mv_diff = AOMMAX(abs(ref_mv.row - prev_ref_mv[idx].row),
abs(ref_mv.col - prev_ref_mv[idx].col));
@@ -1738,15 +1738,15 @@
int_mv this_mv;
this_mv.as_int = INVALID_MV;
ret = get_this_mv(&this_mv, this_mode, i, mbmi->ref_mv_idx,
- skip_repeated_ref_mv, mbmi->ref_frame, x->mbmi_ext);
+ skip_repeated_ref_mv, mbmi->ref_frame, &x->mbmi_ext);
if (!ret) return 0;
const PREDICTION_MODE single_mode = get_single_mode(this_mode, i);
if (single_mode == NEWMV) {
const uint8_t ref_frame_type = av1_ref_frame_type(mbmi->ref_frame);
cur_mv[i] =
- (i == 0) ? x->mbmi_ext->ref_mv_stack[ref_frame_type][mbmi->ref_mv_idx]
+ (i == 0) ? x->mbmi_ext.ref_mv_stack[ref_frame_type][mbmi->ref_mv_idx]
.this_mv
- : x->mbmi_ext->ref_mv_stack[ref_frame_type][mbmi->ref_mv_idx]
+ : x->mbmi_ext.ref_mv_stack[ref_frame_type][mbmi->ref_mv_idx]
.comp_mv;
} else {
ret &= clamp_and_check_mv(cur_mv + i, this_mv, cm, x);
@@ -1801,7 +1801,7 @@
static int get_drl_refmv_count(const MACROBLOCK *const x,
const MV_REFERENCE_FRAME *ref_frame,
PREDICTION_MODE mode) {
- MB_MODE_INFO_EXT *const mbmi_ext = x->mbmi_ext;
+ const MB_MODE_INFO_EXT *const mbmi_ext = &x->mbmi_ext;
const int8_t ref_frame_type = av1_ref_frame_type(ref_frame);
const int has_nearmv = have_nearmv_in_inter_mode(mode) ? 1 : 0;
const int ref_mv_count = mbmi_ext->ref_mv_count[ref_frame_type];
@@ -1823,7 +1823,7 @@
int ref_mv_idx) {
MACROBLOCKD *xd = &x->e_mbd;
MB_MODE_INFO *mbmi = xd->mi[0];
- const MB_MODE_INFO_EXT *const mbmi_ext = x->mbmi_ext;
+ const MB_MODE_INFO_EXT *const mbmi_ext = &x->mbmi_ext;
const int8_t ref_frame_type = av1_ref_frame_type(mbmi->ref_frame);
const int is_comp_pred = has_second_ref(mbmi);
if (sf->inter_sf.reduce_inter_modes && ref_mv_idx > 0) {
@@ -1873,7 +1873,7 @@
int64_t ref_best_rd, BLOCK_SIZE bsize) {
MACROBLOCKD *xd = &x->e_mbd;
MB_MODE_INFO *mbmi = xd->mi[0];
- MB_MODE_INFO_EXT *const mbmi_ext = x->mbmi_ext;
+ MB_MODE_INFO_EXT *const mbmi_ext = &x->mbmi_ext;
const int8_t ref_frame_type = av1_ref_frame_type(mbmi->ref_frame);
const AV1_COMMON *cm = &cpi->common;
const int is_comp_pred = has_second_ref(mbmi);
@@ -2551,7 +2551,7 @@
const int num_planes = av1_num_planes(cm);
MACROBLOCKD *xd = &x->e_mbd;
MB_MODE_INFO *mbmi = xd->mi[0];
- MB_MODE_INFO_EXT *const mbmi_ext = x->mbmi_ext;
+ MB_MODE_INFO_EXT *const mbmi_ext = &x->mbmi_ext;
TxfmSearchInfo *txfm_info = &x->txfm_search_info;
const int is_comp_pred = has_second_ref(mbmi);
const PREDICTION_MODE this_mode = mbmi->mode;
@@ -2894,7 +2894,7 @@
const int sb_row = mi_row >> cm->seq_params.mib_size_log2;
const int sb_col = mi_col >> cm->seq_params.mib_size_log2;
- MB_MODE_INFO_EXT *const mbmi_ext = x->mbmi_ext;
+ MB_MODE_INFO_EXT *const mbmi_ext = &x->mbmi_ext;
MV_REFERENCE_FRAME ref_frame = INTRA_FRAME;
av1_find_mv_refs(cm, xd, mbmi, ref_frame, mbmi_ext->ref_mv_count,
xd->ref_mv_stack, xd->weight, NULL, mbmi_ext->global_mvs,
@@ -3130,7 +3130,7 @@
if (rd_cost->rate == INT_MAX) return;
ctx->mic = *xd->mi[0];
- av1_copy_mbmi_ext_to_mbmi_ext_frame(&ctx->mbmi_ext_best, x->mbmi_ext,
+ av1_copy_mbmi_ext_to_mbmi_ext_frame(&ctx->mbmi_ext_best, &x->mbmi_ext,
av1_ref_frame_type(xd->mi[0]->ref_frame));
av1_copy_array(ctx->tx_type_map, xd->tx_type_map, ctx->num_4x4_blk);
}
@@ -3183,12 +3183,12 @@
mbmi->ref_frame[0] = ref_frame;
mbmi->ref_frame[1] = second_ref_frame;
const uint8_t ref_frame_type = av1_ref_frame_type(mbmi->ref_frame);
- if (x->mbmi_ext->ref_mv_count[ref_frame_type] == UINT8_MAX) {
- if (x->mbmi_ext->ref_mv_count[ref_frame] == UINT8_MAX ||
- x->mbmi_ext->ref_mv_count[second_ref_frame] == UINT8_MAX) {
+ if (x->mbmi_ext.ref_mv_count[ref_frame_type] == UINT8_MAX) {
+ MB_MODE_INFO_EXT *mbmi_ext = &x->mbmi_ext;
+ if (mbmi_ext->ref_mv_count[ref_frame] == UINT8_MAX ||
+ mbmi_ext->ref_mv_count[second_ref_frame] == UINT8_MAX) {
return;
}
- MB_MODE_INFO_EXT *mbmi_ext = x->mbmi_ext;
av1_find_mv_refs(cm, xd, mbmi, ref_frame_type, mbmi_ext->ref_mv_count,
xd->ref_mv_stack, xd->weight, NULL, mbmi_ext->global_mvs,
mbmi_ext->mode_context);
@@ -3616,9 +3616,10 @@
mask->pred_modes[ALTREF_FRAME] = ~INTER_NEAREST_NEAR_ZERO;
const MV_REFERENCE_FRAME tmp_ref_frames[2] = { ALTREF_FRAME, NONE_FRAME };
int_mv near_mv, nearest_mv, global_mv;
- get_this_mv(&nearest_mv, NEARESTMV, 0, 0, 0, tmp_ref_frames, x->mbmi_ext);
- get_this_mv(&near_mv, NEARMV, 0, 0, 0, tmp_ref_frames, x->mbmi_ext);
- get_this_mv(&global_mv, GLOBALMV, 0, 0, 0, tmp_ref_frames, x->mbmi_ext);
+ get_this_mv(&nearest_mv, NEARESTMV, 0, 0, 0, tmp_ref_frames,
+ &x->mbmi_ext);
+ get_this_mv(&near_mv, NEARMV, 0, 0, 0, tmp_ref_frames, &x->mbmi_ext);
+ get_this_mv(&global_mv, GLOBALMV, 0, 0, 0, tmp_ref_frames, &x->mbmi_ext);
if (near_mv.as_int != global_mv.as_int)
mask->pred_modes[ALTREF_FRAME] |= (1 << NEARMV);
@@ -3722,7 +3723,7 @@
const AV1_COMMON *const cm = &cpi->common;
MACROBLOCKD *const xd = &x->e_mbd;
MB_MODE_INFO *const mbmi = xd->mi[0];
- MB_MODE_INFO_EXT *const mbmi_ext = x->mbmi_ext;
+ MB_MODE_INFO_EXT *const mbmi_ext = &x->mbmi_ext;
unsigned char segment_id = mbmi->segment_id;
init_neighbor_pred_buf(&x->obmc_buffer, args, is_cur_buf_hbd(&x->e_mbd));
@@ -3737,7 +3738,7 @@
for (MV_REFERENCE_FRAME ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME;
++ref_frame) {
x->pred_mv_sad[ref_frame] = INT_MAX;
- x->mbmi_ext->mode_context[ref_frame] = 0;
+ mbmi_ext->mode_context[ref_frame] = 0;
mbmi_ext->ref_mv_count[ref_frame] = UINT8_MAX;
if (cpi->ref_frame_flags & av1_ref_frame_flag_list[ref_frame]) {
// Skip the ref frame if the mask says skip and the ref is not used by
@@ -3760,7 +3761,7 @@
// No second reference on RT ref set, so no need to initialize
for (MV_REFERENCE_FRAME ref_frame = EXTREF_FRAME;
ref_frame < MODE_CTX_REF_FRAMES; ++ref_frame) {
- x->mbmi_ext->mode_context[ref_frame] = 0;
+ mbmi_ext->mode_context[ref_frame] = 0;
mbmi_ext->ref_mv_count[ref_frame] = UINT8_MAX;
const MV_REFERENCE_FRAME *rf = ref_frame_map[ref_frame - REF_FRAMES];
if (!((cpi->ref_frame_flags & av1_ref_frame_flag_list[rf[0]]) &&
@@ -4305,8 +4306,8 @@
int_mv single_mv;
int_mv comp_mv;
get_this_mv(&single_mv, mode[i], 0, ref_mv_idx, 0, single_refs,
- x->mbmi_ext);
- get_this_mv(&comp_mv, this_mode, i, ref_mv_idx, 0, refs, x->mbmi_ext);
+ &x->mbmi_ext);
+ get_this_mv(&comp_mv, this_mode, i, ref_mv_idx, 0, refs, &x->mbmi_ext);
if (single_mv.as_int != comp_mv.as_int) {
ref_mv_match[i] = 0;
break;