Sync sub8x8 chroma component decoding process Process sub8x8 chroma component decoding in the unit of 4x4 block. Change-Id: I02e149f6076cdb5942b8a0a0b9ac2d833b1a7e49
diff --git a/av1/common/onyxc_int.h b/av1/common/onyxc_int.h index f29a232..fd70332 100644 --- a/av1/common/onyxc_int.h +++ b/av1/common/onyxc_int.h
@@ -584,6 +584,9 @@ xd->plane[i].width = (bw * MI_SIZE) >> xd->plane[i].subsampling_x; xd->plane[i].height = (bh * MI_SIZE) >> xd->plane[i].subsampling_y; + + xd->plane[i].width = AOMMAX(xd->plane[i].width, 4); + xd->plane[i].height = AOMMAX(xd->plane[i].height, 4); } }
diff --git a/av1/common/reconinter.c b/av1/common/reconinter.c index f7143cb..cae92a6 100644 --- a/av1/common/reconinter.c +++ b/av1/common/reconinter.c
@@ -1085,6 +1085,11 @@ const int bw = pd->width; const int bh = pd->height; +#if CONFIG_CB4X4 + if (bsize < BLOCK_8X8 && plane && !is_chroma_reference(mi_row, mi_col)) + continue; +#endif + if (xd->mi[0]->mbmi.sb_type < BLOCK_8X8 && !unify_bsize) { const PARTITION_TYPE bp = bsize - xd->mi[0]->mbmi.sb_type; const int have_vsplit = bp != PARTITION_HORZ;
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c index d791ac8..b9cb37a 100644 --- a/av1/decoder/decodeframe.c +++ b/av1/decoder/decodeframe.c
@@ -1659,7 +1659,8 @@ 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); + const BLOCK_SIZE plane_bsize = + AOMMAX(BLOCK_4X4, get_plane_block_size(bsize, pd)); #else const BLOCK_SIZE plane_bsize = get_plane_block_size(AOMMAX(BLOCK_8X8, bsize), pd); @@ -1668,6 +1669,11 @@ const int max_blocks_wide = max_block_wide(xd, plane_bsize, plane); const int max_blocks_high = max_block_high(xd, plane_bsize, plane); +#if CONFIG_CB4X4 + if (bsize < BLOCK_8X8 && plane && !is_chroma_reference(mi_row, mi_col)) + continue; +#endif + for (row = 0; row < max_blocks_high; row += stepr) for (col = 0; col < max_blocks_wide; col += stepc) predict_and_reconstruct_intra_block(cm, xd, r, mbmi, plane, row, col, @@ -1738,7 +1744,8 @@ 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); + const BLOCK_SIZE plane_bsize = + AOMMAX(BLOCK_4X4, get_plane_block_size(bsize, pd)); #else const BLOCK_SIZE plane_bsize = get_plane_block_size(AOMMAX(BLOCK_8X8, bsize), pd); @@ -1746,6 +1753,12 @@ 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; + +#if CONFIG_CB4X4 + if (bsize < BLOCK_8X8 && plane && !is_chroma_reference(mi_row, mi_col)) + continue; +#endif + #if CONFIG_VAR_TX const TX_SIZE max_tx_size = max_txsize_rect_lookup[plane_bsize]; const int bh_var_tx = tx_size_high_unit[max_tx_size];
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c index 4106860..7830ba9 100644 --- a/av1/encoder/bitstream.c +++ b/av1/encoder/bitstream.c
@@ -2151,6 +2151,15 @@ assert(*tok < tok_end); for (plane = 0; plane < MAX_MB_PLANE; ++plane) { MB_MODE_INFO *mbmi = &m->mbmi; + +#if CONFIG_CB4X4 + if (mbmi->sb_type < BLOCK_8X8 && plane && + !is_chroma_reference(mi_row, mi_col)) { + (*tok)++; + continue; + } +#endif + #if CONFIG_VAR_TX const struct macroblockd_plane *const pd = &xd->plane[plane]; BLOCK_SIZE bsize = mbmi->sb_type;
diff --git a/av1/encoder/tokenize.c b/av1/encoder/tokenize.c index d05dff5..bf0dff9 100644 --- a/av1/encoder/tokenize.c +++ b/av1/encoder/tokenize.c
@@ -816,6 +816,16 @@ td->counts->skip[ctx][0] += skip_inc; for (plane = 0; plane < MAX_MB_PLANE; ++plane) { +#if CONFIG_CB4X4 + if (bsize < BLOCK_8X8 && plane && !is_chroma_reference(mi_row, mi_col)) { + (*t)->token = EOSB_TOKEN; + (*t)++; + continue; + } +#else + (void)mi_row; + (void)mi_col; +#endif av1_foreach_transformed_block_in_plane(xd, bsize, plane, tokenize_b, &arg); (*t)->token = EOSB_TOKEN;