Update EPG Cache(thanks to open source community)
[vuplus_dvbapp] / lib / service / servicemp3.h
index b864a10..4cbedf5 100644 (file)
@@ -41,12 +41,14 @@ public:
        RESULT getName(const eServiceReference &ref, std::string &name);
        int getLength(const eServiceReference &ref);
        int getInfo(const eServiceReference &ref, int w);
+       int isPlayable(const eServiceReference &ref, const eServiceReference &ignore, bool simulate) { return 1; }
+       RESULT getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &ptr, time_t start_time);
 };
 
 typedef struct _GstElement GstElement;
 
 typedef enum { atUnknown, atMPEG, atMP3, atAC3, atDTS, atAAC, atPCM, atOGG, atFLAC } audiotype_t;
-typedef enum { stPlainText, stSSA, stSRT } subtype_t;
+typedef enum { stUnknown, stPlainText, stSSA, stASS, stSRT, stVOB, stPGS } subtype_t;
 typedef enum { ctNone, ctMPEGTS, ctMPEGPS, ctMKV, ctAVI, ctMP4, ctVCD, ctCDA } containertype_t;
 
 class eServiceMP3: public iPlayableService, public iPauseableService,
@@ -83,6 +85,8 @@ public:
        RESULT keys(ePtr<iServiceKeys> &ptr) { ptr = 0; return -1; }
        RESULT stream(ePtr<iStreamableService> &ptr) { ptr = 0; return -1; }
 
+       void setQpipMode(bool value, bool audio) { }
+
                // iPausableService
        RESULT pause();
        RESULT unpause();
@@ -99,6 +103,7 @@ public:
 
                // iServiceInformation
        RESULT getName(std::string &name);
+       RESULT getEvent(ePtr<eServiceEvent> &evt, int nownext);
        int getInfo(int w);
        std::string getInfoString(int w);
        PyObject *getInfoObject(int w);
@@ -167,12 +172,22 @@ public:
                int bufferPercent;
                int avgInRate;
                int avgOutRate;
-               long long bufferingLeft;
+               int64_t bufferingLeft;
                bufferInfo()
                        :bufferPercent(0), avgInRate(0), avgOutRate(0), bufferingLeft(-1)
                {
                }
        };
+       struct errorInfo
+       {
+               std::string error_message;
+               std::string missing_codec;
+       };
+
+protected:
+       ePtr<eTimer> m_nownext_timer;
+       ePtr<eServiceEvent> m_event_now, m_event_next;
+       void updateEpgCacheNowNext();
 private:
        static int pcm_delay;
        static int ac3_delay;
@@ -183,42 +198,83 @@ private:
        std::vector<subtitleStream> m_subtitleStreams;
        eSubtitleWidget *m_subtitle_widget;
        int m_currentTrickRatio;
-       ePtr<eTimer> m_seekTimeout;
-       void seekTimeoutCB();
        friend class eServiceFactoryMP3;
        eServiceReference m_ref;
        int m_buffer_size;
+
        bufferInfo m_bufferInfo;
+       errorInfo m_errorInfo;
        eServiceMP3(eServiceReference ref);
        Signal2<void,iPlayableService*,int> m_event;
        enum
        {
                stIdle, stRunning, stStopped,
+        };
+        int m_state;
+        GstElement *m_gst_playbin, *audioSink, *videoSink;
+        GstTagList *m_stream_tags;
+
+        struct Message
+        {
+                Message()
+                        :type(-1)
+                {}
+                Message(int type)
+                        :type(type)
+                {}
+                Message(int type, GstPad *pad)
+                        :type(type)
+                {
+                        d.pad=pad;
+                }
+                               Message(int type, GstBuffer *buffer)
+                        :type(type)
+                {
+                        d.buffer=buffer;
+                }
+
+                int type;
+                union {
+                        GstBuffer *buffer; // for msg type 2
+                        GstPad *pad; // for msg type 3
+                } d;
+        };
+
+        eFixedMessagePump<Message> m_pump;
+
+        audiotype_t gstCheckAudioPad(GstStructure* structure);
+#if GST_VERSION_MAJOR < 1
+        static gint match_sinktype(GstElement *element, gpointer type);
+#else
+        static gint match_sinktype(const GValue *velement, const gchar *type);
+#endif
+        void gstBusCall(GstBus *bus, GstMessage *msg);
+        static GstBusSyncReply gstBusSyncHandler(GstBus *bus, GstMessage *message, gpointer user_data);
+       static void gstTextpadHasCAPS(GstPad *pad, GParamSpec * unused, gpointer user_data);
+       void gstTextpadHasCAPS_synced(GstPad *pad);
+        static void gstCBsubtitleAvail(GstElement *element, GstBuffer *buffer, gpointer user_data);
+        GstPad* gstCreateSubtitleSink(eServiceMP3* _this, subtype_t type);
+       void gstPoll(const Message&);
+        static void gstHTTPSourceSetAgent(GObject *source, GParamSpec *unused, gpointer user_data);
+
+       struct SubtitlePage
+       {
+               enum { Unknown, Pango, Vob } type;
+               ePangoSubtitlePage pango_page;
+               eVobSubtitlePage vob_page;
        };
-       int m_state;
-       GstElement *m_gst_playbin;
-       GstTagList *m_stream_tags;
-       eFixedMessagePump<int> m_pump;
-       std::string m_error_message;
-
-       audiotype_t gstCheckAudioPad(GstStructure* structure);
-       void gstBusCall(GstBus *bus, GstMessage *msg);
-       static GstBusSyncReply gstBusSyncHandler(GstBus *bus, GstMessage *message, gpointer user_data);
-       static void gstCBsubtitleAvail(GstElement *element, gpointer user_data);
-       GstPad* gstCreateSubtitleSink(eServiceMP3* _this, subtype_t type);
-       void gstPoll(const int&);
-       static void gstHTTPSourceSetAgent(GObject *source, GParamSpec *unused, gpointer user_data);
-
-       std::list<ePangoSubtitlePage> m_subtitle_pages;
-       ePtr<eTimer> m_subtitle_sync_timer;
-       
-       ePtr<eTimer> m_streamingsrc_timeout;
-       void pushSubtitles();
-       void pullSubtitle();
-       void sourceTimeout();
-       int m_subs_to_pull;
-       sourceStream m_sourceinfo;
-       eSingleLock m_subs_to_pull_lock;
+
+        std::list<SubtitlePage> m_subtitle_pages;
+        ePtr<eTimer> m_subtitle_sync_timer;
+        
+        ePtr<eTimer> m_streamingsrc_timeout;
+        pts_t m_prev_decoder_time;
+        int m_decoder_time_valid_state;
+
+        void pushSubtitles();
+        void pullSubtitle(GstBuffer *buffer);
+        void sourceTimeout();
+        sourceStream m_sourceinfo;
        gulong m_subs_to_pull_handler_id;
 
        RESULT seekToImpl(pts_t to);