1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-12-23 12:43:46 +02:00

avfilter/vf_chromahold: implement blend option

This commit is contained in:
Paul B Mahol 2019-05-13 12:10:22 +02:00
parent dcc999819d
commit f1c9d6fe70
2 changed files with 12 additions and 1 deletions

View File

@ -6449,6 +6449,11 @@ The color which will not be replaced with neutral chroma.
Similarity percentage with the above color. Similarity percentage with the above color.
0.01 matches only the exact key color, while 1.0 matches everything. 0.01 matches only the exact key color, while 1.0 matches everything.
@item blend
Blend percentage.
0.0 makes pixels either fully gray, or not gray at all.
Higher values result in more preserved color.
@item yuv @item yuv
Signals that the color passed is already in YUV instead of RGB. Signals that the color passed is already in YUV instead of RGB.

View File

@ -128,7 +128,12 @@ static int do_chromahold_slice(AVFilterContext *avctx, void *arg, int jobnr, int
diff = sqrt((du * du + dv * dv) / (255.0 * 255.0)); diff = sqrt((du * du + dv * dv) / (255.0 * 255.0));
alpha = diff > ctx->similarity; alpha = diff > ctx->similarity;
if (alpha) { if (ctx->blend > 0.0001) {
double f = 1. - av_clipd((diff - ctx->similarity) / ctx->blend, 0.0, 1.0);
frame->data[1][frame->linesize[1] * y + x] = 128 + (u - 128) * f;
frame->data[2][frame->linesize[2] * y + x] = 128 + (v - 128) * f;
} else if (alpha) {
frame->data[1][frame->linesize[1] * y + x] = 128; frame->data[1][frame->linesize[1] * y + x] = 128;
frame->data[2][frame->linesize[2] * y + x] = 128; frame->data[2][frame->linesize[2] * y + x] = 128;
} }
@ -262,6 +267,7 @@ AVFilter ff_vf_chromakey = {
static const AVOption chromahold_options[] = { static const AVOption chromahold_options[] = {
{ "color", "set the chromahold key color", OFFSET(chromakey_rgba), AV_OPT_TYPE_COLOR, { .str = "black" }, CHAR_MIN, CHAR_MAX, FLAGS }, { "color", "set the chromahold key color", OFFSET(chromakey_rgba), AV_OPT_TYPE_COLOR, { .str = "black" }, CHAR_MIN, CHAR_MAX, FLAGS },
{ "similarity", "set the chromahold similarity value", OFFSET(similarity), AV_OPT_TYPE_FLOAT, { .dbl = 0.01 }, 0.01, 1.0, FLAGS }, { "similarity", "set the chromahold similarity value", OFFSET(similarity), AV_OPT_TYPE_FLOAT, { .dbl = 0.01 }, 0.01, 1.0, FLAGS },
{ "blend", "set the chromahold blend value", OFFSET(blend), AV_OPT_TYPE_FLOAT, { .dbl = 0.0 }, 0.0, 1.0, FLAGS },
{ "yuv", "color parameter is in yuv instead of rgb", OFFSET(is_yuv), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS }, { "yuv", "color parameter is in yuv instead of rgb", OFFSET(is_yuv), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS },
{ NULL } { NULL }
}; };