mirror of https://git.ffmpeg.org/ffmpeg.git
lavfi/histogram: overlay display mode for levels histogram mode
Signed-off-by: Paul B Mahol <onemda@gmail.com>
This commit is contained in:
parent
e39821a65e
commit
480ddf2bc9
|
@ -3170,29 +3170,33 @@ Set mode for @code{waveform}. Can be either @code{row}, or @code{column}.
|
||||||
Default is @code{row}.
|
Default is @code{row}.
|
||||||
|
|
||||||
@item display_mode
|
@item display_mode
|
||||||
Set display mode for @code{waveform}.
|
Set display mode for @code{waveform} and @code{levels}.
|
||||||
It accepts the following values:
|
It accepts the following values:
|
||||||
@table @samp
|
@table @samp
|
||||||
@item parade
|
@item parade
|
||||||
Display separate waveforms for the color components side by side in
|
Display separate graph for the color components side by side in
|
||||||
@code{row} mode or one below other in @code{column} mode.
|
@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
|
This display mode in @code{waveform} histogram mode makes it easy to spot
|
||||||
shadows of an image, by comparing the contours of the top and the bottom
|
color casts in the highlights and shadows of an image, by comparing the
|
||||||
of each waveform. Since whites, grays, and blacks are characterized by
|
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
|
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
|
If not, the correction is easy to make by making adjustments to level the
|
||||||
three waveforms.
|
three waveforms.
|
||||||
|
|
||||||
@item overlay
|
@item overlay
|
||||||
Presents information that's identical to that in the @code{parade}, except
|
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.
|
over one another.
|
||||||
|
|
||||||
This display mode can make it easier to spot the relative differences or
|
This display mode in @code{waveform} histogram mode can make it easier to spot
|
||||||
similarities in overlapping areas of the color components that are supposed
|
the relative differences or similarities in overlapping areas of the color
|
||||||
to be identical, such as neutral whites, grays, or blacks.
|
components that are supposed to be identical, such as neutral whites, grays,
|
||||||
|
or blacks.
|
||||||
@end table
|
@end table
|
||||||
Default is @code{parade}.
|
Default is @code{parade}.
|
||||||
@end table
|
@end table
|
||||||
|
|
|
@ -153,7 +153,7 @@ static int config_output(AVFilterLink *outlink)
|
||||||
switch (h->mode) {
|
switch (h->mode) {
|
||||||
case MODE_LEVELS:
|
case MODE_LEVELS:
|
||||||
outlink->w = 256;
|
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;
|
break;
|
||||||
case MODE_WAVEFORM:
|
case MODE_WAVEFORM:
|
||||||
if (h->waveform_mode)
|
if (h->waveform_mode)
|
||||||
|
@ -200,7 +200,7 @@ static int filter_frame(AVFilterLink *inlink, AVFilterBufferRef *in)
|
||||||
switch (h->mode) {
|
switch (h->mode) {
|
||||||
case MODE_LEVELS:
|
case MODE_LEVELS:
|
||||||
for (k = 0; k < h->ncomp; k++) {
|
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++) {
|
for (i = 0; i < in->video->h; i++) {
|
||||||
src = in->data[k] + i * in->linesize[k];
|
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++) {
|
for (i = 0; i < outlink->w; i++) {
|
||||||
int col_height = h->level_height - (float)h->histogram[i] / h->max_hval * h->level_height;
|
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 (j = h->level_height - 1; j >= col_height; j--) {
|
||||||
|
if (h->display_mode) {
|
||||||
for (l = 0; l < h->ncomp; l++)
|
for (l = 0; l < h->ncomp; l++)
|
||||||
out->data[l][(j + start) * out->linesize[l] + i] = h->fg_color[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--)
|
for (j = h->level_height + h->scale_height - 1; j >= h->level_height; j--)
|
||||||
out->data[k][(j + start) * out->linesize[k] + i] = i;
|
out->data[k][(j + start) * out->linesize[k] + i] = i;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue