should be ok, can try it next week, if you didnt. On Wed, Sep 6, 2017 at 12:59 AM, Mark Thompson <s...@jkqxz.net> wrote:
> 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 8ef77835d..c568e9625 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; > } > > -- > 2.11.0 > > _______________________________________________ > libav-devel mailing list > libav-devel@libav.org > https://lists.libav.org/mailman/listinfo/libav-devel _______________________________________________ libav-devel mailing list libav-devel@libav.org https://lists.libav.org/mailman/listinfo/libav-devel