]> granicus.if.org Git - libvpx/commitdiff
Recompute mv inconsistency after mv search is done
authorAngie Chiang <angiebird@google.com>
Wed, 17 Oct 2018 22:54:25 +0000 (15:54 -0700)
committerAngie Chiang <angiebird@google.com>
Thu, 15 Nov 2018 01:01:51 +0000 (17:01 -0800)
Change-Id: I6061f38cb42eea2b4c8996ad372c829dc1051c8d

vp9/encoder/vp9_encoder.c
vp9/encoder/vp9_mcomp.c
vp9/encoder/vp9_mcomp.h

index e269955c11bf396a645cf200716656b8a39b538d..a2f9a8c458739413a7d3e2be72e11d78987a9029 100644 (file)
@@ -52,6 +52,9 @@
 #include "vp9/encoder/vp9_extend.h"
 #include "vp9/encoder/vp9_firstpass.h"
 #include "vp9/encoder/vp9_mbgraph.h"
+#if CONFIG_NON_GREEDY_MV
+#include "vp9/encoder/vp9_mcomp.h"
+#endif
 #include "vp9/encoder/vp9_multi_thread.h"
 #include "vp9/encoder/vp9_noise_estimate.h"
 #include "vp9/encoder/vp9_picklpf.h"
@@ -6089,6 +6092,7 @@ static void do_motion_search(VP9_COMP *cpi, ThreadData *td, int frame_idx,
 
 #define CHANGE_MV_SEARCH_ORDER 1
 #define USE_PQSORT 1
+#define RE_COMPUTE_MV_INCONSISTENCY 1
 
 #if CHANGE_MV_SEARCH_ORDER
 #if USE_PQSORT
@@ -6327,11 +6331,21 @@ void mc_flow_dispenser(VP9_COMP *cpi, GF_PICTURE *gf_picture, int frame_idx,
         TplDepStats *this_tpl_stats =
             &tpl_frame->tpl_stats_ptr[mi_row * tpl_frame->stride + mi_col];
         for (rf_idx = 0; rf_idx < 3; ++rf_idx) {
+#if RE_COMPUTE_MV_INCONSISTENCY
+          MV full_mv;
+          int_mv nb_full_mvs[NB_MVS_NUM];
+          prepare_nb_full_mvs(tpl_frame, mi_row, mi_col, rf_idx, bsize,
+                              nb_full_mvs);
+          full_mv.row = this_tpl_stats->mv_arr[rf_idx].as_mv.row >> 3;
+          full_mv.col = this_tpl_stats->mv_arr[rf_idx].as_mv.col >> 3;
+          this_tpl_stats->mv_cost[rf_idx] =
+              av1_nb_mvs_inconsistency(&full_mv, nb_full_mvs);
+#endif  // RE_COMPUTE_MV_INCONSISTENCY
           tpl_frame->mv_dist_sum[rf_idx] += this_tpl_stats->mv_dist[rf_idx];
           tpl_frame->mv_cost_sum[rf_idx] += this_tpl_stats->mv_cost[rf_idx];
         }
       }
-#endif
+#endif  // CONFIG_NON_GREEDY_MV
     }
   }
 }
index 4962516222bd5afbeda6a01ab08c72d8a954d727..1192ed64d20db6f2bd0147302b34f8e308a4de75 100644 (file)
@@ -1733,7 +1733,7 @@ static int exhuastive_mesh_search(const MACROBLOCK *x, MV *ref_mv, MV *best_mv,
 }
 
 #if CONFIG_NON_GREEDY_MV
