]> granicus.if.org Git - libvpx/commitdiff
changed mv candidate search for superblocks
authorYaowu Xu <yaowu@google.com>
Fri, 16 Nov 2012 14:31:53 +0000 (06:31 -0800)
committerYaowu Xu <yaowu@google.com>
Fri, 16 Nov 2012 15:01:13 +0000 (07:01 -0800)
added additional motion vectors at close neighborhood of a superblock
to the list of candiate motion vectors, and removed a couple that are
further away.

The change helped std-hd set about .8% (all metrics) and smaller gain
for derf set.

Change-Id: Iaa69b98614db43420ed3fd4738d0ca5587b90045

vp9/common/mvref_common.c

index a412a6c8a5cbb030982203fb70da620b7df447e1..654b4903f8fad64e49625a5a0c4e239519af9e22 100644 (file)
 #include "mvref_common.h"
 
 #define MVREF_NEIGHBOURS 8
-static int mv_ref_search[MVREF_NEIGHBOURS][2] =
-  { {0,-1},{-1,0},{-1,-1},{0,-2},{-2,0},{-1,-2},{-2,-1},{-2,-2} };
-static int ref_distance_weight[MVREF_NEIGHBOURS] =
-  { 3,3,2,1,1,1,1,1 };
-
+static int mb_mv_ref_search[MVREF_NEIGHBOURS][2] = {
+    {0, -1}, {-1, 0}, {-1, -1}, {0, -2},
+    {-2, 0}, {-1, -2}, {-2, -1}, {-2, -2}
+};
+static int mb_ref_distance_weight[MVREF_NEIGHBOURS] =
+  { 3, 3, 2, 1, 1, 1, 1, 1 };
+#if CONFIG_SUPERBLOCKS
+static int sb_mv_ref_search[MVREF_NEIGHBOURS][2] = {
+    {0, -1}, {-1, 0}, {1, -1}, {-1, 1},
+    {-1, -1}, {0, -2}, {-2, 0}, {-1, -2}
+};
+static int sb_ref_distance_weight[MVREF_NEIGHBOURS] =
+  { 3, 3, 2, 2, 2, 1, 1, 1 };
+#endif
 // clamp_mv
 #define MV_BORDER (16 << 3) // Allow 16 pels in 1/8th pel units
 static void clamp_mv(const MACROBLOCKD *xd, int_mv *mv) {
@@ -224,12 +233,26 @@ void vp9_find_mv_refs(
   int index = 0;
   int ref_weight = 0;
   int valid_mv_ref;
+  int (*mv_ref_search)[2];
+  int *ref_distance_weight;
 
   // Blank the reference vector lists and other local structures.
   vpx_memset(mv_ref_list, 0, sizeof(int_mv) * MAX_MV_REFS);
   vpx_memset(candidate_mvs, 0, sizeof(int_mv) * MAX_MV_REFS);
   vpx_memset(candidate_scores, 0, sizeof(candidate_scores));
 
+#if CONFIG_SUPERBLOCKS
+  if (mbmi->encoded_as_sb) {
+    mv_ref_search = sb_mv_ref_search;
+    ref_distance_weight = sb_ref_distance_weight;
+  } else {
+    mv_ref_search = mb_mv_ref_search;
+    ref_distance_weight = mb_ref_distance_weight;
+  }
+#else
+  mv_ref_search = mb_mv_ref_search;
+  ref_distance_weight = mb_ref_distance_weight;
+#endif
   // Populate a list with candidate reference vectors from the
   // spatial neighbours.
   for (i = 0; i < 2; ++i) {