[FFmpeg-devel] Memory leak in h264
Jeff Downs
heydowns
Sat Jan 26 20:13:32 CET 2008
On Tue, 22 Jan 2008, Michael Niedermayer wrote:
> honestly, i dont think this is the cleanest way to solve it ...
> I really think we should try to minimize the number of variables which get
> initialized in mpegideo.c AND h264.c.
Sure. The attached is more of what you had in mind?
-------------- next part --------------
Index: libavcodec/h264.c
===================================================================
--- libavcodec/h264.c (revision 11620)
+++ libavcodec/h264.c (working copy)
@@ -1951,7 +1951,6 @@
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 @@
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 @@
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;
Index: libavcodec/mpegvideo.c
===================================================================
--- libavcodec/mpegvideo.c (revision 11620)
+++ libavcodec/mpegvideo.c (working copy)
@@ -587,9 +587,7 @@
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; i<threads; i++){
s->thread_context[i]= av_malloc(sizeof(MpegEncContext));
More information about the ffmpeg-devel
mailing list