From ab093bdeefad1489264e064b43e937f40b83f531 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20B=C5=93sch?= Date: Wed, 25 Feb 2015 15:34:13 +0100 Subject: [PATCH] avfilter/palettegen: export color quantization ratio --- doc/filters.texi | 5 +++++ libavfilter/version.h | 2 +- libavfilter/vf_palettegen.c | 15 +++++++++++++-- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/doc/filters.texi b/doc/filters.texi index baef346e66..0c72145d80 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -6980,6 +6980,11 @@ the background is static. Default value is @var{full}. @end table +The filter also exports the frame metadata @code{lavfi.color_quant_ratio} +(@code{nb_color_in / nb_color_out}) which you can use to evaluate the degree of +color quantization of the palette. This information is also visible at +@var{info} logging level. + @subsection Examples @itemize diff --git a/libavfilter/version.h b/libavfilter/version.h index 83fd2a52ec..986d7a7230 100644 --- a/libavfilter/version.h +++ b/libavfilter/version.h @@ -31,7 +31,7 @@ #define LIBAVFILTER_VERSION_MAJOR 5 #define LIBAVFILTER_VERSION_MINOR 11 -#define LIBAVFILTER_VERSION_MICRO 101 +#define LIBAVFILTER_VERSION_MICRO 102 #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \ LIBAVFILTER_VERSION_MINOR, \ diff --git a/libavfilter/vf_palettegen.c b/libavfilter/vf_palettegen.c index a7d1ffbc3b..0d52843cb8 100644 --- a/libavfilter/vf_palettegen.c +++ b/libavfilter/vf_palettegen.c @@ -275,6 +275,15 @@ static struct color_ref **load_color_refs(const struct hist_node *hist, int nb_r return refs; } +static double set_colorquant_ratio_meta(AVFrame *out, int nb_out, int nb_in) +{ + char buf[32]; + const double ratio = (double)nb_out / nb_in; + snprintf(buf, sizeof(buf), "%f", ratio); + av_dict_set(&out->metadata, "lavfi.color_quant_ratio", buf, 0); + return ratio; +} + /** * Main function implementing the Median Cut Algorithm defined by Paul Heckbert * in Color Image Quantization for Frame Buffer Display (1982) @@ -284,6 +293,7 @@ static AVFrame *get_palette_frame(AVFilterContext *ctx) AVFrame *out; PaletteGenContext *s = ctx->priv; AVFilterLink *outlink = ctx->outputs[0]; + double ratio; int box_id = 0; struct range_box *box; @@ -362,8 +372,9 @@ static AVFrame *get_palette_frame(AVFilterContext *ctx) box = box_id >= 0 ? &s->boxes[box_id] : NULL; } - av_log(ctx, AV_LOG_DEBUG, "%d%s boxes generated out of %d colors\n", - s->nb_boxes, s->reserve_transparent ? "(+1)" : "", s->nb_refs); + ratio = set_colorquant_ratio_meta(out, s->nb_boxes, s->nb_refs); + av_log(ctx, AV_LOG_INFO, "%d%s colors generated out of %d colors; ratio=%f\n", + s->nb_boxes, s->reserve_transparent ? "(+1)" : "", s->nb_refs, ratio); qsort(s->boxes, s->nb_boxes, sizeof(*s->boxes), cmp_color);