]> granicus.if.org Git - libvpx/commitdiff
Enforce effective motion vector search range
authorJingning Han <jingning@google.com>
Tue, 21 Jan 2014 19:40:33 +0000 (11:40 -0800)
committerJingning Han <jingning@google.com>
Tue, 21 Jan 2014 20:03:18 +0000 (12:03 -0800)
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

vp9/encoder/vp9_mcomp.c

index 88d527a22355d2cfed87b9ad68015e91b3725942..8b3da0e0bc7b1005dc0bc327e658bbb5019058c0 100644 (file)
 // #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.