[FFmpeg-devel] [PATCH 1/3] avfilter/vf_libplacebo: list AV_PIX_FMT_VULKAN first
Niklas Haas
ffmpeg at haasn.xyz
Mon Jun 16 21:05:28 EEST 2025
From: Niklas Haas <git at haasn.dev>
Under normal circumstances, this change does not affect anything, as the vast
majority of filters either support only vulkan or only software formats.
However, when a filter supports both (such as vf_libplacebo itself, and
possibly vf_scale in the future), linking together two such filter instances
without an explicit format will default matching the input format, resulting
in a redundant round trip through host RAM.
This change bumps up AV_PIX_FMT_VULKAN to the first entry in the format list,
ensuring that it gets preferred whenever possible.
---
libavfilter/vf_libplacebo.c | 23 +++++++++++------------
1 file changed, 11 insertions(+), 12 deletions(-)
diff --git a/libavfilter/vf_libplacebo.c b/libavfilter/vf_libplacebo.c
index 9ff64053cc..c7a1b15f92 100644
--- a/libavfilter/vf_libplacebo.c
+++ b/libavfilter/vf_libplacebo.c
@@ -1150,8 +1150,17 @@ static int libplacebo_query_format(const AVFilterContext *ctx,
const AVPixFmtDescriptor *desc = NULL;
AVFilterFormats *infmts = NULL, *outfmts = NULL;
+ /* List AV_PIX_FMT_VULKAN first to prefer it when possible */
+ if (s->have_hwdevice) {
+ RET(ff_add_format(&infmts, AV_PIX_FMT_VULKAN));
+ if (s->out_format == AV_PIX_FMT_NONE || av_vkfmt_from_pixfmt(s->out_format))
+ RET(ff_add_format(&outfmts, AV_PIX_FMT_VULKAN));
+ }
+
while ((desc = av_pix_fmt_desc_next(desc))) {
enum AVPixelFormat pixfmt = av_pix_fmt_desc_get_id(desc);
+ if (pixfmt == AV_PIX_FMT_VULKAN)
+ continue; /* Handled above */
#if PL_API_VER < 232
// Older libplacebo can't handle >64-bit pixel formats, so safe-guard
@@ -1160,9 +1169,6 @@ static int libplacebo_query_format(const AVFilterContext *ctx,
continue;
#endif
- if (pixfmt == AV_PIX_FMT_VULKAN && !s->have_hwdevice)
- continue;
-
if (!pl_test_pixfmt(s->gpu, pixfmt))
continue;
@@ -1173,15 +1179,8 @@ static int libplacebo_query_format(const AVFilterContext *ctx,
continue; /* BE formats are not supported by pl_download_avframe */
/* Mask based on user specified format */
- if (s->out_format != AV_PIX_FMT_NONE) {
- if (pixfmt == AV_PIX_FMT_VULKAN && av_vkfmt_from_pixfmt(s->out_format)) {
- /* OK */
- } else if (pixfmt == s->out_format) {
- /* OK */
- } else {
- continue; /* Not OK */
- }
- }
+ if (pixfmt != s->out_format && s->out_format != AV_PIX_FMT_NONE)
+ continue;
#if PL_API_VER >= 293
if (!pl_test_pixfmt_caps(s->gpu, pixfmt, PL_FMT_CAP_RENDERABLE))
--
2.49.0
More information about the ffmpeg-devel
mailing list