#ifndef __servicemp3_h
#define __servicemp3_h
-#ifdef HAVE_GSTREAMER
#include <lib/base/message.h>
#include <lib/service/iservice.h>
#include <lib/dvb/pmt.h>
typedef struct _GstElement GstElement;
typedef enum { atUnknown, atMPEG, atMP3, atAC3, atDTS, atAAC, atPCM, atOGG, atFLAC } audiotype_t;
-typedef enum { stUnknown, stPlainText, stSSA, stASS, stSRT, stVOB } 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
GstElement *m_gst_playbin;
GstElement *m_gst_subtitlebin;
GstTagList *m_stream_tags;
- eFixedMessagePump<int> m_pump;
+
+ struct Message
+ {
+ Message()
+ :type(-1)
+ {}
+ Message(int type)
+ :type(type)
+ {}
+ Message(int type, GstPad *pad)
+ :type(type)
+ {
+ d.pad=pad;
+ }
+
+ int type;
+ union {
+ GstPad *pad; // for msg type 3
+ } d;
+ };
+
+ eFixedMessagePump<Message> 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 gstHTTPSourceSetAgent(GObject *source, GParamSpec *unused, gpointer user_data);
static void gstCBsubtitleAvail(GstElement *element, gpointer user_data);
static GstCaps* gstGhostpadGetCAPS (GstPad * pad);
static gboolean gstGhostpadAcceptCAPS(GstPad * pad, GstCaps * caps);
/* 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&);
+ void gstPoll(const Message&);
+ void gstGhostpadHasCAPS_synced(GstPad *pad);
+
GstPadBufferAllocFunction m_ghost_pad_buffer_alloc;
GstPadChainFunction m_ghost_pad_chain_function;
GstPadEventFunction m_ghost_pad_subtitle_sink_event;
GstSegment m_gst_subtitle_segment;
GstPadEventFunction m_gst_sink_event;
+ struct SubtitlePage
+ {
+ enum { Unknown, Pango, Vob } type;
+ ePangoSubtitlePage pango_page;
+ eVobSubtitlePage vob_page;
+ };
+
std::list<SubtitlePage> m_subtitle_pages;
ePtr<eTimer> m_subtitle_sync_timer;
ePtr<eTimer> m_subtitle_hide_timer;
+ ePtr<eTimer> m_streamingsrc_timeout;
+ pts_t m_prev_decoder_time;
+ int m_decoder_time_valid_state;
+
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