ffmpeg | branch: master | Anton Khirnov <an...@khirnov.net> | Mon Oct 7 12:47:32 2024 +0200| [036336296c5eccdbab2539342f0056d24d322752] | committer: Anton Khirnov
lavfi/vf_hwupload: validate the hw device in init Rather than query_formats(). Init is a more appropriate place, as query_formats() is supposed to be free of side-effects. > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=036336296c5eccdbab2539342f0056d24d322752 --- libavfilter/vf_hwupload.c | 49 +++++++++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/libavfilter/vf_hwupload.c b/libavfilter/vf_hwupload.c index 3afd67012f..70ee262c09 100644 --- a/libavfilter/vf_hwupload.c +++ b/libavfilter/vf_hwupload.c @@ -39,35 +39,41 @@ typedef struct HWUploadContext { char *device_type; } HWUploadContext; -static int hwupload_query_formats(AVFilterContext *avctx) +static int hwupload_init(AVFilterContext *avctx) { HWUploadContext *ctx = avctx->priv; - AVHWFramesConstraints *constraints = NULL; - const enum AVPixelFormat *input_pix_fmts, *output_pix_fmts; - AVFilterFormats *input_formats = NULL; - int err, i; + int err; - if (ctx->hwdevice_ref) { - /* We already have a specified device. */ - } else if (avctx->hw_device_ctx) { - if (ctx->device_type) { - err = av_hwdevice_ctx_create_derived( - &ctx->hwdevice_ref, - av_hwdevice_find_type_by_name(ctx->device_type), - avctx->hw_device_ctx, 0); - if (err < 0) - return err; - } else { - ctx->hwdevice_ref = av_buffer_ref(avctx->hw_device_ctx); - if (!ctx->hwdevice_ref) - return AVERROR(ENOMEM); - } - } else { + if (!avctx->hw_device_ctx) { av_log(ctx, AV_LOG_ERROR, "A hardware device reference is required " "to upload frames to.\n"); return AVERROR(EINVAL); } + if (ctx->device_type) { + err = av_hwdevice_ctx_create_derived( + &ctx->hwdevice_ref, + av_hwdevice_find_type_by_name(ctx->device_type), + avctx->hw_device_ctx, 0); + if (err < 0) + return err; + } else { + ctx->hwdevice_ref = av_buffer_ref(avctx->hw_device_ctx); + if (!ctx->hwdevice_ref) + return AVERROR(ENOMEM); + } + + return 0; +} + +static int hwupload_query_formats(AVFilterContext *avctx) +{ + HWUploadContext *ctx = avctx->priv; + AVHWFramesConstraints *constraints = NULL; + const enum AVPixelFormat *input_pix_fmts, *output_pix_fmts; + AVFilterFormats *input_formats = NULL; + int err, i; + constraints = av_hwdevice_get_hwframe_constraints(ctx->hwdevice_ref, NULL); if (!constraints) { err = AVERROR(EINVAL); @@ -253,6 +259,7 @@ static const AVFilterPad hwupload_outputs[] = { const AVFilter ff_vf_hwupload = { .name = "hwupload", .description = NULL_IF_CONFIG_SMALL("Upload a normal frame to a hardware frame"), + .init = hwupload_init, .uninit = hwupload_uninit, .priv_size = sizeof(HWUploadContext), .priv_class = &hwupload_class, _______________________________________________ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog To unsubscribe, visit link above, or email ffmpeg-cvslog-requ...@ffmpeg.org with subject "unsubscribe".