Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
* [FFmpeg-devel] [PATCH 1/5] avutil/hwcontext_vulkan: fixed validation error VUID 01387
@ 2022-01-02 14:51 Wu Jianhua
  2022-01-02 14:51 ` [FFmpeg-devel] [PATCH 2/5] transpose_vulkan: add passthrough option Wu Jianhua
                   ` (3 more replies)
  0 siblings, 4 replies; 11+ messages in thread
From: Wu Jianhua @ 2022-01-02 14:51 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Wu Jianhua

This commit fixed the validation error that occurred on the Windows platform.

Validation Error: [ VUID-vkCreateDevice-ppEnabledExtensionNames-01387 ] Object 0: \
handle = 0x2ab1cfa0db0, type = VK_OBJECT_TYPE_INSTANCE; | MessageID = 0x12537a2c | \
Missing extension required by the device extension VK_EXT_hdr_metadata: VK_KHR_swapchain. \
The Vulkan spec states: All required device extensions for each extension in the \
VkDeviceCreateInfo::ppEnabledExtensionNames list must also be present in that list \
(https://vulkan.lunarg.com/doc/view/1.2.198.1/windows/1.2-extensions/vkspec.html#\
VUID-vkCreateDevice-ppEnabledExtensionNames-01387)

Signed-off-by: Wu Jianhua <jianhua.wu@intel.com>
---
 libavutil/hwcontext_vulkan.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/libavutil/hwcontext_vulkan.c b/libavutil/hwcontext_vulkan.c
