allow_warp: rectify mismatch between spec and code
As per the spec, we must compare the scales at higher precision in this
function to check if there is a rescale.
So, we use the av1_is_scaled() function that looks at the fixed point
scales.
BUG=aomedia:2191
Change-Id: I9276dc6f54fe01deb98549ac4ebcc25fae462cf2
diff --git a/av1/common/reconinter.c b/av1/common/reconinter.c
index 21d3534..f6e5b11 100644
--- a/av1/common/reconinter.c
+++ b/av1/common/reconinter.c
@@ -35,10 +35,12 @@
int av1_allow_warp(const MB_MODE_INFO *const mbmi,
const WarpTypesAllowed *const warp_types,
const WarpedMotionParams *const gm_params,
- int build_for_obmc, int x_scale, int y_scale,
+ int build_for_obmc, const struct scale_factors *const sf,
WarpedMotionParams *final_warp_params) {
- if (x_scale != SCALE_SUBPEL_SHIFTS || y_scale != SCALE_SUBPEL_SHIFTS)
- return 0;
+ // Note: As per the spec, we must test the fixed point scales here, which are
+ // at a higher precision (1 << 14) than the xs and ys in subpel_params (that
+ // have 1 << 10 precision).
+ if (av1_is_scaled(sf)) return 0;
if (final_warp_params != NULL) *final_warp_params = default_warp_params;
@@ -75,8 +77,7 @@
const int do_warp =
(w >= 8 && h >= 8 &&
av1_allow_warp(mi, warp_types, &xd->global_motion[mi->ref_frame[ref]],
- build_for_obmc, subpel_params->xs, subpel_params->ys,
- &final_warp_params));
+ build_for_obmc, sf, &final_warp_params));
const int is_intrabc = mi->use_intrabc;
assert(IMPLIES(is_intrabc, !do_warp));
diff --git a/av1/common/reconinter.h b/av1/common/reconinter.h
index db86c77..b98b0ca 100644
--- a/av1/common/reconinter.h
+++ b/av1/common/reconinter.h
@@ -355,7 +355,7 @@
int av1_allow_warp(const MB_MODE_INFO *const mbmi,
const WarpTypesAllowed *const warp_types,
const WarpedMotionParams *const gm_params,
- int build_for_obmc, int x_scale, int y_scale,
+ int build_for_obmc, const struct scale_factors *const sf,
WarpedMotionParams *final_warp_params);
#ifdef __cplusplus
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index ae32a0b..f4aa4a3 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -789,8 +789,7 @@
int do_warp = (bw >= 8 && bh >= 8 &&
av1_allow_warp(mi, &warp_types,
&xd->global_motion[mi->ref_frame[ref]],
- build_for_obmc, subpel_params[ref].xs,
- subpel_params[ref].ys, NULL));
+ build_for_obmc, sf, NULL));
do_warp = (do_warp && xd->cur_frame_force_integer_mv == 0);
extend_mc_border(sf, pre_buf, scaled_mv, block, subpel_x_mv, subpel_y_mv,