[FFmpeg-cvslog] avfilter/vf_blend: add softdifference blend mode

Paul B Mahol git at videolan.org
Mon Sep 27 00:35:21 EEST 2021


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Sun Sep 26 23:08:14 2021 +0200| [e2d40cd1d52306035756687257c00bed144928e1] | committer: Paul B Mahol

avfilter/vf_blend: add softdifference blend mode

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

 doc/filters.texi       | 1 +
 libavfilter/blend.h    | 1 +
 libavfilter/vf_blend.c | 8 ++++++++
 3 files changed, 10 insertions(+)

diff --git a/doc/filters.texi b/doc/filters.texi
index 398c6b82fc..0b7e21f7f8 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -7559,6 +7559,7 @@ Available values for component modes are:
 @item pinlight
 @item reflect
 @item screen
+ at item softdifference
 @item softlight
 @item subtract
 @item vividlight
diff --git a/libavfilter/blend.h b/libavfilter/blend.h
index 00db51838d..a9a436a6da 100644
--- a/libavfilter/blend.h
+++ b/libavfilter/blend.h
@@ -59,6 +59,7 @@ enum BlendMode {
     BLEND_HEAT,
     BLEND_FREEZE,
     BLEND_EXTREMITY,
+    BLEND_SOFTDIFFERENCE,
     BLEND_NB
 };
 
