avfilter/vf_libplacebo: init vulkan device in query_format

Instead of doing it ad-hoc in `filter_frame`. This is not a huge change
on its own, but paves the way for adding support for more formats in the
future, in particular formats other than AV_PIX_FMT_VULKAN.
This commit is contained in:
Niklas Haas 2022-11-07 23:27:41 +01:00
parent 3b375a0c5c
commit be13812a23
1 changed files with 28 additions and 7 deletions

View File

@ -56,7 +56,6 @@ static const struct pl_tone_map_function * const tonemapping_funcs[TONE_MAP_COUN
typedef struct LibplaceboContext {
/* lavfi vulkan*/
FFVulkanContext vkctx;
int initialized;
/* libplacebo */
pl_log log;
@ -237,10 +236,17 @@ static int init_vulkan(AVFilterContext *avctx)
{
int err = 0;
LibplaceboContext *s = avctx->priv;
const AVVulkanDeviceContext *hwctx = s->vkctx.hwctx;
const AVVulkanDeviceContext *hwctx;
uint8_t *buf = NULL;
size_t buf_len;
if (!avctx->hw_device_ctx) {
av_log(s, AV_LOG_ERROR, "Missing vulkan hwdevice for vf_libplacebo.\n");
return AVERROR(EINVAL);
}
hwctx = ((AVHWDeviceContext*) avctx->hw_device_ctx->data)->hwctx;
/* Import libavfilter vulkan context into libplacebo */
s->vulkan = pl_vulkan_import(s->log, pl_vulkan_import_params(
.instance = hwctx->inst,
@ -289,7 +295,6 @@ static int init_vulkan(AVFilterContext *avctx)
fail:
if (buf)
av_file_unmap(buf, buf_len);
s->initialized = 1;
return err;
}
@ -303,7 +308,6 @@ static void libplacebo_uninit(AVFilterContext *avctx)
pl_vulkan_destroy(&s->vulkan);
pl_log_destroy(&s->log);
ff_vk_uninit(&s->vkctx);
s->initialized = 0;
s->gpu = NULL;
}
@ -452,8 +456,6 @@ static int filter_frame(AVFilterLink *link, AVFrame *in)
}
pl_log_level_update(s->log, get_log_level());
if (!s->initialized)
RET(init_vulkan(ctx));
RET(av_frame_copy_props(out, in));
out->width = outlink->w;
@ -505,6 +507,25 @@ fail:
return err;
}
static int libplacebo_query_format(AVFilterContext *ctx)
{
int err = 0;
static const enum AVPixelFormat pix_fmts[] = {
AV_PIX_FMT_VULKAN, AV_PIX_FMT_NONE,
};
RET(init_vulkan(ctx));
RET(ff_formats_ref(ff_make_format_list(pix_fmts),
&ctx->inputs[0]->outcfg.formats));
RET(ff_formats_ref(ff_make_format_list(pix_fmts),
&ctx->outputs[0]->incfg.formats));
return 0;
fail:
return err;
}
static int libplacebo_config_output(AVFilterLink *outlink)
{
int err;
@ -755,7 +776,7 @@ const AVFilter ff_vf_libplacebo = {
.process_command = &ff_filter_process_command,
FILTER_INPUTS(libplacebo_inputs),
FILTER_OUTPUTS(libplacebo_outputs),
FILTER_SINGLE_PIXFMT(AV_PIX_FMT_VULKAN),
FILTER_QUERY_FUNC(libplacebo_query_format),
.priv_class = &libplacebo_class,
.flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE,
};