* [FFmpeg-devel] [PATCH 2/2] overlay_vulkan: remove in favor of libplacebo
@ 2023-06-20 17:33 Lynne
2023-06-20 17:36 ` Nicolas George
0 siblings, 1 reply; 2+ messages in thread
From: Lynne @ 2023-06-20 17:33 UTC (permalink / raw)
To: Ffmpeg Devel
[-- Attachment #1: Type: text/plain, Size: 17 bytes --]
Patch attached.
[-- Attachment #2: 0002-lavfi-remove-overlay_vulkan-in-favor-of-libplacebo.patch --]
[-- Type: text/x-diff, Size: 16384 bytes --]
From 453c513bb4960dee72228a8713375fce75a40482 Mon Sep 17 00:00:00 2001
From: Lynne <dev@lynne.ee>
Date: Tue, 20 Jun 2023 18:59:03 +0200
Subject: [PATCH 2/2] lavfi: remove overlay_vulkan in favor of libplacebo
---
configure | 1 -
doc/filters.texi | 20 --
libavfilter/Makefile | 1 -
libavfilter/allfilters.c | 1 -
libavfilter/vf_overlay_vulkan.c | 346 --------------------------------
5 files changed, 369 deletions(-)
delete mode 100644 libavfilter/vf_overlay_vulkan.c
diff --git a/configure b/configure
index 81ec58bacd..df3ae8cb77 100755
--- a/configure
+++ b/configure
@@ -3772,7 +3772,6 @@ overlay_opencl_filter_deps="opencl"
overlay_qsv_filter_deps="libmfx"
overlay_qsv_filter_select="qsvvpp"
overlay_vaapi_filter_deps="vaapi VAProcPipelineCaps_blend_flags"
-overlay_vulkan_filter_deps="vulkan spirv_compiler"
owdenoise_filter_deps="gpl"
pad_opencl_filter_deps="opencl"
pan_filter_deps="swresample"
diff --git a/doc/filters.texi b/doc/filters.texi
index f596773af6..bf70fadacb 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -27613,26 +27613,6 @@ Must be odd number in range [0, 99].
@end table
-@section overlay_vulkan
-
-Overlay one video on top of another.
-
-It takes two inputs and has one output. The first input is the "main" video on which the second input is overlaid.
-This filter requires all inputs to use the same pixel format. So, format conversion may be needed.
-
-The filter accepts the following options:
-
-@table @option
-@item x
-Set the x coordinate of the overlaid video on the main video.
-Default value is @code{0}.
-
-@item y
-Set the y coordinate of the overlaid video on the main video.
-Default value is @code{0}.
-
-@end table
-
@section transpose_vulkan
Transpose rows with columns in the input video and optionally flip it.
diff --git a/libavfilter/Makefile b/libavfilter/Makefile
index 62e98bbb09..27c02570b2 100644
--- a/libavfilter/Makefile
+++ b/libavfilter/Makefile
@@ -409,7 +409,6 @@ OBJS-$(CONFIG_OVERLAY_OPENCL_FILTER) += vf_overlay_opencl.o opencl.o \
opencl/overlay.o framesync.o
OBJS-$(CONFIG_OVERLAY_QSV_FILTER) += vf_overlay_qsv.o framesync.o
OBJS-$(CONFIG_OVERLAY_VAAPI_FILTER) += vf_overlay_vaapi.o framesync.o vaapi_vpp.o
-OBJS-$(CONFIG_OVERLAY_VULKAN_FILTER) += vf_overlay_vulkan.o vulkan.o vulkan_filter.o
OBJS-$(CONFIG_OWDENOISE_FILTER) += vf_owdenoise.o
OBJS-$(CONFIG_PAD_FILTER) += vf_pad.o
OBJS-$(CONFIG_PAD_OPENCL_FILTER) += vf_pad_opencl.o opencl.o opencl/pad.o
diff --git a/libavfilter/allfilters.c b/libavfilter/allfilters.c
index eeb014248b..3b379a0d38 100644
--- a/libavfilter/allfilters.c
+++ b/libavfilter/allfilters.c
@@ -382,7 +382,6 @@ extern const AVFilter ff_vf_overlay;
extern const AVFilter ff_vf_overlay_opencl;
extern const AVFilter ff_vf_overlay_qsv;
extern const AVFilter ff_vf_overlay_vaapi;
-extern const AVFilter ff_vf_overlay_vulkan;
extern const AVFilter ff_vf_overlay_cuda;
extern const AVFilter ff_vf_owdenoise;
extern const AVFilter ff_vf_pad;
diff --git a/libavfilter/vf_overlay_vulkan.c b/libavfilter/vf_overlay_vulkan.c
deleted file mode 100644
index ef8e9fd59b..0000000000
--- a/libavfilter/vf_overlay_vulkan.c
+++ /dev/null
@@ -1,346 +0,0 @@
-/*
- * Copyright (c) Lynne
- *
- * 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 "vulkan_spirv.h"
-#include "internal.h"
-#include "framesync.h"
-
-typedef struct OverlayVulkanContext {
- FFVulkanContext vkctx;
- FFFrameSync fs;
-
- int initialized;
- FFVulkanPipeline pl;
- FFVkExecPool e;
- FFVkQueueFamilyCtx qf;
- FFVkSPIRVShader shd;
- VkSampler sampler;
-
- /* Push constants / options */
- struct {
- int32_t o_offset[2*3];
- int32_t o_size[2*3];
- } opts;
-
- int overlay_x;
- int overlay_y;
- int overlay_w;
- int overlay_h;
-} OverlayVulkanContext;
-
-static const char overlay_noalpha[] = {
- C(0, void overlay_noalpha(int i, ivec2 pos) )
- C(0, { )
- C(1, if ((o_offset[i].x <= pos.x) && (o_offset[i].y <= pos.y) &&
- (pos.x < (o_offset[i].x + o_size[i].x)) &&
- (pos.y < (o_offset[i].y + o_size[i].y))) { )
- C(2, vec4 res = texture(overlay_img[i], pos - o_offset[i]); )
- C(2, imageStore(output_img[i], pos, res); )
- C(1, } else { )
- C(2, vec4 res = texture(main_img[i], pos); )
- C(2, imageStore(output_img[i], pos, res); )
- C(1, } )
- C(0, } )
-};
-
-static const char overlay_alpha[] = {
- C(0, void overlay_alpha_opaque(int i, ivec2 pos) )
- C(0, { )
- C(1, vec4 res = texture(main_img[i], pos); )
- C(1, if ((o_offset[i].x <= pos.x) && (o_offset[i].y <= pos.y) &&
- (pos.x < (o_offset[i].x + o_size[i].x)) &&
- (pos.y < (o_offset[i].y + o_size[i].y))) { )
- C(2, vec4 ovr = texture(overlay_img[i], pos - o_offset[i]); )
- C(2, res = ovr * ovr.a + res * (1.0f - ovr.a); )
- C(2, res.a = 1.0f; )
- C(2, imageStore(output_img[i], pos, res); )
- C(1, } )
- C(1, imageStore(output_img[i], pos, res); )
- C(0, } )
-};
-
-static av_cold int init_filter(AVFilterContext *ctx)
-{
- int err;
- uint8_t *spv_data;
- size_t spv_len;
- void *spv_opaque = NULL;
- OverlayVulkanContext *s = ctx->priv;
- FFVulkanContext *vkctx = &s->vkctx;
- const int planes = av_pix_fmt_count_planes(s->vkctx.output_format);
- const int ialpha = av_pix_fmt_desc_get(s->vkctx.input_format)->flags & AV_PIX_FMT_FLAG_ALPHA;
- const AVPixFmtDescriptor *pix_desc = av_pix_fmt_desc_get(s->vkctx.output_format);
- FFVkSPIRVShader *shd = &s->shd;
- FFVkSPIRVCompiler *spv;
- FFVulkanDescriptorSetBinding *desc;
-
- spv = ff_vk_spirv_init();
- if (!spv) {
- av_log(ctx, AV_LOG_ERROR, "Unable to initialize SPIR-V compiler!\n");
- return AVERROR_EXTERNAL;
- }
-
- ff_vk_qf_init(vkctx, &s->qf, VK_QUEUE_COMPUTE_BIT);
- RET(ff_vk_exec_pool_init(vkctx, &s->qf, &s->e, s->qf.nb_queues*4, 0, 0, 0, NULL));
- RET(ff_vk_init_sampler(vkctx, &s->sampler, 1, VK_FILTER_NEAREST));
- RET(ff_vk_shader_init(&s->pl, &s->shd, "overlay_compute",
- VK_SHADER_STAGE_COMPUTE_BIT, 0));
-
- ff_vk_shader_set_compute_sizes(&s->shd, 32, 32, 1);
-
- GLSLC(0, layout(push_constant, std430) uniform pushConstants { );
- GLSLC(1, ivec2 o_offset[3]; );
- GLSLC(1, ivec2 o_size[3]; );
- GLSLC(0, }; );
- GLSLC(0, );
-
- ff_vk_add_push_constant(&s->pl, 0, sizeof(s->opts),
- VK_SHADER_STAGE_COMPUTE_BIT);
-
- desc = (FFVulkanDescriptorSetBinding []) {
- {
- .name = "main_img",
- .type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
- .dimensions = 2,
- .elems = planes,
- .stages = VK_SHADER_STAGE_COMPUTE_BIT,
- .samplers = DUP_SAMPLER(s->sampler),
- },
- {
- .name = "overlay_img",
- .type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
- .dimensions = 2,
- .elems = planes,
- .stages = VK_SHADER_STAGE_COMPUTE_BIT,
- .samplers = DUP_SAMPLER(s->sampler),
- },
- {
- .name = "output_img",
- .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,
- },
- };
-
- RET(ff_vk_pipeline_descriptor_set_add(vkctx, &s->pl, shd, desc, 3, 0, 0));
-
- GLSLD( overlay_noalpha );
- GLSLD( overlay_alpha );
- GLSLC(0, void main() );
- GLSLC(0, { );
- GLSLC(1, ivec2 pos = ivec2(gl_GlobalInvocationID.xy); );
- GLSLF(1, int planes = %i; ,planes);
- GLSLC(1, for (int i = 0; i < planes; i++) { );
- if (ialpha)
- GLSLC(2, overlay_alpha_opaque(i, pos); );
- else
- GLSLC(2, overlay_noalpha(i, pos); );
- GLSLC(1, } );
- GLSLC(0, } );
-
- RET(spv->compile_shader(spv, ctx, shd, &spv_data, &spv_len, "main",
- &spv_opaque));
- RET(ff_vk_shader_create(vkctx, shd, spv_data, spv_len, "main"));
-
- RET(ff_vk_init_compute_pipeline(vkctx, &s->pl, shd));
- RET(ff_vk_exec_pipeline_register(vkctx, &s->e, &s->pl));
-
- s->opts.o_offset[0] = s->overlay_x;
- s->opts.o_offset[1] = s->overlay_y;
- s->opts.o_offset[2] = s->opts.o_offset[0] >> pix_desc->log2_chroma_w;
- s->opts.o_offset[3] = s->opts.o_offset[1] >> pix_desc->log2_chroma_h;
- s->opts.o_offset[4] = s->opts.o_offset[0] >> pix_desc->log2_chroma_w;
- s->opts.o_offset[5] = s->opts.o_offset[1] >> pix_desc->log2_chroma_h;
-
- s->opts.o_size[0] = s->overlay_w;
- s->opts.o_size[1] = s->overlay_h;
- s->opts.o_size[2] = s->opts.o_size[0] >> pix_desc->log2_chroma_w;
- s->opts.o_size[3] = s->opts.o_size[1] >> pix_desc->log2_chroma_h;
- s->opts.o_size[4] = s->opts.o_size[0] >> pix_desc->log2_chroma_w;
- s->opts.o_size[5] = s->opts.o_size[1] >> pix_desc->log2_chroma_h;
-
- s->initialized = 1;
-
-fail:
- if (spv_opaque)
- spv->free_shader(spv, &spv_opaque);
- if (spv)
- spv->uninit(&spv);
-
- return err;
-}
-
-static int overlay_vulkan_blend(FFFrameSync *fs)
-{
- int err;
- AVFilterContext *ctx = fs->parent;
- OverlayVulkanContext *s = ctx->priv;
- AVFilterLink *outlink = ctx->outputs[0];
- AVFrame *input_main, *input_overlay, *out;
-
- err = ff_framesync_get_frame(fs, 0, &input_main, 0);
- if (err < 0)
- goto fail;
- err = ff_framesync_get_frame(fs, 1, &input_overlay, 0);
- if (err < 0)
- goto fail;
-
- if (!input_main || !input_overlay)
- return 0;
-
- if (!s->initialized) {
- AVHWFramesContext *main_fc = (AVHWFramesContext*)input_main->hw_frames_ctx->data;
- AVHWFramesContext *overlay_fc = (AVHWFramesContext*)input_overlay->hw_frames_ctx->data;
- if (main_fc->sw_format != overlay_fc->sw_format) {
- av_log(ctx, AV_LOG_ERROR, "Mismatching sw formats!\n");
- return AVERROR(EINVAL);
- }
-
- s->overlay_w = input_overlay->width;
- s->overlay_h = input_overlay->height;
-
- RET(init_filter(ctx));
- }
-
- out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
- if (!out) {
- err = AVERROR(ENOMEM);
- goto fail;
- }
-
- RET(ff_vk_filter_process_Nin(&s->vkctx, &s->e, &s->pl,
- out, (AVFrame *[]){ input_main, input_overlay }, 2,
- s->sampler, &s->opts, sizeof(s->opts)));
-
- err = av_frame_copy_props(out, input_main);
- if (err < 0)
- goto fail;
-
- return ff_filter_frame(outlink, out);
-
-fail:
- av_frame_free(&out);
- return err;
-}
-
-static int overlay_vulkan_config_output(AVFilterLink *outlink)
-{
- int err;
- AVFilterContext *avctx = outlink->src;
- OverlayVulkanContext *s = avctx->priv;
-
- err = ff_vk_filter_config_output(outlink);
- if (err < 0)
- return err;
-
- err = ff_framesync_init_dualinput(&s->fs, avctx);
- if (err < 0)
- return err;
-
- return ff_framesync_configure(&s->fs);
-}
-
-static int overlay_vulkan_activate(AVFilterContext *avctx)
-{
- OverlayVulkanContext *s = avctx->priv;
-
- return ff_framesync_activate(&s->fs);
-}
-
-static av_cold int overlay_vulkan_init(AVFilterContext *avctx)
-{
- OverlayVulkanContext *s = avctx->priv;
-
- s->fs.on_event = &overlay_vulkan_blend;
-
- return ff_vk_filter_init(avctx);
-}
-
-static void overlay_vulkan_uninit(AVFilterContext *avctx)
-{
- OverlayVulkanContext *s = avctx->priv;
- FFVulkanContext *vkctx = &s->vkctx;
- FFVulkanFunctions *vk = &vkctx->vkfn;
-
- ff_vk_exec_pool_free(vkctx, &s->e);
- ff_vk_pipeline_free(vkctx, &s->pl);
- ff_vk_shader_free(vkctx, &s->shd);
-
- if (s->sampler)
- vk->DestroySampler(vkctx->hwctx->act_dev, s->sampler,
- vkctx->hwctx->alloc);
-
- ff_vk_uninit(&s->vkctx);
- ff_framesync_uninit(&s->fs);
-
- s->initialized = 0;
-}
-
-#define OFFSET(x) offsetof(OverlayVulkanContext, x)
-#define FLAGS (AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
-static const AVOption overlay_vulkan_options[] = {
- { "x", "Set horizontal offset", OFFSET(overlay_x), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, .flags = FLAGS },
- { "y", "Set vertical offset", OFFSET(overlay_y), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, .flags = FLAGS },
- { NULL },
-};
-
-AVFILTER_DEFINE_CLASS(overlay_vulkan);
-
-static const AVFilterPad overlay_vulkan_inputs[] = {
- {
- .name = "main",
- .type = AVMEDIA_TYPE_VIDEO,
- .config_props = &ff_vk_filter_config_input,
- },
- {
- .name = "overlay",
- .type = AVMEDIA_TYPE_VIDEO,
- .config_props = &ff_vk_filter_config_input,
- },
-};
-
-static const AVFilterPad overlay_vulkan_outputs[] = {
- {
- .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .config_props = &overlay_vulkan_config_output,
- },
-};
-
-const AVFilter ff_vf_overlay_vulkan = {
- .name = "overlay_vulkan",
- .description = NULL_IF_CONFIG_SMALL("Overlay a source on top of another"),
- .priv_size = sizeof(OverlayVulkanContext),
- .init = &overlay_vulkan_init,
- .uninit = &overlay_vulkan_uninit,
- .activate = &overlay_vulkan_activate,
- FILTER_INPUTS(overlay_vulkan_inputs),
- FILTER_OUTPUTS(overlay_vulkan_outputs),
- FILTER_SINGLE_PIXFMT(AV_PIX_FMT_VULKAN),
- .priv_class = &overlay_vulkan_class,
- .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE,
- .flags = AVFILTER_FLAG_HWDEVICE,
-};
--
2.40.1
[-- Attachment #3: 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] 2+ messages in thread
* Re: [FFmpeg-devel] [PATCH 2/2] overlay_vulkan: remove in favor of libplacebo
2023-06-20 17:33 [FFmpeg-devel] [PATCH 2/2] overlay_vulkan: remove in favor of libplacebo Lynne
@ 2023-06-20 17:36 ` Nicolas George
0 siblings, 0 replies; 2+ messages in thread
From: Nicolas George @ 2023-06-20 17:36 UTC (permalink / raw)
To: FFmpeg development discussions and patches
[-- Attachment #1.1: Type: text/plain, Size: 466 bytes --]
Lynne (12023-06-20):
> Patch attached.
>
> >From 453c513bb4960dee72228a8713375fce75a40482 Mon Sep 17 00:00:00 2001
> From: Lynne <dev@lynne.ee>
> Date: Tue, 20 Jun 2023 18:59:03 +0200
> Subject: [PATCH 2/2] lavfi: remove overlay_vulkan in favor of libplacebo
Similar questions than for the other patch:
Is libplacebo considered a system library?
Is overlaying not considered an integral part of FFmpeg's task?
Regards,
--
Nicolas George
[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 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] 2+ messages in thread
end of thread, other threads:[~2023-06-20 17:36 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-06-20 17:33 [FFmpeg-devel] [PATCH 2/2] overlay_vulkan: remove in favor of libplacebo Lynne
2023-06-20 17:36 ` Nicolas George
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