diff --git a/libavfilter/vf_blend.c b/libavfilter/vf_blend.c
index 47ec1b5a2d..ff06940a66 100644
--- a/libavfilter/vf_blend.c
+++ b/libavfilter/vf_blend.c
@@ -104,6 +104,7 @@ static const AVOption blend_options[] = {
     { "subtract",   "", 0, AV_OPT_TYPE_CONST, {.i64=BLEND_SUBTRACT},   0, 0, FLAGS, "mode" },
     { "vividlight", "", 0, AV_OPT_TYPE_CONST, {.i64=BLEND_VIVIDLIGHT}, 0, 0, FLAGS, "mode" },
     { "xor",        "", 0, AV_OPT_TYPE_CONST, {.i64=BLEND_XOR},        0, 0, FLAGS, "mode" },
+    { "softdifference","", 0, AV_OPT_TYPE_CONST, {.i64=BLEND_SOFTDIFFERENCE}, 0, 0, FLAGS, "mode" },
     { "c0_expr",  "set color component #0 expression", OFFSET(params[0].expr_str), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS },
     { "c1_expr",  "set color component #1 expression", OFFSET(params[1].expr_str), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS },
     { "c2_expr",  "set color component #2 expression", OFFSET(params[2].expr_str), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS },
@@ -322,6 +323,7 @@ DEFINE_BLEND8(or,         A | B)
 DEFINE_BLEND8(xor,        A ^ B)
 DEFINE_BLEND8(vividlight, (A < 128) ? BURN(2 * A, B) : DODGE(2 * (A - 128), B))
 DEFINE_BLEND8(linearlight,av_clip_uint8((B < 128) ? B + 2 * A - 255 : B + 2 * (A - 128)))
+DEFINE_BLEND8(softdifference,av_clip_uint8((A > B) ? (B == 255) ? 0 : (A - B) * 255 / (255 - B) : (B == 0) ? 0 : (B - A) * 255 / B))
 
 #undef MULTIPLY
 #undef SCREEN
@@ -365,6 +367,7 @@ DEFINE_BLEND16(or,         A | B, 16)
 DEFINE_BLEND16(xor,        A ^ B, 16)
 DEFINE_BLEND16(vividlight, (A < 32768) ? BURN(2 * A, B) : DODGE(2 * (A - 32768), B), 16)
 DEFINE_BLEND16(linearlight,av_clip_uint16((B < 32768) ? B + 2 * A - 65535 : B + 2 * (A - 32768)), 16)
+DEFINE_BLEND16(softdifference,av_clip_uint16((A > B) ? (B == 65535) ? 0 : (A - B) * 65535 / (65535 - B) : (B == 0) ? 0 : (B - A) * 65535 / B), 16)
 
 #undef MULTIPLY
 #undef SCREEN
@@ -408,6 +411,7 @@ DEFINE_BLEND16(or,         A | B, 10)
 DEFINE_BLEND16(xor,        A ^ B, 10)
 DEFINE_BLEND16(vividlight, (A < 512) ? BURN(2 * A, B) : DODGE(2 * (A - 512), B), 10)
 DEFINE_BLEND16(linearlight,(int)av_clip_uintp2((B < 512) ? B + 2 * A - 1023 : B + 2 * (A - 512), 10), 10)
+DEFINE_BLEND16(softdifference,(int)av_clip_uintp2((A > B) ? (B == 1023) ? 0 : (A - B) * 1023 / (1023 - B) : (B == 0) ? 0 : (B - A) * 1023 / B, 10), 10)
 
 #undef MULTIPLY
 #undef SCREEN
@@ -451,6 +455,7 @@ DEFINE_BLEND16(or,         A | B, 12)
 DEFINE_BLEND16(xor,        A ^ B, 12)
 DEFINE_BLEND16(vividlight, (A < 2048) ? BURN(2 * A, B) : DODGE(2 * (A - 2048), B), 12)
 DEFINE_BLEND16(linearlight,(int)av_clip_uintp2((B < 2048) ? B + 2 * A - 4095 : B + 2 * (A - 2048), 12), 12)
+DEFINE_BLEND16(softdifference,(int)av_clip_uintp2((A > B) ? (B == 4095) ? 0 : (A - B) * 4095 / (4095 - B) : (B == 0) ? 0 : (B - A) * 4095 / B, 12), 12)
 
 #undef MULTIPLY
 #undef SCREEN
@@ -494,6 +499,7 @@ DEFINE_BLEND16(or,         A | B, 9)
 DEFINE_BLEND16(xor,        A ^ B, 9)
 DEFINE_BLEND16(vividlight, (A < 256) ? BURN(2 * A, B) : DODGE(2 * (A - 256), B), 9)
 DEFINE_BLEND16(linearlight,(int)av_clip_uintp2((B < 256) ? B + 2 * A - 511 : B + 2 * (A - 256), 9), 9)
+DEFINE_BLEND16(softdifference,(int)av_clip_uintp2((A > B) ? (A - B) * 511 / (511 - B) : (B == 0) ? 0 : (B - A) * 511 / B, 9), 9)
 
 #undef MULTIPLY
 #undef SCREEN
@@ -537,6 +543,7 @@ DEFINE_BLEND32(or,         av_int2float(av_float2int(A) | av_float2int(B)), 32)
 DEFINE_BLEND32(xor,        av_int2float(av_float2int(A) ^ av_float2int(B)), 32)
 DEFINE_BLEND32(vividlight, (A < 0.5) ? BURN(2 * A, B) : DODGE(2 * (A - 0.5), B), 32)
 DEFINE_BLEND32(linearlight,(B < 0.5) ? B + 2 * A - 1.0 : B + 2 * (A - 0.5), 32)
+DEFINE_BLEND32(softdifference, (A > B) ? (B == 1.f) ? 0.f : (A - B) / (1.f - B) : (B == 0.f) ? 0.f : (B - A) / B, 32)
 
 #define DEFINE_BLEND_EXPR(type, name, div)                                     \
 static void blend_expr_## name(const uint8_t *_top, ptrdiff_t top_linesize,          \
@@ -733,6 +740,7 @@ static av_cold void init_blend_func_##depth##_##nbits##bit(FilterParams *param)
     case BLEND_SUBTRACT:     param->blend = blend_subtract_##depth##bit;     break;   \
     case BLEND_VIVIDLIGHT:   param->blend = blend_vividlight_##depth##bit;   break;   \
     case BLEND_XOR:          param->blend = blend_xor_##depth##bit;          break;   \
+    case BLEND_SOFTDIFFERENCE:param->blend = blend_softdifference_##depth##bit; break;\
     }                                                                                 \
 }
 DEFINE_INIT_BLEND_FUNC(8, 8)



More information about the ffmpeg-cvslog mailing list