-static double nb_mvs_inconsistency(const MV *mv, const int_mv *nb_mvs) {
+double av1_nb_mvs_inconsistency(const MV *mv, const int_mv *nb_mvs) {
   int i;
   double best_cost = -1;
   vpx_clear_system_state();
@@ -1801,7 +1801,7 @@ double vp9_diamond_search_sad_new(const MACROBLOCK *x,
 
   // Check the starting position
   *best_mv_dist = fn_ptr->sdf(what, what_stride, in_what, in_what_stride);
-  *best_mv_cost = nb_mvs_inconsistency(best_full_mv, nb_full_mvs);
+  *best_mv_cost = av1_nb_mvs_inconsistency(best_full_mv, nb_full_mvs);
   bestsad = (*best_mv_dist) + lambda * (*best_mv_cost);
 
   i = 0;
@@ -1834,7 +1834,8 @@ double vp9_diamond_search_sad_new(const MACROBLOCK *x,
           const MV this_mv = { best_full_mv->row + ss_mv[i].row,
                                best_full_mv->col + ss_mv[i].col };
           const double mv_dist = sad_array[t];
-          const double mv_cost = nb_mvs_inconsistency(&this_mv, nb_full_mvs);
+          const double mv_cost =
+              av1_nb_mvs_inconsistency(&this_mv, nb_full_mvs);
           double thissad = mv_dist + lambda * mv_cost;
           if (thissad < bestsad) {
             bestsad = thissad;
@@ -1854,7 +1855,8 @@ double vp9_diamond_search_sad_new(const MACROBLOCK *x,
           const uint8_t *const check_here = ss_os[i] + best_address;
           const double mv_dist =
               fn_ptr->sdf(what, what_stride, check_here, in_what_stride);
-          const double mv_cost = nb_mvs_inconsistency(&this_mv, nb_full_mvs);
+          const double mv_cost =
+              av1_nb_mvs_inconsistency(&this_mv, nb_full_mvs);
           double thissad = mv_dist + lambda * mv_cost;
           if (thissad < bestsad) {
             bestsad = thissad;
@@ -2440,7 +2442,7 @@ double vp9_refining_search_sad_new(const MACROBLOCK *x, MV *best_full_mv,
   vpx_clear_system_state();
   *best_mv_dist =
       fn_ptr->sdf(what->buf, what->stride, best_address, in_what->stride);
-  *best_mv_cost = nb_mvs_inconsistency(best_full_mv, nb_full_mvs);
+  *best_mv_cost = av1_nb_mvs_inconsistency(best_full_mv, nb_full_mvs);
   best_sad = (*best_mv_dist) + lambda * (*best_mv_cost);
 
   for (i = 0; i < search_range; i++) {
@@ -2462,7 +2464,7 @@ double vp9_refining_search_sad_new(const MACROBLOCK *x, MV *best_full_mv,
         const MV mv = { best_full_mv->row + neighbors[j].row,
                         best_full_mv->col + neighbors[j].col };
         const double mv_dist = sads[j];
-        const double mv_cost = nb_mvs_inconsistency(&mv, nb_full_mvs);
+        const double mv_cost = av1_nb_mvs_inconsistency(&mv, nb_full_mvs);
         const double thissad = mv_dist + lambda * mv_cost;
         if (thissad < best_sad) {
           best_sad = thissad;
@@ -2480,7 +2482,7 @@ double vp9_refining_search_sad_new(const MACROBLOCK *x, MV *best_full_mv,
           const double mv_dist =
               fn_ptr->sdf(what->buf, what->stride,
                           get_buf_from_mv(in_what, &mv), in_what->stride);
-          const double mv_cost = nb_mvs_inconsistency(&mv, nb_full_mvs);
+          const double mv_cost = av1_nb_mvs_inconsistency(&mv, nb_full_mvs);
           const double thissad = mv_dist + lambda * mv_cost;
           if (thissad < best_sad) {
             best_sad = thissad;
index 558ecbcd85c432dd4c608752d0286bf57692bf63..a159cb288edcaba290a98c9fd9918b113a56ec4c 100644 (file)
@@ -134,6 +134,8 @@ double vp9_full_pixel_diamond_new(const struct VP9_COMP *cpi, MACROBLOCK *x,
                                   const vp9_variance_fn_ptr_t *fn_ptr,
                                   const int_mv *nb_full_mvs,
                                   struct TplDepStats *tpl_stats, int rf_idx);
+
+double av1_nb_mvs_inconsistency(const MV *mv, const int_mv *nb_mvs);
 #endif  // CONFIG_NON_GREEDY_MV
 #ifdef __cplusplus
 }  // extern "C"