[FFmpeg-devel] [PATCH v2 26/32] avfilter/palettegen: use lowbias32 for color hashing
Clément Bœsch
u at pkh.me
Wed Dec 28 01:18:08 EET 2022
1.12x faster overall in palettegen on my machine.
---
libavfilter/vf_palettegen.c | 19 ++-----------------
1 file changed, 2 insertions(+), 17 deletions(-)
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;
--
2.39.0
More information about the ffmpeg-devel
mailing list