]> granicus.if.org Git - libvpx/commitdiff
Properly handle the boundary blocks for integral projection search
authorJingning Han <jingning@google.com>
Mon, 2 Mar 2015 21:51:12 +0000 (13:51 -0800)
committerJingning Han <jingning@google.com>
Wed, 4 Mar 2015 00:15:12 +0000 (16:15 -0800)
Use rectangular block size for integral projection motion estimation
if the the 64x64 block has over half block outside the frame. This
avoids the issue that the motion information of these blocks is
dominated by the extended pixels, instead of the pixels of interest.

Change-Id: I22f4d2bb7f6a20db9b3f5e2e5463a7f4b9d1b737

vp9/encoder/vp9_encodeframe.c

index cf3ff46b47b79c72d37b29168f2f72413950275d..fcd443cd5e00bd7aa2b34687394e2c286c859eb6 100644 (file)
@@ -715,6 +715,7 @@ static void choose_partitioning(VP9_COMP *cpi,
     unsigned int var = 0, uv_sse;
 #if GLOBAL_MOTION
     unsigned int y_sse;
+    BLOCK_SIZE bsize;
 #endif
     vp9_setup_pre_planes(xd, 0, yv12, mi_row, mi_col,
         &cm->frame_refs[LAST_FRAME - 1].sf);
@@ -725,7 +726,16 @@ static void choose_partitioning(VP9_COMP *cpi,
     mbmi->interp_filter = BILINEAR;
 
 #if GLOBAL_MOTION
-    y_sse = motion_estimation(cpi, x, BLOCK_64X64);
+    if (mi_row + 4 < cm->mi_rows && mi_col + 4 < cm->mi_cols)
+      bsize = BLOCK_64X64;
+    else if (mi_row + 4 < cm->mi_rows && mi_col + 4 >= cm->mi_cols)
+      bsize = BLOCK_32X64;
+    else if (mi_row + 4 >= cm->mi_rows && mi_col + 4 < cm->mi_cols)
+      bsize = BLOCK_64X32;
+    else
+      bsize = BLOCK_32X32;
+
+    y_sse = motion_estimation(cpi, x, bsize);
 #endif
 
     vp9_build_inter_predictors_sb(xd, mi_row, mi_col, BLOCK_64X64);