From e4cdef00263dc8b3c8de9d34ceacd00dc68979c0 Mon Sep 17 00:00:00 2001 From: Mark Thompson Date: Mon, 27 Mar 2017 21:10:23 +0100 Subject: [PATCH] vf_scale_qsv: Support increasing hardware frame pool size The deinterlacer does not change, because it does not allocate any new frames (for output it uses the same pool as the input). --- libavfilter/vf_scale_qsv.c | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/libavfilter/vf_scale_qsv.c b/libavfilter/vf_scale_qsv.c index 8ef77835dc..c568e96259 100644 --- a/libavfilter/vf_scale_qsv.c +++ b/libavfilter/vf_scale_qsv.c @@ -71,7 +71,6 @@ enum var_name { typedef struct QSVScaleContext { const AVClass *class; - AVBufferRef *out_frames_ref; /* a clone of the main session, used internally for scaling */ mfxSession session; @@ -134,7 +133,6 @@ static void qsvscale_uninit(AVFilterContext *ctx) MFXClose(s->session); s->session = NULL; } - av_buffer_unref(&s->out_frames_ref); av_freep(&s->mem_ids_in); av_freep(&s->mem_ids_out); @@ -163,6 +161,7 @@ static int init_out_pool(AVFilterContext *ctx, int out_width, int out_height) { QSVScaleContext *s = ctx->priv; + AVFilterLink *outlink = ctx->outputs[0]; AVHWFramesContext *in_frames_ctx; AVHWFramesContext *out_frames_ctx; @@ -183,21 +182,25 @@ static int init_out_pool(AVFilterContext *ctx, in_format = in_frames_ctx->sw_format; out_format = (s->format == AV_PIX_FMT_NONE) ? in_format : s->format; - s->out_frames_ref = av_hwframe_ctx_alloc(in_frames_ctx->device_ref); - if (!s->out_frames_ref) + outlink->hw_frames_ctx = av_hwframe_ctx_alloc(in_frames_ctx->device_ref); + if (!outlink->hw_frames_ctx) return AVERROR(ENOMEM); - out_frames_ctx = (AVHWFramesContext*)s->out_frames_ref->data; + out_frames_ctx = (AVHWFramesContext*)outlink->hw_frames_ctx->data; out_frames_hwctx = out_frames_ctx->hwctx; out_frames_ctx->format = AV_PIX_FMT_QSV; out_frames_ctx->width = FFALIGN(out_width, 32); out_frames_ctx->height = FFALIGN(out_height, 32); out_frames_ctx->sw_format = out_format; - out_frames_ctx->initial_pool_size = 32; + out_frames_ctx->initial_pool_size = 4; out_frames_hwctx->frame_type = in_frames_hwctx->frame_type; - ret = av_hwframe_ctx_init(s->out_frames_ref); + ret = ff_filter_init_hw_frames(ctx, outlink, 32); + if (ret < 0) + return ret; + + ret = av_hwframe_ctx_init(outlink->hw_frames_ctx); if (ret < 0) return ret; @@ -264,7 +267,7 @@ static int init_out_session(AVFilterContext *ctx) QSVScaleContext *s = ctx->priv; AVHWFramesContext *in_frames_ctx = (AVHWFramesContext*)ctx->inputs[0]->hw_frames_ctx->data; - AVHWFramesContext *out_frames_ctx = (AVHWFramesContext*)s->out_frames_ref->data; + AVHWFramesContext *out_frames_ctx = (AVHWFramesContext*)ctx->outputs[0]->hw_frames_ctx->data; AVQSVFramesContext *in_frames_hwctx = in_frames_ctx->hwctx; AVQSVFramesContext *out_frames_hwctx = out_frames_ctx->hwctx; AVQSVDeviceContext *device_hwctx = in_frames_ctx->device_ctx->hwctx; @@ -405,8 +408,6 @@ static int init_out_session(AVFilterContext *ctx) static int init_scale_session(AVFilterContext *ctx, int in_width, int in_height, int out_width, int out_height) { - QSVScaleContext *s = ctx->priv; - int ret; qsvscale_uninit(ctx); @@ -419,11 +420,6 @@ static int init_scale_session(AVFilterContext *ctx, int in_width, int in_height, if (ret < 0) return ret; - av_buffer_unref(&ctx->outputs[0]->hw_frames_ctx); - ctx->outputs[0]->hw_frames_ctx = av_buffer_ref(s->out_frames_ref); - if (!ctx->outputs[0]->hw_frames_ctx) - return AVERROR(ENOMEM); - return 0; }