On Ma, 2024-10-28 at 16:55 +0800, fei.w.wang-at-intel....@ffmpeg.org wrote: > From: Fei Wang <fei.w.w...@intel.com> > > Signed-off-by: Fei Wang <fei.w.w...@intel.com> > --- > libavcodec/vaapi_decode.c | 34 +++++++++++++++++++++++++--------- > libavcodec/vaapi_decode.h | 7 ++----- > 2 files changed, 27 insertions(+), 14 deletions(-) > > diff --git a/libavcodec/vaapi_decode.c b/libavcodec/vaapi_decode.c > index a59194340f..709699dcaf 100644 > --- a/libavcodec/vaapi_decode.c > +++ b/libavcodec/vaapi_decode.c > @@ -39,12 +39,24 @@ int ff_vaapi_decode_make_param_buffer(AVCodecContext > *avctx, > { > VAAPIDecodeContext *ctx = avctx->internal->hwaccel_priv_data; > VAStatus vas; > - VABufferID buffer; > > - av_assert0(pic->nb_param_buffers + 1 <= MAX_PARAM_BUFFERS); > + av_assert0(pic->nb_param_buffers <= pic->nb_param_buffers_allocated); > + if (pic->nb_param_buffers == pic->nb_param_buffers_allocated) { > + VABufferID *tmp = > + av_realloc_array(pic->param_buffers, > + pic->nb_param_buffers_allocated + 16, > + sizeof(*pic->param_buffers)); > + if (!tmp) > + return AVERROR(ENOMEM); > + > + pic->param_buffers = tmp; > + pic->nb_param_buffers_allocated += 16; > + } > + av_assert0(pic->nb_param_buffers + 1 <= pic->nb_param_buffers_allocated); > > vas = vaCreateBuffer(ctx->hwctx->display, ctx->va_context, > - type, size, 1, (void*)data, &buffer); > + type, size, 1, (void*)data, > + &pic->param_buffers[pic->nb_param_buffers]); > if (vas != VA_STATUS_SUCCESS) { > av_log(avctx, AV_LOG_ERROR, "Failed to create parameter " > "buffer (type %d): %d (%s).\n", > @@ -52,14 +64,14 @@ int ff_vaapi_decode_make_param_buffer(AVCodecContext > *avctx, > return AVERROR(EIO); > } > > - pic->param_buffers[pic->nb_param_buffers++] = buffer; > - > av_log(avctx, AV_LOG_DEBUG, "Param buffer (type %d, %zu bytes) " > - "is %#x.\n", type, size, buffer); > + "is %#x.\n", type, size, pic->param_buffers[pic- > >nb_param_buffers]); > + > + ++pic->nb_param_buffers; > + > return 0; > } > > - > int ff_vaapi_decode_make_slice_buffer(AVCodecContext *avctx, > VAAPIDecodePicture *pic, > const void *params_data, > @@ -222,7 +234,9 @@ fail: > ff_vaapi_decode_destroy_buffers(avctx, pic); > fail_at_end: > exit: > - pic->nb_param_buffers = 0; > + pic->nb_param_buffers = 0; > + pic->nb_param_buffers_allocated = 0; > + av_freep(&pic->param_buffers); > pic->nb_slices = 0; > pic->slices_allocated = 0; > av_freep(&pic->slice_buffers); > @@ -235,7 +249,9 @@ int ff_vaapi_decode_cancel(AVCodecContext *avctx, > { > ff_vaapi_decode_destroy_buffers(avctx, pic); > > - pic->nb_param_buffers = 0; > + pic->nb_param_buffers = 0; > + pic->nb_param_buffers_allocated = 0; > + av_freep(&pic->param_buffers); > pic->nb_slices = 0; > pic->slices_allocated = 0; > av_freep(&pic->slice_buffers); > diff --git a/libavcodec/vaapi_decode.h b/libavcodec/vaapi_decode.h > index 702171e108..a373eb5d6b 100644 > --- a/libavcodec/vaapi_decode.h > +++ b/libavcodec/vaapi_decode.h > @@ -32,15 +32,12 @@ static inline VASurfaceID ff_vaapi_get_surface_id(AVFrame > *pic) > return (uintptr_t)pic->data[3]; > } > > -enum { > - MAX_PARAM_BUFFERS = 16, > -}; > - > typedef struct VAAPIDecodePicture { > VASurfaceID output_surface; > > int nb_param_buffers; > - VABufferID param_buffers[MAX_PARAM_BUFFERS]; > + VABufferID *param_buffers; > + int nb_param_buffers_allocated; > > int nb_slices; > VABufferID *slice_buffers;
The patchset looks good and works well for me. I'll push it if there is no objection in a few days. Thanks Haihao _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".