]> granicus.if.org Git - libvpx/commitdiff
Palette code: Use built-in qsort() method; create remove_dup() method.
authorUrvang Joshi <urvang@google.com>
Thu, 4 Aug 2016 23:17:58 +0000 (16:17 -0700)
committerUrvang Joshi <urvang@google.com>
Wed, 10 Aug 2016 19:10:09 +0000 (12:10 -0700)
Change-Id: Id816413307334336a9f473540cf9aa0e789ea9e9

vp10/encoder/palette.c
vp10/encoder/palette.h
vp10/encoder/rdopt.c

index 94e0c875554371a2a0970f752d539a3134c5a3c3..d52e5fe9d861f572aa97852007c233cd4a02bda4 100644 (file)
@@ -9,6 +9,7 @@
  */
 
 #include <math.h>
+#include <stdlib.h>
 #include "vp10/encoder/palette.h"
 
 static float calc_dist(const float *p1, const float *p2, int dim) {
@@ -117,26 +118,27 @@ void vp10_k_means(const float *data, float *centroids, uint8_t *indices, int n,
   }
 }
 
-void vp10_insertion_sort(float *data, int n) {
-  int i, j, k;
-  float val;
-
-  if (n <= 1)
-    return;
-
-  for (i = 1; i < n; ++i) {
-    val = data[i];
-    j = 0;
-    while (val > data[j] && j < i)
-      ++j;
-
-    if (j == i)
-      continue;
+static int float_comparer(const void *a, const void *b) {
+  const float fa = *(const float *)a;
+  const float fb = *(const float *)b;
+  return (fa > fb) - (fb < fa);
+}
 
-    for (k = i; k > j; --k)
-      data[k] = data[k - 1];
-    data[j] = val;
+int vp10_remove_duplicates(float *centroids, int num_centroids) {
+  int num_unique;  // number of unique centroids
+  int i;
+  qsort(centroids, num_centroids, sizeof(*centroids), float_comparer);
+  for (i = 0; i < num_centroids; ++i) {
+    centroids[i] = roundf(centroids[i]);
+  }
+  // Remove duplicates.
+  num_unique = 1;
+  for (i = 1; i < num_centroids; ++i) {
+    if (centroids[i] != centroids[i - 1]) {  // found a new unique centroid
+      centroids[num_unique++] = centroids[i];
+    }
   }
+  return num_unique;
 }
 
 int vp10_count_colors(const uint8_t *src, int stride, int rows, int cols) {
index 3ec0f73bcbef1e13cd0150e715d6372179f2d559..d417085fc4f5ecf108fb0dca6705afc99ca97965 100644 (file)
 extern "C" {
 #endif
 
-void vp10_insertion_sort(float *data, int n);
 void vp10_calc_indices(const float *data, const float *centroids,
                        uint8_t *indices, int n, int k, int dim);
 void vp10_k_means(const float *data, float *centroids, uint8_t *indices, int n,
                   int k, int dim, int max_itr);
+
+// Given a list of centroids, returns the unique number of centroids 'k', and
+// puts these unique centroids in first 'k' indices of 'centroids' array.
+int vp10_remove_duplicates(float *centroids, int num_centroids);
+
 int vp10_count_colors(const uint8_t *src, int stride, int rows, int cols);
 #if CONFIG_VP9_HIGHBITDEPTH
 int vp10_count_colors_highbd(const uint8_t *src8, int stride, int rows,
index 1a4ff37cd0b72356ba28ce023a8cabff2ededfd4..a0660de4725fd326f8a594a5e2280754abae566b 100644 (file)
@@ -1914,18 +1914,7 @@ static int rd_pick_palette_intra_sby(VP10_COMP *cpi, MACROBLOCK *x,
       for (i = 0; i < n; ++i)
         centroids[i] = lb + (2 * i + 1) * (ub - lb) / n / 2;
       vp10_k_means(data, centroids, color_map, rows * cols, n, 1, max_itr);
-      vp10_insertion_sort(centroids, n);
-      for (i = 0; i < n; ++i)
-        centroids[i] = roundf(centroids[i]);
-      // remove duplicates
-      i = 1;
-      for (j = 1; j < n; ++j) {
-        if (centroids[j] != centroids[j - 1]) {  // found a new unique centroid
-          centroids[i] = centroids[j];
-          ++i;
-        }
-      }
-      k = i;  // number of unique centroids
+      k = vp10_remove_duplicates(centroids, n);
 
 #if CONFIG_VP9_HIGHBITDEPTH
       if (cpi->common.use_highbitdepth)