summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRonald S. Bultje <rsbultje@gmail.com>2015-10-02 12:09:24 -0400
committerRonald S. Bultje <rsbultje@gmail.com>2015-10-16 19:30:38 -0400
commitdea998997f46a3a15e07284452bd1d7407912bb4 (patch)
treed28ffb0ec5361d257966a0f8a21bc9d8e8dd6d61
parent1eb51a2010c95845d340ac7dafe311e4c1716d66 (diff)
downloadlibvpx-dea998997f46a3a15e07284452bd1d7407912bb4.tar.gz
vp10: allow MV refs to point outside visible image.
In VP9, the ref MV had to point to a block that itself fully resided within the visible image, i.e. all borders of the image had to be within the visible borders of the coded frame. This is somewhat illogical, and had obscure side effects, e.g. clamping of fairly reasonable motion vectors such as 0,0 were clipped to negative values if the block was overhanging on frame edges (such as the last rows on 1080p content), which makes no sense whatsoever. Instead, relax clamping constraints such that the ref MVs are allowed to point to blocks exactly outside the visible edges in both Y as well as UV planes, including the 8tap filter edges (that's why the offset is 8 pixels + block size). See issue 1037. Change-Id: I2683eb2a18b24955e4dcce36c2940aa2ba3a1061
-rw-r--r--vp10/common/mvref_common.c4
-rw-r--r--vp10/common/mvref_common.h15
2 files changed, 17 insertions, 2 deletions
diff --git a/vp10/common/mvref_common.c b/vp10/common/mvref_common.c
index 9bf701fcc..b2eeaa29e 100644
--- a/vp10/common/mvref_common.c
+++ b/vp10/common/mvref_common.c
@@ -27,6 +27,8 @@ static void find_mv_refs_idx(const VP10_COMMON *cm, const MACROBLOCKD *xd,
const MV_REF *const prev_frame_mvs = cm->use_prev_frame_mvs ?
cm->prev_frame->mvs + mi_row * cm->mi_cols + mi_col : NULL;
const TileInfo *const tile = &xd->tile;
+ const int bw = num_8x8_blocks_wide_lookup[mi->mbmi.sb_type] << 3;
+ const int bh = num_8x8_blocks_high_lookup[mi->mbmi.sb_type] << 3;
// Blank the reference vector list
memset(mv_ref_list, 0, sizeof(*mv_ref_list) * MAX_MV_REF_CANDIDATES);
@@ -145,7 +147,7 @@ static void find_mv_refs_idx(const VP10_COMMON *cm, const MACROBLOCKD *xd,
// Clamp vectors
for (i = 0; i < MAX_MV_REF_CANDIDATES; ++i)
- clamp_mv_ref(&mv_ref_list[i].as_mv, xd);
+ clamp_mv_ref(&mv_ref_list[i].as_mv, bw, bh, xd);
}
void vp10_find_mv_refs(const VP10_COMMON *cm, const MACROBLOCKD *xd,
diff --git a/vp10/common/mvref_common.h b/vp10/common/mvref_common.h
index e92ad52cd..4608df0fe 100644
--- a/vp10/common/mvref_common.h
+++ b/vp10/common/mvref_common.h
@@ -119,13 +119,26 @@ static const int idx_n_column_to_subblock[4][2] = {
};
// clamp_mv_ref
+#if CONFIG_MISC_FIXES
+#define MV_BORDER (8 << 3) // Allow 8 pels in 1/8th pel units
+#else
#define MV_BORDER (16 << 3) // Allow 16 pels in 1/8th pel units
+#endif
-static INLINE void clamp_mv_ref(MV *mv, const MACROBLOCKD *xd) {
+static INLINE void clamp_mv_ref(MV *mv, int bw, int bh, const MACROBLOCKD *xd) {
+#if CONFIG_MISC_FIXES
+ clamp_mv(mv, xd->mb_to_left_edge - bw * 8 - MV_BORDER,
+ xd->mb_to_right_edge + bw * 8 + MV_BORDER,
+ xd->mb_to_top_edge - bh * 8 - MV_BORDER,
+ xd->mb_to_bottom_edge + bh * 8 + MV_BORDER);
+#else
+ (void) bw;
+ (void) bh;
clamp_mv(mv, xd->mb_to_left_edge - MV_BORDER,
xd->mb_to_right_edge + MV_BORDER,
xd->mb_to_top_edge - MV_BORDER,
xd->mb_to_bottom_edge + MV_BORDER);
+#endif
}
// This function returns either the appropriate sub block or block's mv