[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