]> granicus.if.org Git - libvpx/commitdiff
Let vp9_kmeans provide boundary for each group
authorAngie Chiang <angiebird@google.com>
Thu, 14 Mar 2019 22:06:45 +0000 (15:06 -0700)
committerAngie Chiang <angiebird@google.com>
Thu, 14 Mar 2019 23:50:51 +0000 (16:50 -0700)
boundary_ls[j] is the upper bound of data centered at ctr_ls[j]

Add vp9_get_group_idx() for computing group_idx

Change-Id: I3b1b488edf8acbfb63c469eeeba15f3e42b0a645

vp9/encoder/vp9_encodeframe.c
vp9/encoder/vp9_encodeframe.h
vp9/encoder/vp9_encoder.h

index 22b5f06ac5a1f6bd0752199cfe55cf59581623fd..57d74b031dc2782720c95fcbb643e46669380dbe 100644 (file)
@@ -8,6 +8,7 @@
  *  be found in the AUTHORS file in the root of the source tree.
  */
 
+#include <float.h>
 #include <limits.h>
 #include <math.h>
 #include <stdio.h>
@@ -5688,12 +5689,33 @@ static int compare_kmeans_data(const void *a, const void *b) {
   }
 }
 
-void vp9_kmeans(double *ctr_ls, int k, KMEANS_DATA *arr, int size) {
+static void compute_boundary_ls(const double *ctr_ls, int k,
+                                double *boundary_ls) {
+  // boundary_ls[j] is the upper bound of data centered at ctr_ls[j]
+  int j;
+  for (j = 0; j < k - 1; ++j) {
+    boundary_ls[j] = (ctr_ls[j] + ctr_ls[j + 1]) / 2.;
+  }
+  boundary_ls[k - 1] = DBL_MAX;
+}
+
+int vp9_get_group_idx(double value, double *boundary_ls, int k) {
+  int group_idx = 0;
+  while (value >= boundary_ls[group_idx]) {
+    ++group_idx;
+    if (group_idx == k - 1) {
+      break;
+    }
+  }
+  return group_idx;
+}
+
+void vp9_kmeans(double *ctr_ls, double *boundary_ls, int k, KMEANS_DATA *arr,
+                int size) {
   double min, max;
   double step;
   int i, j;
   int itr;
-  double boundary_ls[MAX_KMEANS_GROUPS] = { 0 };
   int group_idx;
   double sum;
   int count;
@@ -5714,11 +5736,7 @@ void vp9_kmeans(double *ctr_ls, int k, KMEANS_DATA *arr, int size) {
   }
 
   for (itr = 0; itr < 10; ++itr) {
-    for (j = 0; j < k - 1; ++j) {
-      boundary_ls[j] = (ctr_ls[j] + ctr_ls[j + 1]) / 2.;
-    }
-    boundary_ls[k - 1] = max + 1;
-
+    compute_boundary_ls(ctr_ls, k, boundary_ls);
     group_idx = 0;
     count = 0;
     sum = 0;
@@ -5744,10 +5762,7 @@ void vp9_kmeans(double *ctr_ls, int k, KMEANS_DATA *arr, int size) {
   }
 
   // compute group_idx
-  for (j = 0; j < k - 1; ++j) {
-    boundary_ls[j] = (ctr_ls[j] + ctr_ls[j + 1]) / 2.;
-  }
-  boundary_ls[k - 1] = max + 1;
+  compute_boundary_ls(ctr_ls, k, boundary_ls);
   group_idx = 0;
   for (i = 0; i < size; ++i) {
     while (arr[i].value >= boundary_ls[group_idx]) {
@@ -5890,7 +5905,8 @@ static void encode_frame_internal(VP9_COMP *cpi) {
     }
 
     if (cpi->sf.enable_wiener_variance && cm->show_frame) {
-      vp9_kmeans(cpi->kmeans_ctr_ls, cpi->kmeans_ctr_num, cpi->kmeans_data_arr,
+      vp9_kmeans(cpi->kmeans_ctr_ls, cpi->kmeans_boundary_ls,
+                 cpi->kmeans_ctr_num, cpi->kmeans_data_arr,
                  cpi->kmeans_data_size);
     }
 
index a761ae68beb5429ccb450ba5132a3d3eed03ddc1..29a56b923cf496fab1555473c5328c44be03bd56 100644 (file)
@@ -46,7 +46,9 @@ void vp9_set_variance_partition_thresholds(struct VP9_COMP *cpi, int q,
                                            int content_state);
 
 struct KMEANS_DATA;
-void vp9_kmeans(double *ctr_ls, int k, struct KMEANS_DATA *arr, int size);
+void vp9_kmeans(double *ctr_ls, double *boundary_ls, int k,
+                struct KMEANS_DATA *arr, int size);
+int vp9_get_group_idx(double value, double *boundary_ls, int k);
 
 #ifdef __cplusplus
 }  // extern "C"
index 278408fd5840230d42061b3c09a425581756dee3..24ccaf99d8c17ccd9d7b0531d840b0dc109502e6 100644 (file)
@@ -607,6 +607,7 @@ typedef struct VP9_COMP {
   int kmeans_data_size;
   int kmeans_data_stride;
   double kmeans_ctr_ls[MAX_KMEANS_GROUPS];
+  double kmeans_boundary_ls[MAX_KMEANS_GROUPS];
   int kmeans_ctr_num;
 #if CONFIG_NON_GREEDY_MV
   int tpl_ready;