[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