ref: 20cf22a1289c01cc44ac948103fa4755293f9df3
parent: b461c0884ed354c1b178087e0b4329eb33d3b882
author: Jingning Han <[email protected]>
date: Tue Jan 21 06:40:33 EST 2014
Enforce effective motion vector search range This commit explicitly enforces the effective motion vector range in the motion search stage. The range needs to be the intersection of UMV border, effective absolute motion vector value range, and the target search area. Change-Id: I1cf7c563e02b1086040dad6c1f4f6be1538635a6
--- a/vp9/encoder/vp9_mcomp.c
+++ b/vp9/encoder/vp9_mcomp.c
@@ -24,10 +24,15 @@
// #define NEW_DIAMOND_SEARCH
void vp9_set_mv_search_range(MACROBLOCK *x, const MV *mv) {
- const int col_min = (mv->col >> 3) - MAX_FULL_PEL_VAL + (mv->col & 7 ? 1 : 0);
- const int row_min = (mv->row >> 3) - MAX_FULL_PEL_VAL + (mv->row & 7 ? 1 : 0);
- const int col_max = (mv->col >> 3) + MAX_FULL_PEL_VAL;
- const int row_max = (mv->row >> 3) + MAX_FULL_PEL_VAL;
+ int col_min = (mv->col >> 3) - MAX_FULL_PEL_VAL + (mv->col & 7 ? 1 : 0);
+ int row_min = (mv->row >> 3) - MAX_FULL_PEL_VAL + (mv->row & 7 ? 1 : 0);
+ int col_max = (mv->col >> 3) + MAX_FULL_PEL_VAL;
+ int row_max = (mv->row >> 3) + MAX_FULL_PEL_VAL;
+
+ col_min = MAX(col_min, (MV_LOW >> 3) + 1);
+ row_min = MAX(row_min, (MV_LOW >> 3) + 1);
+ col_max = MIN(col_max, (MV_UPP >> 3) - 1);
+ row_max = MIN(row_max, (MV_UPP >> 3) - 1);
// Get intersection of UMV window and valid MV window to reduce # of checks
// in diamond search.