Allow global motion based translation for sub8x8
Also handle block centers for sub8x8 blocks correctly.
BDRATE: lowres: -1.308%
Change-Id: I6bdb25bdaceb5086a8b951617fd62ed41cd89023
diff --git a/av1/common/blockd.h b/av1/common/blockd.h
index 6d3bfbb..9d044fe 100644
--- a/av1/common/blockd.h
+++ b/av1/common/blockd.h
@@ -1131,6 +1131,9 @@
if (mbmi->mode != ZEROMV) return 0;
#endif // CONFIG_EXT_INTER
} else {
+#if !GLOBAL_SUB8X8_USED
+ return 0;
+#endif // !GLOBAL_SUB8X8_USED
#if CONFIG_EXT_INTER
if (mi->bmi[0].as_mode != ZEROMV || mi->bmi[1].as_mode != ZEROMV ||
mi->bmi[2].as_mode != ZEROMV || mi->bmi[3].as_mode != ZEROMV ||
diff --git a/av1/common/mv.h b/av1/common/mv.h
index 981076d..a2ba42c 100644
--- a/av1/common/mv.h
+++ b/av1/common/mv.h
@@ -152,33 +152,33 @@
static INLINE int block_center_x(int mi_col, BLOCK_SIZE bs) {
const int bw = block_size_wide[bs];
- return mi_col * MI_SIZE + AOMMAX(bw, MI_SIZE) / 2;
+ return mi_col * MI_SIZE + bw / 2;
}
static INLINE int block_center_y(int mi_row, BLOCK_SIZE bs) {
const int bh = block_size_high[bs];
- return mi_row * MI_SIZE + AOMMAX(bh, MI_SIZE) / 2;
+ return mi_row * MI_SIZE + bh / 2;
}
// Convert a global motion translation vector (which may have more bits than a
// regular motion vector) into a motion vector
static INLINE int_mv gm_get_motion_vector(const WarpedMotionParams *gm,
int allow_hp, BLOCK_SIZE bsize,
- int mi_col, int mi_row) {
-#if !GLOBAL_SUB8X8_USED
- if (bsize < BLOCK_8X8) {
- int_mv res_zero;
- res_zero.as_mv.row = 0;
- res_zero.as_mv.col = 0;
- return res_zero;
- }
-#endif
-
+ int mi_col, int mi_row,
+ int block_idx) {
+ const int unify_bsize = CONFIG_CB4X4;
int_mv res;
const int32_t *mat = gm->wmmat;
- const int x = block_center_x(mi_col, bsize);
- const int y = block_center_y(mi_row, bsize);
- int xc, yc;
+ int xc, yc, x, y;
+ if (bsize >= BLOCK_8X8 || unify_bsize) {
+ x = block_center_x(mi_col, bsize);
+ y = block_center_y(mi_row, bsize);
+ } else {
+ x = block_center_x(mi_col, bsize);
+ y = block_center_y(mi_row, bsize);
+ x += (block_idx & 1) * MI_SIZE / 2;
+ y += (block_idx & 2) * MI_SIZE / 4;
+ }
int shift = allow_hp ? WARPEDMODEL_PREC_BITS - 3 : WARPEDMODEL_PREC_BITS - 2;
int scale = allow_hp ? 0 : 1;
diff --git a/av1/common/mvref_common.c b/av1/common/mvref_common.c
index 5088ad0..0ffe2a0 100644
--- a/av1/common/mvref_common.c
+++ b/av1/common/mvref_common.c
@@ -940,21 +940,21 @@
#if CONFIG_GLOBAL_MOTION
#if CONFIG_REF_MV
av1_set_ref_frame(rf, ref_frame);
- zeromv[0].as_int =
- gm_get_motion_vector(&cm->global_motion[rf[0]],
- cm->allow_high_precision_mv, bsize, mi_col, mi_row)
- .as_int;
+ zeromv[0].as_int = gm_get_motion_vector(&cm->global_motion[rf[0]],
+ cm->allow_high_precision_mv, bsize,
+ mi_col, mi_row, 0)
+ .as_int;
zeromv[1].as_int = (rf[1] != NONE_FRAME)
? gm_get_motion_vector(&cm->global_motion[rf[1]],
cm->allow_high_precision_mv,
- bsize, mi_col, mi_row)
+ bsize, mi_col, mi_row, 0)
.as_int
: 0;
#else
- zeromv[0].as_int =
- gm_get_motion_vector(&cm->global_motion[ref_frame],
- cm->allow_high_precision_mv, bsize, mi_col, mi_row)
- .as_int;
+ zeromv[0].as_int = gm_get_motion_vector(&cm->global_motion[ref_frame],
+ cm->allow_high_precision_mv, bsize,
+ mi_col, mi_row, 0)
+ .as_int;
zeromv[1].as_int = 0;
#endif // CONFIG_REF_MV
#else
@@ -1041,7 +1041,7 @@
#if CONFIG_GLOBAL_MOTION
zeromv.as_int =
gm_get_motion_vector(&cm->global_motion[ref], cm->allow_high_precision_mv,
- mi->mbmi.sb_type, mi_col, mi_row)
+ mi->mbmi.sb_type, mi_col, mi_row, block)
.as_int;
#else
zeromv.as_int = 0;
diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c
index 6ffaf07..e13dfb9 100644
--- a/av1/decoder/decodemv.c
+++ b/av1/decoder/decodemv.c
@@ -1360,12 +1360,12 @@
#if CONFIG_GLOBAL_MOTION
mv[0].as_int = gm_get_motion_vector(&cm->global_motion[ref_frame[0]],
cm->allow_high_precision_mv, bsize,
- mi_col, mi_row)
+ mi_col, mi_row, block)
.as_int;
if (is_compound)
mv[1].as_int = gm_get_motion_vector(&cm->global_motion[ref_frame[1]],
cm->allow_high_precision_mv, bsize,
- mi_col, mi_row)
+ mi_col, mi_row, block)
.as_int;
#else
mv[0].as_int = 0;
@@ -1373,8 +1373,8 @@
#endif // CONFIG_GLOBAL_MOTION
#if CONFIG_REF_MV
- pred_mv[0].as_int = 0;
- if (is_compound) pred_mv[1].as_int = 0;
+ pred_mv[0].as_int = mv[0].as_int;
+ if (is_compound) pred_mv[1].as_int = mv[1].as_int;
#endif
break;
}
@@ -1515,11 +1515,11 @@
#if CONFIG_GLOBAL_MOTION
mv[0].as_int = gm_get_motion_vector(&cm->global_motion[ref_frame[0]],
cm->allow_high_precision_mv, bsize,
- mi_col, mi_row)
+ mi_col, mi_row, block)
.as_int;
mv[1].as_int = gm_get_motion_vector(&cm->global_motion[ref_frame[1]],
cm->allow_high_precision_mv, bsize,
- mi_col, mi_row)
+ mi_col, mi_row, block)
.as_int;
#else
mv[0].as_int = 0;
@@ -1627,12 +1627,12 @@
#if CONFIG_GLOBAL_MOTION
zeromv[0].as_int = gm_get_motion_vector(&cm->global_motion[rf[0]],
cm->allow_high_precision_mv,
- bsize, mi_col, mi_row)
+ bsize, mi_col, mi_row, 0)
.as_int;
zeromv[1].as_int = (rf[1] != NONE_FRAME)
? gm_get_motion_vector(&cm->global_motion[rf[1]],
cm->allow_high_precision_mv,
- bsize, mi_col, mi_row)
+ bsize, mi_col, mi_row, 0)
.as_int
: 0;
#else
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index a64e8df..70f4e1b 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -5046,7 +5046,7 @@
gm_get_motion_vector(
&cpi->common.global_motion[mbmi->ref_frame[ref]],
cpi->common.allow_high_precision_mv, mbmi->sb_type, mi_col,
- mi_row)
+ mi_row, i)
.as_int;
thismvcost += GLOBAL_MOTION_RATE(cpi, mbmi->ref_frame[ref]);
#else
@@ -5104,12 +5104,12 @@
this_mv[0].as_int =
gm_get_motion_vector(&cpi->common.global_motion[mbmi->ref_frame[0]],
cpi->common.allow_high_precision_mv,
- mbmi->sb_type, mi_col, mi_row)
+ mbmi->sb_type, mi_col, mi_row, i)
.as_int;
this_mv[1].as_int =
gm_get_motion_vector(&cpi->common.global_motion[mbmi->ref_frame[1]],
cpi->common.allow_high_precision_mv,
- mbmi->sb_type, mi_col, mi_row)
+ mbmi->sb_type, mi_col, mi_row, i)
.as_int;
thismvcost += GLOBAL_MOTION_RATE(cpi, mbmi->ref_frame[0]) +
GLOBAL_MOTION_RATE(cpi, mbmi->ref_frame[1]);
@@ -5380,7 +5380,7 @@
zeromv[cur_frm].as_int =
gm_get_motion_vector(&cpi->common.global_motion[ref_frames[cur_frm]],
cpi->common.allow_high_precision_mv, bsize,
- mi_col, mi_row)
+ mi_col, mi_row, block)
.as_int;
else
#endif // CONFIG_GLOBAL_MOTION
@@ -5842,7 +5842,7 @@
frame_mv[ZEROMV][frame].as_int =
gm_get_motion_vector(&cm->global_motion[frame],
cm->allow_high_precision_mv, mbmi->sb_type,
- mi_col, mi_row)
+ mi_col, mi_row, index)
.as_int;
#else // CONFIG_GLOBAL_MOTION
frame_mv[ZEROMV][frame].as_int = 0;
@@ -5875,7 +5875,7 @@
frame_mv[ZERO_ZEROMV][frame].as_int =
gm_get_motion_vector(&cm->global_motion[frame],
cm->allow_high_precision_mv, mbmi->sb_type,
- mi_col, mi_row)
+ mi_col, mi_row, index)
.as_int;
#else
frame_mv[ZERO_ZEROMV][frame].as_int = 0;
@@ -9602,7 +9602,8 @@
#if CONFIG_GLOBAL_MOTION
frame_mv[ZEROMV][ref_frame].as_int =
gm_get_motion_vector(&cm->global_motion[ref_frame],
- cm->allow_high_precision_mv, bsize, mi_col, mi_row)
+ cm->allow_high_precision_mv, bsize, mi_col, mi_row,
+ 0)
.as_int;
#else // CONFIG_GLOBAL_MOTION
frame_mv[ZEROMV][ref_frame].as_int = 0;
@@ -9613,7 +9614,8 @@
#if CONFIG_GLOBAL_MOTION
frame_mv[ZERO_ZEROMV][ref_frame].as_int =
gm_get_motion_vector(&cm->global_motion[ref_frame],
- cm->allow_high_precision_mv, bsize, mi_col, mi_row)
+ cm->allow_high_precision_mv, bsize, mi_col, mi_row,
+ 0)
.as_int;
#else // CONFIG_GLOBAL_MOTION
frame_mv[ZERO_ZEROMV][ref_frame].as_int = 0;
@@ -9724,7 +9726,7 @@
#if CONFIG_GLOBAL_MOTION
zeromv.as_int = gm_get_motion_vector(&cm->global_motion[ALTREF_FRAME],
cm->allow_high_precision_mv, bsize,
- mi_col, mi_row)
+ mi_col, mi_row, 0)
.as_int;
#else
zeromv.as_int = 0;
@@ -10918,14 +10920,14 @@
const uint8_t rf_type = av1_ref_frame_type(best_mbmode.ref_frame);
#endif // CONFIG_REF_MV
#if CONFIG_GLOBAL_MOTION
- zeromv[0].as_int =
- gm_get_motion_vector(&cm->global_motion[refs[0]],
- cm->allow_high_precision_mv, bsize, mi_col, mi_row)
- .as_int;
+ zeromv[0].as_int = gm_get_motion_vector(&cm->global_motion[refs[0]],
+ cm->allow_high_precision_mv, bsize,
+ mi_col, mi_row, 0)
+ .as_int;
zeromv[1].as_int = comp_pred_mode
? gm_get_motion_vector(&cm->global_motion[refs[1]],
cm->allow_high_precision_mv,
- bsize, mi_col, mi_row)
+ bsize, mi_col, mi_row, 0)
.as_int
: 0;
#else
@@ -11037,12 +11039,12 @@
#if CONFIG_GLOBAL_MOTION
zeromv[0].as_int = gm_get_motion_vector(&cm->global_motion[refs[0]],
cm->allow_high_precision_mv,
- bsize, mi_col, mi_row)
+ bsize, mi_col, mi_row, 0)
.as_int;
zeromv[1].as_int = comp_pred_mode
? gm_get_motion_vector(&cm->global_motion[refs[1]],
cm->allow_high_precision_mv,
- bsize, mi_col, mi_row)
+ bsize, mi_col, mi_row, 0)
.as_int
: 0;
#else
@@ -11088,11 +11090,11 @@
best_mbmode.ref_frame[1] };
zeromv[0].as_int = gm_get_motion_vector(&cm->global_motion[refs[0]],
cm->allow_high_precision_mv,
- bsize, mi_col, mi_row)
+ bsize, mi_col, mi_row, 0)
.as_int;
zeromv[1].as_int = gm_get_motion_vector(&cm->global_motion[refs[1]],
cm->allow_high_precision_mv,
- bsize, mi_col, mi_row)
+ bsize, mi_col, mi_row, 0)
.as_int;
lower_mv_precision(&zeromv[0].as_mv, cm->allow_high_precision_mv);
lower_mv_precision(&zeromv[1].as_mv, cm->allow_high_precision_mv);
@@ -11254,7 +11256,8 @@
#if CONFIG_GLOBAL_MOTION
mbmi->mv[0].as_int =
gm_get_motion_vector(&cm->global_motion[mbmi->ref_frame[0]],
- cm->allow_high_precision_mv, bsize, mi_col, mi_row)
+ cm->allow_high_precision_mv, bsize, mi_col, mi_row,
+ 0)
.as_int;
#else // CONFIG_GLOBAL_MOTION
mbmi->mv[0].as_int = 0;