shithub: libvpx

Download patch

ref: dee12bdf8fb4b67af5f90f737cf949a239911867
parent: 8be35347a8f9e504f44f11e77048bb131d2132dc
parent: 60456083e91f7a95c12309e22644c5c32bcbbb3a
author: Yunqing Wang <[email protected]>
date: Tue May 14 06:18:11 EDT 2013

Merge "Do joint motion search iteratively" into experimental

--- a/vp9/encoder/vp9_rdopt.c
+++ b/vp9/encoder/vp9_rdopt.c
@@ -1863,6 +1863,7 @@
         struct buf_2d backup_yv12[MAX_MB_PLANE] = {{0}};
         struct buf_2d backup_second_yv12[MAX_MB_PLANE] = {{0}};
         struct buf_2d scaled_first_yv12;
+        int last_besterr[2] = {INT_MAX, INT_MAX};
 
         if (scaled_ref_frame[0]) {
           int i;
@@ -1897,11 +1898,9 @@
         frame_mv[NEWMV][refs[0]].as_int = single_newmv[refs[0]].as_int;
         frame_mv[NEWMV][refs[1]].as_int = single_newmv[refs[1]].as_int;
 
-        // Iteration: joint search is done once for each ref frame.
-        // Tried allowing search multiple times iteratively, and break out if
-        // it couldn't find better mv. But tests didn't show noticeable
-        // improvement.
-        for (ite = 0; ite < 2; ite++) {
+        // Allow joint search multiple times iteratively for each ref frame, and
+        // break out the search loop if it couldn't find better mv.
+        for (ite = 0; ite < 4; ite++) {
           struct buf_2d ref_yv12[2] = {xd->plane[0].pre[0],
                                        xd->plane[0].pre[1]};
           int bestsme = INT_MAX;
@@ -1952,19 +1951,26 @@
             int dis; /* TODO: use dis in distortion calculation later. */
             unsigned int sse;
 
-            vp9_find_best_sub_pixel_comp(x, &tmp_mv,
-                                         &ref_mv[id],
-                                         x->errorperbit,
-                                         &cpi->fn_ptr[block_size],
-                                         x->nmvjointcost, x->mvcost,
-                                         &dis, &sse, second_pred,
-                                         b_sz[bsize][0], b_sz[bsize][1]);
+            bestsme = vp9_find_best_sub_pixel_comp(x, &tmp_mv,
+                                                   &ref_mv[id],
+                                                   x->errorperbit,
+                                                   &cpi->fn_ptr[block_size],
+                                                   x->nmvjointcost, x->mvcost,
+                                                   &dis, &sse, second_pred,
+                                                   b_sz[bsize][0],
+                                                   b_sz[bsize][1]);
           }
 
-          frame_mv[NEWMV][refs[id]].as_int =
-              xd->mode_info_context->bmi[0].as_mv[1].as_int = tmp_mv.as_int;
           if (id)
             xd->plane[0].pre[0] = scaled_first_yv12;
+
+          if (bestsme < last_besterr[id]) {
+            frame_mv[NEWMV][refs[id]].as_int =
+                xd->mode_info_context->bmi[0].as_mv[1].as_int = tmp_mv.as_int;
+            last_besterr[id] = bestsme;
+          } else {
+            break;
+          }
         }
 
         // restore the predictor