Support 4x4 block unit decoding
Unify the block decoding process for all coding block sizes.
Change-Id: I7bfb482e9b5266f144e280b3ed713927a5ddc572
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index d70eaf1..de5f3fa 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -477,8 +477,10 @@
#endif
dst = &pd->dst.buf[(row * pd->dst.stride + col) << tx_size_wide_log2[0]];
+#if !CONFIG_CB4X4
if (mbmi->sb_type < BLOCK_8X8)
if (plane == 0) mode = xd->mi[0]->bmi[(row << 1) + col].as_mode;
+#endif
av1_predict_intra_block(xd, pd->width, pd->height, tx_size, mode, dst,
pd->dst.stride, dst, pd->dst.stride, col, row, plane);
@@ -1422,7 +1424,11 @@
}
#endif
+#if CONFIG_CB4X4
+ if (mbmi->skip) reset_skip_context(xd, bsize);
+#else
if (mbmi->skip) reset_skip_context(xd, AOMMAX(BLOCK_8X8, bsize));
+#endif
#if CONFIG_COEF_INTERLEAVE
{
@@ -1558,8 +1564,12 @@
const TX_SIZE tx_size = plane ? get_uv_tx_size(mbmi, pd) : mbmi->tx_size;
const int stepr = tx_size_high_unit[tx_size];
const int stepc = tx_size_wide_unit[tx_size];
+#if CONFIG_CB4X4
+ const BLOCK_SIZE plane_bsize = get_plane_block_size(bsize, pd);
+#else
const BLOCK_SIZE plane_bsize =
get_plane_block_size(AOMMAX(BLOCK_8X8, bsize), pd);
+#endif
int row, col;
const int max_blocks_wide = max_block_wide(xd, plane_bsize, plane);
const int max_blocks_high = max_block_high(xd, plane_bsize, plane);
@@ -1596,8 +1606,12 @@
}
} else {
#endif // CONFIG_WARPED_MOTION
- av1_build_inter_predictors_sb(xd, mi_row, mi_col, NULL,
- AOMMAX(bsize, BLOCK_8X8));
+#if CONFIG_CB4X4
+ av1_build_inter_predictors_sb(xd, mi_row, mi_col, NULL, bsize);
+#else
+ av1_build_inter_predictors_sb(xd, mi_row, mi_col, NULL,
+ AOMMAX(bsize, BLOCK_8X8));
+#endif
#if CONFIG_WARPED_MOTION
}
#endif // CONFIG_WARPED_MOTION
@@ -1614,8 +1628,12 @@
for (plane = 0; plane < MAX_MB_PLANE; ++plane) {
const struct macroblockd_plane *const pd = &xd->plane[plane];
+#if CONFIG_CB4X4
+ const BLOCK_SIZE plane_bsize = get_plane_block_size(bsize, pd);
+#else
const BLOCK_SIZE plane_bsize =
get_plane_block_size(AOMMAX(BLOCK_8X8, bsize), pd);
+#endif
const int max_blocks_wide = max_block_wide(xd, plane_bsize, plane);
const int max_blocks_high = max_block_high(xd, plane_bsize, plane);
int row, col;
@@ -1724,6 +1742,11 @@
const int n8x8_l2 = n4x4_l2 - 1;
const int num_8x8_wh = mi_size_wide[bsize];
const int hbs = num_8x8_wh >> 1;
+#if CONFIG_CB4X4
+ const int unify_bsize = 1;
+#else
+ const int unify_bsize = 0;
+#endif
PARTITION_TYPE partition;
BLOCK_SIZE subsize;
#if CONFIG_EXT_PARTITION_TYPES
@@ -1762,7 +1785,7 @@
#endif
}
#endif // CONFIG_SUPERTX
- if (!hbs) {
+ if (!hbs && !unify_bsize) {
// calculate bmode block dimensions (log 2)
xd->bmode_blocks_wl = 1 >> !!(partition & PARTITION_VERT);
xd->bmode_blocks_hl = 1 >> !!(partition & PARTITION_HORZ);