mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-11-21 10:55:51 +02:00
avfilter/vf_vectorscope: add color5 mode, mode like color but with higher saturation
Signed-off-by: Paul B Mahol <onemda@gmail.com>
This commit is contained in:
parent
c6f4720b86
commit
2ad1c87bb2
@ -12513,7 +12513,7 @@ same component color value on location in graph. This is the default mode.
|
||||
@item color
|
||||
Gray values are displayed on graph. Surrounding pixels values which are not
|
||||
present in video frame are drawn in gradient of 2 color components which are
|
||||
set by option @code{x} and @code{y}.
|
||||
set by option @code{x} and @code{y}. The 3rd color component is static.
|
||||
|
||||
@item color2
|
||||
Actual color components values present in video frame are displayed on graph.
|
||||
@ -12527,6 +12527,10 @@ default values of @code{x} and @code{y}.
|
||||
Actual colors present in video frame are displayed on graph. If two different
|
||||
colors map to same position on graph then color with higher value of component
|
||||
not present in graph is picked.
|
||||
|
||||
@item color5
|
||||
Gray values are displayed on graph. Similar to @code{color} but with 3rd color
|
||||
component picked from radial gradient.
|
||||
@end table
|
||||
|
||||
@item x
|
||||
@ -12536,7 +12540,7 @@ Set which color component will be represented on X-axis. Default is @code{1}.
|
||||
Set which color component will be represented on Y-axis. Default is @code{2}.
|
||||
|
||||
@item intensity, i
|
||||
Set intensity, used by modes: gray, color and color3 for increasing brightness
|
||||
Set intensity, used by modes: gray, color, color3 and color5 for increasing brightness
|
||||
of color component which represents frequency of (X, Y) location in graph.
|
||||
|
||||
@item envelope, e
|
||||
|
@ -34,6 +34,7 @@ enum VectorscopeMode {
|
||||
COLOR2,
|
||||
COLOR3,
|
||||
COLOR4,
|
||||
COLOR5,
|
||||
MODE_NB
|
||||
};
|
||||
|
||||
@ -68,6 +69,7 @@ static const AVOption vectorscope_options[] = {
|
||||
{ "color2", 0, 0, AV_OPT_TYPE_CONST, {.i64=COLOR2}, 0, 0, FLAGS, "mode" },
|
||||
{ "color3", 0, 0, AV_OPT_TYPE_CONST, {.i64=COLOR3}, 0, 0, FLAGS, "mode" },
|
||||
{ "color4", 0, 0, AV_OPT_TYPE_CONST, {.i64=COLOR4}, 0, 0, FLAGS, "mode" },
|
||||
{ "color5", 0, 0, AV_OPT_TYPE_CONST, {.i64=COLOR5}, 0, 0, FLAGS, "mode" },
|
||||
{ "x", "set color component on X axis", OFFSET(x), AV_OPT_TYPE_INT, {.i64=1}, 0, 2, FLAGS},
|
||||
{ "y", "set color component on Y axis", OFFSET(y), AV_OPT_TYPE_INT, {.i64=2}, 0, 2, FLAGS},
|
||||
{ "intensity", "set intensity", OFFSET(fintensity), AV_OPT_TYPE_FLOAT, {.dbl=0.004}, 0, 1, FLAGS},
|
||||
@ -354,11 +356,12 @@ static void vectorscope16(VectorscopeContext *s, AVFrame *in, AVFrame *out, int
|
||||
for (i = 0; i < out->height ; i++)
|
||||
for (j = 0; j < out->width; j++)
|
||||
AV_WN16(out->data[k] + i * out->linesize[k] + j * 2,
|
||||
s->mode == COLOR && k == s->pd ? 0 : s->bg_color[k] * mult);
|
||||
(s->mode == COLOR || s->mode == COLOR5) && k == s->pd ? 0 : s->bg_color[k] * mult);
|
||||
}
|
||||
|
||||
switch (s->mode) {
|
||||
case COLOR:
|
||||
case COLOR5:
|
||||
case GRAY:
|
||||
if (s->is_yuv) {
|
||||
for (i = 0; i < h; i++) {
|
||||
@ -480,6 +483,16 @@ static void vectorscope16(VectorscopeContext *s, AVFrame *in, AVFrame *out, int
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (s->mode == COLOR5) {
|
||||
for (i = 0; i < out->height; i++) {
|
||||
for (j = 0; j < out->width; j++) {
|
||||
if (!dpd[i * dlinesize + j]) {
|
||||
dpx[i * dlinesize + j] = j;
|
||||
dpy[i * dlinesize + j] = i;
|
||||
dpd[i * dlinesize + j] = mid * M_SQRT2 - hypot(i - mid, j - mid);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -508,9 +521,10 @@ static void vectorscope8(VectorscopeContext *s, AVFrame *in, AVFrame *out, int p
|
||||
for (k = 0; k < 4 && dst[k]; k++)
|
||||
for (i = 0; i < out->height ; i++)
|
||||
memset(dst[k] + i * out->linesize[k],
|
||||
s->mode == COLOR && k == s->pd ? 0 : s->bg_color[k], out->width);
|
||||
(s->mode == COLOR || s->mode == COLOR5) && k == s->pd ? 0 : s->bg_color[k], out->width);
|
||||
|
||||
switch (s->mode) {
|
||||
case COLOR5:
|
||||
case COLOR:
|
||||
case GRAY:
|
||||
if (s->is_yuv) {
|
||||
@ -633,6 +647,16 @@ static void vectorscope8(VectorscopeContext *s, AVFrame *in, AVFrame *out, int p
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (s->mode == COLOR5) {
|
||||
for (i = 0; i < out->height; i++) {
|
||||
for (j = 0; j < out->width; j++) {
|
||||
if (!dpd[i * out->linesize[pd] + j]) {
|
||||
dpx[i * out->linesize[px] + j] = j;
|
||||
dpy[i * out->linesize[py] + j] = i;
|
||||
dpd[i * out->linesize[pd] + j] = 128 * M_SQRT2 - hypot(i - 128, j - 128);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user