From: Wu Jianhua <jianhua...@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...@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-requ...@ffmpeg.org with subject "unsubscribe".