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

Paul B Mahol git at videolan.org
Mon Feb 18 21:18:07 CET 2013


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Mon Feb 18 20:12:07 2013 +0000| [480ddf2bc9c0796493eb76203e255c4c84881947] | committer: Paul B Mahol

lavfi/histogram: overlay display mode for levels histogram mode

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

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

 doc/filters.texi           |   28 ++++++++++++++++------------
 libavfilter/vf_histogram.c |   15 ++++++++++-----
 2 files changed, 26 insertions(+), 17 deletions(-)

diff --git a/doc/filters.texi b/doc/filters.texi
index a9ee7cb..43bfd9c 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -3170,29 +3170,33 @@ Set mode for @code{waveform}. Can be either @code{row}, or @code{column}.
 Default is @code{row}.
 
 @item display_mode
-Set display mode for @code{waveform}.
+Set display mode for @code{waveform} and @code{levels}.
 It accepts the following values:
 @table @samp
 @item parade
-Display separate waveforms for the color components side by side in
- at code{row} mode or one below other in @code{column} mode.
-
-In this display mode it is easy to spot color casts in the highlights and
-shadows of an image, by comparing the contours of the top and the bottom
-of each waveform. Since whites, grays, and blacks are characterized by
+Display separate graph for the color components side by side in
+ at code{row} waveform mode or one below other in @code{column} waveform mode
+for @code{waveform} histogram mode. For @code{levels} histogram mode
+per color component graphs are placed one bellow other.
+
+This display mode in @code{waveform} histogram mode makes it easy to spot
+color casts in the highlights and shadows of an image, by comparing the
+contours of the top and the bottom of each waveform.
+Since whites, grays, and blacks are characterized by
 exactly equal amounts of red, green, and blue, neutral areas of the
-picture should display three waveforms of roughly equal height.
+picture should display three waveforms of roughly equal width/height.
 If not, the correction is easy to make by making adjustments to level the
 three waveforms.
 
 @item overlay
 Presents information that's identical to that in the @code{parade}, except
-that the waveforms representing color components are superimposed directly
+that the graphs representing color components are superimposed directly
 over one another.
 
-This display mode can make it easier to spot the relative differences or
-similarities in overlapping areas of the color components that are supposed
-to be identical, such as neutral whites, grays, or blacks.
+This display mode in @code{waveform} histogram mode can make it easier to spot
+the relative differences or similarities in overlapping areas of the color
+components that are supposed to be identical, such as neutral whites, grays,
+or blacks.
 @end table
 Default is @code{parade}.
 @end table
diff --git a/libavfilter/vf_histogram.c b/libavfilter/vf_histogram.c
index ee9689f..279e44a 100644
--- a/libavfilter/vf_histogram.c
+++ b/libavfilter/vf_histogram.c
@@ -153,7 +153,7 @@ static int config_output(AVFilterLink *outlink)
     switch (h->mode) {
     case MODE_LEVELS:
         outlink->w = 256;
-        outlink->h = (h->level_height + h->scale_height) * h->ncomp;
+        outlink->h = (h->level_height + h->scale_height) * FFMAX(h->ncomp * h->display_mode, 1);
         break;
     case MODE_WAVEFORM:
         if (h->waveform_mode)
@@ -200,7 +200,7 @@ static int filter_frame(AVFilterLink *inlink, AVFilterBufferRef *in)
     switch (h->mode) {
     case MODE_LEVELS:
         for (k = 0; k < h->ncomp; k++) {
-            int start = k * (h->level_height + h->scale_height);
+            int start = k * (h->level_height + h->scale_height) * h->display_mode;
 
             for (i = 0; i < in->video->h; i++) {
                 src = in->data[k] + i * in->linesize[k];
@@ -214,9 +214,14 @@ static int filter_frame(AVFilterLink *inlink, AVFilterBufferRef *in)
             for (i = 0; i < outlink->w; i++) {
                 int col_height = h->level_height - (float)h->histogram[i] / h->max_hval * h->level_height;
 
-                for (j = h->level_height - 1; j >= col_height; j--)
-                    for (l = 0; l < h->ncomp; l++)
-                        out->data[l][(j + start) * out->linesize[l] + i] = h->fg_color[l];
+                for (j = h->level_height - 1; j >= col_height; j--) {
+                    if (h->display_mode) {
+                        for (l = 0; l < h->ncomp; l++)
+                            out->data[l][(j + start) * out->linesize[l] + i] = h->fg_color[l];
+                    } else {
+                        out->data[k][(j + start) * out->linesize[k] + i] = 255;
+                    }
+                }
                 for (j = h->level_height + h->scale_height - 1; j >= h->level_height; j--)
                     out->data[k][(j + start) * out->linesize[k] + i] = i;
             }



More information about the ffmpeg-cvslog mailing list