Separate num_8x8 table use case from mode_info table Separate the use cases of number of 8x8 blocks from those of mode_info array. This allows the mode_info array processing to be scaled to 4x4 resolution. Change-Id: Iab78f2540355ce7658d9ea21e902a86f71148d8f
diff --git a/av1/common/common_data.h b/av1/common/common_data.h index 10f8c42..0de9a71 100644 --- a/av1/common/common_data.h +++ b/av1/common/common_data.h
@@ -53,6 +53,21 @@ 0, 0, 0, 0, 1, 0, 1, 2, 1, 2, 3, 2, 3, IF_EXT_PARTITION(4, 3, 4) }; +static const uint8_t mi_size_wide[BLOCK_SIZES] = { +#if CONFIG_CB4X4 + 1, 1, 1, 1, 1, 2, 2, 2, 4, 4, 4, 8, 8, 8, 16, 16, IF_EXT_PARTITION(16, 32, 32) +#else + 1, 1, 1, 1, 1, 2, 2, 2, 4, 4, 4, 8, 8, IF_EXT_PARTITION(8, 16, 16) +#endif +}; +static const uint8_t mi_size_high[BLOCK_SIZES] = { +#if CONFIG_CB4X4 + 1, 1, 1, 1, 2, 1, 2, 4, 2, 4, 8, 4, 8, 16, 8, 16, IF_EXT_PARTITION(32, 16, 32) +#else + 1, 1, 1, 1, 2, 1, 2, 4, 2, 4, 8, 4, 8, IF_EXT_PARTITION(16, 8, 16) +#endif +}; + // Width/height lookup tables in units of various block sizes static const uint8_t block_size_wide[BLOCK_SIZES] = { #if CONFIG_CB4X4
diff --git a/av1/common/mvref_common.c b/av1/common/mvref_common.c index abf3c87..6697708 100644 --- a/av1/common/mvref_common.c +++ b/av1/common/mvref_common.c
@@ -175,8 +175,7 @@ const MODE_INFO *const candidate_mi = xd->mi[mi_pos.row * xd->mi_stride + mi_pos.col]; const MB_MODE_INFO *const candidate = &candidate_mi->mbmi; - int len = - AOMMIN(xd->n8_w, num_8x8_blocks_wide_lookup[candidate->sb_type]); + int len = AOMMIN(xd->n8_w, mi_size_wide[candidate->sb_type]); if (use_step_16) len = AOMMAX(2, len); newmv_count += add_ref_mv_candidate( candidate_mi, candidate, rf, refmv_count, ref_mv_stack, @@ -211,8 +210,7 @@ const MODE_INFO *const candidate_mi = xd->mi[mi_pos.row * xd->mi_stride + mi_pos.col]; const MB_MODE_INFO *const candidate = &candidate_mi->mbmi; - int len = - AOMMIN(xd->n8_h, num_8x8_blocks_high_lookup[candidate->sb_type]); + int len = AOMMIN(xd->n8_h, mi_size_high[candidate->sb_type]); if (use_step_16) len = AOMMAX(2, len); newmv_count += add_ref_mv_candidate( candidate_mi, candidate, rf, refmv_count, ref_mv_stack, @@ -513,12 +511,12 @@ ? cm->prev_frame->mvs + mi_row * cm->mi_cols + mi_col : NULL; const TileInfo *const tile = &xd->tile; - const int bw = num_8x8_blocks_wide_lookup[mi->mbmi.sb_type] << 3; - const int bh = num_8x8_blocks_high_lookup[mi->mbmi.sb_type] << 3; + const int bw = block_size_wide[AOMMAX(mi->mbmi.sb_type, BLOCK_8X8)]; + const int bh = block_size_high[AOMMAX(mi->mbmi.sb_type, BLOCK_8X8)]; #if CONFIG_REF_MV POSITION mv_ref_search[MVREF_NEIGHBOURS]; - const int num_8x8_blocks_wide = bw >> 3; - const int num_8x8_blocks_high = bh >> 3; + const int num_8x8_blocks_wide = bw >> MI_SIZE_LOG2; + const int num_8x8_blocks_high = bh >> MI_SIZE_LOG2; mv_ref_search[0].row = num_8x8_blocks_high - 1; mv_ref_search[0].col = -1; mv_ref_search[1].row = -1;
diff --git a/av1/common/onyxc_int.h b/av1/common/onyxc_int.h index b194786..5c32c39 100644 --- a/av1/common/onyxc_int.h +++ b/av1/common/onyxc_int.h
@@ -643,13 +643,13 @@ xd->left_seg_context + (mi_row & MAX_MIB_MASK); #if CONFIG_EXT_PARTITION_TYPES - const int bw = num_8x8_blocks_wide_lookup[bsize]; - const int bh = num_8x8_blocks_high_lookup[bsize]; + const int bw = mi_size_wide[bsize]; + const int bh = mi_size_high[bsize]; memset(above_ctx, partition_context_lookup[subsize].above, bw); memset(left_ctx, partition_context_lookup[subsize].left, bh); #else // num_4x4_blocks_wide_lookup[bsize] / 2 - const int bs = num_8x8_blocks_wide_lookup[bsize]; + const int bs = mi_size_wide[bsize]; // update the partition context at the end notes. set partition bits // of block sizes larger than the current one to be one, and partition @@ -792,8 +792,8 @@ TXFM_CONTEXT *left_ctx, TX_SIZE tx_size) { BLOCK_SIZE bsize = txsize_to_bsize[tx_size]; - int bh = num_8x8_blocks_high_lookup[bsize]; - int bw = num_8x8_blocks_wide_lookup[bsize]; + int bh = mi_size_high[bsize]; + int bw = mi_size_wide[bsize]; uint8_t txw = tx_size_wide[tx_size]; uint8_t txh = tx_size_high[tx_size]; int i; @@ -835,7 +835,7 @@ #if !CONFIG_EXT_PARTITION_TYPES return partition; #else - const int hbs = num_8x8_blocks_wide_lookup[bsize] / 2; + const int hbs = mi_size_wide[bsize] / 2; assert(cm->mi_grid_visible[offset] == &cm->mi[offset]); @@ -865,11 +865,10 @@ static INLINE void set_sb_size(AV1_COMMON *const cm, const BLOCK_SIZE sb_size) { cm->sb_size = sb_size; + cm->mib_size = mi_size_wide[cm->sb_size]; #if CONFIG_CB4X4 - cm->mib_size = num_4x4_blocks_wide_lookup[cm->sb_size]; cm->mib_size_log2 = b_width_log2_lookup[cm->sb_size]; #else - cm->mib_size = num_8x8_blocks_wide_lookup[cm->sb_size]; cm->mib_size_log2 = mi_width_log2_lookup[cm->sb_size]; #endif }
diff --git a/av1/common/pred_common.h b/av1/common/pred_common.h index 6b47ed2..71865f2 100644 --- a/av1/common/pred_common.h +++ b/av1/common/pred_common.h
@@ -24,8 +24,8 @@ const uint8_t *segment_ids, BLOCK_SIZE bsize, int mi_row, int mi_col) { const int mi_offset = mi_row * cm->mi_cols + mi_col; - const int bw = num_8x8_blocks_wide_lookup[bsize]; - const int bh = num_8x8_blocks_high_lookup[bsize]; + const int bw = mi_size_wide[bsize]; + const int bh = mi_size_high[bsize]; const int xmis = AOMMIN(cm->mi_cols - mi_col, bw); const int ymis = AOMMIN(cm->mi_rows - mi_row, bh); int x, y, segment_id = MAX_SEGMENTS;
diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c index 838c9af..c01a4ce 100644 --- a/av1/decoder/decodemv.c +++ b/av1/decoder/decodemv.c
@@ -497,8 +497,8 @@ MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi; int predicted_segment_id, segment_id; const int mi_offset = mi_row * cm->mi_cols + mi_col; - const int bw = num_8x8_blocks_wide_lookup[mbmi->sb_type]; - const int bh = num_8x8_blocks_high_lookup[mbmi->sb_type]; + const int bw = mi_size_wide[mbmi->sb_type]; + const int bh = mi_size_high[mbmi->sb_type]; // TODO(slavarnway): move x_mis, y_mis into xd ????? const int x_mis = AOMMIN(cm->mi_cols - mi_col, bw);
diff --git a/av1/encoder/aq_complexity.c b/av1/encoder/aq_complexity.c index 5c4a5e3..cb15ff8 100644 --- a/av1/encoder/aq_complexity.c +++ b/av1/encoder/aq_complexity.c
@@ -116,8 +116,8 @@ const AV1_COMMON *const cm = &cpi->common; const int mi_offset = mi_row * cm->mi_cols + mi_col; - const int xmis = AOMMIN(cm->mi_cols - mi_col, num_8x8_blocks_wide_lookup[bs]); - const int ymis = AOMMIN(cm->mi_rows - mi_row, num_8x8_blocks_high_lookup[bs]); + const int xmis = AOMMIN(cm->mi_cols - mi_col, mi_size_wide[bs]); + const int ymis = AOMMIN(cm->mi_rows - mi_row, mi_size_high[bs]); int x, y; int i; unsigned char segment;
diff --git a/av1/encoder/aq_cyclicrefresh.c b/av1/encoder/aq_cyclicrefresh.c index bcf11a7..e41c608 100644 --- a/av1/encoder/aq_cyclicrefresh.c +++ b/av1/encoder/aq_cyclicrefresh.c
@@ -215,8 +215,8 @@ int64_t rate, int64_t dist, int skip) { const AV1_COMMON *const cm = &cpi->common; CYCLIC_REFRESH *const cr = cpi->cyclic_refresh; - const int bw = num_8x8_blocks_wide_lookup[bsize]; - const int bh = num_8x8_blocks_high_lookup[bsize]; + const int bw = mi_size_wide[bsize]; + const int bh = mi_size_high[bsize]; const int xmis = AOMMIN(cm->mi_cols - mi_col, bw); const int ymis = AOMMIN(cm->mi_rows - mi_row, bh); const int block_index = mi_row * cm->mi_cols + mi_col;
diff --git a/av1/encoder/aq_variance.c b/av1/encoder/aq_variance.c index 01528ec..2048940 100644 --- a/av1/encoder/aq_variance.c +++ b/av1/encoder/aq_variance.c
@@ -151,8 +151,8 @@ (xd->mb_to_bottom_edge < 0) ? ((-xd->mb_to_bottom_edge) >> 3) : 0; if (right_overflow || bottom_overflow) { - const int bw = 8 * num_8x8_blocks_wide_lookup[bs] - right_overflow; - const int bh = 8 * num_8x8_blocks_high_lookup[bs] - bottom_overflow; + const int bw = 8 * mi_size_wide[bs] - right_overflow; + const int bh = 8 * mi_size_high[bs] - bottom_overflow; int avg; #if CONFIG_AOM_HIGHBITDEPTH if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c index e64414d..92afa69 100644 --- a/av1/encoder/bitstream.c +++ b/av1/encoder/bitstream.c
@@ -1811,8 +1811,8 @@ assert(m->mbmi.sb_type <= cm->sb_size); - bh = num_8x8_blocks_high_lookup[m->mbmi.sb_type]; - bw = num_8x8_blocks_wide_lookup[m->mbmi.sb_type]; + bh = mi_size_high[m->mbmi.sb_type]; + bw = mi_size_wide[m->mbmi.sb_type]; cpi->td.mb.mbmi_ext = cpi->mbmi_ext_base + (mi_row * cm->mi_cols + mi_col); @@ -2189,7 +2189,7 @@ int mi_row, int mi_col, BLOCK_SIZE bsize) { const AV1_COMMON *const cm = &cpi->common; MACROBLOCKD *const xd = &cpi->td.mb.e_mbd; - const int hbs = num_8x8_blocks_wide_lookup[bsize] / 2; + const int hbs = mi_size_wide[bsize] / 2; const PARTITION_TYPE partition = get_partition(cm, mi_row, mi_col, bsize); const BLOCK_SIZE subsize = get_subsize(bsize, partition); #if CONFIG_SUPERTX @@ -4013,7 +4013,7 @@ aom_wb_write_literal(wb, cm->frame_context_idx, FRAME_CONTEXTS_LOG2); - assert(cm->mib_size == num_8x8_blocks_wide_lookup[cm->sb_size]); + assert(cm->mib_size == mi_size_wide[cm->sb_size]); assert(cm->mib_size == 1 << cm->mib_size_log2); #if CONFIG_EXT_PARTITION assert(cm->sb_size == BLOCK_128X128 || cm->sb_size == BLOCK_64X64);
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c index 7e39cc5..a274f72 100644 --- a/av1/encoder/encodeframe.c +++ b/av1/encoder/encodeframe.c
@@ -264,8 +264,8 @@ int mi_col, BLOCK_SIZE bsize) { const AV1_COMMON *const cm = &cpi->common; MACROBLOCKD *const xd = &x->e_mbd; - const int mi_width = num_8x8_blocks_wide_lookup[bsize]; - const int mi_height = num_8x8_blocks_high_lookup[bsize]; + const int mi_width = mi_size_wide[bsize]; + const int mi_height = mi_size_high[bsize]; const int bwl = b_width_log2_lookup[AOMMAX(bsize, BLOCK_8X8)]; const int bhl = b_height_log2_lookup[AOMMAX(bsize, BLOCK_8X8)]; @@ -438,8 +438,8 @@ int mi_col, const int64_t *const threshold, const BLOCK_SIZE *const bsize_min) { AV1_COMMON *const cm = &cpi->common; - const int hbw = num_8x8_blocks_wide_lookup[vt->bsize] / 2; - const int hbh = num_8x8_blocks_high_lookup[vt->bsize] / 2; + const int hbw = mi_size_wide[vt->bsize] / 2; + const int hbh = mi_size_high[vt->bsize] / 2; const int has_cols = mi_col + hbw < cm->mi_cols; const int has_rows = mi_row + hbh < cm->mi_rows; @@ -827,8 +827,8 @@ const uint8_t *ref; int src_stride; int ref_stride; - int pixels_wide = 8 * num_8x8_blocks_wide_lookup[cm->sb_size]; - int pixels_high = 8 * num_8x8_blocks_high_lookup[cm->sb_size]; + int pixels_wide = MI_SIZE * mi_size_wide[cm->sb_size]; + int pixels_high = MI_SIZE * mi_size_high[cm->sb_size]; int64_t thresholds[5] = { cpi->vbp_thresholds[0], cpi->vbp_thresholds[1], cpi->vbp_thresholds[2], cpi->vbp_thresholds[3], cpi->vbp_thresholds[4], @@ -1028,16 +1028,16 @@ MB_MODE_INFO *const mbmi = &xd->mi[0]->mbmi; MODE_INFO *mi_addr = xd->mi[0]; const struct segmentation *const seg = &cm->seg; - const int bw = num_8x8_blocks_wide_lookup[mi->mbmi.sb_type]; - const int bh = num_8x8_blocks_high_lookup[mi->mbmi.sb_type]; + const int bw = mi_size_wide[mi->mbmi.sb_type]; + const int bh = mi_size_high[mi->mbmi.sb_type]; const int x_mis = AOMMIN(bw, cm->mi_cols - mi_col); const int y_mis = AOMMIN(bh, cm->mi_rows - mi_row); MV_REF *const frame_mvs = cm->cur_frame->mvs + mi_row * cm->mi_cols + mi_col; int w, h; const int mis = cm->mi_stride; - const int mi_width = num_8x8_blocks_wide_lookup[bsize]; - const int mi_height = num_8x8_blocks_high_lookup[bsize]; + const int mi_width = mi_size_wide[bsize]; + const int mi_height = mi_size_high[bsize]; #if CONFIG_REF_MV int8_t rf_type; @@ -2131,10 +2131,12 @@ BLOCK_SIZE bsize) { MACROBLOCKD *xd = &x->e_mbd; int p; - const int num_4x4_blocks_wide = num_4x4_blocks_wide_lookup[bsize]; - const int num_4x4_blocks_high = num_4x4_blocks_high_lookup[bsize]; - int mi_width = num_8x8_blocks_wide_lookup[bsize]; - int mi_height = num_8x8_blocks_high_lookup[bsize]; + const int num_4x4_blocks_wide = + block_size_wide[bsize] >> tx_size_wide_log2[0]; + const int num_4x4_blocks_high = + block_size_high[bsize] >> tx_size_high_log2[0]; + int mi_width = mi_size_wide[bsize]; + int mi_height = mi_size_high[bsize]; for (p = 0; p < MAX_MB_PLANE; p++) { memcpy(xd->above_context[p] + ((mi_col * 2) >> xd->plane[p].subsampling_x), ctx->a + num_4x4_blocks_wide * p, @@ -2171,10 +2173,12 @@ BLOCK_SIZE bsize) { const MACROBLOCKD *xd = &x->e_mbd; int p; - const int num_4x4_blocks_wide = num_4x4_blocks_wide_lookup[bsize]; - const int num_4x4_blocks_high = num_4x4_blocks_high_lookup[bsize]; - int mi_width = num_8x8_blocks_wide_lookup[bsize]; - int mi_height = num_8x8_blocks_high_lookup[bsize]; + const int num_4x4_blocks_wide = + block_size_wide[bsize] >> tx_size_wide_log2[0]; + const int num_4x4_blocks_high = + block_size_high[bsize] >> tx_size_high_log2[0]; + int mi_width = mi_size_wide[bsize]; + int mi_height = mi_size_high[bsize]; // buffer the above/left context information of the block in search. for (p = 0; p < MAX_MB_PLANE; ++p) { @@ -2238,7 +2242,7 @@ MACROBLOCKD *const xd = &x->e_mbd; const int ctx = partition_plane_context(xd, mi_row, mi_col, bsize); - const int hbs = num_8x8_blocks_wide_lookup[bsize] / 2; + const int hbs = mi_size_wide[bsize] / 2; const PARTITION_TYPE partition = pc_tree->partitioning; const BLOCK_SIZE subsize = get_subsize(bsize, partition); #if CONFIG_EXT_PARTITION_TYPES @@ -2450,8 +2454,8 @@ return AOMMIN(bsize, BLOCK_8X8); } else { for (; bsize > 0; bsize -= 3) { - *bh = num_8x8_blocks_high_lookup[bsize]; - *bw = num_8x8_blocks_wide_lookup[bsize]; + *bh = mi_size_high[bsize]; + *bw = mi_size_wide[bsize]; if ((*bh <= rows_left) && (*bw <= cols_left)) { break; } @@ -2491,8 +2495,8 @@ const int mi_cols_remaining = tile->mi_col_end - mi_col; int block_row, block_col; MODE_INFO *const mi_upper_left = cm->mi + mi_row * cm->mi_stride + mi_col; - int bh = num_8x8_blocks_high_lookup[bsize]; - int bw = num_8x8_blocks_wide_lookup[bsize]; + int bh = mi_size_high[bsize]; + int bw = mi_size_wide[bsize]; assert((mi_rows_remaining > 0) && (mi_cols_remaining > 0)); @@ -2525,7 +2529,7 @@ TileInfo *const tile_info = &tile_data->tile_info; MACROBLOCK *const x = &td->mb; MACROBLOCKD *const xd = &x->e_mbd; - const int bs = num_8x8_blocks_wide_lookup[bsize]; + const int bs = mi_size_wide[bsize]; const int hbs = bs / 2; int i; const int pl = partition_plane_context(xd, mi_row, mi_col, bsize); @@ -3077,8 +3081,8 @@ int mi_col, BLOCK_SIZE bsize, BLOCK_SIZE *const min_bs, BLOCK_SIZE *const max_bs) { - const int mi_width = num_8x8_blocks_wide_lookup[bsize]; - const int mi_height = num_8x8_blocks_high_lookup[bsize]; + const int mi_width = mi_size_wide[bsize]; + const int mi_height = mi_size_high[bsize]; int idx, idy; const int idx_str = cm->mi_stride * mi_row + mi_col; @@ -3424,7 +3428,7 @@ TileInfo *const tile_info = &tile_data->tile_info; MACROBLOCK *const x = &td->mb; MACROBLOCKD *const xd = &x->e_mbd; - const int mi_step = num_8x8_blocks_wide_lookup[bsize] / 2; + const int mi_step = mi_size_wide[bsize] / 2; RD_SEARCH_MACROBLOCK_CONTEXT x_ctx; const TOKENEXTRA *const tp_orig = *tp; PICK_MODE_CONTEXT *ctx_none = &pc_tree->none; @@ -3506,8 +3510,7 @@ #endif // NDEBUG #endif // CONFIG_VAR_TX - assert(num_8x8_blocks_wide_lookup[bsize] == - num_8x8_blocks_high_lookup[bsize]); + assert(mi_size_wide[bsize] == mi_size_high[bsize]); av1_rd_cost_init(&this_rdc); av1_rd_cost_init(&sum_rdc); @@ -5440,8 +5443,8 @@ const int seg_skip = segfeature_active(&cm->seg, mbmi->segment_id, SEG_LVL_SKIP); const int mis = cm->mi_stride; - const int mi_width = num_8x8_blocks_wide_lookup[bsize]; - const int mi_height = num_8x8_blocks_high_lookup[bsize]; + const int mi_width = mi_size_wide[bsize]; + const int mi_height = mi_size_high[bsize]; const int is_inter = is_inter_block(mbmi); x->use_lp32x32fdct = cpi->sf.use_lp32x32fdct;
diff --git a/av1/encoder/firstpass.c b/av1/encoder/firstpass.c index f066b46..968677d 100644 --- a/av1/encoder/firstpass.c +++ b/av1/encoder/firstpass.c
@@ -617,9 +617,8 @@ xd->left_available = (mb_col != 0); xd->mi[0]->mbmi.sb_type = bsize; xd->mi[0]->mbmi.ref_frame[0] = INTRA_FRAME; - set_mi_row_col(xd, &tile, mb_row << 1, num_8x8_blocks_high_lookup[bsize], - mb_col << 1, num_8x8_blocks_wide_lookup[bsize], - cm->mi_rows, cm->mi_cols); + set_mi_row_col(xd, &tile, mb_row << 1, mi_size_high[bsize], mb_col << 1, + mi_size_wide[bsize], cm->mi_rows, cm->mi_cols); set_plane_n4(xd, num_8x8_blocks_wide_lookup[bsize], num_8x8_blocks_high_lookup[bsize], mi_width_log2_lookup[bsize], mi_height_log2_lookup[bsize]);
diff --git a/av1/encoder/segmentation.c b/av1/encoder/segmentation.c index 828b31c..b291b29 100644 --- a/av1/encoder/segmentation.c +++ b/av1/encoder/segmentation.c
@@ -160,7 +160,7 @@ unsigned *t_unpred_seg_counts, int mi_row, int mi_col, BLOCK_SIZE bsize) { const int mis = cm->mi_stride; - const int bs = num_8x8_blocks_wide_lookup[bsize], hbs = bs / 2; + const int bs = mi_size_wide[bsize], hbs = bs / 2; #if CONFIG_EXT_PARTITION_TYPES PARTITION_TYPE partition; #else @@ -252,8 +252,8 @@ default: assert(0); } #else - bw = num_8x8_blocks_wide_lookup[mi[0]->mbmi.sb_type]; - bh = num_8x8_blocks_high_lookup[mi[0]->mbmi.sb_type]; + bw = mi_size_wide[mi[0]->mbmi.sb_type]; + bh = mi_size_high[mi[0]->mbmi.sb_type]; if (bw == bs && bh == bs) { count_segs(cm, xd, tile, mi, no_pred_segcounts, temporal_predictor_count,