From 8055ccf9068cac08b8f1203f92ee2249cc3a4926 Mon Sep 17 00:00:00 2001 From: Yaowu Xu Date: Tue, 13 Mar 2012 10:26:53 -0700 Subject: [PATCH] added clamp for 2nd motion vector The commit added a clamp to the 2nd motion vector used in compound prediction to insure mv within UMV borders. The clamp is similar to that of the first motion vector except that No SPLITMV is ever used for the 2nd motion vector. Change-Id: I26dd63c304bd66b2e03a083749cc98c641667116 --- vp8/common/blockd.h | 1 + vp8/common/reconinter.c | 16 ++++++++++++++-- vp8/decoder/decodemv.c | 3 ++- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/vp8/common/blockd.h b/vp8/common/blockd.h index 89fe03516..88773e902 100644 --- a/vp8/common/blockd.h +++ b/vp8/common/blockd.h @@ -188,6 +188,7 @@ typedef struct unsigned char partitioning; unsigned char mb_skip_coeff; /* does this mb has coefficients at all, 1=no coefficients, 0=need decode tokens */ unsigned char need_to_clamp_mvs; + unsigned char need_to_clamp_secondmv; unsigned char segment_id; /* Which set of segmentation parameters should be used for this MB */ // Flags used for prediction status of various bistream signals diff --git a/vp8/common/reconinter.c b/vp8/common/reconinter.c index bd08e7f2c..ebcc665d5 100644 --- a/vp8/common/reconinter.c +++ b/vp8/common/reconinter.c @@ -541,13 +541,25 @@ void vp8_build_2nd_inter16x16_predictors_mb(MACROBLOCKD *x, unsigned char *ptr; unsigned char *uptr, *vptr; - int mv_row = x->mode_info_context->mbmi.second_mv.as_mv.row; - int mv_col = x->mode_info_context->mbmi.second_mv.as_mv.col; + int_mv _16x16mv; + int mv_row; + int mv_col; + int omv_row, omv_col; unsigned char *ptr_base = x->second_pre.y_buffer; int pre_stride = x->block[0].pre_stride; + _16x16mv.as_int = x->mode_info_context->mbmi.second_mv.as_int; + + if (x->mode_info_context->mbmi.need_to_clamp_secondmv) + { + clamp_mv_to_umv_border(&_16x16mv.as_mv, x); + } + + mv_row = _16x16mv.as_mv.row; + mv_col = _16x16mv.as_mv.col; + ptr = ptr_base + (mv_row >> 3) * pre_stride + (mv_col >> 3); if ((mv_row | mv_col) & 7) diff --git a/vp8/decoder/decodemv.c b/vp8/decoder/decodemv.c index 8539ff25c..07e4c9039 100644 --- a/vp8/decoder/decodemv.c +++ b/vp8/decoder/decodemv.c @@ -656,6 +656,7 @@ static void read_mb_modes_mv(VP8D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi, mb_to_top_edge -= LEFT_TOP_MARGIN; mb_to_bottom_edge += RIGHT_BOTTOM_MARGIN; mbmi->need_to_clamp_mvs = 0; + mbmi->need_to_clamp_secondmv = 0; mbmi->second_ref_frame = 0; /* Distance of Mb to the various image edges. * These specified to 8th pel as they are always compared to MV values that are in 1/8th pel units @@ -894,7 +895,7 @@ static void read_mb_modes_mv(VP8D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi, read_mv(bc, &mbmi->second_mv.as_mv, (const MV_CONTEXT *) mvc); mbmi->second_mv.as_mv.row += best_mv.as_mv.row; mbmi->second_mv.as_mv.col += best_mv.as_mv.col; - mbmi->need_to_clamp_mvs |= vp8_check_mv_bounds(&mbmi->second_mv, + mbmi->need_to_clamp_secondmv = vp8_check_mv_bounds(&mbmi->second_mv, mb_to_left_edge, mb_to_right_edge, mb_to_top_edge, -- 2.40.0