]> granicus.if.org Git - libvpx/commitdiff
Fix a motion vector out of range bug
authorYunqing Wang <yunqingwang@google.com>
Fri, 5 Aug 2016 22:09:13 +0000 (15:09 -0700)
committerYunqing Wang <yunqingwang@google.com>
Fri, 5 Aug 2016 22:23:05 +0000 (15:23 -0700)
This patch fixed a motion vector(MV) out of range bug, which was caused
by not restoring the original values of the MV min/max thresholds after
the sub8x8 full pixel motion search. It occurred rarely and only was seen
while encoding a 4k clip for 200 frames.

BUG=webm:1271

Change-Id: Ibc4e0de80846f297431923cef8a0c80fe8dcc6a5

vp9/encoder/vp9_rdopt.c

index a3ef5e5db5ef12432d43e15bc0d747d9220472a5..707dd5bfb56c04df6ca3cf4e0a870ab4a0f0978c 100644 (file)
@@ -1958,6 +1958,10 @@ static int64_t rd_pick_best_sub8x8_mode(
           MV mvp_full;
           int max_mv;
           int cost_list[5];
+          int tmp_col_min = x->mv_col_min;
+          int tmp_col_max = x->mv_col_max;
+          int tmp_row_min = x->mv_row_min;
+          int tmp_row_max = x->mv_row_max;
 
           /* Is the best so far sufficiently good that we cant justify doing
            * and new motion search. */
@@ -2005,6 +2009,11 @@ static int64_t rd_pick_best_sub8x8_mode(
               sf->mv.subpel_search_method != SUBPEL_TREE ? cost_list : NULL,
               &bsi->ref_mv[0]->as_mv, new_mv, INT_MAX, 1);
 
+          x->mv_col_min = tmp_col_min;
+          x->mv_col_max = tmp_col_max;
+          x->mv_row_min = tmp_row_min;
+          x->mv_row_max = tmp_row_max;
+
           if (bestsme < UINT_MAX) {
             uint32_t distortion;
             cpi->find_fractional_mv_step(