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:
parent
3b375a0c5c
commit
be13812a23
@ -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,
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user