On Mon, Jul 30, 2018 at 6:15 PM Luca Barbato <[email protected]> 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
> [email protected]
> https://lists.libav.org/mailman/listinfo/libav-devel
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel