[mythtv-commits] Ticket #11329: [PATCH] 16 bytes leaked per frame
MythTV
noreply at mythtv.org
Sat Jan 5 05:37:03 UTC 2013
#11329: [PATCH] 16 bytes leaked per frame
-------------------------------------+-------------------------------------
Reporter: Bradley Baetz | Type: Patch - Bug Fix
<bbaetz@…> | Priority: minor
Status: new | Component: MythTV - Video
Milestone: unknown | Decoding
Version: 0.26-fixes | Severity: medium
Keywords: patch | Ticket locked: 0
-------------------------------------+-------------------------------------
The fix for #11029 [92016b94983a4b8a6cb75dbc48893f5c05ce4620] applied a
mythtv-specific patch to libavformat, chaning a call from
av_init_packet(pkt) to av_new_packet(pkt, 0), in order to properly
initialise some fields.
However, av_new_packet ends up mallocing (size+
FF_INPUT_BUFFER_PADDING_SIZE) (FF_INPUT_BUFFER_PADDING_SIZE is #defined as
16). This data is never freed, at least according to valgrind.
After watching a 2 hour show (recorded as an MPEG2 TS stream from an
hdhomerun) 4MB of data was leaked:
{{{
==5837== 4,279,136 bytes in 267,446 blocks are definitely lost in loss
record 2,969 of 2,971
==5837== at 0x4C29BE8: memalign (in /usr/lib/valgrind
/vgpreload_memcheck-amd64-linux.so)
==5837== by 0x4C29C97: posix_memalign (in /usr/lib/valgrind
/vgpreload_memcheck-amd64-linux.so)
==5837== by 0xAE9DAC1: av_malloc (mem.c:95)
==5837== by 0xA0A15C7: av_new_packet (avpacket.c:71)
==5837== by 0x9D88A8A: ff_read_packet (utils.c:712)
==5837== by 0x9D89C46: read_frame_internal (utils.c:1310)
==5837== by 0x9D8A6F2: av_read_frame (utils.c:1413)
==5837== by 0x5301CF5: AvFormatDecoder::GetFrame(DecodeTypes)
(avformatdecoder.cpp:4509)
==5837== by 0x52930E3: MythPlayer::DecoderGetFrame(DecodeTypes, bool)
(mythplayer.cpp:3221)
==5837== by 0x5293381: MythPlayer::DecoderLoop(bool)
(mythplayer.cpp:3145)
==5837== by 0x5284EE5: DecoderThread::run() (mythplayer.cpp:108)
==5837== by 0x8938FCA: ??? (in /usr/lib/x86_64-linux-
gnu/libQtCore.so.4.8.1)
==5837== by 0x720BE99: start_thread (pthread_create.c:308)
==5837== by 0x9398CBC: clone (clone.S:112)
}}}
Upstream appears to have fixed the same bug with
http://git.videolan.org/?p=ffmpeg.git;a=commitdiff;h=1cc569dddadfedabe970ce7408dba7ddf381e98b
which just initialises those fields. I suspect that that's the better fix
(I could only find the git commit and no mailing list conversation; not
sure if someone else reported the same issue or if that fix was prompted
from a report by one of the mythtv developers)
Reverting the mythtv patch and applying the upstream one fixes the leak
for me, and from code inspection this does the same as av_new_packet
(without the malloc). (I can't easily check for the bug that that ticket
has; it was apparently hard to reproduce, plus mythtv crashes very often
for me under valgrind anyway for some reason)
Note that this data should be freed by av_free_packet, which implies that
its not being called in this case. Not sure why not, but it may be
internal to libavformat and related to the mythtv-local patch (the library
isn't expecting allocated data at that point?) Or it may be another bug -
AvFormatDecoder::GetFrame's use of av_dup_packet looks a bit odd (dupes
the data and then just drops the original? Not sure though - documentation
for av_dup_packet is a bit missing)
Full valgrind log and patch attached. (This was noticed while I'm trying
to reproduce a much larger frontend leak)
--
Ticket URL: <http://code.mythtv.org/trac/ticket/11329>
MythTV <http://code.mythtv.org/trac>
MythTV Media Center
More information about the mythtv-commits
mailing list