Deal correctly with 16x4/4x16 blocks in mvref_common.c The logic that searches for motion vectors in scan_row_mbmi and scan_col_mbmi steps in 4x4 units when the block size is less than 8x8. That test (bsize < BLOCK_8X8) doesn't work when you have 16X4 or 4X16 blocks, because they appear higher up in the enum. Change-Id: Idb1a97f8a43b675fd78dbc76ae501fcdff7adbcd
diff --git a/av1/common/mvref_common.c b/av1/common/mvref_common.c index 7666000..9c72612 100644 --- a/av1/common/mvref_common.c +++ b/av1/common/mvref_common.c
@@ -162,9 +162,11 @@ int col_offset = 0; #if CONFIG_CB4X4 const int bsize = xd->mi[0]->mbmi.sb_type; - const int mi_offset = bsize < BLOCK_8X8 || abs(row_offset) > 1 - ? mi_size_wide[BLOCK_4X4] - : mi_size_wide[BLOCK_8X8]; + const int mi_width = mi_size_wide[bsize]; + const int mi_col_offset = + ((abs(row_offset) > 1) || (mi_width < mi_size_wide[BLOCK_8X8])) + ? mi_size_wide[BLOCK_4X4] + : mi_size_wide[BLOCK_8X8]; // TODO(jingning): Revisit this part after cb4x4 is stable. if (abs(row_offset) > 1) { row_offset *= 2; @@ -172,13 +174,12 @@ col_offset = 1; - if (bsize < BLOCK_8X8) { - if (mi_row & 0x01) row_offset += 1; - if (mi_col & 0x01) col_offset -= 1; - } + if (mi_row & 0x01 && mi_size_high[bsize] < mi_size_high[BLOCK_8X8]) + ++row_offset; + if (mi_col & 0x01 && mi_width < mi_size_wide[BLOCK_8X8]) --col_offset; } #else - const int mi_offset = mi_size_wide[BLOCK_8X8]; + const int mi_col_offset = mi_size_wide[BLOCK_8X8]; #endif for (i = 0; i < xd->n8_w && *refmv_count < MAX_REF_MV_STACK_SIZE;) { @@ -204,9 +205,9 @@ i += len; } else { if (use_step_16) - i += (mi_offset << 1); + i += (mi_col_offset << 1); else - i += mi_offset; + i += mi_col_offset; } } @@ -223,22 +224,23 @@ int row_offset = 0; #if CONFIG_CB4X4 const BLOCK_SIZE bsize = xd->mi[0]->mbmi.sb_type; - const int mi_offset = (bsize < BLOCK_8X8) || (abs(col_offset) > 1) - ? mi_size_high[BLOCK_4X4] - : mi_size_high[BLOCK_8X8]; + const int mi_height = mi_size_high[bsize]; + const int mi_row_offset = + ((abs(col_offset) > 1) || (mi_height < mi_size_high[BLOCK_8X8])) + ? mi_size_high[BLOCK_4X4] + : mi_size_high[BLOCK_8X8]; if (abs(col_offset) > 1) { col_offset *= 2; col_offset += 1; row_offset = 1; - if (bsize < BLOCK_8X8) { - if (mi_row & 0x01) row_offset -= 1; - if (mi_col & 0x01) col_offset += 1; - } + if (mi_row & 0x01 && mi_height < mi_size_high[BLOCK_8X8]) --row_offset; + if (mi_col & 0x01 && mi_size_wide[bsize] < mi_size_wide[BLOCK_8X8]) + ++col_offset; } #else - const int mi_offset = mi_size_wide[BLOCK_8X8]; + const int mi_row_offset = mi_size_wide[BLOCK_8X8]; #endif for (i = 0; i < xd->n8_h && *refmv_count < MAX_REF_MV_STACK_SIZE;) { @@ -264,9 +266,9 @@ i += len; } else { if (use_step_16) - i += (mi_offset << 1); + i += (mi_row_offset << 1); else - i += mi_offset; + i += mi_row_offset; } }