Not use sub8x8 mv of neighbors in obmc
Take all sub8x8 neighbors as 8x8 blocks and use mv assigned to
the last block.
Change of performance in AWCY
HL improved by 0.01%
LL improved by 0.06%
Change-Id: I55d3c5401222396d871f9157b62b3de29e5390b0
diff --git a/av1/common/reconinter.c b/av1/common/reconinter.c
index e0b6faa..290d239 100644
--- a/av1/common/reconinter.c
+++ b/av1/common/reconinter.c
@@ -1035,13 +1035,13 @@
const MV mv = mi->mbmi.mv[ref].as_mv;
#else
const MV mv =
- mi->mbmi.sb_type < BLOCK_8X8
#if CONFIG_MOTION_VAR
- ? (build_for_obmc ? mi->bmi[block].as_mv[ref].as_mv
- : average_split_mvs(pd, mi, ref, block))
+ (mi->mbmi.sb_type < BLOCK_8X8 && !build_for_obmc)
+ ?
#else
- ? average_split_mvs(pd, mi, ref, block)
-#endif // CONFIG_MOTION_VAR
+ mi->mbmi.sb_type < BLOCK_8X8 ?
+#endif
+ average_split_mvs(pd, mi, ref, block)
: mi->mbmi.mv[ref].as_mv;
#endif
@@ -1661,13 +1661,8 @@
mi_step = AOMMIN(xd->n8_w, mi_size_wide[above_mbmi->sb_type]);
- if (is_neighbor_overlappable(above_mbmi)) {
- const BLOCK_SIZE a_bsize = above_mbmi->sb_type;
-
+ if (is_neighbor_overlappable(above_mbmi))
xd->mi[0]->mbmi.overlappable_neighbors[0]++;
- if (!CONFIG_CB4X4 && (a_bsize == BLOCK_4X4 || a_bsize == BLOCK_4X8))
- xd->mi[0]->mbmi.overlappable_neighbors[0]++;
- }
}
}
@@ -1682,13 +1677,8 @@
mi_step = AOMMIN(xd->n8_h, mi_size_high[left_mbmi->sb_type]);
- if (is_neighbor_overlappable(left_mbmi)) {
- const BLOCK_SIZE l_bsize = left_mbmi->sb_type;
-
+ if (is_neighbor_overlappable(left_mbmi))
xd->mi[0]->mbmi.overlappable_neighbors[1]++;
- if (!CONFIG_CB4X4 && (l_bsize == BLOCK_4X4 || l_bsize == BLOCK_8X4))
- xd->mi[0]->mbmi.overlappable_neighbors[1]++;
- }
}
}
}
@@ -1728,10 +1718,7 @@
const int mi_step = AOMMIN(xd->n8_w, mi_size_wide[a_bsize]);
if (is_neighbor_overlappable(above_mbmi)) {
- if (!CONFIG_CB4X4 && (a_bsize == BLOCK_4X4 || a_bsize == BLOCK_4X8))
- neighbor_count += 2;
- else
- neighbor_count++;
+ neighbor_count++;
if (neighbor_count > neighbor_limit) break;
for (plane = 0; plane < MAX_MB_PLANE; ++plane) {
const struct macroblockd_plane *pd = &xd->plane[plane];
@@ -1777,10 +1764,7 @@
const int mi_step = AOMMIN(xd->n8_h, mi_size_high[l_bsize]);
if (is_neighbor_overlappable(left_mbmi)) {
- if (!CONFIG_CB4X4 && (l_bsize == BLOCK_4X4 || l_bsize == BLOCK_8X4))
- neighbor_count += 2;
- else
- neighbor_count++;
+ neighbor_count++;
if (neighbor_count > neighbor_limit) break;
for (plane = 0; plane < MAX_MB_PLANE; ++plane) {
const struct macroblockd_plane *pd = &xd->plane[plane];
@@ -1854,10 +1838,7 @@
if (!is_neighbor_overlappable(above_mbmi)) continue;
- if (!CONFIG_CB4X4 && (a_bsize == BLOCK_4X4 || a_bsize == BLOCK_4X8))
- neighbor_count += 2;
- else
- neighbor_count++;
+ neighbor_count++;
if (neighbor_count > neighbor_limit) break;
#if CONFIG_EXT_INTER
@@ -1895,60 +1876,36 @@
bh = AOMMAX((num_4x4_blocks_high_lookup[bsize] * 2) >> pd->subsampling_y,
4);
- if (a_bsize < BLOCK_8X8 && !CONFIG_CB4X4) {
- const PARTITION_TYPE bp = BLOCK_8X8 - a_bsize;
- const int have_vsplit = bp != PARTITION_HORZ;
- const int have_hsplit = bp != PARTITION_VERT;
- const int num_4x4_w = 2 >> !have_vsplit;
- const int num_4x4_h = 2 >> !have_hsplit;
- const int pw = 8 >> (have_vsplit + pd->subsampling_x);
- int x, y;
-
- for (y = 0; y < num_4x4_h; ++y)
- for (x = 0; x < num_4x4_w; ++x) {
- if ((bp == PARTITION_HORZ || bp == PARTITION_SPLIT) && y == 0)
- continue;
-
- build_inter_predictors(xd, j, mi_col_offset, mi_row_offset,
- y * 2 + x, bw, bh,
- (4 * x) >> pd->subsampling_x, 0, pw, bh,
-#if CONFIG_SUPERTX && CONFIG_EXT_INTER
- 0, 0,
-#endif // CONFIG_SUPERTX && CONFIG_EXT_INTER
- mi_x, mi_y);
- }
- } else {
#if CONFIG_WARPED_MOTION
- if (above_mbmi->motion_mode == WARPED_CAUSAL) {
- assert_motion_mode_valid(WARPED_CAUSAL,
+ if (above_mbmi->motion_mode == WARPED_CAUSAL) {
+ assert_motion_mode_valid(WARPED_CAUSAL,
#if CONFIG_GLOBAL_MOTION && SEPARATE_GLOBAL_MOTION
- 0, cm->global_motion,
+ 0, cm->global_motion,
#endif // CONFIG_GLOBAL_MOTION && SEPARATE_GLOBAL_MOTION
- above_mi);
+ above_mi);
- av1_warp_plane(&above_mbmi->wm_params[0],
+ av1_warp_plane(&above_mbmi->wm_params[0],
#if CONFIG_AOM_HIGHBITDEPTH
- xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH, xd->bd,
+ xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH, xd->bd,
#endif // CONFIG_AOM_HIGHBITDEPTH
- pd->pre[0].buf0, pd->pre[0].width, pd->pre[0].height,
- pd->pre[0].stride, pd->dst.buf,
- (((mi_col + i) * MI_SIZE) >> pd->subsampling_x),
- ((mi_row * MI_SIZE) >> pd->subsampling_y), bw, bh,
- pd->dst.stride, pd->subsampling_x, pd->subsampling_y,
- 16, 16, 0);
+ pd->pre[0].buf0, pd->pre[0].width, pd->pre[0].height,
+ pd->pre[0].stride, pd->dst.buf,
+ (((mi_col + i) * MI_SIZE) >> pd->subsampling_x),
+ ((mi_row * MI_SIZE) >> pd->subsampling_y), bw, bh,
+ pd->dst.stride, pd->subsampling_x, pd->subsampling_y, 16,
+ 16, 0);
- } else {
+ } else {
#endif // CONFIG_WARPED_MOTION
- build_inter_predictors(xd, j, mi_col_offset, mi_row_offset, 0, bw, bh,
- 0, 0, bw, bh,
+ build_inter_predictors(xd, j, mi_col_offset, mi_row_offset, 0, bw, bh,
+ 0, 0, bw, bh,
#if CONFIG_SUPERTX && CONFIG_EXT_INTER
- 0, 0,
+ 0, 0,
#endif // CONFIG_SUPERTX && CONFIG_EXT_INTER
- mi_x, mi_y);
+ mi_x, mi_y);
#if CONFIG_WARPED_MOTION
- }
-#endif // CONFIG_WARPED_MOTION
}
+#endif // CONFIG_WARPED_MOTION
}
#if CONFIG_EXT_INTER
*above_mbmi = backup_mbmi;
@@ -1991,10 +1948,7 @@
if (!is_neighbor_overlappable(left_mbmi)) continue;
- if (!CONFIG_CB4X4 && (l_bsize == BLOCK_4X4 || l_bsize == BLOCK_8X4))
- neighbor_count += 2;
- else
- neighbor_count++;
+ neighbor_count++;
if (neighbor_count > neighbor_limit) break;
#if CONFIG_EXT_INTER
@@ -2032,60 +1986,36 @@
4);
bh = (mi_step << MI_SIZE_LOG2) >> pd->subsampling_y;
- if (l_bsize < BLOCK_8X8 && !CONFIG_CB4X4) {
- const PARTITION_TYPE bp = BLOCK_8X8 - l_bsize;
- const int have_vsplit = bp != PARTITION_HORZ;
- const int have_hsplit = bp != PARTITION_VERT;
- const int num_4x4_w = 2 >> !have_vsplit;
- const int num_4x4_h = 2 >> !have_hsplit;
- const int ph = 8 >> (have_hsplit + pd->subsampling_y);
- int x, y;
-
- for (y = 0; y < num_4x4_h; ++y)
- for (x = 0; x < num_4x4_w; ++x) {
- if ((bp == PARTITION_VERT || bp == PARTITION_SPLIT) && x == 0)
- continue;
-
- build_inter_predictors(xd, j, mi_col_offset, mi_row_offset,
- y * 2 + x, bw, bh, 0,
- (4 * y) >> pd->subsampling_y, bw, ph,
-#if CONFIG_SUPERTX && CONFIG_EXT_INTER
- 0, 0,
-#endif // CONFIG_SUPERTX && CONFIG_EXT_INTER
- mi_x, mi_y);
- }
- } else {
#if CONFIG_WARPED_MOTION
- if (left_mbmi->motion_mode == WARPED_CAUSAL) {
- assert_motion_mode_valid(WARPED_CAUSAL,
+ if (left_mbmi->motion_mode == WARPED_CAUSAL) {
+ assert_motion_mode_valid(WARPED_CAUSAL,
#if CONFIG_GLOBAL_MOTION && SEPARATE_GLOBAL_MOTION
- 0, cm->global_motion,
+ 0, cm->global_motion,
#endif // CONFIG_GLOBAL_MOTION && SEPARATE_GLOBAL_MOTION
- left_mi);
+ left_mi);
- av1_warp_plane(&left_mbmi->wm_params[0],
+ av1_warp_plane(&left_mbmi->wm_params[0],
#if CONFIG_AOM_HIGHBITDEPTH
- xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH, xd->bd,
+ xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH, xd->bd,
#endif // CONFIG_AOM_HIGHBITDEPTH
- pd->pre[0].buf0, pd->pre[0].width, pd->pre[0].height,
- pd->pre[0].stride, pd->dst.buf,
- ((mi_col * MI_SIZE) >> pd->subsampling_x),
- (((mi_row + i) * MI_SIZE) >> pd->subsampling_y), bw,
- bh, pd->dst.stride, pd->subsampling_x,
- pd->subsampling_y, 16, 16, 0);
+ pd->pre[0].buf0, pd->pre[0].width, pd->pre[0].height,
+ pd->pre[0].stride, pd->dst.buf,
+ ((mi_col * MI_SIZE) >> pd->subsampling_x),
+ (((mi_row + i) * MI_SIZE) >> pd->subsampling_y), bw, bh,
+ pd->dst.stride, pd->subsampling_x, pd->subsampling_y, 16,
+ 16, 0);
- } else {
+ } else {
#endif // CONFIG_WARPED_MOTION
- build_inter_predictors(xd, j, mi_col_offset, mi_row_offset, 0, bw, bh,
- 0, 0, bw, bh,
+ build_inter_predictors(xd, j, mi_col_offset, mi_row_offset, 0, bw, bh,
+ 0, 0, bw, bh,
#if CONFIG_SUPERTX && CONFIG_EXT_INTER
- 0, 0,
+ 0, 0,
#endif // CONFIG_SUPERTX && CONFIG_EXT_INTER
- mi_x, mi_y);
+ mi_x, mi_y);
#if CONFIG_WARPED_MOTION
- }
-#endif // CONFIG_WARPED_MOTION
}
+#endif // CONFIG_WARPED_MOTION
}
#if CONFIG_EXT_INTER
*left_mbmi = backup_mbmi;