From 33452aede6acab78f726cd1924824585f00765cc Mon Sep 17 00:00:00 2001 From: Gildas Cocherel Date: Tue, 10 Dec 2013 15:42:28 +0100 Subject: [PATCH] hevc: store the VPS list as an AVBufferRef, just like the others *PS Signed-off-by: Anton Khirnov --- libavcodec/hevc.c | 13 +++++++++++-- libavcodec/hevc.h | 2 +- libavcodec/hevc_ps.c | 15 ++++++++------- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/libavcodec/hevc.c b/libavcodec/hevc.c index b7e7757..d969f5e 100644 --- a/libavcodec/hevc.c +++ b/libavcodec/hevc.c @@ -431,7 +431,7 @@ static int set_sps(HEVCContext *s, const HEVCSPS *sps) } s->sps = sps; - s->vps = s->vps_list[s->sps->vps_id]; + s->vps = (HEVCVPS*) s->vps_list[s->sps->vps_id]->data; return 0; fail: @@ -2924,7 +2924,7 @@ static av_cold int hevc_decode_free(AVCodecContext *avctx) } for (i = 0; i < FF_ARRAY_ELEMS(s->vps_list); i++) - av_freep(&s->vps_list[i]); + av_buffer_unref(&s->vps_list[i]); for (i = 0; i < FF_ARRAY_ELEMS(s->sps_list); i++) av_buffer_unref(&s->sps_list[i]); for (i = 0; i < FF_ARRAY_ELEMS(s->pps_list); i++) @@ -2999,6 +2999,15 @@ static int hevc_update_thread_context(AVCodecContext *dst, } } + for (i = 0; i < FF_ARRAY_ELEMS(s->vps_list); i++) { + av_buffer_unref(&s->vps_list[i]); + if (s0->vps_list[i]) { + s->vps_list[i] = av_buffer_ref(s0->vps_list[i]); + if (!s->vps_list[i]) + return AVERROR(ENOMEM); + } + } + for (i = 0; i < FF_ARRAY_ELEMS(s->sps_list); i++) { av_buffer_unref(&s->sps_list[i]); if (s0->sps_list[i]) { diff --git a/libavcodec/hevc.h b/libavcodec/hevc.h index d19f312..bd6f50f 100644 --- a/libavcodec/hevc.h +++ b/libavcodec/hevc.h @@ -843,7 +843,7 @@ typedef struct HEVCContext { const HEVCVPS *vps; const HEVCSPS *sps; const HEVCPPS *pps; - HEVCVPS *vps_list[MAX_VPS_COUNT]; + AVBufferRef *vps_list[MAX_VPS_COUNT]; AVBufferRef *sps_list[MAX_SPS_COUNT]; AVBufferRef *pps_list[MAX_PPS_COUNT]; diff --git a/libavcodec/hevc_ps.c b/libavcodec/hevc_ps.c index 402c16f..d981125 100644 --- a/libavcodec/hevc_ps.c +++ b/libavcodec/hevc_ps.c @@ -328,12 +328,13 @@ int ff_hevc_decode_nal_vps(HEVCContext *s) GetBitContext *gb = &s->HEVClc.gb; int vps_id = 0; HEVCVPS *vps; + AVBufferRef *vps_buf = av_buffer_allocz(sizeof(*vps)); - av_log(s->avctx, AV_LOG_DEBUG, "Decoding VPS\n"); + if (!vps_buf) + return AVERROR(ENOMEM); + vps = (HEVCVPS*)vps_buf->data; - vps = av_mallocz(sizeof(*vps)); - if (!vps) - return AVERROR(ENOMEM); + av_log(s->avctx, AV_LOG_DEBUG, "Decoding VPS\n"); vps_id = get_bits(gb, 4); if (vps_id >= MAX_VPS_COUNT) { @@ -410,12 +411,12 @@ int ff_hevc_decode_nal_vps(HEVCContext *s) } get_bits1(gb); /* vps_extension_flag */ - av_free(s->vps_list[vps_id]); - s->vps_list[vps_id] = vps; + av_buffer_unref(&s->vps_list[vps_id]); + s->vps_list[vps_id] = vps_buf; return 0; err: - av_free(vps); + av_buffer_unref(&vps_buf); return AVERROR_INVALIDDATA; } -- 2.7.4