X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/699e95c18614b5e6c659a82ae955be6c3920f6e5..032f04eacfaaa0a616b4d0cf34e85b497de62d9f:/lib/service/servicemp3.h diff --git a/lib/service/servicemp3.h b/lib/service/servicemp3.h index 985179f6..7a5b152e 100644 --- a/lib/service/servicemp3.h +++ b/lib/service/servicemp3.h @@ -41,14 +41,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 } 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 +204,7 @@ private: }; int m_state; GstElement *m_gst_playbin; + GstElement *m_gst_subtitlebin; GstTagList *m_stream_tags; eFixedMessagePump m_pump; std::string m_error_message; @@ -205,13 +213,30 @@ private: 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); + 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 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 m_subtitle_pages; ePtr m_subtitle_sync_timer; + ePtr m_subtitle_hide_timer; void pushSubtitles(); void pullSubtitle(); + void hideSubtitles(); int m_subs_to_pull; eSingleLock m_subs_to_pull_lock; gulong m_subs_to_pull_handler_id;