Better block center in gm_get_motion_vector fn
Also supports homography models for future experiments.
Change-Id: I4510540f54133e063891ed491c95c087222f7810
diff --git a/av1/common/mv.h b/av1/common/mv.h
index 2b50c61..b43c3ab 100644
--- a/av1/common/mv.h
+++ b/av1/common/mv.h
@@ -135,7 +135,7 @@
#define GM_ALPHA_MIN -GM_ALPHA_MAX
#define GM_ROW3HOMO_MIN -GM_ROW3HOMO_MAX
-// Bits used for different models
+// Maximum number of bits used for different models
#define GM_IDENTITY_BITS 0
#define GM_TRANSLATION_BITS ((GM_ABS_TRANS_BITS + 1) * 2)
#define GM_ROTZOOM_BITS (GM_TRANSLATION_BITS + (GM_ABS_ALPHA_BITS + 1) * 2)
@@ -152,8 +152,6 @@
int allow_hp, int x, int y) {
int_mv res;
const int32_t *mat = gm->wmmat;
- // Project the center point of the frame and use that to derive the
- // motion vector. Assume the model is an AFFINE or ROTZOOM model
int xc, yc;
int shift = allow_hp ? WARPEDMODEL_PREC_BITS - 3 : WARPEDMODEL_PREC_BITS - 2;
int scale = allow_hp ? 0 : 1;
@@ -165,6 +163,15 @@
xc = mat[2] * x + mat[3] * y + mat[0];
yc = mat[4] * x + mat[5] * y + mat[1];
+ if (gm->wmtype > AFFINE) {
+ const int Z =
+ mat[6] * x + mat[7] * y + (1 << WARPEDMODEL_ROW3HOMO_PREC_BITS);
+ xc <<= (WARPEDMODEL_ROW3HOMO_PREC_BITS - WARPEDMODEL_PREC_BITS);
+ yc <<= (WARPEDMODEL_ROW3HOMO_PREC_BITS - WARPEDMODEL_PREC_BITS);
+ xc = xc > 0 ? (xc + Z / 2) / Z : (xc - Z / 2) / Z;
+ yc = yc > 0 ? (yc + Z / 2) / Z : (yc - Z / 2) / Z;
+ }
+
int tx = (ROUND_POWER_OF_TWO_SIGNED(xc, shift) << scale) - (x << 3);
int ty = (ROUND_POWER_OF_TWO_SIGNED(yc, shift) << scale) - (y << 3);
diff --git a/av1/common/mvref_common.c b/av1/common/mvref_common.c
index ed86122..1c33b64 100644
--- a/av1/common/mvref_common.c
+++ b/av1/common/mvref_common.c
@@ -925,6 +925,7 @@
int idx, all_zero = 1;
#if CONFIG_GLOBAL_MOTION
MV_REFERENCE_FRAME rf[2];
+ BLOCK_SIZE bsize = mi->mbmi.sb_type;
#endif
#endif
#if CONFIG_EXT_INTER
@@ -941,21 +942,21 @@
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,
- mi_col * MI_SIZE + MI_SIZE / 2,
- mi_row * MI_SIZE + MI_SIZE / 2)
+ block_center_x(mi_col, bsize),
+ block_center_y(mi_row, bsize))
.as_int;
zeromv[1].as_int = (rf[1] != NONE_FRAME)
? gm_get_motion_vector(&cm->global_motion[rf[1]],
cm->allow_high_precision_mv,
- mi_col * MI_SIZE + MI_SIZE / 2,
- mi_row * MI_SIZE + MI_SIZE / 2)
+ block_center_x(mi_col, bsize),
+ block_center_y(mi_row, bsize))
.as_int
: 0;
#else
zeromv[0].as_int = gm_get_motion_vector(&cm->global_motion[ref_frame],
cm->allow_high_precision_mv,
- mi_col * MI_SIZE + MI_SIZE / 2,
- mi_row * MI_SIZE + MI_SIZE / 2)
+ block_center_x(mi_col, bsize),
+ block_center_y(mi_row, bsize))
.as_int;
zeromv[1].as_int = 0;
#endif // CONFIG_REF_MV
@@ -1043,8 +1044,8 @@
#if CONFIG_GLOBAL_MOTION
zeromv.as_int =
gm_get_motion_vector(&cm->global_motion[ref], cm->allow_high_precision_mv,
- mi_col * MI_SIZE + MI_SIZE / 2,
- mi_row * MI_SIZE + MI_SIZE / 2)
+ block_center_x(mi_col, mi->mbmi.sb_type),
+ block_center_y(mi_row, mi->mbmi.sb_type))
.as_int;
#else
zeromv.as_int = 0;
diff --git a/av1/common/mvref_common.h b/av1/common/mvref_common.h
index f5a3919..9b3a246 100644
--- a/av1/common/mvref_common.h
+++ b/av1/common/mvref_common.h
@@ -255,6 +255,18 @@
};
#endif
+#if CONFIG_GLOBAL_MOTION
+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;
+}
+
+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;
+}
+#endif // CONFIG_GLOBAL_MOTION
+
static const int idx_n_column_to_subblock[4][2] = {
{ 1, 2 }, { 1, 3 }, { 3, 2 }, { 3, 3 }
};
diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c
index daef18b..06534e2 100644
--- a/av1/decoder/decodemv.c
+++ b/av1/decoder/decodemv.c
@@ -1281,13 +1281,13 @@
#else
FRAME_CONTEXT *ec_ctx = cm->fc;
#endif
+ BLOCK_SIZE bsize = xd->mi[0]->mbmi.sb_type;
#if CONFIG_REF_MV
MB_MODE_INFO *mbmi = &xd->mi[0]->mbmi;
#if CONFIG_CB4X4
int_mv *pred_mv = mbmi->pred_mv;
(void)block;
#else
- BLOCK_SIZE bsize = mbmi->sb_type;
int_mv *pred_mv =
(bsize >= BLOCK_8X8) ? mbmi->pred_mv : xd->mi[0]->bmi[block].pred_mv;
#endif // CONFIG_CB4X4
@@ -1298,6 +1298,7 @@
(void)cm;
(void)mi_row;
(void)mi_col;
+ (void)bsize;
switch (mode) {
#if CONFIG_EXT_INTER
@@ -1354,14 +1355,14 @@
#if CONFIG_GLOBAL_MOTION
mv[0].as_int = gm_get_motion_vector(&cm->global_motion[ref_frame[0]],
cm->allow_high_precision_mv,
- mi_col * MI_SIZE + MI_SIZE / 2,
- mi_row * MI_SIZE + MI_SIZE / 2)
+ block_center_x(mi_col, bsize),
+ block_center_y(mi_row, bsize))
.as_int;
if (is_compound)
mv[1].as_int = gm_get_motion_vector(&cm->global_motion[ref_frame[1]],
cm->allow_high_precision_mv,
- mi_col * MI_SIZE + MI_SIZE / 2,
- mi_row * MI_SIZE + MI_SIZE / 2)
+ block_center_x(mi_col, bsize),
+ block_center_y(mi_row, bsize))
.as_int;
#else
mv[0].as_int = 0;
@@ -1511,13 +1512,13 @@
#if CONFIG_GLOBAL_MOTION
mv[0].as_int = gm_get_motion_vector(&cm->global_motion[ref_frame[0]],
cm->allow_high_precision_mv,
- mi_col * MI_SIZE + MI_SIZE / 2,
- mi_row * MI_SIZE + MI_SIZE / 2)
+ block_center_x(mi_col, bsize),
+ block_center_y(mi_row, bsize))
.as_int;
mv[1].as_int = gm_get_motion_vector(&cm->global_motion[ref_frame[1]],
cm->allow_high_precision_mv,
- mi_col * MI_SIZE + MI_SIZE / 2,
- mi_row * MI_SIZE + MI_SIZE / 2)
+ block_center_x(mi_col, bsize),
+ block_center_y(mi_row, bsize))
.as_int;
#else
mv[0].as_int = 0;
@@ -1625,15 +1626,15 @@
#if CONFIG_GLOBAL_MOTION
zeromv[0].as_int = gm_get_motion_vector(&cm->global_motion[rf[0]],
cm->allow_high_precision_mv,
- mi_col * MI_SIZE + MI_SIZE / 2,
- mi_row * MI_SIZE + MI_SIZE / 2)
+ block_center_x(mi_col, bsize),
+ block_center_y(mi_row, bsize))
.as_int;
zeromv[1].as_int =
(rf[1] != NONE_FRAME)
? gm_get_motion_vector(&cm->global_motion[rf[1]],
cm->allow_high_precision_mv,
- mi_col * MI_SIZE + MI_SIZE / 2,
- mi_row * MI_SIZE + MI_SIZE / 2)
+ block_center_x(mi_col, bsize),
+ block_center_y(mi_row, bsize))
.as_int
: 0;
#else
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index d9e1b27..7b84fd2 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -5046,7 +5046,8 @@
gm_get_motion_vector(
&cpi->common.global_motion[mbmi->ref_frame[ref]],
cpi->common.allow_high_precision_mv,
- mi_col * MI_SIZE + MI_SIZE / 2, mi_row * MI_SIZE + MI_SIZE / 2)
+ block_center_x(mi_col, mbmi->sb_type),
+ block_center_y(mi_row, mbmi->sb_type))
.as_int;
thismvcost += GLOBAL_MOTION_RATE(cpi, mbmi->ref_frame[ref]);
#else
@@ -5104,14 +5105,14 @@
this_mv[0].as_int =
gm_get_motion_vector(&cpi->common.global_motion[mbmi->ref_frame[0]],
cpi->common.allow_high_precision_mv,
- mi_col * MI_SIZE + MI_SIZE / 2,
- mi_row * MI_SIZE + MI_SIZE / 2)
+ block_center_x(mi_col, mbmi->sb_type),
+ block_center_y(mi_row, mbmi->sb_type))
.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,
- mi_col * MI_SIZE + MI_SIZE / 2,
- mi_row * MI_SIZE + MI_SIZE / 2)
+ block_center_x(mi_col, mbmi->sb_type),
+ block_center_y(mi_row, mbmi->sb_type))
.as_int;
thismvcost += GLOBAL_MOTION_RATE(cpi, mbmi->ref_frame[0]) +
GLOBAL_MOTION_RATE(cpi, mbmi->ref_frame[1]);
@@ -5382,8 +5383,8 @@
zeromv[cur_frm].as_int =
gm_get_motion_vector(&cpi->common.global_motion[ref_frames[cur_frm]],
cpi->common.allow_high_precision_mv,
- mi_col * MI_SIZE + MI_SIZE / 2,
- mi_row * MI_SIZE + MI_SIZE / 2)
+ block_center_x(mi_col, bsize),
+ block_center_y(mi_row, bsize))
.as_int;
else
#endif // CONFIG_GLOBAL_MOTION
@@ -5843,9 +5844,10 @@
#endif // CONFIG_EXT_INTER
#if CONFIG_GLOBAL_MOTION
frame_mv[ZEROMV][frame].as_int =
- gm_get_motion_vector(
- &cm->global_motion[frame], cm->allow_high_precision_mv,
- mi_col * MI_SIZE + MI_SIZE / 2, mi_row * MI_SIZE + MI_SIZE / 2)
+ gm_get_motion_vector(&cm->global_motion[frame],
+ cm->allow_high_precision_mv,
+ block_center_x(mi_col, mbmi->sb_type),
+ block_center_y(mi_row, mbmi->sb_type))
.as_int;
#else // CONFIG_GLOBAL_MOTION
frame_mv[ZEROMV][frame].as_int = 0;
@@ -5878,8 +5880,8 @@
frame_mv[ZERO_ZEROMV][frame].as_int =
gm_get_motion_vector(&cm->global_motion[frame],
cm->allow_high_precision_mv,
- mi_col * MI_SIZE + MI_SIZE / 2,
- mi_row * MI_SIZE + MI_SIZE / 2)
+ block_center_x(mi_col, mbmi->sb_type),
+ block_center_y(mi_row, mbmi->sb_type))
.as_int;
#else
frame_mv[ZERO_ZEROMV][frame].as_int = 0;
@@ -9568,7 +9570,7 @@
frame_mv[ZEROMV][ref_frame].as_int =
gm_get_motion_vector(
&cm->global_motion[ref_frame], cm->allow_high_precision_mv,
- mi_col * MI_SIZE + MI_SIZE / 2, mi_row * MI_SIZE + MI_SIZE / 2)
+ block_center_x(mi_col, bsize), block_center_y(mi_row, bsize))
.as_int;
#else // CONFIG_GLOBAL_MOTION
frame_mv[ZEROMV][ref_frame].as_int = 0;
@@ -9580,7 +9582,7 @@
frame_mv[ZERO_ZEROMV][ref_frame].as_int =
gm_get_motion_vector(
&cm->global_motion[ref_frame], cm->allow_high_precision_mv,
- mi_col * MI_SIZE + MI_SIZE / 2, mi_row * MI_SIZE + MI_SIZE / 2)
+ block_center_x(mi_col, bsize), block_center_y(mi_row, bsize))
.as_int;
#else // CONFIG_GLOBAL_MOTION
frame_mv[ZERO_ZEROMV][ref_frame].as_int = 0;
@@ -9684,8 +9686,8 @@
#if CONFIG_GLOBAL_MOTION
zeromv.as_int = gm_get_motion_vector(&cm->global_motion[ALTREF_FRAME],
cm->allow_high_precision_mv,
- mi_col * MI_SIZE + MI_SIZE / 2,
- mi_row * MI_SIZE + MI_SIZE / 2)
+ block_center_x(mi_col, bsize),
+ block_center_y(mi_row, bsize))
.as_int;
#else
zeromv.as_int = 0;
@@ -10853,17 +10855,16 @@
#if CONFIG_GLOBAL_MOTION
zeromv[0].as_int = gm_get_motion_vector(&cm->global_motion[refs[0]],
cm->allow_high_precision_mv,
- mi_col * MI_SIZE + MI_SIZE / 2,
- mi_row * MI_SIZE + MI_SIZE / 2)
+ block_center_x(mi_col, bsize),
+ block_center_y(mi_row, bsize))
.as_int;
- zeromv[1].as_int =
- comp_pred_mode
- ? gm_get_motion_vector(&cm->global_motion[refs[1]],
- cm->allow_high_precision_mv,
- mi_col * MI_SIZE + MI_SIZE / 2,
- mi_row * MI_SIZE + MI_SIZE / 2)
- .as_int
- : 0;
+ zeromv[1].as_int = comp_pred_mode
+ ? gm_get_motion_vector(&cm->global_motion[refs[1]],
+ cm->allow_high_precision_mv,
+ block_center_x(mi_col, bsize),
+ block_center_y(mi_row, bsize))
+ .as_int
+ : 0;
#else
zeromv[0].as_int = 0;
zeromv[1].as_int = 0;
@@ -10973,15 +10974,15 @@
#if CONFIG_GLOBAL_MOTION
zeromv[0].as_int = gm_get_motion_vector(&cm->global_motion[refs[0]],
cm->allow_high_precision_mv,
- mi_col * MI_SIZE + MI_SIZE / 2,
- mi_row * MI_SIZE + MI_SIZE / 2)
+ block_center_x(mi_col, bsize),
+ block_center_y(mi_row, bsize))
.as_int;
zeromv[1].as_int =
comp_pred_mode
? gm_get_motion_vector(&cm->global_motion[refs[1]],
cm->allow_high_precision_mv,
- mi_col * MI_SIZE + MI_SIZE / 2,
- mi_row * MI_SIZE + MI_SIZE / 2)
+ block_center_x(mi_col, bsize),
+ block_center_y(mi_row, bsize))
.as_int
: 0;
#else
@@ -11027,13 +11028,13 @@
best_mbmode.ref_frame[1] };
zeromv[0].as_int = gm_get_motion_vector(&cm->global_motion[refs[0]],
cm->allow_high_precision_mv,
- mi_col * MI_SIZE + MI_SIZE / 2,
- mi_row * MI_SIZE + MI_SIZE / 2)
+ block_center_x(mi_col, bsize),
+ block_center_y(mi_row, bsize))
.as_int;
zeromv[1].as_int = gm_get_motion_vector(&cm->global_motion[refs[1]],
cm->allow_high_precision_mv,
- mi_col * MI_SIZE + MI_SIZE / 2,
- mi_row * MI_SIZE + MI_SIZE / 2)
+ block_center_x(mi_col, bsize),
+ block_center_y(mi_row, bsize))
.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);
@@ -11196,7 +11197,7 @@
mbmi->mv[0].as_int =
gm_get_motion_vector(
&cm->global_motion[mbmi->ref_frame[0]], cm->allow_high_precision_mv,
- mi_col * MI_SIZE + MI_SIZE / 2, mi_row * MI_SIZE + MI_SIZE / 2)
+ block_center_x(mi_col, bsize), block_center_y(mi_row, bsize))
.as_int;
#else // CONFIG_GLOBAL_MOTION
mbmi->mv[0].as_int = 0;