Refactor set_mi_offsets() function
With that:
- We clarify that pointers in 'mi_grid_base' are being updated to point
to appropriate locations in 'mi' array. (This was not at all obvious from
statements like "xd->mi = mi_params->mi_grid_base + grid_idx;" followed by
"xd->mi[0] = mi_params->mi + alloc_idx;" used earlier)
- We use 'mi_grid_base' or 'xd->mi' as far as possible, without using
'mi' array directly
BUG=aomedia:2610
Change-Id: Ibed8f7e500b90d78328a2e4a7a47fa8cac991079
diff --git a/av1/common/av1_common_int.h b/av1/common/av1_common_int.h
index 5ce40fb..7d193e7 100644
--- a/av1/common/av1_common_int.h
+++ b/av1/common/av1_common_int.h
@@ -1236,6 +1236,21 @@
return mi_alloc_row * mi_params->mi_alloc_cols + mi_alloc_col;
}
+// For this partition block, set pointers in mi_params->mi_grid_base and xd->mi.
+static INLINE void set_mi_offsets(const CommonModeInfoParams *const mi_params,
+ MACROBLOCKD *const xd, int mi_row,
+ int mi_col) {
+ // 'mi_grid_base' should point to appropriate memory in 'mi'.
+ const int mi_grid_idx = get_mi_grid_idx(mi_params, mi_row, mi_col);
+ const int mi_alloc_idx = get_alloc_mi_idx(mi_params, mi_row, mi_col);
+ mi_params->mi_grid_base[mi_grid_idx] = &mi_params->mi[mi_alloc_idx];
+ // 'xd->mi' should point to an offset in 'mi_grid_base';
+ xd->mi = mi_params->mi_grid_base + mi_grid_idx;
+ // 'xd->tx_type_map' should point to an offset in 'mi_params->tx_type_map'.
+ xd->tx_type_map = mi_params->tx_type_map + mi_grid_idx;
+ xd->tx_type_map_stride = mi_params->mi_stride;
+}
+
static INLINE void txfm_partition_update(TXFM_CONTEXT *above_ctx,
TXFM_CONTEXT *left_ctx,
TX_SIZE tx_size, TX_SIZE txb_size) {
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index ccad632..29a758a 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -324,13 +324,7 @@
const CommonModeInfoParams *const mi_params = &cm->mi_params;
const TileInfo *const tile = &xd->tile;
- xd->mi = mi_params->mi_grid_base + get_mi_grid_idx(mi_params, mi_row, mi_col);
- xd->mi[0] = &mi_params->mi[get_alloc_mi_idx(mi_params, mi_row, mi_col)];
- xd->tx_type_map =
- &mi_params->tx_type_map[mi_row * mi_params->mi_stride + mi_col];
- xd->tx_type_map_stride = mi_params->mi_stride;
- // TODO(slavarnway): Generate sb_type based on bwl and bhl, instead of
- // passing bsize from decode_partition().
+ set_mi_offsets(mi_params, xd, mi_row, mi_col);
xd->mi[0]->sb_type = bsize;
#if CONFIG_RD_DEBUG
xd->mi[0]->mi_row = mi_row;
diff --git a/av1/encoder/encode_strategy.c b/av1/encoder/encode_strategy.c
index 3b7f842..c5b1cee 100644
--- a/av1/encoder/encode_strategy.c
+++ b/av1/encoder/encode_strategy.c
@@ -875,11 +875,7 @@
av1_setup_block_planes(xd, cm->seq_params.subsampling_x,
cm->seq_params.subsampling_y, num_planes);
- const CommonModeInfoParams *const mi_params = &cm->mi_params;
- xd->mi = mi_params->mi_grid_base;
- xd->mi[0] = mi_params->mi;
- xd->tx_type_map = mi_params->tx_type_map;
- xd->tx_type_map_stride = mi_params->mi_stride;
+ set_mi_offsets(&cm->mi_params, xd, 0, 0);
}
// Apply temporal filtering to key frames and encode the filtered frame.
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index a3f3a81..9b0d0e3 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -4163,10 +4163,10 @@
// before mi is assigned for each block in current superblock
for (int j = 0; j < AOMMIN(mib_size, mi_params->mi_rows - mi_row); j++) {
for (int k = 0; k < AOMMIN(mib_size, mi_params->mi_cols - mi_col); k++) {
- const int mi_idx = get_alloc_mi_idx(mi_params, mi_row + j, mi_col + k);
- mi_params->mi[mi_idx].delta_lf_from_base = delta_lf;
+ const int grid_idx = get_mi_grid_idx(mi_params, mi_row + j, mi_col + k);
+ mi_params->mi_grid_base[grid_idx]->delta_lf_from_base = delta_lf;
for (int lf_id = 0; lf_id < frame_lf_count; ++lf_id) {
- mi_params->mi[mi_idx].delta_lf[lf_id] = delta_lf;
+ mi_params->mi_grid_base[grid_idx]->delta_lf[lf_id] = delta_lf;
}
}
}
@@ -5598,10 +5598,7 @@
mi_params->setup_mi(mi_params);
}
- xd->mi = mi_params->mi_grid_base;
- xd->mi[0] = mi_params->mi;
- xd->tx_type_map = mi_params->tx_type_map;
- xd->tx_type_map_stride = mi_params->mi_stride;
+ set_mi_offsets(mi_params, xd, 0, 0);
#if CONFIG_AV1_HIGHBITDEPTH
x->fwd_txfm4x4 = aom_fdct4x4;
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index aa40799..10a1363 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -1549,14 +1549,8 @@
MACROBLOCKD *const xd, int mi_row,
int mi_col) {
const CommonModeInfoParams *const mi_params = &cpi->common.mi_params;
- const int grid_idx = get_mi_grid_idx(mi_params, mi_row, mi_col);
- const int mi_idx = get_alloc_mi_idx(mi_params, mi_row, mi_col);
+ set_mi_offsets(mi_params, xd, mi_row, mi_col);
const int ext_idx = get_mi_ext_idx(mi_params, mi_row, mi_col);
-
- xd->mi = mi_params->mi_grid_base + grid_idx;
- xd->mi[0] = mi_params->mi + mi_idx;
- xd->tx_type_map = mi_params->tx_type_map + grid_idx;
- xd->tx_type_map_stride = mi_params->mi_stride;
x->mbmi_ext_frame = cpi->mbmi_ext_frame_base + ext_idx;
}
diff --git a/av1/encoder/firstpass.c b/av1/encoder/firstpass.c
index 9abd0c6..11a6aa8 100644
--- a/av1/encoder/firstpass.c
+++ b/av1/encoder/firstpass.c
@@ -367,9 +367,8 @@
av1_setup_frame_size(cpi);
aom_clear_system_state();
- xd->mi = mi_params->mi_grid_base;
- xd->mi[0] = mi_params->mi;
- x->e_mbd.mi[0]->sb_type = BLOCK_16X16;
+ set_mi_offsets(mi_params, xd, 0, 0);
+ xd->mi[0]->sb_type = BLOCK_16X16;
intra_factor = 0.0;
brightness_factor = 0.0;
@@ -392,8 +391,7 @@
av1_setup_pre_planes(xd, 0, lst_yv12, 0, 0, NULL, num_planes);
}
- xd->mi = mi_params->mi_grid_base;
- xd->mi[0] = mi_params->mi;
+ set_mi_offsets(mi_params, xd, 0, 0);
// Don't store luma on the fist pass since chroma is not computed
xd->cfl.store_y = 0;
@@ -442,14 +440,7 @@
aom_clear_system_state();
- const int grid_idx =
- get_mi_grid_idx(mi_params, mb_row * mb_scale, mb_col * mb_scale);
- const int mi_idx =
- get_alloc_mi_idx(mi_params, mb_row * mb_scale, mb_col * mb_scale);
- xd->mi = mi_params->mi_grid_base + grid_idx;
- xd->mi[0] = mi_params->mi + mi_idx;
- xd->tx_type_map = mi_params->tx_type_map + grid_idx;
- xd->tx_type_map_stride = mi_params->mi_stride;
+ set_mi_offsets(mi_params, xd, mb_row * mb_scale, mb_col * mb_scale);
xd->plane[0].dst.buf = new_yv12->y_buffer + recon_yoffset;
xd->plane[1].dst.buf = new_yv12->u_buffer + recon_uvoffset;
xd->plane[2].dst.buf = new_yv12->v_buffer + recon_uvoffset;