error handling for unsupported video stream types
authorAndreas Frisch <andreas.frisch@multimedia-labs.de>
Wed, 17 Sep 2008 11:37:52 +0000 (11:37 +0000)
committerAndreas Frisch <andreas.frisch@multimedia-labs.de>
Wed, 17 Sep 2008 11:37:52 +0000 (11:37 +0000)
lib/python/Plugins/Extensions/MediaPlayer/plugin.py
lib/service/servicemp3.cpp

index 8ef1f2fe5433664701aa9b17f8e98f24408ecc0d..27cf1d5e7a39848dcfb1482ade7487372078417f 100644 (file)
@@ -176,7 +176,8 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB
 
                self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
                        {
 
                self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
                        {
-                               iPlayableService.evUpdatedInfo: self.__evUpdatedInfo
+                               iPlayableService.evUpdatedInfo: self.__evUpdatedInfo,
+                               iPlayableService.evUser+11: self.__evDecodeError
                        })
 
        def doNothing(self):
                        })
 
        def doNothing(self):
@@ -217,6 +218,12 @@ class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoB
                print "[__evUpdatedInfo] title %d of %d (%s)" % (currenttitle, totaltitles, sTitle)
                self.readTitleInformation()
 
                print "[__evUpdatedInfo] title %d of %d (%s)" % (currenttitle, totaltitles, sTitle)
                self.readTitleInformation()
 
+       def __evDecodeError(self):
+               currPlay = self.session.nav.getCurrentService()
+               sVideoType = currPlay.info().getInfoString(iServiceInformation.sVideoType)
+               print "[__evDecodeError] video-codec %s can't be decoded by hardware" % (sVideoType)
+               self.session.open(MessageBox, _("This Dreambox can't decode %s video streams!") % sVideoType, type = MessageBox.TYPE_INFO,timeout = 10 )
+
        def delMPTimer(self):
                del self.rightKeyTimer
                del self.leftKeyTimer
        def delMPTimer(self):
                del self.rightKeyTimer
                del self.leftKeyTimer
index 4d36ba86a461c5a825d559a75c47198cf4479194..fb515e9b8e73f76b13aa189854c022267fa64c30 100644 (file)
@@ -148,7 +148,7 @@ eServiceMP3::eServiceMP3(const char *filename): m_filename(filename), m_pump(eAp
        
        int all_ok = 0;
 
        
        int all_ok = 0;
 
-       m_gst_pipeline = gst_pipeline_new ("audio-player");
+       m_gst_pipeline = gst_pipeline_new ("mediaplayer");
        if (!m_gst_pipeline)
                eWarning("failed to create pipeline");
 
        if (!m_gst_pipeline)
                eWarning("failed to create pipeline");
 
@@ -227,10 +227,10 @@ eServiceMP3::eServiceMP3(const char *filename): m_filename(filename), m_pump(eAp
                        /* filesrc -> mpegdemux -> | queue_audio -> dvbaudiosink
                                                   | queue_video -> dvbvideosink */
 
                        /* filesrc -> mpegdemux -> | queue_audio -> dvbaudiosink
                                                   | queue_video -> dvbvideosink */
 
-               audio = gst_element_factory_make("dvbaudiosink", "audio");
+               audio = gst_element_factory_make("dvbaudiosink", "audiosink");
                queue_audio = gst_element_factory_make("queue", "queue_audio");
                
                queue_audio = gst_element_factory_make("queue", "queue_audio");
                
-               video = gst_element_factory_make("dvbvideosink", "video");
+               video = gst_element_factory_make("dvbvideosink", "videosink");
                queue_video = gst_element_factory_make("queue", "queue_video");
                
                if (is_mpeg_ps)
                queue_video = gst_element_factory_make("queue", "queue_video");
                
                if (is_mpeg_ps)
@@ -559,6 +559,7 @@ int eServiceMP3::getInfo(int w)
        case sComment:
        case sTracknumber:
        case sGenre:
        case sComment:
        case sTracknumber:
        case sGenre:
+       case sVideoType:
                return resIsString;
        case sCurrentTitle:
                tag = GST_TAG_TRACK_NUMBER;
                return resIsString;
        case sCurrentTitle:
                tag = GST_TAG_TRACK_NUMBER;
@@ -604,6 +605,9 @@ std::string eServiceMP3::getInfoString(int w)
        case sGenre:
                tag = GST_TAG_GENRE;
                break;
        case sGenre:
                tag = GST_TAG_GENRE;
                break;
+       case sVideoType:
+               tag = GST_TAG_VIDEO_CODEC;
+               break;
        default:
                return "";
        }
        default:
                return "";
        }
@@ -652,11 +656,21 @@ void eServiceMP3::gstBusCall(GstBus *bus, GstMessage *msg)
                break;
        case GST_MESSAGE_ERROR:
        {
                break;
        case GST_MESSAGE_ERROR:
        {
-               gchar *debug;
+               gchar *debug, *sourceName;
                GError *err;
                GError *err;
+               GstObject *source;
+
+               source = GST_MESSAGE_SRC(msg);
+               sourceName = gst_object_get_name(source);
+
                gst_message_parse_error (msg, &err, &debug);
                g_free (debug);
                gst_message_parse_error (msg, &err, &debug);
                g_free (debug);
-               eWarning("Gstreamer error: %s", err->message);
+               eWarning("Gstreamer error: %s (%i) from %s", err->message, err->code, sourceName );
+               if ( err->domain == GST_STREAM_ERROR && err->code == GST_STREAM_ERROR_DECODE )
+               {
+                       if ( g_strrstr(sourceName, "videosink") )
+                               m_event((iPlayableService*)this, evUser+11);
+               }
                g_error_free(err);
                        /* TODO: signal error condition to user */
                break;
                g_error_free(err);
                        /* TODO: signal error condition to user */
                break;