shithub: libvpx

Download patch

ref: 21d3612a2f2e09d8cc76e696a181865744479dcd
parent: f798f9e46542c570253bcd7323a3a4d6822187a9
author: Yaowu Xu <yaowu@google.com>
date: Tue Mar 13 06:26:53 EDT 2012

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

--- a/vp8/common/blockd.h
+++ b/vp8/common/blockd.h
@@ -188,6 +188,7 @@
     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
--- a/vp8/common/reconinter.c
+++ b/vp8/common/reconinter.c
@@ -541,12 +541,24 @@
     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);
 
--- a/vp8/decoder/decodemv.c
+++ b/vp8/decoder/decodemv.c
@@ -656,6 +656,7 @@
     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 @@
                     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,