On Mon, Jul 30, 2018 at 6:15 PM Luca Barbato <lu_z...@gentoo.org> wrote:
> On 30/07/2018 18:02, Maxym Dmytrychenko wrote: > > we need to make sure that memory allocation for Y/UV planes is > continuous and re-used from a > > pool > > --- > > I'm afraid this would break the already-proper-frame codepath. > > I would simplify the default avcoded allocator and call it directly. > > Note that: + if (!qf->frame->data[0]) { + ret = av_frame_get_buffer(qf->frame, q->width_align); would keep the pool running and dont see it leaking, or? > > > libavcodec/qsvenc.c | 16 +++++++++++----- > > 1 file changed, 11 insertions(+), 5 deletions(-) > > > > diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c > > index e349a075f..c74b3ae31 100644 > > --- a/libavcodec/qsvenc.c > > +++ b/libavcodec/qsvenc.c > > @@ -1014,7 +1014,6 @@ static void clear_unused_frames(QSVEncContext *q) > > QSVFrame *cur = q->work_frames; > > while (cur) { > > if (cur->used && !cur->surface.Data.Locked) { > > - av_frame_unref(cur->frame); > > cur->used = 0; > > } > > cur = cur->next; > > @@ -1082,16 +1081,23 @@ static int submit_frame(QSVEncContext *q, const > AVFrame *frame, > > } > > } else { > > /* make a copy if the input is not padded as libmfx requires */ > > - if (frame->height & 31 || frame->linesize[0] & (q->width_align > - 1)) { > > + /* and to make allocation continious for data[0]/data[1] */ > > + if ((frame->height & 31 || frame->linesize[0] & > (q->width_align - 1)) || > > + (frame->data[1] - frame->data[0] != frame->linesize[0] * > FFALIGN(qf->frame->height, q->height_align))) { > > qf->frame->height = FFALIGN(frame->height, q->height_align); > > qf->frame->width = FFALIGN(frame->width, q->width_align); > > > > - ret = ff_get_buffer(q->avctx, qf->frame, > AV_GET_BUFFER_FLAG_REF); > > - if (ret < 0) > > - return ret; > > + qf->frame->format = frame->format; > > + > > + if (!qf->frame->data[0]) { > > + ret = av_frame_get_buffer(qf->frame, q->width_align); > > + if (ret < 0) > > + return ret; > > + } > > > > qf->frame->height = frame->height; > > qf->frame->width = frame->width; > > + > > ret = av_frame_copy(qf->frame, frame); > > if (ret < 0) { > > av_frame_unref(qf->frame); > > > > _______________________________________________ > 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