Access bottom-right 4x4 block in sub8x8 neighbor for obmc When the neighbor block is coded in sub8x8 block size, use the bottom-right 4x4 luma block coding mode to produce obmc reference. Change-Id: Icecccf5ddf95e8b9e65b36fdb6fa176691591a8e
diff --git a/av1/common/reconinter.c b/av1/common/reconinter.c index b8bc57f..c47883f 100644 --- a/av1/common/reconinter.c +++ b/av1/common/reconinter.c
@@ -1761,10 +1761,13 @@ void av1_count_overlappable_neighbors(const AV1_COMMON *cm, MACROBLOCKD *xd, int mi_row, int mi_col) { int i, mi_step; + MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi; xd->mi[0]->mbmi.overlappable_neighbors[0] = 0; xd->mi[0]->mbmi.overlappable_neighbors[1] = 0; + if (!is_motion_variation_allowed_bsize(mbmi->sb_type)) return; + if (xd->up_available) { const int ilimit = AOMMIN(xd->n8_w, cm->mi_cols - mi_col); for (i = 0; i < ilimit; i += mi_step) { @@ -1773,8 +1776,15 @@ MODE_INFO *above_mi = xd->mi[mi_col_offset + mi_row_offset * xd->mi_stride]; MB_MODE_INFO *above_mbmi = &above_mi->mbmi; - - mi_step = AOMMIN(xd->n8_w, mi_size_wide[above_mbmi->sb_type]); +#if CONFIG_CHROMA_SUB8X8 + if (above_mbmi->sb_type < BLOCK_8X8) { + ++mi_col_offset; + above_mbmi = + &xd->mi[mi_col_offset + mi_row_offset * xd->mi_stride]->mbmi; + } +#endif + BLOCK_SIZE above_bsize = AOMMAX(above_mbmi->sb_type, BLOCK_8X8); + mi_step = AOMMIN(xd->n8_w, mi_size_wide[above_bsize]); if (is_neighbor_overlappable(above_mbmi)) xd->mi[0]->mbmi.overlappable_neighbors[0]++; @@ -1790,7 +1800,15 @@ xd->mi[mi_col_offset + mi_row_offset * xd->mi_stride]; MB_MODE_INFO *left_mbmi = &left_mi->mbmi; - mi_step = AOMMIN(xd->n8_h, mi_size_high[left_mbmi->sb_type]); +#if CONFIG_CHROMA_SUB8X8 + if (left_mbmi->sb_type < BLOCK_8X8) { + ++mi_row_offset; + left_mbmi = + &xd->mi[mi_col_offset + mi_row_offset * xd->mi_stride]->mbmi; + } +#endif + BLOCK_SIZE left_bsize = AOMMAX(left_mbmi->sb_type, BLOCK_8X8); + mi_step = AOMMIN(xd->n8_h, mi_size_high[left_bsize]); if (is_neighbor_overlappable(left_mbmi)) xd->mi[0]->mbmi.overlappable_neighbors[1]++; @@ -1855,9 +1873,17 @@ i = 0; do { // for each mi in the above row - const int mi_col_offset = i; - const MB_MODE_INFO *const above_mbmi = + int mi_col_offset = i; + MB_MODE_INFO *above_mbmi = &xd->mi[mi_col_offset + mi_row_offset * xd->mi_stride]->mbmi; +#if CONFIG_CHROMA_SUB8X8 + if (above_mbmi->sb_type < BLOCK_8X8) { + ++mi_col_offset; + above_mbmi = + &xd->mi[mi_col_offset + mi_row_offset * xd->mi_stride]->mbmi; + } +#endif + const BLOCK_SIZE a_bsize = AOMMAX(BLOCK_8X8, above_mbmi->sb_type); const int mi_step = AOMMIN(xd->n8_w, mi_size_wide[a_bsize]); @@ -1904,9 +1930,17 @@ i = 0; do { // for each mi in the left column - const int mi_row_offset = i; - const MB_MODE_INFO *const left_mbmi = + int mi_row_offset = i; + MB_MODE_INFO *left_mbmi = &xd->mi[mi_col_offset + mi_row_offset * xd->mi_stride]->mbmi; +#if CONFIG_CHROMA_SUB8X8 + if (left_mbmi->sb_type < BLOCK_8X8) { + ++mi_row_offset; + left_mbmi = + &xd->mi[mi_col_offset + mi_row_offset * xd->mi_stride]->mbmi; + } +#endif + const BLOCK_SIZE l_bsize = AOMMAX(BLOCK_8X8, left_mbmi->sb_type); const int mi_step = AOMMIN(xd->n8_h, mi_size_high[l_bsize]); @@ -1980,6 +2014,14 @@ int mi_x, mi_y, bw, bh; MODE_INFO *above_mi = xd->mi[mi_col_offset + mi_row_offset * xd->mi_stride]; MB_MODE_INFO *above_mbmi = &above_mi->mbmi; + +#if CONFIG_CHROMA_SUB8X8 + if (above_mbmi->sb_type < BLOCK_8X8) { + ++mi_col_offset; + above_mbmi = &xd->mi[mi_col_offset + mi_row_offset * xd->mi_stride]->mbmi; + } +#endif + const BLOCK_SIZE a_bsize = AOMMAX(BLOCK_8X8, above_mbmi->sb_type); MB_MODE_INFO backup_mbmi; @@ -2061,6 +2103,14 @@ int mi_x, mi_y, bw, bh; MODE_INFO *left_mi = xd->mi[mi_col_offset + mi_row_offset * xd->mi_stride]; MB_MODE_INFO *left_mbmi = &left_mi->mbmi; + +#if CONFIG_CHROMA_SUB8X8 + if (left_mbmi->sb_type < BLOCK_8X8) { + ++mi_row_offset; + left_mbmi = &xd->mi[mi_col_offset + mi_row_offset * xd->mi_stride]->mbmi; + } +#endif + const BLOCK_SIZE l_bsize = AOMMAX(left_mbmi->sb_type, BLOCK_8X8); MB_MODE_INFO backup_mbmi;
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c index 97100b9..17c52a8 100644 --- a/av1/encoder/rdopt.c +++ b/av1/encoder/rdopt.c
@@ -10078,6 +10078,7 @@ #if CONFIG_MOTION_VAR av1_count_overlappable_neighbors(cm, xd, mi_row, mi_col); + if (check_num_overlappable_neighbors(mbmi) && is_motion_variation_allowed_bsize(bsize)) { av1_build_prediction_by_above_preds(cm, xd, mi_row, mi_col, @@ -12612,8 +12613,13 @@ i = 0; do { // for each mi in the above row const int mi_col_offset = i; - const MB_MODE_INFO *const above_mbmi = + const MB_MODE_INFO *above_mbmi = &xd->mi[mi_col_offset + mi_row_offset * xd->mi_stride]->mbmi; +#if CONFIG_CHROMA_SUB8X8 + if (above_mbmi->sb_type < BLOCK_8X8) + above_mbmi = + &xd->mi[mi_col_offset + 1 + mi_row_offset * xd->mi_stride]->mbmi; +#endif const BLOCK_SIZE a_bsize = AOMMAX(above_mbmi->sb_type, BLOCK_8X8); const int mi_step = AOMMIN(xd->n8_w, mi_size_wide[a_bsize]); const int neighbor_bw = mi_step * MI_SIZE; @@ -12686,8 +12692,14 @@ i = 0; do { // for each mi in the left column const int mi_row_offset = i; - const MB_MODE_INFO *const left_mbmi = + MB_MODE_INFO *left_mbmi = &xd->mi[mi_col_offset + mi_row_offset * xd->mi_stride]->mbmi; + +#if CONFIG_CHROMA_SUB8X8 + if (left_mbmi->sb_type < BLOCK_8X8) + left_mbmi = + &xd->mi[mi_col_offset + (mi_row_offset + 1) * xd->mi_stride]->mbmi; +#endif const BLOCK_SIZE l_bsize = AOMMAX(left_mbmi->sb_type, BLOCK_8X8); const int mi_step = AOMMIN(xd->n8_h, mi_size_high[l_bsize]); const int neighbor_bh = mi_step * MI_SIZE;