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,