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 { 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
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();
// 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);
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;
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;
- GstElement *m_gst_subtitlebin;
- 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 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 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&);
- 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;
+
+ 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);