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

Fu, Linjie linjie.fu at intel.com
Tue Jun 4 12:10:37 EEST 2019


> -----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


More information about the ffmpeg-devel mailing list