diff --git a/libavfilter/qsvvpp.c b/libavfilter/qsvvpp.c index 732cf56a6a..2c01295628 100644 --- a/libavfilter/qsvvpp.c +++ b/libavfilter/qsvvpp.c @@ -296,7 +296,7 @@ static QSVFrame *submit_frame(QSVVPPContext *s, AVFilterLink *inlink, AVFrame *p av_log(ctx, AV_LOG_ERROR, "QSVVPP gets a wrong frame.\n"); return NULL; } - qsv_frame->frame = picref; + qsv_frame->frame = av_frame_clone(picref); qsv_frame->surface = (mfxFrameSurface1 *)qsv_frame->frame->data[3]; } else { /* make a copy if the input is not padded as libmfx requires */ @@ -318,7 +318,7 @@ static QSVFrame *submit_frame(QSVVPPContext *s, AVFilterLink *inlink, AVFrame *p av_frame_copy_props(qsv_frame->frame, picref); av_frame_free(&picref); } else - qsv_frame->frame = picref; + qsv_frame->frame = av_frame_clone(picref); if (map_frame_to_surface(qsv_frame->frame, &qsv_frame->surface_internal) < 0) { diff --git a/libavfilter/vf_vpp_qsv.c b/libavfilter/vf_vpp_qsv.c index 6be7098ae9..41a9f38962 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -341,9 +341,10 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *picref) VPPContext *vpp = inlink->dst->priv; AVFilterLink *outlink = ctx->outputs[0]; - if (vpp->qsv) + if (vpp->qsv) { ret = ff_qsvvpp_filter_frame(vpp->qsv, inlink, picref); - else { + av_frame_free(&picref); + } else { if (picref->pts != AV_NOPTS_VALUE) picref->pts = av_rescale_q(picref->pts, inlink->time_base, outlink->time_base); ret = ff_filter_frame(outlink, picref);