ref: e5fe165840d25240d6b2fe02f33c613eda61ff2e
parent: 6e5115e12e916e7d787e0daf2a30a7c610947871
author: Jingning Han <[email protected]>
date: Mon Mar 2 08:51:12 EST 2015
Properly handle the boundary blocks for integral projection search 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
--- a/vp9/encoder/vp9_encodeframe.c
+++ b/vp9/encoder/vp9_encodeframe.c
@@ -715,6 +715,7 @@
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 @@
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);