]> granicus.if.org Git - libvpx/commitdiff
Changed to use reference mv as nearest mv
authorYaowu Xu <yaowu@google.com>
Mon, 6 Aug 2012 17:51:20 +0000 (10:51 -0700)
committerYaowu Xu <yaowu@google.com>
Tue, 14 Aug 2012 16:12:15 +0000 (09:12 -0700)
The reference motion vector selected by surrounding pixels that has
the best matching score is used as nearest motion vector.

The change has shown consistent gain on all test sets, compression
gains range from .2% to .6%. The variation is largely dependent on
various other experiments on or off.

Change-Id: I5552e1c2f6fc57c3e8818a5ee41ffda89af05e75

vp8/common/findnearmv.c
vp8/decoder/decodemv.c
vp8/encoder/rdopt.c
vp8/encoder/tokenize.c

index 1087ee4f8f1c0618c657e6b559c3a59903dd16ab..05789aff2293f99eaf4e59804bd66a1ff14a0f40 100644 (file)
@@ -202,7 +202,9 @@ vp8_prob *vp8_mv_ref_probs(VP8_COMMON *pc,
 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 @@ void vp8_find_best_ref_mvs(MACROBLOCKD *xd,
     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
index f8cf83799a9a51ebf5917f8d5cdc782bceadccd1..f8efd4199085f0ef564182193525892324a80142 100644 (file)
@@ -653,7 +653,7 @@ static void read_mb_modes_mv(VP8D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi,
       vp8_find_best_ref_mvs(xd,
                             xd->pre.y_buffer,
                             recon_y_stride,
-                            &best_mv);
+                            &best_mv, &nearest, &nearby);
     }
 #endif
 
@@ -732,7 +732,9 @@ static void read_mb_modes_mv(VP8D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi,
         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,
index 4689550226e4ddb5c661addc34af4598ca92092f..df5fa2ede78e07e295b5dd6536050c6b24776e62 100644 (file)
@@ -2652,7 +2652,10 @@ void setup_buffer_inter(VP8_COMP *cpi, MACROBLOCK *x, int idx, int frame_type,
   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
 }
index a8b6436efda76114213d814d6e665f4fd8f6a18b..9b848f3d5835e6f12ae25b493676bfe19d7bc911 100644 (file)
@@ -1311,6 +1311,7 @@ void vp8_stuff_mb_8x8(VP8_COMP *cpi,
   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 @@ void vp8_stuff_mb_8x8(VP8_COMP *cpi,
     *(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 @@ void vp8_stuff_mb_16x16(VP8_COMP *cpi,
   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 @@ void vp8_stuff_mb_16x16(VP8_COMP *cpi,
   }
   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 @@ void stuff1st_order_buv
   *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;