[mythtv] crash mythfrontend (OSDTypeEditSlider::Reinit)
Jim Westfall
jwestfall at surrealistic.net
Sun Mar 6 02:46:11 UTC 2005
Attached is a patch that fixes the problem. It holds off creating the osd
object until width/height are non-zero and fps/aspect are non-nan.
jim
Jim Westfall <jwestfall at surrealistic.net> wrote [03.05.05]:
> The crash is in frame #10
> (gdb) f 10
> #10 0xb7c75d1c in OSDTypeEditSlider::Reinit(float, float, float, float) (
> this=0xb41faad0, wchange=inf, hchange=inf, wmult=3, hmult=2.25)
> at osdtypes.cpp:1223
> 1223 m_drawMap = new unsigned char[m_drawwidth + 1];
> (gdb) print m_drawwidth
> $2 = -2147483648
>
> The underlying problem looks like NuppelVideoPlayer can create a new
> OSD object with bogus height/width data as seen in the backtrace below this
> one. This is causing m_hmult and m_wmult to be zero. When OSDSet::Reinit
> is called its breaking the following code.
>
> float wchange = wmult / m_wmult;
> float hchange = hmult / m_hmult;
>
> resulting in wchange/hchange both being inf.
>
> jim
>
> (gdb) bt full
> #0 0xb69ef7b1 in kill () from /lib/libc.so.6
> No symbol table info available.
> #1 0xb6bbb729 in pthread_kill () from /lib/libpthread.so.0
> No symbol table info available.
> #2 0xb6bbba7d in raise () from /lib/libpthread.so.0
> No symbol table info available.
> #3 0xb69ef404 in raise () from /lib/libc.so.6
> No symbol table info available.
> #4 0xb69f0a58 in abort () from /lib/libc.so.6
> No symbol table info available.
> #5 0xb6b8b103 in __cxa_call_unexpected ()
> from /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.5/libstdc++.so.5
> No symbol table info available.
> #6 0xb6b8b136 in std::terminate() ()
> from /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.5/libstdc++.so.5
> No symbol table info available.
> #7 0xb6b8b281 in __cxa_throw ()
> from /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.5/libstdc++.so.5
> No symbol table info available.
> #8 0xb6b8b48d in operator new(unsigned) ()
> from /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.5/libstdc++.so.5
> No symbol table info available.
> #9 0xb6b8b54b in operator new[](unsigned) ()
> from /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.5/libstdc++.so.5
> No symbol table info available.
> #10 0xb7c75d1c in OSDTypeEditSlider::Reinit(float, float, float, float) (
> this=0xb41faad0, wchange=inf, hchange=inf, wmult=3, hmult=2.25)
> at osdtypes.cpp:1223
> width = -2147483648
> height = -2147483648
> x = -2147483648
> y = -2147483648
> #11 0xb7c6fe01 in OSDSet::Reinit(int, int, int, int, int, int, float,
> float, in$
> screenwidth=1920, screenheight=1088, xoff=0, yoff=0,
> displaywidth=1920, displayheight=1080, wmult=3, hmult=2.25,
> frint=33366)
> at osdtypes.cpp:192
> item = (OSDTypeEditSlider *) 0xb41faad0
> item = (OSDTypeFillSlider *) 0x0
> item = (OSDTypePosSlider *) 0x0
> item = (OSDTypePositionImage *) 0x0
> item = (OSDTypeText *) 0x0
> item = (OSDTypePositionImage *) 0x0
> item = (OSDTypeText *) 0x0
> type = (class OSDType *) 0xb41faad0
> wchange = inf
> hchange = inf
> iter =
> {<iterator<std::random_access_iterator_tag,OSDType*,int,OSDType**,OSDType*&>> = {<No
> data fields>}, _M_current = 0x8218a68}
> #12 0xb7c5abbd in OSD::Reinit(int, int, int, int, int, int, int) (
> this=0xb63abd68, width=1920, height=1088, frint=33366, dispx=0,
> dispy=0,
> dispw=1920, disph=1080) at osd.cpp:232
> set = (class OSDSet *) 0xb41fa858
> fonts = {node = 0xb63abad0}
> sets = {node = 0xb41fa920}
> #13 0xb7c43798 in NuppelVideoPlayer::ReinitOSD() (this=0x82fbe50)
> at NuppelVideoPlayer.cpp:458
> dispx = 0
> dispy = 0
> dispw = 1920
> disph = 1080
> #14 0xb7c43812 in NuppelVideoPlayer::ReinitVideo() (this=0x82fbe50)
> at NuppelVideoPlayer.cpp:469
> No locals.
> #15 0xb7c443fd in NuppelVideoPlayer::SetVideoParams(int, int, double, int, float, FrameScanType,
> bool) (this=0x82fbe50, width=1920, height=1088,
> fps=29.970029970029969, keyframedistance=15, aspect=1.77777779,
> scan=kScan_Detect, reinit=true) at NuppelVideoPlayer.cpp:564
> No locals.
> ...
>
>
>
> (gdb)
> #0 0xb69ef7b1 in kill () from /lib/libc.so.6
> #1 0xb6bbb729 in pthread_kill () from /lib/libpthread.so.0
> #2 0xb6bbba7d in raise () from /lib/libpthread.so.0
> #3 0xb69ef404 in raise () from /lib/libc.so.6
> #4 0xb69f0a58 in abort () from /lib/libc.so.6
> #5 0xb7c5f9c3 in OSD::parseSlider(OSDSet*, QDomElement&) (this=0xb65990e0,
> container=0x82f6ea8, element=@0xbf1ff744) at osd.cpp:708
> #6 0xb7c63c59 in OSD::parseContainer(QDomElement&) (this=0xb65990e0,
> element=@0xbf1ff844) at osd.cpp:1084
> #7 0xb7c64921 in OSD::LoadTheme() (this=0xb65990e0) at osd.cpp:1166
> #8 0xb7c5913a in OSD (this=0xb65990e0, width=0, height=0, frint=-1, dispx=0,
> dispy=0, dispw=0, disph=0) at osd.cpp:68
> #9 0xb7c4ab1c in NuppelVideoPlayer::StartPlaying() (this=0x82b2600)
> at NuppelVideoPlayer.cpp:1816
>
> _______________________________________________
> mythtv-dev mailing list
> mythtv-dev at mythtv.org
> http://mythtv.org/cgi-bin/mailman/listinfo/mythtv-dev
-------------- next part --------------
Index: libs/libmythtv/NuppelVideoPlayer.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/NuppelVideoPlayer.cpp,v
retrieving revision 1.443
diff -u -r1.443 NuppelVideoPlayer.cpp
--- libs/libmythtv/NuppelVideoPlayer.cpp 27 Feb 2005 21:54:36 -0000 1.443
+++ libs/libmythtv/NuppelVideoPlayer.cpp 6 Mar 2005 02:43:35 -0000
@@ -1809,19 +1809,8 @@
return;
}
- if (!disablevideo)
- {
- int dispx = 0, dispy = 0, dispw = video_width, disph = video_height;
- videoOutput->GetVisibleSize(dispx, dispy, dispw, disph);
- osd = new OSD(video_width, video_height, frame_interval,
- dispx, dispy, dispw, disph);
-
- if (forceVideoOutput != kVideoOutput_Default &&
- forceVideoOutput != kVideoOutput_IVTV)
- osd->DisableFade();
- }
-
- playing = true;
+ if(disablevideo)
+ playing = true;
rewindtime = fftime = 0;
skipcommercials = 0;
@@ -1903,6 +1892,21 @@
break;
}
+ if (!disablevideo && !osd && video_height && video_width &&
+ !isnan(video_aspect) && !isnan(video_frame_rate))
+ {
+ int dispx = 0, dispy = 0, dispw = video_width, disph = video_height;
+ videoOutput->GetVisibleSize(dispx, dispy, dispw, disph);
+ osd = new OSD(video_width, video_height, frame_interval,
+ dispx, dispy, dispw, disph);
+
+ if (forceVideoOutput != kVideoOutput_Default &&
+ forceVideoOutput != kVideoOutput_IVTV)
+ osd->DisableFade();
+
+ playing = true;
+ }
+
if (play_speed != next_play_speed)
{
decoder_lock.lock();
More information about the mythtv-dev
mailing list