]> granicus.if.org Git - libvpx/commitdiff
Change log2_fast to log2_approximation
authorAngie Chiang <angiebird@google.com>
Tue, 18 Jun 2019 22:33:23 +0000 (15:33 -0700)
committerAngie Chiang <angiebird@google.com>
Wed, 19 Jun 2019 19:10:58 +0000 (12:10 -0700)
This reduce non_greedy_mv encoding time by 8.9%

Use linear approximation for value >= 1024

BDRate increases slightly on hdres
lowres: -0.002
midres: 0.007
hdres: 0.057

Change-Id: I55fd5e0bf0ab2206a286e11974f701cc48084be8

vp9/encoder/vp9_mcomp.c

index 2d4b81d72898ab0d006ee84e2f536f264f6df0b4..572eb3f8829ab398078ff0cef161e5df712c3bec 100644 (file)
@@ -1884,12 +1884,15 @@ static const double log2_table[LOG2_TABLE_SIZE] = {
   9.998590,
 };
 
-static double log2_fast(int v) {
+static double log2_approximation(int v) {
   assert(v > 0);
   if (v < LOG2_TABLE_SIZE) {
     return log2_table[v];
   } else {
-    return log2(v);
+    // use linear approximation when v >= 2^10
+    const double slope = 0.001409;  // slope = 1 / (log(2) * 1024)
+    assert(LOG2_TABLE_SIZE == 1 << 10);
+    return slope * (v - LOG2_TABLE_SIZE) + 10;
   }
 }
 double vp9_nb_mvs_inconsistency(const MV *mv, const int_mv *nb_mvs,
@@ -1903,7 +1906,8 @@ double vp9_nb_mvs_inconsistency(const MV *mv, const int_mv *nb_mvs,
       MV nb_mv = nb_mvs[i].as_mv;
       const int row_diff = abs(mv->row - nb_mv.row);
       const int col_diff = abs(mv->col - nb_mv.col);
-      double cost = log2_fast(1 + row_diff * row_diff + col_diff * col_diff);
+      double cost =
+          log2_approximation(1 + row_diff * row_diff + col_diff * col_diff);
       if (update == 0) {
         best_cost = cost;
         update = 1;