shithub: libvpx

Download patch

ref: ee554c8cebcb0e3a7a549b98a8b3d398fc88fd07
parent: 291055812b6962e808619892abe8c87277d843c4
author: Angie Chiang <angiebird@google.com>
date: Tue Jul 16 13:49:22 EDT 2019

Let vp9_nb_mvs_inconsistency call log2 just once

The bahavior of this function is to compute log2 of mv difference,
i.e. min log2(1 + row_diff * row_diff + col_diff * col_diff)
against available neghbor mvs.
Since the log2 is monotonic increasing, we can compute
min row_diff * row_diff + col_diff * col_diff first
then apply log2 in the end

non_greedy_mv encoding time is reduced by 1.5%

Change-Id: I70d40060e2621daec27229f1f6d9fea0286aa04e

--- a/vp9/encoder/vp9_mcomp.c
+++ b/vp9/encoder/vp9_mcomp.c
@@ -1901,26 +1901,30 @@
 
 int64_t vp9_nb_mvs_inconsistency(const MV *mv, const int_mv *nb_mvs,
                                  int mv_num) {
+  // The bahavior of this function is to compute log2 of mv difference,
+  // i.e. min log2(1 + row_diff * row_diff + col_diff * col_diff)
+  // against available neghbor mvs.
+  // Since the log2 is monotonic increasing, we can compute
+  // min row_diff * row_diff + col_diff * col_diff first
+  // then apply log2 in the end
   int i;
-  int update = 0;
-  int64_t best_cost = 0;
-  vpx_clear_system_state();
+  int64_t min_abs_diff = INT64_MAX;
+  int cnt = 0;
   for (i = 0; i < mv_num; ++i) {
     if (nb_mvs[i].as_int != INVALID_MV) {
       MV nb_mv = nb_mvs[i].as_mv;
       const int64_t row_diff = abs(mv->row - nb_mv.row);
       const int64_t col_diff = abs(mv->col - nb_mv.col);
-      const int64_t cost =
-          log2_approximation(1 + row_diff * row_diff + col_diff * col_diff);
-      if (update == 0) {
-        best_cost = cost;
-        update = 1;
-      } else {
-        best_cost = cost < best_cost ? cost : best_cost;
-      }
+      const int64_t abs_diff = row_diff * row_diff + col_diff * col_diff;
+      min_abs_diff = VPXMIN(abs_diff, min_abs_diff);
+      ++cnt;
     }
   }
-  return best_cost;
+  if (cnt) {
+    return log2_approximation(1 + min_abs_diff);
+  } else {
+    return 0;
+  }
 }
 
 static int64_t exhaustive_mesh_search_multi_step(