From 5345d2d435c0ddb35e689633ef02daaac2ecf83f Mon Sep 17 00:00:00 2001 From: David Rosca Date: Sun, 28 Apr 2024 09:26:41 +0200 Subject: [PATCH] lavc/vaapi_av1: Avoid sending the same slice buffer multiple times When there are multiple tiles in one slice buffer, use multiple slice params to avoid sending the same slice buffer multiple times and thus increasing the bitstream size the driver will need to upload to hw. --- libavcodec/vaapi_av1.c | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/libavcodec/vaapi_av1.c b/libavcodec/vaapi_av1.c index e184d01a432..8cab906c112 100644 --- a/libavcodec/vaapi_av1.c +++ b/libavcodec/vaapi_av1.c @@ -19,6 +19,7 @@ */ #include "libavutil/frame.h" +#include "libavutil/mem.h" #include "hwaccel_internal.h" #include "vaapi_decode.h" #include "internal.h" @@ -393,13 +394,17 @@ static int vaapi_av1_decode_slice(AVCodecContext *avctx, { const AV1DecContext *s = avctx->priv_data; VAAPIDecodePicture *pic = s->cur_frame.hwaccel_picture_private; - VASliceParameterBufferAV1 slice_param; - int err = 0; + VASliceParameterBufferAV1 *slice_params; + int err = 0, nb_params = 0; - for (int i = s->tg_start; i <= s->tg_end; i++) { - memset(&slice_param, 0, sizeof(VASliceParameterBufferAV1)); + slice_params = av_calloc(s->tg_end - s->tg_start + 1, sizeof(*slice_params)); + if (!slice_params) { + err = AVERROR(ENOMEM); + goto fail; + } - slice_param = (VASliceParameterBufferAV1) { + for (int i = s->tg_start; i <= s->tg_end; i++) { + slice_params[nb_params++] = (VASliceParameterBufferAV1) { .slice_data_size = s->tile_group_info[i].tile_size, .slice_data_offset = s->tile_group_info[i].tile_offset, .slice_data_flag = VA_SLICE_DATA_FLAG_ALL, @@ -408,18 +413,22 @@ static int vaapi_av1_decode_slice(AVCodecContext *avctx, .tg_start = s->tg_start, .tg_end = s->tg_end, }; - - err = ff_vaapi_decode_make_slice_buffer(avctx, pic, &slice_param, 1, - sizeof(VASliceParameterBufferAV1), - buffer, - size); - if (err) { - ff_vaapi_decode_cancel(avctx, pic); - return err; - } } + err = ff_vaapi_decode_make_slice_buffer(avctx, pic, slice_params, nb_params, + sizeof(VASliceParameterBufferAV1), + buffer, + size); + av_free(slice_params); + + if (err) + goto fail; + return 0; + +fail: + ff_vaapi_decode_cancel(avctx, pic); + return err; } const FFHWAccel ff_av1_vaapi_hwaccel = {