Commit 2736dc05 authored by Paul B Mahol's avatar Paul B Mahol

avfilter/vf_vectorscope: rename gray mode to tint mode

parent 29b765d6
...@@ -18945,6 +18945,7 @@ Set vectorscope mode. ...@@ -18945,6 +18945,7 @@ Set vectorscope mode.
It accepts the following values: It accepts the following values:
@table @samp @table @samp
@item gray @item gray
@item tint
Gray values are displayed on graph, higher brightness means more pixels have Gray values are displayed on graph, higher brightness means more pixels have
same component color value on location in graph. This is the default mode. same component color value on location in graph. This is the default mode.
...@@ -19048,6 +19049,11 @@ Set what kind of colorspace to use when drawing graticule. ...@@ -19048,6 +19049,11 @@ Set what kind of colorspace to use when drawing graticule.
@item 709 @item 709
@end table @end table
Default is auto. Default is auto.
@item tint0, t0
@item tint1, t1
Set color tint for gray/tint vectorscope mode. By default both options are zero.
This means no tint, and output will remain gray.
@end table @end table
@anchor{vidstabdetect} @anchor{vidstabdetect}
......
...@@ -38,7 +38,7 @@ enum GraticuleType { ...@@ -38,7 +38,7 @@ enum GraticuleType {
}; };
enum VectorscopeMode { enum VectorscopeMode {
GRAY, TINT,
COLOR, COLOR,
COLOR2, COLOR2,
COLOR3, COLOR3,
...@@ -53,6 +53,7 @@ typedef struct VectorscopeContext { ...@@ -53,6 +53,7 @@ typedef struct VectorscopeContext {
int intensity; int intensity;
float fintensity; float fintensity;
uint16_t bg_color[4]; uint16_t bg_color[4];
float ftint[2];
int planewidth[4]; int planewidth[4];
int planeheight[4]; int planeheight[4];
int hsub, vsub; int hsub, vsub;
...@@ -67,6 +68,7 @@ typedef struct VectorscopeContext { ...@@ -67,6 +68,7 @@ typedef struct VectorscopeContext {
float bgopacity; float bgopacity;
float lthreshold; float lthreshold;
float hthreshold; float hthreshold;
int tint[2];
int tmin; int tmin;
int tmax; int tmax;
int flags; int flags;
...@@ -87,7 +89,8 @@ typedef struct VectorscopeContext { ...@@ -87,7 +89,8 @@ typedef struct VectorscopeContext {
static const AVOption vectorscope_options[] = { static const AVOption vectorscope_options[] = {
{ "mode", "set vectorscope mode", OFFSET(mode), AV_OPT_TYPE_INT, {.i64=0}, 0, MODE_NB-1, FLAGS, "mode"}, { "mode", "set vectorscope mode", OFFSET(mode), AV_OPT_TYPE_INT, {.i64=0}, 0, MODE_NB-1, FLAGS, "mode"},
{ "m", "set vectorscope mode", OFFSET(mode), AV_OPT_TYPE_INT, {.i64=0}, 0, MODE_NB-1, FLAGS, "mode"}, { "m", "set vectorscope mode", OFFSET(mode), AV_OPT_TYPE_INT, {.i64=0}, 0, MODE_NB-1, FLAGS, "mode"},
{ "gray", 0, 0, AV_OPT_TYPE_CONST, {.i64=GRAY}, 0, 0, FLAGS, "mode" }, { "gray", 0, 0, AV_OPT_TYPE_CONST, {.i64=TINT}, 0, 0, FLAGS, "mode" },
{ "tint", 0, 0, AV_OPT_TYPE_CONST, {.i64=TINT}, 0, 0, FLAGS, "mode" },
{ "color", 0, 0, AV_OPT_TYPE_CONST, {.i64=COLOR}, 0, 0, FLAGS, "mode" }, { "color", 0, 0, AV_OPT_TYPE_CONST, {.i64=COLOR}, 0, 0, FLAGS, "mode" },
{ "color2", 0, 0, AV_OPT_TYPE_CONST, {.i64=COLOR2}, 0, 0, FLAGS, "mode" }, { "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" }, { "color3", 0, 0, AV_OPT_TYPE_CONST, {.i64=COLOR3}, 0, 0, FLAGS, "mode" },
...@@ -127,6 +130,10 @@ static const AVOption vectorscope_options[] = { ...@@ -127,6 +130,10 @@ static const AVOption vectorscope_options[] = {
{ "auto", 0, 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, FLAGS, "colorspace" }, { "auto", 0, 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, FLAGS, "colorspace" },
{ "601", 0, 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, FLAGS, "colorspace" }, { "601", 0, 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, FLAGS, "colorspace" },
{ "709", 0, 0, AV_OPT_TYPE_CONST, {.i64=2}, 0, 0, FLAGS, "colorspace" }, { "709", 0, 0, AV_OPT_TYPE_CONST, {.i64=2}, 0, 0, FLAGS, "colorspace" },
{ "tint0", "set 1st tint", OFFSET(ftint[0]), AV_OPT_TYPE_FLOAT, {.dbl=0}, -1, 1, FLAGS},
{ "t0", "set 1st tint", OFFSET(ftint[0]), AV_OPT_TYPE_FLOAT, {.dbl=0}, -1, 1, FLAGS},
{ "tint1", "set 2nd tint", OFFSET(ftint[1]), AV_OPT_TYPE_FLOAT, {.dbl=0}, -1, 1, FLAGS},
{ "t1", "set 2nd tint", OFFSET(ftint[1]), AV_OPT_TYPE_FLOAT, {.dbl=0}, -1, 1, FLAGS},
{ NULL } { NULL }
}; };
...@@ -442,7 +449,7 @@ static void vectorscope16(VectorscopeContext *s, AVFrame *in, AVFrame *out, int ...@@ -442,7 +449,7 @@ static void vectorscope16(VectorscopeContext *s, AVFrame *in, AVFrame *out, int
switch (s->mode) { switch (s->mode) {
case COLOR: case COLOR:
case COLOR5: case COLOR5:
case GRAY: case TINT:
if (s->is_yuv) { if (s->is_yuv) {
for (i = 0; i < h; i++) { for (i = 0; i < h; i++) {
const int iwx = i * slinesizex; const int iwx = i * slinesizex;
...@@ -581,7 +588,17 @@ static void vectorscope16(VectorscopeContext *s, AVFrame *in, AVFrame *out, int ...@@ -581,7 +588,17 @@ static void vectorscope16(VectorscopeContext *s, AVFrame *in, AVFrame *out, int
} }
} }
if (s->mode == COLOR) { if (s->mode == TINT && (s->tint[0] != mid ||
s->tint[1] != mid)) {
for (i = 0; i < out->height; i++) {
for (j = 0; j < out->width; j++) {
if (dpd[i * dlinesize + j]) {
dst[1][i * dlinesize + j] = s->tint[0];
dst[2][i * dlinesize + j] = s->tint[1];
}
}
}
} else if (s->mode == COLOR) {
for (i = 0; i < out->height; i++) { for (i = 0; i < out->height; i++) {
for (j = 0; j < out->width; j++) { for (j = 0; j < out->width; j++) {
if (!dpd[i * dlinesize + j]) { if (!dpd[i * dlinesize + j]) {
...@@ -636,7 +653,7 @@ static void vectorscope8(VectorscopeContext *s, AVFrame *in, AVFrame *out, int p ...@@ -636,7 +653,7 @@ static void vectorscope8(VectorscopeContext *s, AVFrame *in, AVFrame *out, int p
switch (s->mode) { switch (s->mode) {
case COLOR5: case COLOR5:
case COLOR: case COLOR:
case GRAY: case TINT:
if (s->is_yuv) { if (s->is_yuv) {
for (i = 0; i < h; i++) { for (i = 0; i < h; i++) {
const int iwx = i * slinesizex; const int iwx = i * slinesizex;
...@@ -775,7 +792,17 @@ static void vectorscope8(VectorscopeContext *s, AVFrame *in, AVFrame *out, int p ...@@ -775,7 +792,17 @@ static void vectorscope8(VectorscopeContext *s, AVFrame *in, AVFrame *out, int p
} }
} }
if (s->mode == COLOR) { if (s->mode == TINT && (s->tint[0] != 128 ||
s->tint[1] != 128)) {
for (i = 0; i < out->height; i++) {
for (j = 0; j < out->width; j++) {
if (dpd[i * dlinesize + j]) {
dst[1][i * dlinesize + j] = s->tint[0];
dst[2][i * dlinesize + j] = s->tint[1];
}
}
}
} else if (s->mode == COLOR) {
for (i = 0; i < out->height; i++) { for (i = 0; i < out->height; i++) {
for (j = 0; j < out->width; j++) { for (j = 0; j < out->width; j++) {
if (!dpd[i * out->linesize[pd] + j]) { if (!dpd[i * out->linesize[pd] + j]) {
...@@ -1483,9 +1510,9 @@ static int config_input(AVFilterLink *inlink) ...@@ -1483,9 +1510,9 @@ static int config_input(AVFilterLink *inlink)
return AVERROR(EINVAL); return AVERROR(EINVAL);
} }
if (s->mode == GRAY && s->is_yuv) if (s->mode == TINT && s->is_yuv) {
s->pd = 0; s->pd = 0;
else { } else {
if ((s->x == 1 && s->y == 2) || (s->x == 2 && s->y == 1)) if ((s->x == 1 && s->y == 2) || (s->x == 2 && s->y == 1))
s->pd = 0; s->pd = 0;
else if ((s->x == 0 && s->y == 2) || (s->x == 2 && s->y == 0)) else if ((s->x == 0 && s->y == 2) || (s->x == 2 && s->y == 0))
...@@ -1519,6 +1546,9 @@ static int config_input(AVFilterLink *inlink) ...@@ -1519,6 +1546,9 @@ static int config_input(AVFilterLink *inlink)
s->bg_color[3] = s->bgopacity * (s->size - 1); s->bg_color[3] = s->bgopacity * (s->size - 1);
s->tint[0] = .5f * (s->ftint[0] + 1.f) * (s->size - 1);
s->tint[1] = .5f * (s->ftint[1] + 1.f) * (s->size - 1);
switch (inlink->format) { switch (inlink->format) {
case AV_PIX_FMT_GBRP12: case AV_PIX_FMT_GBRP12:
case AV_PIX_FMT_GBRP10: case AV_PIX_FMT_GBRP10:
...@@ -1531,8 +1561,8 @@ static int config_input(AVFilterLink *inlink) ...@@ -1531,8 +1561,8 @@ static int config_input(AVFilterLink *inlink)
break; break;
default: default:
s->bg_color[0] = 0; s->bg_color[0] = 0;
s->bg_color[1] = s->size / 2 - 1; s->bg_color[1] = s->size / 2;
s->bg_color[2] = s->size / 2 - 1; s->bg_color[2] = s->size / 2;
} }
s->hsub = desc->log2_chroma_w; s->hsub = desc->log2_chroma_w;
......
...@@ -3,6 +3,6 @@ ...@@ -3,6 +3,6 @@
#codec_id 0: rawvideo #codec_id 0: rawvideo
#dimensions 0: 256x256 #dimensions 0: 256x256
#sar 0: 1/1 #sar 0: 1/1
0, 0, 0, 1, 196608, 0xf6e3aa30 0, 0, 0, 1, 196608, 0x7c431d1f
0, 1, 1, 1, 196608, 0x5584acf9 0, 1, 1, 1, 196608, 0xb7e82028
0, 2, 2, 1, 196608, 0xa862775d 0, 2, 2, 1, 196608, 0x2feeeb61
...@@ -3,6 +3,6 @@ ...@@ -3,6 +3,6 @@
#codec_id 0: rawvideo #codec_id 0: rawvideo
#dimensions 0: 256x256 #dimensions 0: 256x256
#sar 0: 1/1 #sar 0: 1/1
0, 0, 0, 1, 196608, 0x5e62fae5 0, 0, 0, 1, 196608, 0xdad38823
0, 1, 1, 1, 196608, 0x4c27fcbf 0, 1, 1, 1, 196608, 0xeb8589bd
0, 2, 2, 1, 196608, 0xb7531088 0, 2, 2, 1, 196608, 0x31a79c93
...@@ -3,6 +3,6 @@ ...@@ -3,6 +3,6 @@
#codec_id 0: rawvideo #codec_id 0: rawvideo
#dimensions 0: 256x256 #dimensions 0: 256x256
#sar 0: 1/1 #sar 0: 1/1
0, 0, 0, 1, 196608, 0x83df8770 0, 0, 0, 1, 196608, 0x005f14ae
0, 1, 1, 1, 196608, 0xa6a674a7 0, 1, 1, 1, 196608, 0x461301a5
0, 2, 2, 1, 196608, 0x11757143 0, 2, 2, 1, 196608, 0x8bbafd4e
...@@ -3,6 +3,6 @@ ...@@ -3,6 +3,6 @@
#codec_id 0: rawvideo #codec_id 0: rawvideo
#dimensions 0: 256x256 #dimensions 0: 256x256
#sar 0: 1/1 #sar 0: 1/1
0, 0, 0, 1, 196608, 0x326953c4 0, 0, 0, 1, 196608, 0xaedae0f3
0, 1, 1, 1, 196608, 0x870e1dcc 0, 1, 1, 1, 196608, 0x267baabb
0, 2, 2, 1, 196608, 0x87cb8800 0, 2, 2, 1, 196608, 0x021f141a
...@@ -3,6 +3,6 @@ ...@@ -3,6 +3,6 @@
#codec_id 0: rawvideo #codec_id 0: rawvideo
#dimensions 0: 256x256 #dimensions 0: 256x256
#sar 0: 1/1 #sar 0: 1/1
0, 0, 0, 1, 196608, 0x79ba71e2 0, 0, 0, 1, 196608, 0xf62bff11
0, 1, 1, 1, 196608, 0x909271e2 0, 1, 1, 1, 196608, 0x2ffffed1
0, 2, 2, 1, 196608, 0x143971e2 0, 2, 2, 1, 196608, 0x8e7efded
...@@ -3,6 +3,6 @@ ...@@ -3,6 +3,6 @@
#codec_id 0: rawvideo #codec_id 0: rawvideo
#dimensions 0: 256x256 #dimensions 0: 256x256
#sar 0: 1/1 #sar 0: 1/1
0, 0, 0, 1, 196608, 0xa2899af1 0, 0, 0, 1, 196608, 0xd2bfcc40
0, 1, 1, 1, 196608, 0x26409af1 0, 1, 1, 1, 196608, 0x2851cb74
0, 2, 2, 1, 196608, 0xf5209af1 0, 2, 2, 1, 196608, 0x48efcc64
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment