[FFmpeg-cvslog] lavfi/histogram: logarithmic mode for levels

Paul B Mahol git at videolan.org
Wed May 15 14:39:04 CEST 2013


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Wed May 15 12:36:41 2013 +0000| [c45b823bf80fdb5dd6dedb67cd56935b83c17ba5] | committer: Paul B Mahol

lavfi/histogram: logarithmic mode for levels

Signed-off-by: Paul B Mahol <onemda at gmail.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=c45b823bf80fdb5dd6dedb67cd56935b83c17ba5
---

 doc/filters.texi           |    4 ++++
 libavfilter/vf_histogram.c |   11 ++++++++++-
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/doc/filters.texi b/doc/filters.texi
index d69a1a3..2bbba35 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -4294,6 +4294,10 @@ components that are supposed to be identical, such as neutral whites, grays,
 or blacks.
 @end table
 Default is @code{parade}.
+
+ at item levels_mode
+Set mode for @code{levels}. Can be either @code{linear}, or @code{logarithmic}.
+Default is @code{linear}.
 @end table
 
 @subsection Examples
diff --git a/libavfilter/vf_histogram.c b/libavfilter/vf_histogram.c
index f3fc9ff..40afe1f 100644
--- a/libavfilter/vf_histogram.c
+++ b/libavfilter/vf_histogram.c
@@ -48,6 +48,7 @@ typedef struct HistogramContext {
     int            step;
     int            waveform_mode;
     int            display_mode;
+    int            levels_mode;
 } HistogramContext;
 
 #define OFFSET(x) offsetof(HistogramContext, x)
@@ -68,6 +69,9 @@ static const AVOption histogram_options[] = {
     { "display_mode", "set display mode", OFFSET(display_mode), AV_OPT_TYPE_INT, {.i64=1}, 0, 1, FLAGS, "display_mode"},
     { "parade",  NULL, 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, FLAGS, "display_mode" },
     { "overlay", NULL, 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, FLAGS, "display_mode" },
+    { "levels_mode", "set levels mode", OFFSET(levels_mode), AV_OPT_TYPE_INT, {.i64=0}, 0, 1, FLAGS, "levels_mode"},
+    { "linear",      NULL, 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, FLAGS, "levels_mode" },
+    { "logarithmic", NULL, 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, FLAGS, "levels_mode" },
     { NULL },
 };
 
@@ -198,7 +202,12 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
                 h->max_hval = FFMAX(h->max_hval, h->histogram[i]);
 
             for (i = 0; i < outlink->w; i++) {
-                int col_height = h->level_height - (h->histogram[i] * (int64_t)h->level_height + h->max_hval - 1) / h->max_hval;
+                int col_height;
+
+                if (h->levels_mode)
+                    col_height = round(h->level_height * (1. - (log2(h->histogram[i] + 1) / log2(h->max_hval + 1))));
+                else
+                    col_height = h->level_height - (h->histogram[i] * (int64_t)h->level_height + h->max_hval - 1) / h->max_hval;
 
                 for (j = h->level_height - 1; j >= col_height; j--) {
                     if (h->display_mode) {



More information about the ffmpeg-cvslog mailing list