X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavfilter%2Fvaapi_vpp.c;h=c5bbc3b85b99426b737c10a0e2e3a84a0f9dcc83;hb=7ca2ee059e3d3e170a8e119af10649671c524112;hp=9d917722a0235102224e2688e2ff174378f3e1e6;hpb=35347e7e9b2769166ce99cd4c4789dcf2ac463a9;p=ffmpeg diff --git a/libavfilter/vaapi_vpp.c b/libavfilter/vaapi_vpp.c index 9d917722a02..c5bbc3b85b9 100644 --- a/libavfilter/vaapi_vpp.c +++ b/libavfilter/vaapi_vpp.c @@ -21,7 +21,7 @@ #include "libavutil/avassert.h" #include "libavutil/pixdesc.h" #include "formats.h" - +#include "internal.h" #include "vaapi_vpp.h" int ff_vaapi_vpp_query_formats(AVFilterContext *avctx) @@ -63,7 +63,6 @@ void ff_vaapi_vpp_pipeline_uninit(AVFilterContext *avctx) ctx->va_config = VA_INVALID_ID; } - av_buffer_unref(&ctx->output_frames_ref); av_buffer_unref(&ctx->device_ref); ctx->hwctx = NULL; } @@ -99,6 +98,7 @@ int ff_vaapi_vpp_config_output(AVFilterLink *outlink) VAAPIVPPContext *ctx = avctx->priv; AVVAAPIHWConfig *hwconfig = NULL; AVHWFramesConstraints *constraints = NULL; + AVHWFramesContext *output_frames; AVVAAPIFramesContext *va_frames; VAStatus vas; int err, i; @@ -172,34 +172,35 @@ int ff_vaapi_vpp_config_output(AVFilterLink *outlink) goto fail; } - ctx->output_frames_ref = av_hwframe_ctx_alloc(ctx->device_ref); - if (!ctx->output_frames_ref) { + outlink->hw_frames_ctx = av_hwframe_ctx_alloc(ctx->device_ref); + if (!outlink->hw_frames_ctx) { av_log(avctx, AV_LOG_ERROR, "Failed to create HW frame context " "for output.\n"); err = AVERROR(ENOMEM); goto fail; } - ctx->output_frames = (AVHWFramesContext*)ctx->output_frames_ref->data; + output_frames = (AVHWFramesContext*)outlink->hw_frames_ctx->data; - ctx->output_frames->format = AV_PIX_FMT_VAAPI; - ctx->output_frames->sw_format = ctx->output_format; - ctx->output_frames->width = ctx->output_width; - ctx->output_frames->height = ctx->output_height; + output_frames->format = AV_PIX_FMT_VAAPI; + output_frames->sw_format = ctx->output_format; + output_frames->width = ctx->output_width; + output_frames->height = ctx->output_height; - // The number of output frames we need is determined by what follows - // the filter. If it's an encoder with complex frame reference - // structures then this could be very high. - ctx->output_frames->initial_pool_size = 10; + output_frames->initial_pool_size = 4; - err = av_hwframe_ctx_init(ctx->output_frames_ref); + err = ff_filter_init_hw_frames(avctx, outlink, 10); + if (err < 0) + goto fail; + + err = av_hwframe_ctx_init(outlink->hw_frames_ctx); if (err < 0) { av_log(avctx, AV_LOG_ERROR, "Failed to initialise VAAPI frame " "context for output: %d\n", err); goto fail; } - va_frames = ctx->output_frames->hwctx; + va_frames = output_frames->hwctx; av_assert0(ctx->va_context == VA_INVALID_ID); vas = vaCreateContext(ctx->hwctx->display, ctx->va_config, @@ -222,18 +223,12 @@ int ff_vaapi_vpp_config_output(AVFilterLink *outlink) goto fail; } - outlink->hw_frames_ctx = av_buffer_ref(ctx->output_frames_ref); - if (!outlink->hw_frames_ctx) { - err = AVERROR(ENOMEM); - goto fail; - } - av_freep(&hwconfig); av_hwframe_constraints_free(&constraints); return 0; fail: - av_buffer_unref(&ctx->output_frames_ref); + av_buffer_unref(&outlink->hw_frames_ctx); av_freep(&hwconfig); av_hwframe_constraints_free(&constraints); return err; @@ -374,6 +369,5 @@ void ff_vaapi_vpp_ctx_uninit(AVFilterContext *avctx) ctx->pipeline_uninit(avctx); av_buffer_unref(&ctx->input_frames_ref); - av_buffer_unref(&ctx->output_frames_ref); av_buffer_unref(&ctx->device_ref); }