SEGV while attempting to play DASH
Posted: 13 Dec 2011 17:51
I'm in the process of adding DASH manifest generation to an existing HLS segmentation engine.
I decided to see what VLC would do given one of our MPDs. VLC SEGV'd.
I've seen other articles that VLC's DASH support did not handle MPEG TS fragments, but based on the logs from the HTTP daemon VLC is blowing up before fetching any segments.
I am pretty sure the VLC application should never SEGV. Ideally it would give a diagnostic that tells you exactly what it doesn't like, but error checking code is often a low priority.
I decided to see what VLC would do given one of our MPDs. VLC SEGV'd.
Code: Select all
(gdb) where
#0 0x00007ffff44f7d8e in std::_Rb_tree<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::_Select1st<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::_M_begin (this=0x8)
at /usr/lib/gcc/x86_64-pc-linux-gnu/4.4.5/include/g++-v4/bits/stl_tree.h:488
#1 0x00007ffff44f90b8 in std::_Rb_tree<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::_Select1st<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::find (this=0x8, __k=...)
at /usr/lib/gcc/x86_64-pc-linux-gnu/4.4.5/include/g++-v4/bits/stl_tree.h:1434
#2 0x00007ffff44f9035 in std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >::find (this=0x8, __x=...)
at /usr/lib/gcc/x86_64-pc-linux-gnu/4.4.5/include/g++-v4/bits/stl_map.h:674
#3 0x00007ffff44fdf67 in dash::mpd::MPD::isLive (this=0x0) at mpd/MPD.cpp:99
#4 0x00007ffff45067ca in Open (p_obj=0x7fffe8005fb8) at dash.cpp:109
#5 0x00007ffff79501e4 in generic_start (func=0x7ffff4506614,
ap=0x7fffed649b00) at modules/modules.c:413
#6 0x00007ffff794fe9a in vlc_module_load (p_this=0x7fffe8005fb8,
psz_capability=0x7ffff7990248 "stream_filter", psz_name=0x0,
b_strict=true, probe=0x7ffff7950171 <generic_start>)
at modules/modules.c:342
#7 0x00007ffff79502a3 in module_need (obj=0x7fffe8005fb8,
cap=0x7ffff7990248 "stream_filter", name=0x0, strict=true)
at modules/modules.c:428
#8 0x00007ffff791ee8f in stream_FilterNew (p_source=0x7fffe800b7a8,
psz_stream_filter=0x0) at input/stream_filter.c:62
#9 0x00007ffff791eef2 in stream_FilterChainNew (p_source=0x7fffe800b7a8,
psz_chain=0x0, b_record=true) at input/stream_filter.c:82
#10 0x00007ffff79151ad in InputSourceInit (p_input=0x7afce8, in=0x6c3bb0,
psz_mrl=0x6b6a60 "http://localhost:4046/live/Kung%20Fu%20Panda/index.mpd",
psz_forced_demux=0x0, b_in_can_fail=false) at input/input.c:2540
#11 0x00007ffff791160e in Init (p_input=0x7afce8) at input/input.c:1240
#12 0x00007ffff790f75d in Run (obj=0x7afce8) at input/input.c:542
#13 0x00007ffff6fd2c1a in start_thread () from /lib64/libpthread.so.0
#14 0x00007ffff6b342cd in clone () from /lib64/libc.so.6
(gdb) up
#4 0x00007ffff45067ca in Open (p_obj=0x7fffe8005fb8) at dash.cpp:109
109 p_sys->isLive = p_dashManager->getMpdManager()->getMPD()->isLive();
(gdb) print p_dashManager->mpdManager ->getMPD()
$9 = (const dash::mpd::MPD *) 0x0
Code: Select all
$ wget -q -O - http://localhost:4046/live/Kung%20Fu%20Panda/index.mpd
<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:mpegB:schema:DASH:MPD:DIS2011" xmlns:xsi="http://www.w3.org/2001/XMLSchema" xsi:schemaLocation="urn:mpeg:mpegB:schema:DASH:MPD:DIS2011" profiles="urn:MPEG:MPEGB:profile:dash:full:2011" minBufferTime="PT10.0S">
<Period>
<Group mimeType="video/mp2t">
<SegmentInfo duration="PT10.0S">
<SegmentTimeline>
<S d="10" />
<S d="10" />
<S d="10" />
<S d="10" />
<S d="10" />
<S d="10" />
<S d="10" />
<S d="10" />
<S d="10" />
<S d="10" />
<S d="10" />
<S d="10" />
</SegmentTimeline>
<Url sourceURL="frag00094.mpeg" />
<Url sourceURL="frag00095.mpeg" />
<Url sourceURL="frag00096.mpeg" />
<Url sourceURL="frag00097.mpeg" />
<Url sourceURL="frag00098.mpeg" />
<Url sourceURL="frag00099.mpeg" />
<Url sourceURL="frag00100.mpeg" />
<Url sourceURL="frag00101.mpeg" />
<Url sourceURL="frag00102.mpeg" />
<Url sourceURL="frag00103.mpeg" />
<Url sourceURL="frag00104.mpeg" />
<Url sourceURL="frag00105.mpeg" />
</SegmentInfo>
</Group>
</Period>
</MPD>
I am pretty sure the VLC application should never SEGV. Ideally it would give a diagnostic that tells you exactly what it doesn't like, but error checking code is often a low priority.