Merge branch 'bug_537_vobsub' into experimental
[vuplus_dvbapp] / lib / service / servicemp3.h
index 985179f..4de0960 100644 (file)
@@ -1,7 +1,6 @@
 #ifndef __servicemp3_h
 #define __servicemp3_h
 
-#ifdef HAVE_GSTREAMER
 #include <lib/base/message.h>
 #include <lib/service/iservice.h>
 #include <lib/dvb/pmt.h>
@@ -41,14 +40,21 @@ class eStaticServiceMP3Info: public iStaticServiceInformation
 public:
        RESULT getName(const eServiceReference &ref, std::string &name);
        int getLength(const eServiceReference &ref);
+       int getInfo(const eServiceReference &ref, int w);
 };
 
 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;
 
+struct SubtitlePage
+{
+       ePangoSubtitlePage *pango_page;
+       eVobSubtitlePage *vob_page;
+};
+
 class eServiceMP3: public iPlayableService, public iPauseableService,
        public iServiceInformation, public iSeekableService, public iAudioTrackSelection, public iAudioChannelSelection, 
        public iSubtitleOutput, public iStreamedService, public iAudioDelay, public Object
@@ -197,6 +203,7 @@ private:
        };
        int m_state;
        GstElement *m_gst_playbin;
+       GstElement *m_gst_subtitlebin;
        GstTagList *m_stream_tags;
        eFixedMessagePump<int> m_pump;
        std::string m_error_message;
@@ -204,23 +211,44 @@ private:
        audiotype_t gstCheckAudioPad(GstStructure* structure);
        void gstBusCall(GstBus *bus, GstMessage *msg);
        static GstBusSyncReply gstBusSyncHandler(GstBus *bus, GstMessage *message, gpointer user_data);
+       static void gstHTTPSourceSetAgent(GObject *source, GParamSpec *unused, gpointer user_data);
        static void gstCBsubtitleAvail(GstElement *element, gpointer user_data);
-       GstPad* gstCreateSubtitleSink(eServiceMP3* _this, subtype_t type);
+       static GstCaps* gstGhostpadGetCAPS (GstPad * pad);
+       static gboolean gstGhostpadAcceptCAPS(GstPad * pad, GstCaps * caps);
+       static void gstGhostpadLink(gpointer user_data, GstCaps * caps);
+       static GstFlowReturn gstGhostpadBufferAlloc(GstPad *pad, guint64 offset, guint size, GstCaps *caps, GstBuffer **buf);
+       static void gstGhostpadHasCAPS(GstPad *pad, GParamSpec * unused, gpointer user_data);
+       static gboolean gstGhostpadSinkEvent(GstPad * pad, GstEvent * event);
+       static GstFlowReturn gstGhostpadChainFunction(GstPad * pad, GstBuffer * buffer);
+/*     static void gstCBsubtitleCAPS(GObject *obj, GParamSpec *pspec, gpointer user_data);
+       static void gstCBsubtitleLink(subtype_t type, gpointer user_data);
+       static gboolean gstCBsubtitleDrop(GstPad *pad, GstBuffer *buffer, gpointer user_data);*/
        void gstPoll(const int&);
-
-       std::list<ePangoSubtitlePage> m_subtitle_pages;
+       GstPadBufferAllocFunction m_ghost_pad_buffer_alloc;
+       GstPadChainFunction m_ghost_pad_chain_function;
+       GstPadEventFunction m_ghost_pad_subtitle_sink_event;
+       GstCaps *m_gst_prev_subtitle_caps;
+       GstSegment m_gst_subtitle_segment;
+       GstPadEventFunction m_gst_sink_event;
+
+       std::list<SubtitlePage> m_subtitle_pages;
        ePtr<eTimer> m_subtitle_sync_timer;
+       ePtr<eTimer> m_subtitle_hide_timer;
+       ePtr<eTimer> m_streamingsrc_timeout;
        void pushSubtitles();
        void pullSubtitle();
+       void hideSubtitles();
+       void sourceTimeout();
        int m_subs_to_pull;
+       sourceStream m_sourceinfo;
        eSingleLock m_subs_to_pull_lock;
        gulong m_subs_to_pull_handler_id;
 
        RESULT seekToImpl(pts_t to);
 
        gint m_aspect, m_width, m_height, m_framerate, m_progressive;
+       std::string m_useragent;
        RESULT trickSeek(gdouble ratio);
 };
-#endif
 
 #endif