index 83a7527198..a2a175a063 100644
--- a/libavutil/hwcontext_vulkan.c
+++ b/libavutil/hwcontext_vulkan.c
@@ -335,7 +335,11 @@ typedef struct VulkanOptExtension {
 } VulkanOptExtension;
 
 static const VulkanOptExtension optional_instance_exts[] = {
-    /* For future use */
+    /* Misc or required by other extensions */
+#ifdef _WIN32
+    { VK_KHR_WIN32_SURFACE_EXTENSION_NAME,                    FF_VK_EXT_NO_FLAG                },
+    { VK_KHR_SURFACE_EXTENSION_NAME,                          FF_VK_EXT_NO_FLAG                },
+#endif
 };
 
 static const VulkanOptExtension optional_device_exts[] = {
@@ -344,6 +348,9 @@ static const VulkanOptExtension optional_device_exts[] = {
     { VK_EXT_HDR_METADATA_EXTENSION_NAME,                     FF_VK_EXT_NO_FLAG                },
     { VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME,         FF_VK_EXT_NO_FLAG                },
     { VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME,                FF_VK_EXT_NO_FLAG                },
+#ifdef _WIN32
+    { VK_KHR_SWAPCHAIN_EXTENSION_NAME,                        FF_VK_EXT_NO_FLAG                },
+#endif
 
     /* Imports/exports */
     { VK_KHR_EXTERNAL_MEMORY_FD_EXTENSION_NAME,               FF_VK_EXT_EXTERNAL_FD_MEMORY     },
-- 
2.25.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".

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [FFmpeg-devel] [PATCH 2/5] transpose_vulkan: add passthrough option
  2022-01-02 14:51 [FFmpeg-devel] [PATCH 1/5] avutil/hwcontext_vulkan: fixed validation error VUID 01387 Wu Jianhua
@ 2022-01-02 14:51 ` Wu Jianhua
  2022-01-10 14:19   ` Anton Khirnov
  2022-01-02 14:51 ` [FFmpeg-devel] [PATCH 3/5] avfilter/vf_scale_vulkan: align struct ScaleVulkanContext Wu Jianhua
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 11+ messages in thread
From: Wu Jianhua @ 2022-01-02 14:51 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Wu Jianhua

The following command is on how to apply passthrough option:

ffmpeg -init_hw_device vulkan -i input.264 -vf hwupload=extra_hw_frames=16,transpose_vulkan=passthrough=landscape,hwdownload,format=yuv420p output.264

Signed-off-by: Wu Jianhua <jianhua.wu@intel.com>
---
 libavfilter/vf_transpose_vulkan.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/libavfilter/vf_transpose_vulkan.c b/libavfilter/vf_transpose_vulkan.c
index ce83cf0fd7..30d052e08c 100644
--- a/libavfilter/vf_transpose_vulkan.c
+++ b/libavfilter/vf_transpose_vulkan.c
@@ -35,6 +35,7 @@ typedef struct TransposeVulkanContext {
     VkDescriptorImageInfo output_images[3];
 
     int dir;
+    int passthrough;
     int initialized;
 } TransposeVulkanContext;
 
@@ -222,6 +223,9 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in)
     TransposeVulkanContext *s = ctx->priv;
     AVFilterLink *outlink = ctx->outputs[0];
 
+    if (s->passthrough)
+        return ff_filter_frame(outlink, in);
+
     out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
     if (!out) {
         err = AVERROR(ENOMEM);
@@ -267,6 +271,17 @@ static int config_props_output(AVFilterLink *outlink)
     FFVulkanContext *vkctx = &s->vkctx;
     AVFilterLink *inlink = avctx->inputs[0];
 
+    if ((inlink->w >= inlink->h && s->passthrough == TRANSPOSE_PT_TYPE_LANDSCAPE) ||
+        (inlink->w <= inlink->h && s->passthrough == TRANSPOSE_PT_TYPE_PORTRAIT)) {
+        av_log(avctx, AV_LOG_VERBOSE,
+               "w:%d h:%d -> w:%d h:%d (passthrough mode)\n",
+               inlink->w, inlink->h, inlink->w, inlink->h);
+        outlink->hw_frames_ctx = av_buffer_ref(inlink->hw_frames_ctx);
+        return outlink->hw_frames_ctx ? 0 : AVERROR(ENOMEM);
+    } else {
+        s->passthrough = TRANSPOSE_PT_TYPE_NONE;
+    }
+
     vkctx->output_width  = inlink->h;
     vkctx->output_height = inlink->w;
 
@@ -288,6 +303,13 @@ static const AVOption transpose_vulkan_options[] = {
         { "clock",       "rotate clockwise",                            0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CLOCK       }, .flags=FLAGS, .unit = "dir" },
         { "cclock",      "rotate counter-clockwise",                    0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CCLOCK      }, .flags=FLAGS, .unit = "dir" },
         { "clock_flip",  "rotate clockwise with vertical flip",         0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CLOCK_FLIP  }, .flags=FLAGS, .unit = "dir" },
+
+    { "passthrough", "do not apply transposition if the input matches the specified geometry",
+      OFFSET(passthrough), AV_OPT_TYPE_INT, {.i64=TRANSPOSE_PT_TYPE_NONE},  0, INT_MAX, FLAGS, "passthrough" },
+        { "none",      "always apply transposition",   0, AV_OPT_TYPE_CONST, {.i64=TRANSPOSE_PT_TYPE_NONE},      INT_MIN, INT_MAX, FLAGS, "passthrough" },
+        { "portrait",  "preserve portrait geometry",   0, AV_OPT_TYPE_CONST, {.i64=TRANSPOSE_PT_TYPE_PORTRAIT},  INT_MIN, INT_MAX, FLAGS, "passthrough" },
+        { "landscape", "preserve landscape geometry",  0, AV_OPT_TYPE_CONST, {.i64=TRANSPOSE_PT_TYPE_LANDSCAPE}, INT_MIN, INT_MAX, FLAGS, "passthrough" },
+
     { NULL }
 };
 
-- 
2.25.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".

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [FFmpeg-devel] [PATCH 3/5] avfilter/vf_scale_vulkan: align struct ScaleVulkanContext
  2022-01-02 14:51 [FFmpeg-devel] [PATCH 1/5] avutil/hwcontext_vulkan: fixed validation error VUID 01387 Wu Jianhua
  2022-01-02 14:51 ` [FFmpeg-devel] [PATCH 2/5] transpose_vulkan: add passthrough option Wu Jianhua
@ 2022-01-02 14:51 ` Wu Jianhua
  2022-01-02 14:51 ` [FFmpeg-devel] [PATCH 4/5] avfilter: add a blend_vulkan filter Wu Jianhua
  2022-01-02 14:51 ` [FFmpeg-devel] [PATCH 5/5] avfilter/vf_blend: fix un-checked potential memory allocation failure Wu Jianhua
  3 siblings, 0 replies; 11+ messages in thread
From: Wu Jianhua @ 2022-01-02 14:51 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Wu Jianhua

On 64 bit Operating System, sizeof(ScaleVulkanContext):
    reduce from 2400 to 2392 on Linux
    reduce from 2416 to 2408 on Windows

Signed-off-by: Wu Jianhua <jianhua.wu@intel.com>
---
 libavfilter/vf_scale_vulkan.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/libavfilter/vf_scale_vulkan.c b/libavfilter/vf_scale_vulkan.c
index cfce5ab1f8..c87a8d7e2e 100644
--- a/libavfilter/vf_scale_vulkan.c
+++ b/libavfilter/vf_scale_vulkan.c
@@ -35,7 +35,6 @@ enum ScalerFunc {
 typedef struct ScaleVulkanContext {
     FFVulkanContext vkctx;
 
-    int initialized;
     FFVkQueueFamilyCtx qf;
     FFVkExecContext *exec;
     FFVulkanPipeline *pl;
@@ -46,11 +45,14 @@ typedef struct ScaleVulkanContext {
     VkDescriptorImageInfo output_images[3];
     VkDescriptorBufferInfo params_desc;
 
-    enum ScalerFunc scaler;
     char *out_format_string;
-    enum AVColorRange out_range;
     char *w_expr;
     char *h_expr;
+
+    enum ScalerFunc scaler;
+    enum AVColorRange out_range;
+
+    int initialized;
 } ScaleVulkanContext;
 
 static const char scale_bilinear[] = {
-- 
2.25.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".

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [FFmpeg-devel] [PATCH 4/5] avfilter: add a blend_vulkan filter
  2022-01-02 14:51 [FFmpeg-devel] [PATCH 1/5] avutil/hwcontext_vulkan: fixed validation error VUID 01387 Wu Jianhua
  2022-01-02 14:51 ` [FFmpeg-devel] [PATCH 2/5] transpose_vulkan: add passthrough option Wu Jianhua
  2022-01-02 14:51 ` [FFmpeg-devel] [PATCH 3/5] avfilter/vf_scale_vulkan: align struct ScaleVulkanContext Wu Jianhua
@ 2022-01-02 14:51 ` Wu Jianhua
  2022-01-02 14:51 ` [FFmpeg-devel] [PATCH 5/5] avfilter/vf_blend: fix un-checked potential memory allocation failure Wu Jianhua
  3 siblings, 0 replies; 11+ messages in thread
From: Wu Jianhua @ 2022-01-02 14:51 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Wu Jianhua

This commit adds a blend_vulkan filter and a normal blend mode, and
reserves support for introducing the blend modes in the future.

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=normal,\
pseudocolor=preset=turbo" -y normal_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=normal,hwdownload,\
format=yuv420p,pseudocolor=preset=turbo" -y normal_vulkan.jpg

Signed-off-by: Wu Jianhua <jianhua.wu@intel.com>
---
 configure                     |   1 +
 libavfilter/Makefile          |   1 +
 libavfilter/allfilters.c      |   1 +
 libavfilter/vf_blend_vulkan.c | 501 ++++++++++++++++++++++++++++++++++
 4 files changed, 504 insertions(+)
 create mode 100644 libavfilter/vf_blend_vulkan.c

diff --git a/configure b/configure
index 6ad70b9f7b..f6c9e38051 100755
--- a/configure
+++ b/configure
@@ -3609,6 +3609,7 @@ avgblur_opencl_filter_deps="opencl"
 avgblur_vulkan_filter_deps="vulkan spirv_compiler"
 azmq_filter_deps="libzmq"
 blackframe_filter_deps="gpl"
+blend_vulkan_filter_deps="vulkan spirv_compiler"
 bm3d_filter_deps="avcodec"
 bm3d_filter_select="dct"
 boxblur_filter_deps="gpl"
diff --git a/libavfilter/Makefile b/libavfilter/Makefile
index 090944a99c..ed727e3fd9 100644
--- a/libavfilter/Makefile
+++ b/libavfilter/Makefile
@@ -192,6 +192,7 @@ OBJS-$(CONFIG_BITPLANENOISE_FILTER)          += vf_bitplanenoise.o
 OBJS-$(CONFIG_BLACKDETECT_FILTER)            += vf_blackdetect.o
 OBJS-$(CONFIG_BLACKFRAME_FILTER)             += vf_blackframe.o
 OBJS-$(CONFIG_BLEND_FILTER)                  += vf_blend.o framesync.o
+OBJS-$(CONFIG_BLEND_VULKAN_FILTER)           += vf_blend_vulkan.o framesync.o vulkan.o vulkan_filter.o
 OBJS-$(CONFIG_BM3D_FILTER)                   += vf_bm3d.o framesync.o
 OBJS-$(CONFIG_BOXBLUR_FILTER)                += vf_boxblur.o boxblur.o
 OBJS-$(CONFIG_BOXBLUR_OPENCL_FILTER)         += vf_avgblur_opencl.o opencl.o \
diff --git a/libavfilter/allfilters.c b/libavfilter/allfilters.c
index caa755320e..84ba9fdf54 100644
--- a/libavfilter/allfilters.c
+++ b/libavfilter/allfilters.c
@@ -183,6 +183,7 @@ extern const AVFilter ff_vf_bitplanenoise;
 extern const AVFilter ff_vf_blackdetect;
 extern const AVFilter ff_vf_blackframe;
 extern const AVFilter ff_vf_blend;
+extern const AVFilter ff_vf_blend_vulkan;
 extern const AVFilter ff_vf_bm3d;
 extern const AVFilter ff_vf_boxblur;
 extern const AVFilter ff_vf_boxblur_opencl;
diff --git a/libavfilter/vf_blend_vulkan.c b/libavfilter/vf_blend_vulkan.c
new file mode 100644
index 0000000000..fac1be532d
--- /dev/null
+++ b/libavfilter/vf_blend_vulkan.c
@@ -0,0 +1,501 @@
+/*
+ * copyright (c) 2021 Wu Jianhua <jianhua.wu@intel.com>
+ * The blend modes are based on the blend.c.
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "libavutil/random_seed.h"
+#include "libavutil/opt.h"
+#include "vulkan_filter.h"
+#include "internal.h"
+#include "framesync.h"
+#include "blend.h"
+
+#define CGS 32
+
+typedef struct FilterParamsVulkan {
+    const char *blend;
+    const char *blend_func;
+    double opacity;
+    enum BlendMode mode;
+} FilterParamsVulkan;
+
+typedef struct BlendVulkanContext {
+    FFVulkanContext vkctx;
+    FFVkQueueFamilyCtx qf;
+    FFVkExecContext *exec;
+    FFVulkanPipeline *pl;
+    FFFrameSync fs;
+
+    VkDescriptorImageInfo top_images[3];
+    VkDescriptorImageInfo bottom_images[3];
+    VkDescriptorImageInfo output_images[3];
+
+    FilterParamsVulkan params[4];
+    double all_opacity;
+    enum BlendMode all_mode;
+
+    int initialized;
+} BlendVulkanContext;
+
+#define DEFINE_BLEND_MODE(MODE, EXPR) \
+static const char blend_##MODE[] = "blend_"#MODE; \
+static const char blend_##MODE##_func[] = { \
+    C(0, vec4 blend_##MODE(vec4 top, vec4 bottom, float opacity) {   ) \
+    C(1,     vec4 dst = EXPR;                                        ) \
+    C(1,     return dst;                                             ) \
+    C(0, }                                                           ) \
+};
+
+#define TOP    0
+#define BOTTOM 1
+
+#define A top
+#define B bottom
+
+DEFINE_BLEND_MODE(NORMAL, A * opacity + B * (1.f - opacity))
+
+static inline void init_blend_func(FilterParamsVulkan *param)
+{
+#define CASE(MODE) case BLEND_##MODE: \
+            param->blend = blend_##MODE;\
+            param->blend_func =  blend_##MODE##_func; \
+            break;
+
+    switch (param->mode) {
+    CASE(NORMAL)
+    default: param->blend = NULL; break;
+    }
+
+#undef CASE
+}
+
+static int config_params(AVFilterContext *avctx)
+{
+    BlendVulkanContext *s = avctx->priv;
+
+    for (int plane = 0; plane < FF_ARRAY_ELEMS(s->params); plane++) {
+        FilterParamsVulkan *param = &s->params[plane];
+
+        if (s->all_mode >= 0)
+            param->mode = s->all_mode;
+        if (s->all_opacity < 1)
+            param->opacity = s->all_opacity;
+
+        init_blend_func(param);
+        if (!param->blend) {
+            av_log(avctx, AV_LOG_ERROR,
+                   "Currently the blend mode specified is not supported yet.\n");
+            return AVERROR(EINVAL);
+        }
+    }
+
+    return 0;
+}
+
+static int process_command(AVFilterContext *ctx, const char *cmd, const char *args,
+                           char *res, int res_len, int flags)
+{
+    int ret;
+
+    ret = ff_filter_process_command(ctx, cmd, args, res, res_len, flags);
+    if (ret < 0)
+        return ret;
+
+    return config_params(ctx);
+}
+
+static av_cold int init_filter(AVFilterContext *avctx)
+{
+    int err = 0;
+    FFVkSampler *sampler;
+    FFVkSPIRVShader *shd;
+    BlendVulkanContext *s = avctx->priv;
+    FFVulkanContext *vkctx = &s->vkctx;
+    const int planes = av_pix_fmt_count_planes(s->vkctx.output_format);
+
+    ff_vk_qf_init(vkctx, &s->qf, VK_QUEUE_COMPUTE_BIT, 0);
+
+    sampler = ff_vk_init_sampler(vkctx, 1, VK_FILTER_LINEAR);
+    if (!sampler)
+        return AVERROR_EXTERNAL;
+
+    s->pl = ff_vk_create_pipeline(vkctx, &s->qf);
+    if (!s->pl)
+        return AVERROR(ENOMEM);
+
+    {
+        FFVulkanDescriptorSetBinding image_descs[] = {
+            {
+                .name       = "top_images",
+                .type       = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
+                .dimensions = 2,
+                .elems      = planes,
+                .stages     = VK_SHADER_STAGE_COMPUTE_BIT,
+                .updater    = s->top_images,
+                .sampler    = sampler,
+            },
+            {
+                .name       = "bottom_images",
+                .type       = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
+                .dimensions = 2,
+                .elems      = planes,
+                .stages     = VK_SHADER_STAGE_COMPUTE_BIT,
+                .updater    = s->bottom_images,
+                .sampler    = sampler,
+            },
+            {
+                .name       = "output_images",
+                .type       = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
+                .mem_layout = ff_vk_shader_rep_fmt(s->vkctx.output_format),
+                .mem_quali  = "writeonly",
+                .dimensions = 2,
+                .elems      = planes,
+                .stages     = VK_SHADER_STAGE_COMPUTE_BIT,
+                .updater    = s->output_images,
+            },
+        };
+
+        shd = ff_vk_init_shader(s->pl, "blend_compute", image_descs[0].stages);
+        if (!shd)
+            return AVERROR(ENOMEM);
+
+        ff_vk_set_compute_shader_sizes(shd, (int [3]){ CGS, CGS, 1 });
+        RET(ff_vk_add_descriptor_set(vkctx, s->pl, shd, image_descs, FF_ARRAY_ELEMS(image_descs), 0));
+
+        for (int i = 0, j = 0; i < planes; i++) {
+            for (j = 0; j < i; j++)
+                if (s->params[i].blend_func == s->params[j].blend_func)
+                    break;
+            /* note: the bracket is needed, for GLSLD is a macro with multiple statements. */
+            if (j == i) {
+                GLSLD(s->params[i].blend_func);
+            }
+        }
+
+        GLSLC(0, void main()                                               );
+        GLSLC(0, {                                                         );
+        GLSLC(1,     ivec2 size;                                           );
+        GLSLC(1,     const ivec2 pos = ivec2(gl_GlobalInvocationID.xy);    );
+        for (int i = 0; i < planes; i++) {
+            GLSLC(0,                                                       );
+            GLSLF(1, size = imageSize(output_images[%i]);                ,i);
+            GLSLC(1, if (IS_WITHIN(pos, size)) {                           );
+            GLSLF(2,     const vec4 top = texture(top_images[%i], pos);       ,i);
+            GLSLF(2,     const vec4 bottom = texture(bottom_images[%i], pos); ,i);
+            GLSLF(2,     const float opacity = %f;         ,s->params[i].opacity);
+            GLSLF(2,     vec4 dst = %s(top, bottom, opacity);,s->params[i].blend);
+            GLSLC(0,                                                       );
+            GLSLF(2,     imageStore(output_images[%i], pos, dst);        ,i);
+            GLSLC(1, }                                                     );
+        }
+        GLSLC(0, }                                                         );
+
+        RET(ff_vk_compile_shader(vkctx, shd, "main"));
+        RET(ff_vk_init_pipeline_layout(vkctx, s->pl));
+        RET(ff_vk_init_compute_pipeline(vkctx, s->pl));
+    }
+
+    RET(ff_vk_create_exec_ctx(vkctx, &s->exec, &s->qf));
+
+    s->initialized = 1;
+
+fail:
+    return err;
+}
+
+static int process_frames(AVFilterContext *avctx, AVFrame *out_frame, AVFrame *top_frame, AVFrame *bottom_frame)
+{
+    int err = 0;
+    VkCommandBuffer cmd_buf;
+    BlendVulkanContext *s = avctx->priv;
+    FFVulkanContext *vkctx = &s->vkctx;
+    FFVulkanFunctions *vk = &s->vkctx.vkfn;
+    const int planes = av_pix_fmt_count_planes(s->vkctx.output_format);
+
+    AVVkFrame *out    = (AVVkFrame *)out_frame->data[0];
+    AVVkFrame *top    = (AVVkFrame *)top_frame->data[0];
+    AVVkFrame *bottom = (AVVkFrame *)bottom_frame->data[0];
+
+    AVHWFramesContext *top_fc    = (AVHWFramesContext*)top_frame->hw_frames_ctx->data;
+    AVHWFramesContext *bottom_fc = (AVHWFramesContext*)bottom_frame->hw_frames_ctx->data;
+
+    const VkFormat *top_formats    = av_vkfmt_from_pixfmt(top_fc->sw_format);
+    const VkFormat *bottom_formats = av_vkfmt_from_pixfmt(bottom_fc->sw_format);
+    const VkFormat *output_formats = av_vkfmt_from_pixfmt(s->vkctx.output_format);
+
+    ff_vk_start_exec_recording(vkctx, s->exec);
+    cmd_buf = ff_vk_get_exec_buf(s->exec);
+
+    for (int i = 0; i < planes; i++) {
+        RET(ff_vk_create_imageview(vkctx, s->exec,
+                                   &s->top_images[i].imageView, top->img[i],
+                                   top_formats[i],
+                                   ff_comp_identity_map));
+
+        RET(ff_vk_create_imageview(vkctx, s->exec,
+                                   &s->bottom_images[i].imageView, bottom->img[i],
+                                   bottom_formats[i],
+                                   ff_comp_identity_map));
+
+        RET(ff_vk_create_imageview(vkctx, s->exec,
+                                   &s->output_images[i].imageView, out->img[i],
+                                   output_formats[i],
+                                   ff_comp_identity_map));
+
+        s->top_images[i].imageLayout    = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
+        s->bottom_images[i].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
+        s->output_images[i].imageLayout = VK_IMAGE_LAYOUT_GENERAL;
+    }
+
+    ff_vk_update_descriptor_set(vkctx, s->pl, 0);
+
+    for (int i = 0; i < planes; i++) {
+        VkImageMemoryBarrier barriers[] = {
+            {
+                .sType                       = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
+                .srcAccessMask               = 0,
+                .dstAccessMask               = VK_ACCESS_SHADER_READ_BIT,
+                .oldLayout                   = top->layout[i],
+                .newLayout                   = s->top_images[i].imageLayout,
+                .srcQueueFamilyIndex         = VK_QUEUE_FAMILY_IGNORED,
+                .dstQueueFamilyIndex         = VK_QUEUE_FAMILY_IGNORED,
+                .image                       = top->img[i],
+                .subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
+                .subresourceRange.levelCount = 1,
+                .subresourceRange.layerCount = 1,
+            },
+            {
+                .sType                       = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
+                .srcAccessMask               = 0,
+                .dstAccessMask               = VK_ACCESS_SHADER_READ_BIT,
+                .oldLayout                   = bottom->layout[i],
+                .newLayout                   = s->bottom_images[i].imageLayout,
+                .srcQueueFamilyIndex         = VK_QUEUE_FAMILY_IGNORED,
+                .dstQueueFamilyIndex         = VK_QUEUE_FAMILY_IGNORED,
+                .image                       = bottom->img[i],
+                .subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
+                .subresourceRange.levelCount = 1,
+                .subresourceRange.layerCount = 1,
+            },
+            {
+                .sType                       = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
+                .srcAccessMask               = 0,
+                .dstAccessMask               = VK_ACCESS_SHADER_WRITE_BIT,
+                .oldLayout                   = out->layout[i],
+                .newLayout                   = s->output_images[i].imageLayout,
+                .srcQueueFamilyIndex         = VK_QUEUE_FAMILY_IGNORED,
+                .dstQueueFamilyIndex         = VK_QUEUE_FAMILY_IGNORED,
+                .image                       = out->img[i],
+                .subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
+                .subresourceRange.levelCount = 1,
+                .subresourceRange.layerCount = 1,
+            },
+        };
+
+        vk->CmdPipelineBarrier(cmd_buf, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
+                               VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, 0,
+                               0, NULL, 0, NULL, FF_ARRAY_ELEMS(barriers), barriers);
+
+        top->layout[i] = barriers[0].newLayout;
+        top->access[i] = barriers[0].dstAccessMask;
+
+        bottom->layout[i] = barriers[1].newLayout;
+        bottom->access[i] = barriers[1].dstAccessMask;
+
+        out->layout[i] = barriers[2].newLayout;
+        out->access[i] = barriers[2].dstAccessMask;
+    }
+
+    ff_vk_bind_pipeline_exec(vkctx, s->exec, s->pl);
+    vk->CmdDispatch(cmd_buf, FFALIGN(s->vkctx.output_width, CGS) / CGS,
+                    FFALIGN(s->vkctx.output_height, CGS) / CGS, 1);
+
+    ff_vk_add_exec_dep(vkctx, s->exec, top_frame, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
+    ff_vk_add_exec_dep(vkctx, s->exec, bottom_frame, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
+    ff_vk_add_exec_dep(vkctx, s->exec, out_frame, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
+
+    err = ff_vk_submit_exec_queue(vkctx, s->exec);
+    if (err)
+        return err;
+
+    ff_vk_qf_rotate(&s->qf);
+
+    return 0;
+
+fail:
+    ff_vk_discard_exec_deps(s->exec);
+    return err;
+}
+
+static int blend_frame(FFFrameSync *fs)
+{
+    int err;
+    AVFilterContext *avctx = fs->parent;
+    BlendVulkanContext *s = avctx->priv;
+    AVFilterLink *outlink = avctx->outputs[0];
+    AVFrame *top, *bottom, *out;
+
+    out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
+    if (!out) {
+        err = AVERROR(ENOMEM);
+        goto fail;
+    }
+
+    RET(ff_framesync_get_frame(fs, TOP, &top, 0));
+    RET(ff_framesync_get_frame(fs, BOTTOM, &bottom, 0));
+
+    RET(av_frame_copy_props(out, top));
+
+    if (!s->initialized) {
+        AVHWFramesContext *top_fc = (AVHWFramesContext*)top->hw_frames_ctx->data;
+        AVHWFramesContext *bottom_fc = (AVHWFramesContext*)bottom->hw_frames_ctx->data;
+        if (top_fc->sw_format != bottom_fc->sw_format) {
+            av_log(avctx, AV_LOG_ERROR,
+                   "Currently the sw format of the bottom video need to match the top!\n");
+            return AVERROR(EINVAL);
+        }
+        RET(init_filter(avctx));
+    }
+
+    RET(process_frames(avctx, out, top, bottom));
+
+    return ff_filter_frame(outlink, out);
+
+fail:
+    av_frame_free(&out);
+    return err;
+}
+
+static av_cold int init(AVFilterContext *avctx)
+{
+    BlendVulkanContext *s = avctx->priv;
+
+    s->fs.on_event = blend_frame;
+
+    return ff_vk_filter_init(avctx);
+}
+
+static av_cold void uninit(AVFilterContext *avctx)
+{
+    BlendVulkanContext *s = avctx->priv;
+
+    ff_framesync_uninit(&s->fs);
+
+    ff_vk_uninit(&s->vkctx);
+
+    s->initialized = 0;
+}
+
+static int config_props_output(AVFilterLink *outlink)
+{
+    int err;
+    AVFilterContext *avctx = outlink->src;
+    BlendVulkanContext *s = avctx->priv;
+    AVFilterLink *toplink = avctx->inputs[TOP];
+    AVFilterLink *bottomlink = avctx->inputs[BOTTOM];
+
+    if (toplink->w != bottomlink->w || toplink->h != bottomlink->h) {
+        av_log(avctx, AV_LOG_ERROR, "First input link %s parameters "
+                "(size %dx%d) do not match the corresponding "
+                "second input link %s parameters (size %dx%d)\n",
+                avctx->input_pads[TOP].name, toplink->w, toplink->h,
+                avctx->input_pads[BOTTOM].name, bottomlink->w, bottomlink->h);
+        return AVERROR(EINVAL);
+    }
+
+    outlink->sample_aspect_ratio = toplink->sample_aspect_ratio;
+    outlink->frame_rate = toplink->frame_rate;
+
+    RET(ff_vk_filter_config_output(outlink));
+
+    RET(ff_framesync_init_dualinput(&s->fs, avctx));
+
+    RET(ff_framesync_configure(&s->fs));
+    outlink->time_base = s->fs.time_base;
+
+    RET(config_params(avctx));
+
+fail:
+    return err;
+}
+
+static int activate(AVFilterContext *avctx)
+{
+    BlendVulkanContext *s = avctx->priv;
+    return ff_framesync_activate(&s->fs);
+}
+
+#define OFFSET(x) offsetof(BlendVulkanContext, x)
+#define FLAGS (AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
+
+static const AVOption blend_vulkan_options[] = {
+    { "c0_mode", "set component #0 blend mode", OFFSET(params[0].mode), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, BLEND_NB - 1, FLAGS, "mode" },
+    { "c1_mode", "set component #1 blend mode", OFFSET(params[1].mode), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, BLEND_NB - 1, FLAGS, "mode" },
+    { "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" },
+
+    { "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 },
+    { "c2_opacity",  "set color component #2 opacity", OFFSET(params[2].opacity), AV_OPT_TYPE_DOUBLE, { .dbl = 1 }, 0, 1, FLAGS },
+    { "c3_opacity",  "set color component #3 opacity", OFFSET(params[3].opacity), AV_OPT_TYPE_DOUBLE, { .dbl = 1 }, 0, 1, FLAGS },
+    { "all_opacity", "set opacity for all color components", OFFSET(all_opacity), AV_OPT_TYPE_DOUBLE, { .dbl = 1 }, 0, 1, FLAGS },
+
+    { NULL }
+};
+
+AVFILTER_DEFINE_CLASS(blend_vulkan);
+
+static const AVFilterPad blend_vulkan_inputs[] = {
+    {
+        .name         = "top",
+        .type         = AVMEDIA_TYPE_VIDEO,
+        .config_props = &ff_vk_filter_config_input,
+    },
+    {
+        .name         = "bottom",
+        .type         = AVMEDIA_TYPE_VIDEO,
+        .config_props = &ff_vk_filter_config_input,
+    },
+};
+
+
+static const AVFilterPad blend_vulkan_outputs[] = {
+    {
+        .name         = "default",
+        .type         = AVMEDIA_TYPE_VIDEO,
+        .config_props = &config_props_output,
+    }
+};
+
+const AVFilter ff_vf_blend_vulkan = {
+    .name            = "blend_vulkan",
+    .description     = NULL_IF_CONFIG_SMALL("Blend two video frames in Vulkan"),
+    .priv_size       = sizeof(BlendVulkanContext),
+    .init            = &init,
+    .uninit          = &uninit,
+    .activate        = &activate,
+    FILTER_INPUTS(blend_vulkan_inputs),
+    FILTER_OUTPUTS(blend_vulkan_outputs),
+    FILTER_SINGLE_PIXFMT(AV_PIX_FMT_VULKAN),
+    .priv_class      = &blend_vulkan_class,
+    .flags_internal  = FF_FILTER_FLAG_HWFRAME_AWARE,
+    .process_command = &process_command,
+};
-- 
2.25.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".

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [FFmpeg-devel] [PATCH 5/5] avfilter/vf_blend: fix un-checked potential memory allocation failure
  2022-01-02 14:51 [FFmpeg-devel] [PATCH 1/5] avutil/hwcontext_vulkan: fixed validation error VUID 01387 Wu Jianhua
                   ` (2 preceding siblings ...)
  2022-01-02 14:51 ` [FFmpeg-devel] [PATCH 4/5] avfilter: add a blend_vulkan filter Wu Jianhua
@ 2022-01-02 14:51 ` Wu Jianhua
  2022-01-03  2:23   ` Lynne
  3 siblings, 1 reply; 11+ messages in thread
From: Wu Jianhua @ 2022-01-02 14:51 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Wu Jianhua

Signed-off-by: Wu Jianhua <jianhua.wu@intel.com>
---
 libavfilter/vf_blend.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/libavfilter/vf_blend.c b/libavfilter/vf_blend.c
index b6f3c4fed3..2d433e439f 100644
--- a/libavfilter/vf_blend.c
+++ b/libavfilter/vf_blend.c
@@ -279,7 +279,11 @@ static AVFrame *blend_frame(AVFilterContext *ctx, AVFrame *top_buf,
     dst_buf = ff_get_video_buffer(outlink, outlink->w, outlink->h);
     if (!dst_buf)
         return top_buf;
-    av_frame_copy_props(dst_buf, top_buf);
+
+    if (av_frame_copy_props(dst_buf, top_buf) < 0) {
+        av_frame_free(&dst_buf);
+        return top_buf;
+    }
 
     for (plane = 0; plane < s->nb_planes; plane++) {
         int hsub = plane == 1 || plane == 2 ? s->hsub : 0;
-- 
2.25.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".

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [FFmpeg-devel] [PATCH 5/5] avfilter/vf_blend: fix un-checked potential memory allocation failure
  2022-01-02 14:51 ` [FFmpeg-devel] [PATCH 5/5] avfilter/vf_blend: fix un-checked potential memory allocation failure Wu Jianhua
@ 2022-01-03  2:23   ` Lynne
  2022-01-03  8:39     ` Wu, Jianhua
  0 siblings, 1 reply; 11+ messages in thread
From: Lynne @ 2022-01-03  2:23 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

2 Jan 2022, 15:51 by jianhua.wu-at-intel.com@ffmpeg.org:

> Signed-off-by: Wu Jianhua <jianhua.wu@intel.com>
> ---
>  libavfilter/vf_blend.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/libavfilter/vf_blend.c b/libavfilter/vf_blend.c
> index b6f3c4fed3..2d433e439f 100644
> --- a/libavfilter/vf_blend.c
> +++ b/libavfilter/vf_blend.c
> @@ -279,7 +279,11 @@ static AVFrame *blend_frame(AVFilterContext *ctx, AVFrame *top_buf,
>  dst_buf = ff_get_video_buffer(outlink, outlink->w, outlink->h);
>  if (!dst_buf)
>  return top_buf;
> -    av_frame_copy_props(dst_buf, top_buf);
> +
> +    if (av_frame_copy_props(dst_buf, top_buf) < 0) {
> +        av_frame_free(&dst_buf);
> +        return top_buf;
> +    }
>  
>  for (plane = 0; plane < s->nb_planes; plane++) {
>  int hsub = plane == 1 || plane == 2 ? s->hsub : 0;
>

Pushed patches 2 and 3. The blend filter doesn't work for me:
https://0x0.st/osRM.jpg
This is not what it's meant to look like at all, for blank, default options.

Patch 1 is a driver bug. The driver should not advertise the
HDR extension as supported if there's no swapchain. The HDR
extension explicitly requires a swapchain, and the Vulkan specs
say that devices are meant to only advertise supported extensions,
which the HDR extension wouldn't be if the swapchain extension
has not been loaded.
I pushed an alternative version that just removes the HDR extension,
but you need to notify your Windows driver developers that it's
not doing what it should.
_______________________________________________
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".

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [FFmpeg-devel] [PATCH 5/5] avfilter/vf_blend: fix un-checked potential memory allocation failure
  2022-01-03  2:23   ` Lynne
@ 2022-01-03  8:39     ` Wu, Jianhua
  2022-01-03 13:57       ` Timo Rothenpieler
  0 siblings, 1 reply; 11+ messages in thread
From: Wu, Jianhua @ 2022-01-03  8:39 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

 Lynne:
> Sent: Monday, January 3, 2022 10:23 AM
> To: FFmpeg development discussions and patches <ffmpeg-
> devel@ffmpeg.org>
> Subject: Re: [FFmpeg-devel] [PATCH 5/5] avfilter/vf_blend: fix un-checked
> potential memory allocation failure
> 
> 2 Jan 2022, 15:51 by jianhua.wu-at-intel.com@ffmpeg.org:
> 
> > Signed-off-by: Wu Jianhua <jianhua.wu@intel.com>
> > ---
> >  libavfilter/vf_blend.c | 6 +++++-
> >  1 file changed, 5 insertions(+), 1 deletion(-)
> >
> > diff --git a/libavfilter/vf_blend.c b/libavfilter/vf_blend.c index
> > b6f3c4fed3..2d433e439f 100644
> > --- a/libavfilter/vf_blend.c
> > +++ b/libavfilter/vf_blend.c
> > @@ -279,7 +279,11 @@ static AVFrame *blend_frame(AVFilterContext
> *ctx,
> > AVFrame *top_buf,  dst_buf = ff_get_video_buffer(outlink, outlink->w,
> > outlink->h);  if (!dst_buf)  return top_buf;
> > -    av_frame_copy_props(dst_buf, top_buf);
> > +
> > +    if (av_frame_copy_props(dst_buf, top_buf) < 0) {
> > +        av_frame_free(&dst_buf);
> > +        return top_buf;
> > +    }
> >
> >  for (plane = 0; plane < s->nb_planes; plane++) {  int hsub = plane ==
> > 1 || plane == 2 ? s->hsub : 0;
> >
> 
> Pushed patches 2 and 3. The blend filter doesn't work for me:
> https://0x0.st/osRM.jpg
> This is not what it's meant to look like at all, for blank, default options.
> 

I'm afraid of it's not the problem of the blend_vulkan filter. Could you help try the other Vulkan filters and
see if they are still work?

> Patch 1 is a driver bug. The driver should not advertise the HDR extension as
> supported if there's no swapchain. The HDR extension explicitly requires a
> swapchain, and the Vulkan specs say that devices are meant to only
> advertise supported extensions, which the HDR extension wouldn't be if the
> swapchain extension has not been loaded.
> I pushed an alternative version that just removes the HDR extension, but you
> need to notify your Windows driver developers that it's not doing what it
> should.
> 

Removing it is okay if it  is not used totally. And I' sorry we may have a mistake here.
Below is my development environment on this patch:
Operating System: Windows 10
Physical Device: Nvidia RTX3070
Driver version: GeForce Game Ready Driver 497.29
I'll add something like these to commit message if I fix similar problems.

And there is one more question, may I know why there is a suffix "@ffmpeg.org"
behind my commit Author email?

Thanks,
Jianhua
_______________________________________________
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".

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [FFmpeg-devel] [PATCH 5/5] avfilter/vf_blend: fix un-checked potential memory allocation failure
  2022-01-03  8:39     ` Wu, Jianhua
@ 2022-01-03 13:57       ` Timo Rothenpieler
  2022-01-03 14:48         ` Wu Jianhua
  0 siblings, 1 reply; 11+ messages in thread
From: Timo Rothenpieler @ 2022-01-03 13:57 UTC (permalink / raw)
  To: ffmpeg-devel


[-- Attachment #1.1: Type: text/plain, Size: 405 bytes --]

On 03.01.2022 09:39, Wu, Jianhua wrote:
> And there is one more question, may I know why there is a suffix "@ffmpeg.org"
> behind my commit Author email?

Your E-Mail server is enforcing strict policy via DKIM/DMARC, so it's 
impossible for any other mail-servers, like mailing lists, to send 
E-Mails from @intel.com.
Hence the only option the list server has is to mangle the sender 
address like that.

[-- Attachment #1.2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4494 bytes --]

[-- Attachment #2: Type: text/plain, Size: 251 bytes --]

_______________________________________________
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".

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [FFmpeg-devel] [PATCH 5/5] avfilter/vf_blend: fix un-checked potential memory allocation failure
  2022-01-03 13:57       ` Timo Rothenpieler
@ 2022-01-03 14:48         ` Wu Jianhua
  0 siblings, 0 replies; 11+ messages in thread
From: Wu Jianhua @ 2022-01-03 14:48 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

Timo Rothenpieler<mailto:timo@rothenpieler.org> wrote:

> On 03.01.2022 09:39, Wu, Jianhua wrote:
>> And there is one more question, may I know why there is a suffix "@ffmpeg.org"
>> behind my commit Author email?
>
> Your E-Mail server is enforcing strict policy via DKIM/DMARC, so it's
> impossible for any other mail-servers, like mailing lists, to send
> E-Mails from @intel.com.
> Hence the only option the list server has is to mangle the sender
> address like that.

Got it. Thanks for your answer. Maybe it's better to send patches as attachments in case the commit message gets broken.

Best Regards,
Jianhua

_______________________________________________
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".

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [FFmpeg-devel] [PATCH 2/5] transpose_vulkan: add passthrough option
  2022-01-02 14:51 ` [FFmpeg-devel] [PATCH 2/5] transpose_vulkan: add passthrough option Wu Jianhua
@ 2022-01-10 14:19   ` Anton Khirnov
  2022-01-10 15:52     ` Wu Jianhua
  0 siblings, 1 reply; 11+ messages in thread
From: Anton Khirnov @ 2022-01-10 14:19 UTC (permalink / raw)
  To: FFmpeg development discussions and patches; +Cc: Wu Jianhua

It sure would be nice if all the different hw flavors of the same filter
could share code.

-- 
Anton Khirnov
_______________________________________________
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".

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [FFmpeg-devel] [PATCH 2/5] transpose_vulkan: add passthrough option
  2022-01-10 14:19   ` Anton Khirnov
@ 2022-01-10 15:52     ` Wu Jianhua
  0 siblings, 0 replies; 11+ messages in thread
From: Wu Jianhua @ 2022-01-10 15:52 UTC (permalink / raw)
  To: FFmpeg development discussions and patches; +Cc: Anton Khirnov

> It sure would be nice if all the different hw flavors of the same filter
> could share code.

Yeah. Definitely. The config_output function of the same filter
implemented by different hw is similar. Maybe something like
this could be integrated into one separate function.

Best Regards,
Jianhua

_______________________________________________
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".

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2022-01-10 15:52 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-01-02 14:51 [FFmpeg-devel] [PATCH 1/5] avutil/hwcontext_vulkan: fixed validation error VUID 01387 Wu Jianhua
2022-01-02 14:51 ` [FFmpeg-devel] [PATCH 2/5] transpose_vulkan: add passthrough option Wu Jianhua
2022-01-10 14:19   ` Anton Khirnov
2022-01-10 15:52     ` Wu Jianhua
2022-01-02 14:51 ` [FFmpeg-devel] [PATCH 3/5] avfilter/vf_scale_vulkan: align struct ScaleVulkanContext Wu Jianhua
2022-01-02 14:51 ` [FFmpeg-devel] [PATCH 4/5] avfilter: add a blend_vulkan filter Wu Jianhua
2022-01-02 14:51 ` [FFmpeg-devel] [PATCH 5/5] avfilter/vf_blend: fix un-checked potential memory allocation failure Wu Jianhua
2022-01-03  2:23   ` Lynne
2022-01-03  8:39     ` Wu, Jianhua
2022-01-03 13:57       ` Timo Rothenpieler
2022-01-03 14:48         ` Wu Jianhua

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