]> granicus.if.org Git - libvpx/commitdiff
Support for a fast diamond search
authorDeb Mukherjee <debargha@google.com>
Sat, 8 Mar 2014 01:15:09 +0000 (17:15 -0800)
committerDeb Mukherjee <debargha@google.com>
Sat, 8 Mar 2014 01:15:09 +0000 (17:15 -0800)
Adds a fast diamond search which is about 5% faster than FAST_HEX
with only a 0.1% drop in psnr when turned on for both speeds 5 and 7.
This search is turned on for speed 7.

Change-Id: I497630aa88a5148926086bb3038e7975e5f4eb98

vp9/encoder/vp9_mcomp.c
vp9/encoder/vp9_mcomp.h
vp9/encoder/vp9_onyx_if.c
vp9/encoder/vp9_onyx_int.h
vp9/encoder/vp9_pickmode.c
vp9/encoder/vp9_rdopt.c

index 158bb68499c94e593b754fc1e91a99acf85284b2..3ff4a672d428d029dc88137b9cc382d79a6a7647 100644 (file)
@@ -884,6 +884,20 @@ int vp9_fast_hex_search(const MACROBLOCK *x,
                         center_mv, best_mv);
 }
 
+int vp9_fast_dia_search(const MACROBLOCK *x,
+                        MV *ref_mv,
+                        int search_param,
+                        int sad_per_bit,
+                        int do_init_search,
+                        const vp9_variance_fn_ptr_t *vfp,
+                        int use_mvcost,
+                        const MV *center_mv,
+                        MV *best_mv) {
+  return vp9_bigdia_search(x, ref_mv, MAX(MAX_MVSEARCH_STEPS - 2, search_param),
+                           sad_per_bit, do_init_search, vfp, use_mvcost,
+                           center_mv, best_mv);
+}
+
 #undef CHECK_BETTER
 
 int vp9_full_range_search_c(const MACROBLOCK *x, MV *ref_mv, MV *best_mv,
index 39360f1b4968fc4384b6531b0fe3384a8172f012..e1e149e5fdfa4a6e48ecac27e50c7104d5abe05a 100644 (file)
@@ -76,6 +76,7 @@ integer_mv_pattern_search_fn vp9_hex_search;
 integer_mv_pattern_search_fn vp9_bigdia_search;
 integer_mv_pattern_search_fn vp9_square_search;
 integer_mv_pattern_search_fn vp9_fast_hex_search;
+integer_mv_pattern_search_fn vp9_fast_dia_search;
 
 typedef int (fractional_mv_step_fp) (
     const MACROBLOCK *x,
index 61881d8aecc5f88e946e613d4f362c4cf8e7a4cc..318e7168f87f735588ab2b0b409b8d225ef21975 100644 (file)
@@ -872,7 +872,7 @@ static void set_rt_speed_feature(VP9_COMMON *cm,
   if (speed >= 7) {
     sf->partition_search_type = VAR_BASED_FIXED_PARTITION;
     sf->use_nonrd_pick_mode = 1;
-    sf->search_method = FAST_HEX;
+    sf->search_method = FAST_DIAMOND;
   }
   if (speed >= 8) {
     int i;
index a8e7b69e28db96895ddfb5ea7d477f7c5eb3affa..4ee035b37e4fb638e2664b3fe0bc3b45c26fbfc8 100644 (file)
@@ -137,7 +137,8 @@ typedef enum {
   HEX = 2,
   BIGDIA = 3,
   SQUARE = 4,
-  FAST_HEX = 5
+  FAST_HEX = 5,
+  FAST_DIAMOND = 6
 } SEARCH_METHODS;
 
 typedef enum {
index 92409a179332ade21144e5e4022b8df48399c5e3..9ece4593d7c5537da512cee068be9961ffed58d0 100644 (file)
@@ -86,7 +86,12 @@ static int full_pixel_motion_search(VP9_COMP *cpi, MACROBLOCK *x,
   mvp_full.col >>= 3;
   mvp_full.row >>= 3;
 
-  if (cpi->sf.search_method == FAST_HEX) {
+  if (cpi->sf.search_method == FAST_DIAMOND) {
+    // NOTE: this returns SAD
+    vp9_fast_dia_search(x, &mvp_full, step_param, sadpb, 0,
+                        &cpi->fn_ptr[bsize], 1,
+                        &ref_mv, &tmp_mv->as_mv);
+  } else if (cpi->sf.search_method == FAST_HEX) {
     // NOTE: this returns SAD
     vp9_fast_hex_search(x, &mvp_full, step_param, sadpb, 0,
                         &cpi->fn_ptr[bsize], 1,
index 7b14fdd63b3bbd504405036ca3f4b5daacac197d..4be4c50d1c16a81739bd5776661aed2b173c37e6 100644 (file)
@@ -2457,7 +2457,14 @@ static void single_motion_search(VP9_COMP *cpi, MACROBLOCK *x,
   // Further step/diamond searches as necessary
   further_steps = (cpi->sf.max_step_search_steps - 1) - step_param;
 
-  if (cpi->sf.search_method == FAST_HEX) {
+  if (cpi->sf.search_method == FAST_DIAMOND) {
+    bestsme = vp9_fast_dia_search(x, &mvp_full, step_param, sadpb, 0,
+                                  &cpi->fn_ptr[bsize], 1,
+                                  &ref_mv, &tmp_mv->as_mv);
+    if (bestsme < INT_MAX)
+      bestsme = vp9_get_mvpred_var(x, &tmp_mv->as_mv, &ref_mv,
+                                   &cpi->fn_ptr[bsize], 1);
+  } else if (cpi->sf.search_method == FAST_HEX) {
     bestsme = vp9_fast_hex_search(x, &mvp_full, step_param, sadpb, 0,
                                   &cpi->fn_ptr[bsize], 1,
                                   &ref_mv, &tmp_mv->as_mv);