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 {
|
typedef struct LibplaceboContext {
|
||||||
/* lavfi vulkan*/
|
/* lavfi vulkan*/
|
||||||
FFVulkanContext vkctx;
|
FFVulkanContext vkctx;
|
||||||
int initialized;
|
|
||||||
|
|
||||||
/* libplacebo */
|
/* libplacebo */
|
||||||
pl_log log;
|
pl_log log;
|
||||||
@ -237,10 +236,17 @@ static int init_vulkan(AVFilterContext *avctx)
|
|||||||
{
|
{
|
||||||
int err = 0;
|
int err = 0;
|
||||||
LibplaceboContext *s = avctx->priv;
|
LibplaceboContext *s = avctx->priv;
|
||||||
const AVVulkanDeviceContext *hwctx = s->vkctx.hwctx;
|
const AVVulkanDeviceContext *hwctx;
|
||||||
uint8_t *buf = NULL;
|
uint8_t *buf = NULL;
|
||||||
size_t buf_len;
|
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 */
|
/* Import libavfilter vulkan context into libplacebo */
|
||||||
s->vulkan = pl_vulkan_import(s->log, pl_vulkan_import_params(
|
s->vulkan = pl_vulkan_import(s->log, pl_vulkan_import_params(
|
||||||
.instance = hwctx->inst,
|
.instance = hwctx->inst,
|
||||||
@ -289,7 +295,6 @@ static int init_vulkan(AVFilterContext *avctx)
|
|||||||
fail:
|
fail:
|
||||||
if (buf)
|
if (buf)
|
||||||
av_file_unmap(buf, buf_len);
|
av_file_unmap(buf, buf_len);
|
||||||
s->initialized = 1;
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -303,7 +308,6 @@ static void libplacebo_uninit(AVFilterContext *avctx)
|
|||||||
pl_vulkan_destroy(&s->vulkan);
|
pl_vulkan_destroy(&s->vulkan);
|
||||||
pl_log_destroy(&s->log);
|
pl_log_destroy(&s->log);
|
||||||
ff_vk_uninit(&s->vkctx);
|
ff_vk_uninit(&s->vkctx);
|
||||||
s->initialized = 0;
|
|
||||||
s->gpu = NULL;
|
s->gpu = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -452,8 +456,6 @@ static int filter_frame(AVFilterLink *link, AVFrame *in)
|
|||||||
}
|
}
|
||||||
|
|
||||||
pl_log_level_update(s->log, get_log_level());
|
pl_log_level_update(s->log, get_log_level());
|
||||||
if (!s->initialized)
|
|
||||||
RET(init_vulkan(ctx));
|
|
||||||
|
|
||||||
RET(av_frame_copy_props(out, in));
|
RET(av_frame_copy_props(out, in));
|
||||||
out->width = outlink->w;
|
out->width = outlink->w;
|
||||||
@ -505,6 +507,25 @@ fail:
|
|||||||
return err;
|
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)
|
static int libplacebo_config_output(AVFilterLink *outlink)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
@ -755,7 +776,7 @@ const AVFilter ff_vf_libplacebo = {
|
|||||||
.process_command = &ff_filter_process_command,
|
.process_command = &ff_filter_process_command,
|
||||||
FILTER_INPUTS(libplacebo_inputs),
|
FILTER_INPUTS(libplacebo_inputs),
|
||||||
FILTER_OUTPUTS(libplacebo_outputs),
|
FILTER_OUTPUTS(libplacebo_outputs),
|
||||||
FILTER_SINGLE_PIXFMT(AV_PIX_FMT_VULKAN),
|
FILTER_QUERY_FUNC(libplacebo_query_format),
|
||||||
.priv_class = &libplacebo_class,
|
.priv_class = &libplacebo_class,
|
||||||
.flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE,
|
.flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE,
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user