shithub: libvpx

Download patch

ref: 3fda7a665d432fdf2650ec8a455a3d0aeec919e6
parent: 39892cceadc48aac8ffca69f9700c854b0bd2441
parent: e52e8b70250b0f897e6947b5c24db365e489ba07
author: Yaowu Xu <yaowu@google.com>
date: Tue Aug 14 05:12:31 EDT 2012

Merge "Changed to use reference mv as nearest mv" into experimental

--- a/vp8/common/findnearmv.c
+++ b/vp8/common/findnearmv.c
@@ -202,7 +202,9 @@
 void vp8_find_best_ref_mvs(MACROBLOCKD *xd,
                            unsigned char *ref_y_buffer,
                            int ref_y_stride,
-                           int_mv *best_mv){
+                           int_mv *best_mv,
+                           int_mv *nearest,
+                           int_mv *near) {
   int_mv *ref_mv = xd->ref_mv;
   int bestsad = INT_MAX;
   int i;
@@ -259,6 +261,13 @@
     lower_mv_precision(best_mv);
 
   vp8_clamp_mv2(best_mv, xd);
+
+  if (best_mv->as_int != 0 &&
+      (best_mv->as_mv.row >> 3) != (nearest->as_mv.row >>3 ) &&
+      (best_mv->as_mv.col >> 3) != (nearest->as_mv.col >>3 )) {
+    near->as_int = nearest->as_int;
+    nearest->as_int = best_mv->as_int;
+  }
 }
 
 #endif
--- a/vp8/decoder/decodemv.c
+++ b/vp8/decoder/decodemv.c
@@ -653,7 +653,7 @@
       vp8_find_best_ref_mvs(xd,
                             xd->pre.y_buffer,
                             recon_y_stride,
-                            &best_mv);
+                            &best_mv, &nearest, &nearby);
     }
 #endif
 
@@ -732,7 +732,9 @@
         vp8_find_best_ref_mvs(xd,
                               xd->second_pre.y_buffer,
                               recon_y_stride,
-                              &best_mv_second);
+                              &best_mv_second,
+                              &nearest_second,
+                              &nearby_second);
       }
 #else
       vp8_find_near_mvs(xd, mi, prev_mi,
--- a/vp8/encoder/rdopt.c
+++ b/vp8/encoder/rdopt.c
@@ -2654,7 +2654,10 @@
   v_buffer[frame_type] = yv12->v_buffer + recon_uvoffset;
 #if CONFIG_NEWBESTREFMV
   vp8_find_best_ref_mvs(&x->e_mbd, y_buffer[frame_type],
-                        yv12->y_stride, &frame_best_ref_mv[frame_type]);
+                        yv12->y_stride,
+                        &frame_best_ref_mv[frame_type],
+                        &frame_nearest_mv[frame_type],
+                        &frame_near_mv[frame_type]);
   ref_mv[frame_type].as_int = frame_best_ref_mv[frame_type].as_int;
 #endif
 }
--- a/vp8/encoder/tokenize.c
+++ b/vp8/encoder/tokenize.c
@@ -1311,6 +1311,7 @@
   ENTROPY_CONTEXT *L = (ENTROPY_CONTEXT *)x->left_context;
   int plane_type;
   int b;
+  TOKENEXTRA *t_backup = *t;
 
   stuff2nd_order_b_8x8(x->block + 24, t, 1, x->frame_type,
                        A + vp8_block2above_8x8[24],
@@ -1334,6 +1335,8 @@
     *(A + vp8_block2above_8x8[b] + 1) = *(A + vp8_block2above_8x8[b]);
     *(L + vp8_block2left_8x8[b] + 1) = *(L + vp8_block2left_8x8[b]);
   }
+  if (dry_run)
+    *t = t_backup;
 }
 
 
@@ -1370,6 +1373,7 @@
   ENTROPY_CONTEXT * A = (ENTROPY_CONTEXT *)x->above_context;
   ENTROPY_CONTEXT * L = (ENTROPY_CONTEXT *)x->left_context;
   int b, i;
+  TOKENEXTRA *t_backup = *t;
 
   stuff1st_order_b_16x16(x->block, t, x->frame_type, A, L, cpi, dry_run);
   for (i = 1; i < 16; i++) {
@@ -1386,6 +1390,8 @@
   }
   vpx_memset(&A[8], 0, sizeof(A[8]));
   vpx_memset(&L[8], 0, sizeof(L[8]));
+  if (dry_run)
+    *t = t_backup;
 }
 #endif
 
@@ -1456,7 +1462,8 @@
   *a = *l = pt;
 }
 
-void vp8_stuff_mb(VP8_COMP *cpi, MACROBLOCKD *x, TOKENEXTRA **t, int dry_run) {
+void vp8_stuff_mb(VP8_COMP *cpi, MACROBLOCKD *x,
+                  TOKENEXTRA **t, int dry_run) {
   ENTROPY_CONTEXT *A = (ENTROPY_CONTEXT *)x->above_context;
   ENTROPY_CONTEXT *L = (ENTROPY_CONTEXT *)x->left_context;
   int plane_type;
--