[FFmpeg-devel] [PATCH, v2 1/2] lavf/qsvvpp: allocate continuous memory

Fu, Linjie linjie.fu at intel.com
Mon Jun 3 08:17:26 EEST 2019


> -----Original Message-----
> From: Li, Zhong
> Sent: Friday, May 31, 2019 17:20
> To: FFmpeg development discussions and patches <ffmpeg-
> devel at ffmpeg.org>
> Cc: Fu, Linjie <linjie.fu at intel.com>
> Subject: RE: [FFmpeg-devel] [PATCH, v2 1/2] lavf/qsvvpp: allocate
> continuous memory
> 
> > From: ffmpeg-devel [mailto:ffmpeg-devel-bounces at ffmpeg.org] On
> Behalf
> > Of Linjie Fu
> > Sent: Thursday, May 30, 2019 1:01 AM
> > To: ffmpeg-devel at ffmpeg.org
> > Cc: Fu, Linjie <linjie.fu at intel.com>
> > Subject: [FFmpeg-devel] [PATCH, v2 1/2] lavf/qsvvpp: allocate continuous
> > memory
> >
> > Mediasdk calls CMRT to copy from video to system memory and requires
> > memory to be continuously allocated across Y and UV.
> >
> > Add a new path to allocate continuous memory when using system out.
> > Use av_image_fill_pointers to arrange data according to pixfmt.
> >
> > Signed-off-by: Linjie Fu <linjie.fu at intel.com>
> > ---
> > [v2]: use av_image_fill_pointers
> >
> >  libavfilter/qsvvpp.c | 32 +++++++++++++++++++++++++++-----
> >  1 file changed, 27 insertions(+), 5 deletions(-)
> >
> > diff --git a/libavfilter/qsvvpp.c b/libavfilter/qsvvpp.c index
> > 06efdf5089..6eeed7e632 100644
> > --- a/libavfilter/qsvvpp.c
> > +++ b/libavfilter/qsvvpp.c
> > @@ -27,6 +27,7 @@
> >  #include "libavutil/hwcontext_qsv.h"
> >  #include "libavutil/time.h"
> >  #include "libavutil/pixdesc.h"
> > +#include "libavutil/imgutils.h"
> >
> >  #include "internal.h"
> >  #include "qsvvpp.h"
> > @@ -51,6 +52,7 @@ struct QSVVPPContext {
> >      enum AVPixelFormat  out_sw_format;   /* Real output format */
> >      mfxVideoParam       vpp_param;
> >      mfxFrameInfo       *frame_infos;     /* frame info for each
> > input */
> > +    AVBufferPool       *pool;
> >
> >      /* members related to the input/output surface */
> >      int                 in_mem_mode;
> > @@ -375,10 +377,24 @@ static QSVFrame *query_frame(QSVVPPContext
> > *s, AVFilterLink *outlink)
> >          out_frame->surface = (mfxFrameSurface1
> > *)out_frame->frame->data[3];
> >      } else {
> >          /* Get a frame with aligned dimensions.
> > -         * Libmfx need system memory being 128x64 aligned */
> > -        out_frame->frame = ff_get_video_buffer(outlink,
> > -
> > FFALIGN(outlink->w, 128),
> > -
> > FFALIGN(outlink->h, 64));
> > +         * Libmfx need system memory being 128x64 aligned
> > +         * and continuously allocated across Y and UV */
> > +        out_frame->frame = av_frame_alloc();
> > +        if (!out_frame->frame) {
> > +            return NULL;
> 
> Should be better to return AVERROR(ENOMEM)?

Will refine.

> 
> > +        }
> > +
> > +        out_frame->frame->linesize[0] = FFALIGN(outlink->w, 128);
> > +        out_frame->frame->linesize[1] = out_frame->frame->linesize[0];
> > +        out_frame->frame->buf[0]      = av_buffer_pool_get(s->pool);
> > +        out_frame->frame->format      = outlink->format;
> > +
> > +        if (!out_frame->frame->buf[0])
> > +            return NULL;
> 
> Same as frame alloc.

Will refine.

> 
> > +
> > +        av_image_fill_pointers(out_frame->frame->data,
> > out_frame->frame->format,
> > +                                FFALIGN(outlink->h, 64),
> > out_frame->frame->buf[0]->data,
> > +
> > + out_frame->frame->linesize);
> >          if (!out_frame->frame)
> >              return NULL;
> >
> > @@ -483,8 +499,13 @@ static int init_vpp_session(AVFilterContext *avctx,
> > QSVVPPContext *s)
> >
> >          av_buffer_unref(&outlink->hw_frames_ctx);
> >          outlink->hw_frames_ctx = out_frames_ref;
> > -    } else
> > +    } else {
> >          s->out_mem_mode = MFX_MEMTYPE_SYSTEM_MEMORY;
> > +        s->pool =
> > av_buffer_pool_init(av_image_get_buffer_size(outlink->format,
> > +
> > FFALIGN(outlink->w, 128),
> > +
> > FFALIGN(outlink->h, 64), 1),
> > +                                        av_buffer_allocz);
> 
> 1. What is the benefit to use a pool? Comparing with directly alloc a buffer
> use av_buffer_allocz()?
Directly allocate seems to be better.

> 2. av_buffer_allocz() will memset the whole buffer and make performance
> drop. Is it really necessary here?
>   If no (I believe so), just use av_buffer_alloc()
I' not quite sure whether the non-initialized padding data introduced by
the alignment will cause some potential run2run issues if we do encoding next.
But as the usages in lavu/frame.c and lavc/avpacket.c, av_buffer_alloc() is enough.

Will refine and send a new version today.

Thanks.
Linjie



More information about the ffmpeg-devel mailing list