From 79db7ac6ef235a06c3049d7792eda39da28ee3fd Mon Sep 17 00:00:00 2001 From: Jeff Downs Date: Mon, 28 Jan 2008 21:12:38 +0000 Subject: [PATCH] Fix memory leak in h264 decoder. allocated_edge_emu_buffer was being allocated in both mpegvideo and h264 decoder. Fixed by allowing all (master and duplicate) contexts to fully initialize in MPV_frame_start and copying these into H264Contexts. Mailing list discussion: [FFmpeg-devel] Memory leak in h264 Tue, 22 Jan 2008 15:22:55 Originally committed as revision 11657 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/h264.c | 7 +------ libavcodec/mpegvideo.c | 4 +--- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/libavcodec/h264.c b/libavcodec/h264.c index 841d85479b..9d0e4a1d46 100644 --- a/libavcodec/h264.c +++ b/libavcodec/h264.c @@ -1951,7 +1951,6 @@ static void free_tables(H264Context *h){ av_freep(&hx->top_borders[1]); av_freep(&hx->top_borders[0]); av_freep(&hx->s.obmc_scratchpad); - av_freep(&hx->s.allocated_edge_emu_buffer); } } @@ -2096,10 +2095,6 @@ static int context_init(H264Context *h){ CHECKED_ALLOCZ(h->top_borders[0], h->s.mb_width * (16+8+8) * sizeof(uint8_t)) CHECKED_ALLOCZ(h->top_borders[1], h->s.mb_width * (16+8+8) * sizeof(uint8_t)) - // edge emu needs blocksize + filter length - 1 (=17x17 for halfpel / 21x21 for h264) - CHECKED_ALLOCZ(s->allocated_edge_emu_buffer, - (s->width+64)*2*21*2); //(width + edge + align)*interlaced*MBsize*tolerance - s->edge_emu_buffer= s->allocated_edge_emu_buffer + (s->width+64)*2*21; return 0; fail: return -1; // free_tables will clean up for us @@ -3907,7 +3902,7 @@ static int decode_slice_header(H264Context *h, H264Context *h0){ for(i = 1; i < s->avctx->thread_count; i++) { H264Context *c; c = h->thread_context[i] = av_malloc(sizeof(H264Context)); - memcpy(c, h, sizeof(MpegEncContext)); + memcpy(c, h->s.thread_context[i], sizeof(MpegEncContext)); memset(&c->s + 1, 0, sizeof(H264Context) - sizeof(MpegEncContext)); c->sps = h->sps; c->pps = h->pps; diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index f4d5e58c54..4788118d5b 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -587,9 +587,7 @@ int MPV_common_init(MpegEncContext *s) s->context_initialized = 1; s->thread_context[0]= s; - /* h264 does thread context setup itself, but it needs context[0] - * to be fully initialized for the error resilience code */ - threads = s->codec_id == CODEC_ID_H264 ? 1 : s->avctx->thread_count; + threads = s->avctx->thread_count; for(i=1; ithread_context[i]= av_malloc(sizeof(MpegEncContext));