mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-07-03 23:05:58 +08:00
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
This commit is contained in:
@ -1951,7 +1951,6 @@ static void free_tables(H264Context *h){
|
|||||||
av_freep(&hx->top_borders[1]);
|
av_freep(&hx->top_borders[1]);
|
||||||
av_freep(&hx->top_borders[0]);
|
av_freep(&hx->top_borders[0]);
|
||||||
av_freep(&hx->s.obmc_scratchpad);
|
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[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))
|
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;
|
return 0;
|
||||||
fail:
|
fail:
|
||||||
return -1; // free_tables will clean up for us
|
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++) {
|
for(i = 1; i < s->avctx->thread_count; i++) {
|
||||||
H264Context *c;
|
H264Context *c;
|
||||||
c = h->thread_context[i] = av_malloc(sizeof(H264Context));
|
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));
|
memset(&c->s + 1, 0, sizeof(H264Context) - sizeof(MpegEncContext));
|
||||||
c->sps = h->sps;
|
c->sps = h->sps;
|
||||||
c->pps = h->pps;
|
c->pps = h->pps;
|
||||||
|
@ -587,9 +587,7 @@ int MPV_common_init(MpegEncContext *s)
|
|||||||
s->context_initialized = 1;
|
s->context_initialized = 1;
|
||||||
|
|
||||||
s->thread_context[0]= s;
|
s->thread_context[0]= s;
|
||||||
/* h264 does thread context setup itself, but it needs context[0]
|
threads = s->avctx->thread_count;
|
||||||
* to be fully initialized for the error resilience code */
|
|
||||||
threads = s->codec_id == CODEC_ID_H264 ? 1 : s->avctx->thread_count;
|
|
||||||
|
|
||||||
for(i=1; i<threads; i++){
|
for(i=1; i<threads; i++){
|
||||||
s->thread_context[i]= av_malloc(sizeof(MpegEncContext));
|
s->thread_context[i]= av_malloc(sizeof(MpegEncContext));
|
||||||
|
Reference in New Issue
Block a user