avfilter/palettegen: export color quantization ratio
authorClément Bœsch <clement@stupeflix.com>
Wed, 25 Feb 2015 14:34:13 +0000 (15:34 +0100)
committerClément Bœsch <clement@stupeflix.com>
Thu, 26 Feb 2015 13:20:02 +0000 (14:20 +0100)
doc/filters.texi
libavfilter/version.h
libavfilter/vf_palettegen.c

index baef346..0c72145 100644 (file)
@@ -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
index 83fd2a5..986d7a7 100644 (file)
@@ -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, \
index a7d1ffb..0d52843 100644 (file)
@@ -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);