Page 1 of 1

SEGV while attempting to play DASH

Posted: 13 Dec 2011 17:51
by thoth
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.

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'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.

Re: SEGV while attempting to play DASH

Posted: 13 Dec 2011 23:27
by Jean-Baptiste Kempf
0x00007ffff44fdf67 in dash::mpd::MPD::isLive (this=0x0) at mpd/MPD.cpp:99

0x0 here seems weird.

Re: SEGV while attempting to play DASH

Posted: 13 Dec 2011 23:30
by thoth
0x0 here seems weird.
That's what led me to ask GDB to print out
p_dashManager->mpdManager ->getMPD()
in the statement
p_sys->isLive = p_dashManager->getMpdManager()->getMPD()->isLive();

It's pretty clear that's why (this) is 0.