lavf/qsv: clone the frame which may be managed by framework
For filters based on framesync, the input frame was managed by framesync, so we should not directly keep and destroy it, instead we make a clone of it here, or else double-free will occur. But for other filters not based on framesync, we still need to free the input frame inside filter_frame. Signed-off-by: Ruiling Song <ruiling.song@intel.com>
This commit is contained in:
parent
f3341a0452
commit
d865783b6c
@ -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) {
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user