diff mbox series

[FFmpeg-devel,v2,26/32] avfilter/palettegen: use lowbias32 for color hashing

Message ID 20221227231814.2520181-27-u@pkh.me
State Accepted
Commit c9084cd0e2d7d3a56f2ae32b01f4cecc9c4d4597
Headers show
Series [FFmpeg-devel,v2,01/32] avfilter/palettegen: allow a minimum of 2 colors | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 success Make fate finished
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Clément Bœsch Dec. 27, 2022, 11:18 p.m. UTC
1.12x faster overall in palettegen on my machine.
---
 libavfilter/vf_palettegen.c | 19 ++-----------------
 1 file changed, 2 insertions(+), 17 deletions(-)
diff mbox series

Patch

diff --git a/libavfilter/vf_palettegen.c b/libavfilter/vf_palettegen.c
index 6301cf6358..97e12f7274 100644
--- a/libavfilter/vf_palettegen.c
+++ b/libavfilter/vf_palettegen.c
@@ -63,8 +63,7 @@  enum {
     NB_STATS_MODE
 };
 
-#define NBITS 5
-#define HIST_SIZE (1<<(3*NBITS))
+#define HIST_SIZE (1<<15)
 
 typedef struct PaletteGenContext {
     const AVClass *class;
@@ -387,27 +386,13 @@  static AVFrame *get_palette_frame(AVFilterContext *ctx)
     return out;
 }
 
-/**
- * Hashing function for the color.
- * It keeps the NBITS least significant bit of each component to make it
- * "random" even if the scene doesn't have much different colors.
- */
-static inline unsigned color_hash(uint32_t color)
-{
-    const uint8_t r = color >> 16 & ((1<<NBITS)-1);
-    const uint8_t g = color >>  8 & ((1<<NBITS)-1);
-    const uint8_t b = color       & ((1<<NBITS)-1);
-
-    return r << (NBITS * 2) | g << NBITS | b;
-}
-
 /**
  * Locate the color in the hash table and increment its counter.
  */
 static int color_inc(struct hist_node *hist, uint32_t color)
 {
     int i;
-    const unsigned hash = color_hash(color);
+    const uint32_t hash = ff_lowbias32(color) & (HIST_SIZE - 1);
     struct hist_node *node = &hist[hash];
     struct color_ref *e;