[FFmpeg-cvslog] avfilter/vf_libplacebo: list AV_PIX_FMT_VULKAN first

Niklas Haas git at videolan.org
Fri Jun 20 16:13:46 EEST 2025


ffmpeg | branch: master | Niklas Haas <git at haasn.dev> | Mon Jun 16 14:52:13 2025 +0200| [f883b7cf93ed56fbd54e285f6c5f27241ee195f2] | committer: Niklas Haas

avfilter/vf_libplacebo: list AV_PIX_FMT_VULKAN first

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.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=f883b7cf93ed56fbd54e285f6c5f27241ee195f2
---

 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 e9049710c2..f14b0f9296 100644
--- a/libavfilter/vf_libplacebo.c
+++ b/libavfilter/vf_libplacebo.c
@@ -1168,8 +1168,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
@@ -1178,9 +1187,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;
 
@@ -1191,15 +1197,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))



More information about the ffmpeg-cvslog mailing list