Commit 02bd5adaff for ffmpeg
commit 02bd5adaff03d1861a132f0bd876fd62c05f1fa2
Author: Niklas Haas <git@haasn.dev>
Date: Wed Oct 28 15:19:52 2026 +0100
avfilter/vf_libplacebo: factor out inherit_device() and config_input_vulkan()
inherit_device() sets the filter's own device to the one of the input, so
choose_default_device() picks it up.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sponsored-by: nxtedition AB
Signed-off-by: Niklas Haas <git@haasn.dev>
diff --git a/libavfilter/vf_libplacebo.c b/libavfilter/vf_libplacebo.c
index aa2ec949ad..817a5be568 100644
--- a/libavfilter/vf_libplacebo.c
+++ b/libavfilter/vf_libplacebo.c
@@ -1417,11 +1417,45 @@ fail:
return err;
}
+/* Adopt the Vulkan device of the input's hardware frames. query_formats
+ * advertised Vulkan only, so a non-Vulkan input here is a configuration error. */
+static int inherit_device(AVFilterLink *inlink)
+{
+ AVFilterContext *avctx = inlink->dst;
+ FilterLink *l = ff_filter_link(inlink);
+ AVHWFramesContext *hwfc;
+
+ if (inlink->format != AV_PIX_FMT_VULKAN || !l->hw_frames_ctx) {
+ av_log(avctx, AV_LOG_ERROR, "inherit_device requires a Vulkan "
+ "hardware frames context on the input.\n");
+ return AVERROR(EINVAL);
+ }
+ hwfc = (AVHWFramesContext *) l->hw_frames_ctx->data;
+ av_buffer_unref(&avctx->hw_device_ctx);
+ avctx->hw_device_ctx = av_buffer_ref(hwfc->device_ref);
+ if (!avctx->hw_device_ctx)
+ return AVERROR(ENOMEM);
+ return 0;
+}
+
+static int config_input_vulkan(AVFilterLink *inlink)
+{
+ LibplaceboContext *s = inlink->dst->priv;
+
+ if (inlink->format == AV_PIX_FMT_VULKAN)
+ return ff_vk_filter_config_input(inlink);
+
+ /* Forward this to the vkctx for format selection */
+ s->vkctx.input_format = inlink->format;
+
+ return 0;
+}
+
static int libplacebo_config_input(AVFilterLink *inlink)
{
+ int err;
AVFilterContext *avctx = inlink->dst;
LibplaceboContext *s = avctx->priv;
- FilterLink *l = ff_filter_link(inlink);
if (s->rotation % PL_ROTATION_180 == PL_ROTATION_90) {
/* Swap width and height for 90 degree rotations to make the size and
@@ -1432,35 +1466,18 @@ static int libplacebo_config_input(AVFilterLink *inlink)
}
/* Deferred Vulkan setup (inherit_device): the device was not created at
- * init; adopt the one the input frames live on. query_formats advertised
- * Vulkan only, so a non-Vulkan input here is a configuration error. */
+ * init; adopt the one the input frames live on. */
if (!s->gpu) {
- AVHWFramesContext *hwfc;
- int err;
av_assert0(s->inherit_device);
- if (inlink->format != AV_PIX_FMT_VULKAN || !l->hw_frames_ctx) {
- av_log(avctx, AV_LOG_ERROR, "inherit_device requires a Vulkan "
- "hardware frames context on the input.\n");
- return AVERROR(EINVAL);
- }
- hwfc = (AVHWFramesContext *) l->hw_frames_ctx->data;
- av_buffer_unref(&avctx->hw_device_ctx);
- avctx->hw_device_ctx = av_buffer_ref(hwfc->device_ref);
- if (!avctx->hw_device_ctx)
- return AVERROR(ENOMEM);
- if ((err = init_vulkan(avctx, hwfc->device_ctx->hwctx)) < 0)
- return err;
- if ((err = libplacebo_setup_gpu(avctx)) < 0)
- return err;
+ RET(inherit_device(inlink));
+ RET(init_vulkan(avctx, choose_default_device(avctx)));
+ RET(libplacebo_setup_gpu(avctx));
}
- if (inlink->format == AV_PIX_FMT_VULKAN)
- return ff_vk_filter_config_input(inlink);
+ return config_input_vulkan(inlink);
- /* Forward this to the vkctx for format selection */
- s->vkctx.input_format = inlink->format;
-
- return 0;
+fail:
+ return err;
}
static inline AVRational max_q(AVRational a, AVRational b)