[mythtv] [patch] version 2 of nuppeldecoder exit removal patch

Daniel Thor Kristjansson danielk at mrl.nyu.edu
Tue Jan 4 14:32:01 EST 2005


I found a bug in my original patch. The "if (decoder->IsErrored())" was 
in the wrong place by about 20 lines. This meant that if decoder was 
null, a coredump would result.

Issac, if you need an incremental patch let me know. This just moves the 
if statement down below the "if (!decoder) {...}" around line 600.

-- Daniel
-------------- next part --------------
Index: libs/libmythtv/NuppelVideoPlayer.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/NuppelVideoPlayer.cpp,v
retrieving revision 1.406
diff -u -r1.406 NuppelVideoPlayer.cpp
--- libs/libmythtv/NuppelVideoPlayer.cpp	29 Dec 2004 21:31:31 -0000	1.406
+++ libs/libmythtv/NuppelVideoPlayer.cpp	4 Jan 2005 19:21:34 -0000
@@ -596,8 +596,13 @@
 
     if (!decoder)
     {
-        cerr << "Couldn't find a matching decoder for: "
-             << ringBuffer->GetFilename() << endl;
+        VERBOSE(VB_IMPORTANT, QString("NVP: Couldn't find a matching decoder for: %1").
+                arg(ringBuffer->GetFilename()));
+        return -1;
+    } else if (decoder->IsErrored())
+    {
+        VERBOSE(VB_IMPORTANT, "NVP: NuppelDecoder encountered error during creation.");
+        delete decoder;
         return -1;
     }
 
@@ -3226,8 +3231,9 @@
 {
     if (dm_iter == NULL && honorCutList)
         dm_iter = deleteMap.begin();
-
-    decoder->GetFrame(0);
+    
+    if (!decoder->GetFrame(0))
+        return false;
     if (eof)
         return false;
 
Index: libs/libmythtv/decoderbase.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/decoderbase.cpp,v
retrieving revision 1.14
diff -u -r1.14 decoderbase.cpp
--- libs/libmythtv/decoderbase.cpp	30 Nov 2004 02:32:22 -0000	1.14
+++ libs/libmythtv/decoderbase.cpp	4 Jan 2005 19:21:34 -0000
@@ -40,6 +40,7 @@
 
     getrawframes = false;
     getrawvideo = false; 
+    errored = false;
 }
 
 void DecoderBase::Reset(void)
Index: libs/libmythtv/decoderbase.h
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/decoderbase.h,v
retrieving revision 1.21
diff -u -r1.21 decoderbase.h
--- libs/libmythtv/decoderbase.h	8 Dec 2004 04:23:16 -0000	1.21
+++ libs/libmythtv/decoderbase.h	4 Jan 2005 19:21:35 -0000
@@ -67,6 +67,7 @@
     virtual void decCurrentAudioTrack(){}
     virtual bool setCurrentAudioTrack(int){ return false;}
                                                           
+    bool IsErrored() { return errored; }
   protected:
     typedef struct posmapentry
     {
@@ -116,6 +117,7 @@
     bool getrawvideo;
 
     int currentAudioTrack;
+    bool errored;
 };
 
 #endif
Index: libs/libmythtv/nuppeldecoder.cpp
===================================================================
RCS file: /var/lib/mythcvs/mythtv/libs/libmythtv/nuppeldecoder.cpp,v
retrieving revision 1.57
diff -u -r1.57 nuppeldecoder.cpp
--- libs/libmythtv/nuppeldecoder.cpp	15 Dec 2004 18:42:54 -0000	1.57
+++ libs/libmythtv/nuppeldecoder.cpp	4 Jan 2005 19:21:35 -0000
@@ -24,56 +24,50 @@
 
 NuppelDecoder::NuppelDecoder(NuppelVideoPlayer *parent, MythSqlDatabase *db,
                              ProgramInfo *pginfo)
-             : DecoderBase(parent, db, pginfo)
+    : DecoderBase(parent, db, pginfo),
+      gf(0), rtjd(0), video_width(0), video_height(0), video_size(0),
+      video_frame_rate(0.0f), audio_samplerate(44100), 
+#ifdef WORDS_BIGENDIAN
+      audio_bits_per_sample(0),
+#endif
+      ffmpeg_extradatasize(0), ffmpeg_extradata(0), usingextradata(false),
+      disablevideo(false), totalLength(0), totalFrames(0), effdsp(0), 
+      directbuf(0), mpa_codec(0), mpa_ctx(0), mpa_pic(0), directrendering(false),
+      lastct('1'), strm(0), buf(0), buf2(0), 
+      videosizetotal(0), videoframesread(0), setreadahead(false)
 {
-    ffmpeg_extradata = NULL;
-    ffmpeg_extradatasize = 0;
-
-    usingextradata = false;
+    // initialize structures
+    memset(&fileheader, 0, sizeof(rtfileheader));
+    memset(&frameheader, 0, sizeof(rtframeheader));
     memset(&extradata, 0, sizeof(extendeddata));
+    memset(&tmppicture, 0, sizeof(AVPicture));
+    memset(&mpa_pic_tmp, 0, sizeof(AVPicture));
+    planes[0] = planes[1] = planes[2] = 0;
 
+    // set parent class variables
     positionMapType = MARK_KEYFRAME;
-
-    totalLength = 0;
-    totalFrames = 0;
+    lastKey = 0;
+    framesPlayed = 0;
+    getrawframes = false;
+    getrawvideo = false;
 
     gf = lame_init();
     lame_set_decode_only(gf, 1);
     lame_decode_init();
     lame_init_params(gf);
 
-    int i;
     rtjd = new RTjpeg();
-    i = RTJ_YUV420;
-    rtjd->SetFormat(&i);
+    int format = RTJ_YUV420;
+    rtjd->SetFormat(&format);
 
+    avcodec_init();
+    avcodec_register_all();
     if (lzo_init() != LZO_E_OK)
     {
-        cerr << "lzo_init() failed, exiting\n";
+        VERBOSE(VB_IMPORTANT, "NuppelDecoder: lzo_init() failed, aborting");
+        errored = true;
+        return;
     }
-
-    avcodec_init();
-    avcodec_register_all();
-
-    mpa_codec = 0;
-    mpa_ctx = NULL;
-    mpa_pic = NULL;
-    directrendering = false;
-    directbuf = NULL;
-
-    buf = NULL;
-    buf2 = NULL;
-    strm = NULL;
-
-    lastct = '1';
-
-    audio_samplerate = 44100;
-
-    lastKey = 0;
-    framesPlayed = 0;
-
-    getrawframes = false;
-    getrawvideo = false;
 }
 
 NuppelDecoder::~NuppelDecoder()
@@ -1070,7 +1064,8 @@
                     else if (lameret < 0)
                     {
                         VERBOSE(VB_IMPORTANT, QString("lame decode error: %1, exiting").arg(lameret));
-                        exit(-15);
+                        errored = true;
+                        return false;
                     }
                     packetlen = 0;
                 } while (lameret > 0);


More information about the mythtv-dev mailing list