[FFmpeg-devel] [PATCH, v2] lavc/vaapi_encode: grow packet if vaMapBuffer returns multiple buffers

Fu, Linjie linjie.fu at intel.com
Thu Sep 12 07:57:57 EEST 2019


> -----Original Message-----
> From: ffmpeg-devel [mailto:ffmpeg-devel-bounces at ffmpeg.org] On Behalf
> Of Fu, Linjie
> Sent: Monday, August 19, 2019 10:04
> To: FFmpeg development discussions and patches <ffmpeg-
> devel at ffmpeg.org>; Mark Thompson <sw at jkqxz.net>
> Subject: Re: [FFmpeg-devel] [PATCH, v2] lavc/vaapi_encode: grow packet if
> vaMapBuffer returns multiple buffers
> 
> > -----Original Message-----
> > From: ffmpeg-devel [mailto:ffmpeg-devel-bounces at ffmpeg.org] On
> Behalf
> > Of Fu, Linjie
> > Sent: Tuesday, August 6, 2019 16:12
> > To: FFmpeg development discussions and patches <ffmpeg-
> > devel at ffmpeg.org>; Mark Thompson <sw at jkqxz.net>
> > Subject: Re: [FFmpeg-devel] [PATCH, v2] lavc/vaapi_encode: grow packet
> if
> > vaMapBuffer returns multiple buffers
> >
> > > -----Original Message-----
> > > From: ffmpeg-devel [mailto:ffmpeg-devel-bounces at ffmpeg.org] On
> > Behalf
> > > Of Fu, Linjie
> > > Sent: Tuesday, June 4, 2019 17:11
> > > To: ffmpeg-devel at ffmpeg.org
> > > Cc: Mark Thompson <sw at jkqxz.net>
> > > Subject: Re: [FFmpeg-devel] [PATCH, v2] lavc/vaapi_encode: grow
> packet
> > if
> > > vaMapBuffer returns multiple buffers
> > >
> > > > -----Original Message-----
> > > > From: Fu, Linjie
> > > > Sent: Friday, May 31, 2019 08:35
> > > > To: ffmpeg-devel at ffmpeg.org
> > > > Cc: Fu, Linjie <linjie.fu at intel.com>
> > > > Subject: [PATCH,v2] lavc/vaapi_encode: grow packet if vaMapBuffer
> > > returns
> > > > multiple buffers
> > > >
> > > > It seems that VA_CODED_BUF_STATUS_SINGLE_NALU allows driver to
> > > map
> > > > buffer for each slice.
> > > >
> > > > Currently, assigning new buffer for pkt when multiple buffer returns
> > > > from vaMapBuffer will cover the previous encoded pkt data and lead
> > > > to encode issues.
> > > >
> > > > Iterate through the buf_list first to find out the total buffer size
> > > > needed for the pkt, allocate the whole pkt to avoid repeated
> reallocation
> > > > and memcpy, then copy data from each buf to pkt.
> > > >
> > > > Signed-off-by: Linjie Fu <linjie.fu at intel.com>
> > > > ---
> > > > [v2]: allocate the whole pkt to avoid repeated reallocation
> > > > and memcpy
> > > >
> > > >  libavcodec/vaapi_encode.c | 18 +++++++++++++-----
> > > >  1 file changed, 13 insertions(+), 5 deletions(-)
> > > >
> > > > diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c
> > > > index 2dda451..9c9e5dd 100644
> > > > --- a/libavcodec/vaapi_encode.c
> > > > +++ b/libavcodec/vaapi_encode.c
> > > > @@ -489,6 +489,8 @@ static int
> vaapi_encode_output(AVCodecContext
> > > > *avctx,
> > > >      VAAPIEncodeContext *ctx = avctx->priv_data;
> > > >      VACodedBufferSegment *buf_list, *buf;
> > > >      VAStatus vas;
> > > > +    int total_size = 0;
> > > > +    uint8_t *ptr;
> > > >      int err;
> > > >
> > > >      err = vaapi_encode_wait(avctx, pic);
> > > > @@ -505,15 +507,21 @@ static int
> > vaapi_encode_output(AVCodecContext
> > > > *avctx,
> > > >          goto fail;
> > > >      }
> > > >
> > > > +    for (buf = buf_list; buf; buf = buf->next)
> > > > +        total_size += buf->size;
> > > > +
> > > > +    err = av_new_packet(pkt, total_size);
> > > > +    ptr = pkt->data;
> > > > +
> > > > +    if (err < 0)
> > > > +        goto fail_mapped;
> > > > +
> > > >      for (buf = buf_list; buf; buf = buf->next) {
> > > >          av_log(avctx, AV_LOG_DEBUG, "Output buffer: %u bytes "
> > > >                 "(status %08x).\n", buf->size, buf->status);
> > > >
> > > > -        err = av_new_packet(pkt, buf->size);
> > > > -        if (err < 0)
> > > > -            goto fail_mapped;
> > > > -
> > > > -        memcpy(pkt->data, buf->buf, buf->size);
> > > > +        memcpy(ptr, buf->buf, buf->size);
> > > > +        ptr += buf->size;
> > > >      }
> > > >
> > > >      if (pic->type == PICTURE_TYPE_IDR)
> > > > --
> > > > 2.7.4
> > >
> > > Ping?
> > > This can fix the encoding issue for vaapi_vp8:
> > > ffmpeg -hwaccel vaapi -vaapi_device /dev/dri/renderD128 -v verbose -f
> > > rawvideo -pix_fmt yuv420p -s:v 1280x720 -i ./input_I420.yuv -vf
> > > 'format=nv12,hwupload' -c:v vp8_vaapi -rc_mode CQP -g 1 -
> global_quality
> > 14
> > > -loop_filter_sharpness 0 -loop_filter_level 0 -vframes 10 -y out.ivf
> >
> > Media driver will return 2 buffers in fact. The first buffer is
> > VACodedBufferSegment
> > buffer which includes encoded output. And the second buffer is extra
> > VACodedBufferVP9Status.
> > https://github.com/intel/media-driver/issues/624
> >
> > Fixes vp8 encoding issues for core platforms(Kaby Lake) and could be
> verified.
> > Ping?
> >
> Another ping?
> Had passed the regression patch check in https://github.com/intel-media-
> ci/ffmpeg/pull/44
> 
ping x 4?
This fixes  vp8/vp9 encoding.

- linjie


More information about the ffmpeg-devel mailing list