From 480ddf2bc9c0796493eb76203e255c4c84881947 Mon Sep 17 00:00:00 2001 From: Paul B Mahol Date: Mon, 18 Feb 2013 20:12:07 +0000 Subject: [PATCH] lavfi/histogram: overlay display mode for levels histogram mode Signed-off-by: Paul B Mahol --- doc/filters.texi | 26 +++++++++++++++----------- libavfilter/vf_histogram.c | 15 ++++++++++----- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/doc/filters.texi b/doc/filters.texi index a9ee7cb9a9..43bfd9c872 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 -@code{row} mode or one below other in @code{column} mode. +Display separate graph for the color components side by side in +@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. -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 +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 ee9689f5e6..279e44aba1 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; }