summaryrefslogtreecommitdiff
path: root/libavfilter/vf_chromakey.c
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2019-05-13 12:10:22 +0200
committerPaul B Mahol <onemda@gmail.com>2019-05-13 12:15:32 +0200
commitf1c9d6fe704c004b424d40d6d695beab8d6f9591 (patch)
tree7f31297c8e9034bb8c7d62f66b6fe09bb490fe17 /libavfilter/vf_chromakey.c
parentdcc999819dda578a4d8e52c6d17bf55d0073783d (diff)
avfilter/vf_chromahold: implement blend option
Diffstat (limited to 'libavfilter/vf_chromakey.c')
-rw-r--r--libavfilter/vf_chromakey.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/libavfilter/vf_chromakey.c b/libavfilter/vf_chromakey.c
index 42b7d71d49..76a5e2056a 100644
--- a/libavfilter/vf_chromakey.c
+++ b/libavfilter/vf_chromakey.c
@@ -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));
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[2][frame->linesize[2] * y + x] = 128;
}
@@ -262,6 +267,7 @@ AVFilter ff_vf_chromakey = {
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 },
{ "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 },
{ NULL }
};