[libav-devel] [PATCH v2] qsv: enforcing continuous memory layout

Maxym Dmytrychenko maxim.d33 at gmail.com
Sun Aug 5 16:45:59 CEST 2018


On Mon, Jul 30, 2018 at 6:15 PM Luca Barbato <lu_zero at 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 at libav.org
> https://lists.libav.org/mailman/listinfo/libav-devel


More information about the libav-devel mailing list