[FFmpeg-devel] Memory leaks in Ffmpeg after changing vlc allocation approach

Michael Niedermayer michaelni
Fri Jun 20 13:24:16 CEST 2008

On Thu, Jun 19, 2008 at 05:13:37PM -0400, Art Clarke wrote:
> Hi folks (well mostly Michael),
> We have a fairly comprehensive memory leak test system for our software
> here, and it's been impressive how solid ffmpeg has been in running through
> it without leaking (way to go folks).  This is super important as our
> current system design has Ffmpeg running inside a very-long-running server
> process.
> That said, Ffmpeg is now starting to show leaks for well-behaved
> applications due to heap-allocated memory that cannot be freed via any
> Ffmpeg API call.  Now the leaks themselves are one-time allocations that do
> not grow, so it's not causing us problems.  But it is breaking our test
> suite.
> The specific change that caused this was made a few weeks ago to clean-up
> how VLC tables were allocated to make it a lot cleaner and less hacky (see
> bistream.c). 

> Unfortunately the new way of allocating still needs to keep
> around static variables that now point to heap-allocated tables.

No, go RTFsvnlog again!

>  In our
> memory allocation tests these show up as still-reachable-memory leaks on
> exit:
> For example:
> ==25405== 6,656 bytes in 5 blocks are still reachable in loss record 2 of 2
> ==25405==    at 0x40058FE: realloc (vg_replace_malloc.c:429)
> ==25405==    by 0x4749DFE: av_realloc (mem.c:110)
> ==25405==    by 0x4166AD3: ff_realloc_static (bitstream.c:47)
> ==25405==    by 0x4166E76: alloc_table (bitstream.c:122)
> ==25405==    by 0x4166EF7: build_table (bitstream.c:145)
> ==25405==    by 0x41672FE: build_table (bitstream.c:224)
> ==25405==    by 0x416744A: init_vlc_sparse (bitstream.c:295)
> ==25405==    by 0x432140B: h263_decode_init_vlc (h263.c:2910)
> ==25405==    by 0x431637C: ff_h263_decode_init (h263dec.c:117)
> Now to be honest, there isn't much anyone can do about this currently since
> after a call to av_register_all, any Ffmpeg call can be made that needs
> those tables.

> My specific question is have folks given any thoughts to creating a method
> on the AV api such as: av_unregister_all()

Yes, theres no need for such a method at all. Because there should not be any
heap allocated tables in static variables. lavc* thread safety requires all
static tables to be constant thus their size is constant as well. Now when
their size is constant it should be
static array[123];
static *array= av_malloc();

Not all code in lav* has been changed, some still uses such mallocs, patches
removing such heap allocated statics are welcome. (note many small patches
prefered over 1 large to avoid you wasting time solving it incorrectly)

> b) is there any other purposed way to solve this?

see above

> c) does anyone read this far into an e-mail?

no, i started skiping randomly where you proposed to put the hacks back that
i removed.

Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Awnsering whenever a program halts or runs forever is
On a turing machine, in general impossible (turings halting problem).
On any real computer, always possible as a real computer has a finite number
of states N, and will either halt in less than N cycles or never halt.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20080620/c5267bf5/attachment.pgp>

More information about the ffmpeg-devel mailing list