From: jianhua.wu-at-intel.com@ffmpeg.org To: ffmpeg-devel@ffmpeg.org Cc: Wu Jianhua <jianhua.wu@intel.com> Subject: [FFmpeg-devel] [PATCH v2] avfilter/vf_blend_vulkan: add more blend modes Date: Fri, 11 Mar 2022 16:04:52 +0800 Message-ID: <20220311080452.53253-1-jianhua.wu@intel.com> (raw) From: Wu Jianhua <jianhua.wu@intel.com> This commit includes addition, average, subtract, negation, extremity, difference, darken, lighten, exclusion and phoenix blend modes. Use the commands below to test: (href: https://trac.ffmpeg.org/wiki/Blend) I. make an image for test ffmpeg -f lavfi -i color=s=256x256,geq=r='H-1-Y':g='H-1-Y':b='H-1-Y' -frames 1 \ -y -pix_fmt yuv420p test.jpg II. blend in sw ffmpeg -i test.jpg -vf "split[a][b];[b]transpose[b];[a][b]blend=all_mode=addition,\ pseudocolor=preset=turbo" -y addition_sw.jpg III. blend in vulkan ffmpeg -init_hw_device vulkan -i test.jpg -vf "split[a][b];[b]transpose[b];\ [a]hwupload[a];[b]hwupload[b];[a][b]blend_vulkan=all_mode=addition,hwdownload,\ format=yuv420p,pseudocolor=preset=turbo" -y addition_vulkan.jpg Signed-off-by: Wu Jianhua <jianhua.wu@intel.com> --- libavfilter/vf_blend_vulkan.c | 47 ++++++++++++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 3 deletions(-) diff --git a/libavfilter/vf_blend_vulkan.c b/libavfilter/vf_blend_vulkan.c index fcc21cbc8d..264fe703b2 100644 --- a/libavfilter/vf_blend_vulkan.c +++ b/libavfilter/vf_blend_vulkan.c @@ -68,10 +68,31 @@ static const char blend_##MODE##_func[] = { \ #define A top #define B bottom +#define MAX vec4(1.0) +#define HALF vec4(0.5) +#define MIN vec4(0.0) + +#ifdef min +#undef min +#endif +#ifdef max +#undef max +#endif + #define FN(EXPR) A + ((EXPR) - A) * opacity DEFINE_BLEND_MODE(NORMAL, A * opacity + B * (1.0f - opacity)) -DEFINE_BLEND_MODE(MULTIPLY, FN(1.0f * A * B / 1.0f)) +DEFINE_BLEND_MODE(ADDITION, FN(min(MAX, A + B))) +DEFINE_BLEND_MODE(AVERAGE, FN((A + B) * HALF)) +DEFINE_BLEND_MODE(SUBTRACT, FN(max(MIN, A - B))) +DEFINE_BLEND_MODE(MULTIPLY, FN(1.0f * A * B / 1.0f)) +DEFINE_BLEND_MODE(NEGATION, FN(MAX - abs(MAX - A - B))) +DEFINE_BLEND_MODE(EXTREMITY, FN(abs(MAX - A - B))) +DEFINE_BLEND_MODE(DIFFERENCE, FN(abs(A - B))) +DEFINE_BLEND_MODE(DARKEN, FN(min(A, B))) +DEFINE_BLEND_MODE(LIGHTEN, FN(max(A, B))) +DEFINE_BLEND_MODE(EXCLUSION, FN(A + B - 2 * A * B / MAX)) +DEFINE_BLEND_MODE(PHOENIX, FN(min(A, B) - max(A, B) + MAX)) static inline void init_blend_func(FilterParamsVulkan *param) { @@ -81,8 +102,18 @@ static inline void init_blend_func(FilterParamsVulkan *param) break; switch (param->mode) { + CASE(ADDITION) + CASE(AVERAGE) + CASE(SUBTRACT) CASE(NORMAL) CASE(MULTIPLY) + CASE(NEGATION) + CASE(EXTREMITY) + CASE(DIFFERENCE) + CASE(DARKEN) + CASE(LIGHTEN) + CASE(EXCLUSION) + CASE(PHOENIX) default: param->blend = NULL; break; } @@ -452,8 +483,18 @@ static const AVOption blend_vulkan_options[] = { { "c2_mode", "set component #2 blend mode", OFFSET(params[2].mode), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, BLEND_NB - 1, FLAGS, "mode" }, { "c3_mode", "set component #3 blend mode", OFFSET(params[3].mode), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, BLEND_NB - 1, FLAGS, "mode" }, { "all_mode", "set blend mode for all components", OFFSET(all_mode), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, BLEND_NB - 1, FLAGS, "mode" }, - { "normal", "", 0, AV_OPT_TYPE_CONST, { .i64 = BLEND_NORMAL }, 0, 0, FLAGS, "mode" }, - { "multiply", "", 0, AV_OPT_TYPE_CONST, { .i64 = BLEND_MULTIPLY }, 0, 0, FLAGS, "mode" }, + { "addition", "", 0, AV_OPT_TYPE_CONST, { .i64 = BLEND_ADDITION }, 0, 0, FLAGS, "mode" }, + { "average", "", 0, AV_OPT_TYPE_CONST, { .i64 = BLEND_AVERAGE }, 0, 0, FLAGS, "mode" }, + { "subtract", "", 0, AV_OPT_TYPE_CONST, { .i64 = BLEND_SUBTRACT }, 0, 0, FLAGS, "mode" }, + { "normal", "", 0, AV_OPT_TYPE_CONST, { .i64 = BLEND_NORMAL }, 0, 0, FLAGS, "mode" }, + { "multiply", "", 0, AV_OPT_TYPE_CONST, { .i64 = BLEND_MULTIPLY }, 0, 0, FLAGS, "mode" }, + { "negation", "", 0, AV_OPT_TYPE_CONST, { .i64 = BLEND_NEGATION }, 0, 0, FLAGS, "mode" }, + { "extremity", "", 0, AV_OPT_TYPE_CONST, { .i64 = BLEND_EXTREMITY }, 0, 0, FLAGS, "mode" }, + { "difference", "", 0, AV_OPT_TYPE_CONST, { .i64 = BLEND_DIFFERENCE }, 0, 0, FLAGS, "mode" }, + { "darken", "", 0, AV_OPT_TYPE_CONST, { .i64 = BLEND_DARKEN }, 0, 0, FLAGS, "mode" }, + { "lighten", "", 0, AV_OPT_TYPE_CONST, { .i64 = BLEND_LIGHTEN }, 0, 0, FLAGS, "mode" }, + { "exclusion", "", 0, AV_OPT_TYPE_CONST, { .i64 = BLEND_EXCLUSION }, 0, 0, FLAGS, "mode" }, + { "phoenix", "", 0, AV_OPT_TYPE_CONST, { .i64 = BLEND_PHOENIX }, 0, 0, FLAGS, "mode" }, { "c0_opacity", "set color component #0 opacity", OFFSET(params[0].opacity), AV_OPT_TYPE_DOUBLE, { .dbl = 1 }, 0, 1, FLAGS }, { "c1_opacity", "set color component #1 opacity", OFFSET(params[1].opacity), AV_OPT_TYPE_DOUBLE, { .dbl = 1 }, 0, 1, FLAGS }, -- 2.17.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
reply other threads:[~2022-03-11 8:05 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20220311080452.53253-1-jianhua.wu@intel.com \ --to=jianhua.wu-at-intel.com@ffmpeg.org \ --cc=ffmpeg-devel@ffmpeg.org \ --cc=jianhua.wu@intel.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel This inbox may be cloned and mirrored by anyone: git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \ ffmpegdev@gitmailbox.com public-inbox-index ffmpegdev Example config snippet for mirrors. AGPL code for this site: git clone https://public-inbox.org/public-inbox.git