Rework sub8x8 chroma reference check to support non-420 format Make is_chroma_reference() account for all the YUV420, 444, and 422 formats. Change-Id: Ia87e51894493dcea86843194a34e5de05799248a
diff --git a/av1/common/blockd.c b/av1/common/blockd.c index 8bc1291..4eb6f01 100644 --- a/av1/common/blockd.c +++ b/av1/common/blockd.c
@@ -165,7 +165,9 @@ for (plane = 0; plane < MAX_MB_PLANE; ++plane) { #if CONFIG_CB4X4 - if (bsize < BLOCK_8X8 && plane && !is_chroma_reference(mi_row, mi_col)) + if (!is_chroma_reference(mi_row, mi_col, bsize, + xd->plane[plane].subsampling_x, + xd->plane[plane].subsampling_y)) continue; #else (void)mi_row;
diff --git a/av1/common/onyxc_int.h b/av1/common/onyxc_int.h index 67a587b..f5558b2 100644 --- a/av1/common/onyxc_int.h +++ b/av1/common/onyxc_int.h
@@ -722,11 +722,19 @@ } #if CONFIG_CB4X4 -static INLINE int is_chroma_reference(const int mi_row, const int mi_col) { +static INLINE int is_chroma_reference(const int mi_row, const int mi_col, + const BLOCK_SIZE bsize, + const int subsampling_x, + const int subsampling_y) { #if CONFIG_CHROMA_2X2 return 1; #endif - return !((mi_row & 0x01) || (mi_col & 0x01)); + int ref_pos = !(((mi_row & 0x01) && subsampling_y) || + ((mi_col & 0x01) && subsampling_x)); + + if (bsize >= BLOCK_8X8) ref_pos = 1; + + return ref_pos; } #endif
diff --git a/av1/common/reconinter.c b/av1/common/reconinter.c index 7e16e29..232e137 100644 --- a/av1/common/reconinter.c +++ b/av1/common/reconinter.c
@@ -1198,7 +1198,8 @@ const int bh = pd->height; #if CONFIG_CB4X4 - if (bsize < BLOCK_8X8 && plane && !is_chroma_reference(mi_row, mi_col)) + if (!is_chroma_reference(mi_row, mi_col, bsize, pd->subsampling_x, + pd->subsampling_y)) continue; #endif
diff --git a/av1/common/reconintra.c b/av1/common/reconintra.c index 9f59fc1..d3f5454 100644 --- a/av1/common/reconintra.c +++ b/av1/common/reconintra.c
@@ -2182,7 +2182,14 @@ #if CONFIG_CB4X4 && !CONFIG_CHROMA_2X2 // force 4x4 chroma component block size. - if (plane && bsize < BLOCK_8X8) bsize = BLOCK_8X8; + if (plane && bsize < BLOCK_8X8) { + if (pd->subsampling_x == 1 && pd->subsampling_y == 1) + bsize = BLOCK_8X8; + else if (pd->subsampling_x == 1) + bsize = BLOCK_8X4; + else if (pd->subsampling_y == 1) + bsize = BLOCK_4X8; + } #endif const int have_right =
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c index c726483..a209d6d 100644 --- a/av1/decoder/decodeframe.c +++ b/av1/decoder/decodeframe.c
@@ -1684,7 +1684,8 @@ 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)) + if (!is_chroma_reference(mi_row, mi_col, bsize, pd->subsampling_x, + pd->subsampling_y)) continue; #endif @@ -1779,7 +1780,8 @@ int row, col; #if CONFIG_CB4X4 - if (bsize < BLOCK_8X8 && plane && !is_chroma_reference(mi_row, mi_col)) + if (!is_chroma_reference(mi_row, mi_col, bsize, pd->subsampling_x, + pd->subsampling_y)) continue; #endif
diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c index 001694d..3011ecc 100644 --- a/av1/decoder/decodemv.c +++ b/av1/decoder/decodemv.c
@@ -968,7 +968,8 @@ #endif #if CONFIG_CB4X4 - if (bsize >= BLOCK_8X8 || is_chroma_reference(mi_row, mi_col)) + if (is_chroma_reference(mi_row, mi_col, bsize, xd->plane[1].subsampling_x, + xd->plane[1].subsampling_y)) mbmi->uv_mode = read_intra_mode_uv(cm, xd, r, mbmi->mode); #else mbmi->uv_mode = read_intra_mode_uv(cm, xd, r, mbmi->mode); @@ -1299,7 +1300,8 @@ #endif #if CONFIG_CB4X4 - if (bsize >= BLOCK_8X8 || is_chroma_reference(mi_row, mi_col)) + if (is_chroma_reference(mi_row, mi_col, bsize, xd->plane[1].subsampling_x, + xd->plane[1].subsampling_y)) mbmi->uv_mode = read_intra_mode_uv(cm, xd, r, mbmi->mode); #else mbmi->uv_mode = read_intra_mode_uv(cm, xd, r, mbmi->mode);
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c index 68d68a7..fe1a9e9 100644 --- a/av1/encoder/bitstream.c +++ b/av1/encoder/bitstream.c
@@ -1692,7 +1692,8 @@ } } #if CONFIG_CB4X4 - if (bsize >= BLOCK_8X8 || is_chroma_reference(mi_row, mi_col)) + if (is_chroma_reference(mi_row, mi_col, bsize, xd->plane[1].subsampling_x, + xd->plane[1].subsampling_y)) write_intra_uv_mode(ec_ctx, mbmi->uv_mode, mode, w); #else // !CONFIG_CB4X4 write_intra_uv_mode(ec_ctx, mbmi->uv_mode, mode, w); @@ -2042,7 +2043,8 @@ } #if CONFIG_CB4X4 - if (bsize >= BLOCK_8X8 || is_chroma_reference(mi_row, mi_col)) + if (is_chroma_reference(mi_row, mi_col, bsize, xd->plane[1].subsampling_x, + xd->plane[1].subsampling_y)) write_intra_uv_mode(ec_ctx, mbmi->uv_mode, mbmi->mode, w); #else // !CONFIG_CB4X4 write_intra_uv_mode(ec_ctx, mbmi->uv_mode, mbmi->mode, w); @@ -2322,8 +2324,9 @@ for (plane = 0; plane < MAX_MB_PLANE; ++plane) { #if CONFIG_CB4X4 - if (mbmi->sb_type < BLOCK_8X8 && plane && - !is_chroma_reference(mi_row, mi_col)) { + if (!is_chroma_reference(mi_row, mi_col, mbmi->sb_type, + xd->plane[plane].subsampling_x, + xd->plane[plane].subsampling_y)) { (*tok)++; continue; }
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c index fa65bb9..1158dc9 100644 --- a/av1/encoder/encodeframe.c +++ b/av1/encoder/encodeframe.c
@@ -1882,7 +1882,8 @@ #if CONFIG_CB4X4 x->skip_chroma_rd = - (bsize < BLOCK_8X8) && !is_chroma_reference(mi_row, mi_col); + !is_chroma_reference(mi_row, mi_col, bsize, xd->plane[1].subsampling_x, + xd->plane[1].subsampling_y); #endif #if CONFIG_AOM_HIGHBITDEPTH @@ -5550,10 +5551,10 @@ } } -static void sum_intra_stats(FRAME_COUNTS *counts, const MODE_INFO *mi, - const MODE_INFO *above_mi, const MODE_INFO *left_mi, - const int intraonly, const int mi_row, - const int mi_col) { +static void sum_intra_stats(FRAME_COUNTS *counts, MACROBLOCKD *xd, + const MODE_INFO *mi, const MODE_INFO *above_mi, + const MODE_INFO *left_mi, const int intraonly, + const int mi_row, const int mi_col) { const PREDICTION_MODE y_mode = mi->mbmi.mode; const PREDICTION_MODE uv_mode = mi->mbmi.uv_mode; const BLOCK_SIZE bsize = mi->mbmi.sb_type; @@ -5586,10 +5587,13 @@ } #if CONFIG_CB4X4 - if (bsize < BLOCK_8X8 && !is_chroma_reference(mi_row, mi_col)) return; + if (!is_chroma_reference(mi_row, mi_col, bsize, xd->plane[1].subsampling_x, + xd->plane[1].subsampling_y)) + return; #else (void)mi_row; (void)mi_col; + (void)xd; #endif ++counts->uv_mode[y_mode][uv_mode]; } @@ -5755,7 +5759,7 @@ av1_encode_intra_block_plane((AV1_COMMON *)cm, x, block_size, plane, 1, mi_row, mi_col); if (!dry_run) - sum_intra_stats(td->counts, mi, xd->above_mi, xd->left_mi, + sum_intra_stats(td->counts, xd, mi, xd->above_mi, xd->left_mi, frame_is_intra_only(cm), mi_row, mi_col); // TODO(huisu): move this into sum_intra_stats().
diff --git a/av1/encoder/encodemb.c b/av1/encoder/encodemb.c index aa743db..02b7ab0 100644 --- a/av1/encoder/encodemb.c +++ b/av1/encoder/encodemb.c
@@ -943,7 +943,9 @@ for (plane = 0; plane < MAX_MB_PLANE; ++plane) { #if CONFIG_CB4X4 && !CONFIG_CHROMA_2X2 - if (bsize < BLOCK_8X8 && plane && !is_chroma_reference(mi_row, mi_col)) + if (!is_chroma_reference(mi_row, mi_col, bsize, + xd->plane[plane].subsampling_x, + xd->plane[plane].subsampling_y)) continue; if (plane) bsize = AOMMAX(bsize, BLOCK_8X8); #else @@ -1121,7 +1123,9 @@ }; #if CONFIG_CB4X4 - if (bsize < BLOCK_8X8 && plane && !is_chroma_reference(mi_row, mi_col)) + if (!is_chroma_reference(mi_row, mi_col, bsize, + xd->plane[plane].subsampling_x, + xd->plane[plane].subsampling_y)) return; #else (void)mi_row;
diff --git a/av1/encoder/tokenize.c b/av1/encoder/tokenize.c index f14410e..2a354ab 100644 --- a/av1/encoder/tokenize.c +++ b/av1/encoder/tokenize.c
@@ -711,7 +711,9 @@ for (plane = 0; plane < MAX_MB_PLANE; ++plane) { #if CONFIG_CB4X4 - if (bsize < BLOCK_8X8 && plane && !is_chroma_reference(mi_row, mi_col)) { + if (!is_chroma_reference(mi_row, mi_col, bsize, + xd->plane[plane].subsampling_x, + xd->plane[plane].subsampling_y)) { #if !CONFIG_PVQ if (!dry_run) { (*t)->token = EOSB_TOKEN; @@ -781,7 +783,9 @@ 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)) { + if (!is_chroma_reference(mi_row, mi_col, bsize, + xd->plane[plane].subsampling_x, + xd->plane[plane].subsampling_y)) { #if !CONFIG_PVQ (*t)->token = EOSB_TOKEN; (*t)++; @@ -806,7 +810,9 @@ int plane; for (plane = 0; plane < MAX_MB_PLANE; ++plane) { #if CONFIG_CB4X4 - if (bsize < BLOCK_8X8 && plane && !is_chroma_reference(mi_row, mi_col)) + if (!is_chroma_reference(mi_row, mi_col, bsize, + xd->plane[plane].subsampling_x, + xd->plane[plane].subsampling_y)) continue; #else (void)mi_row; @@ -819,7 +825,9 @@ int plane; for (plane = 0; plane < MAX_MB_PLANE; ++plane) { #if CONFIG_CB4X4 - if (bsize < BLOCK_8X8 && plane && !is_chroma_reference(mi_row, mi_col)) + if (!is_chroma_reference(mi_row, mi_col, bsize, + xd->plane[plane].subsampling_x, + xd->plane[plane].subsampling_y)) continue; #else (void)mi_row;