From: Sebastien Zwickert <[email protected]> Fix a buffer leak when seeking occurs.
Signed-off-by: Luca Barbato <[email protected]> --- libavcodec/vda_h264.c | 25 ++++++++++++++++++++++++- libavcodec/version.h | 4 ++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/libavcodec/vda_h264.c b/libavcodec/vda_h264.c index e9c4af6..a7183c6 100644 --- a/libavcodec/vda_h264.c +++ b/libavcodec/vda_h264.c @@ -107,6 +107,12 @@ static int vda_h264_decode_slice(AVCodecContext *avctx, return 0; } +static void vda_h264_release_buffer(void *opaque, uint8_t *data) +{ + CVPixelBufferRef cv_buffer = opaque; + CVPixelBufferRelease(cv_buffer); +} + static int vda_h264_end_frame(AVCodecContext *avctx) { H264Context *h = avctx->priv_data; @@ -120,8 +126,25 @@ static int vda_h264_end_frame(AVCodecContext *avctx) status = vda_sync_decode(vda_ctx); frame->data[3] = (void*)vda_ctx->cv_buffer; - if (status) + if (status) { av_log(avctx, AV_LOG_ERROR, "Failed to decode frame (%d)\n", status); + return status; + } + + /* VDA workaround to release properly each core video buffer: + * we need to create an extra av_buffer with a custom freeing callback + * to avoid potential memory leaks. */ + h->cur_pic_ptr->hwaccel_priv_buf = av_buffer_create(frame->data[0], + 0, + vda_h264_release_buffer, + vda_ctx->cv_buffer, + 0); + if (!h->cur_pic_ptr->hwaccel_priv_buf) { + CVPixelBufferRelease(vda_ctx->cv_buffer); + return AVERROR(ENOMEM); + } + + h->cur_pic_ptr->hwaccel_picture_private = h->cur_pic_ptr->hwaccel_priv_buf->data; return status; } diff --git a/libavcodec/version.h b/libavcodec/version.h index cdd5a61..a813fc9 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -29,8 +29,8 @@ #include "libavutil/version.h" #define LIBAVCODEC_VERSION_MAJOR 55 -#define LIBAVCODEC_VERSION_MINOR 34 -#define LIBAVCODEC_VERSION_MICRO 1 +#define LIBAVCODEC_VERSION_MINOR 35 +#define LIBAVCODEC_VERSION_MICRO 0 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ LIBAVCODEC_VERSION_MINOR, \ -- 1.8.5.1 _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
