[FFmpeg-cvslog] avfilter/vf_chromahold: implement blend option

Paul B Mahol git at videolan.org
Mon May 13 13:16:20 EEST 2019


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Mon May 13 12:10:22 2019 +0200| [f1c9d6fe704c004b424d40d6d695beab8d6f9591] | committer: Paul B Mahol

avfilter/vf_chromahold: implement blend option

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=f1c9d6fe704c004b424d40d6d695beab8d6f9591
---

 doc/filters.texi           | 5 +++++
 libavfilter/vf_chromakey.c | 8 +++++++-
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/doc/filters.texi b/doc/filters.texi
index cab400121c..d231387d59 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -6449,6 +6449,11 @@ The color which will not be replaced with neutral chroma.
 Similarity percentage with the above color.
 0.01 matches only the exact key color, while 1.0 matches everything.
 
+ at 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
 Signals that the color passed is already in YUV instead of RGB.
 
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 }
 };



More information about the ffmpeg-cvslog mailing list