summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--vp8/common/blockd.h1
-rw-r--r--vp8/common/reconinter.c16
-rw-r--r--vp8/decoder/decodemv.c3
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,