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;
-class eServiceMP3: public iPlayableService, public iPauseableService,
- public iServiceInformation, public iSeekableService, public iAudioTrackSelection, public iAudioChannelSelection, public iSubtitleOutput, public Object
+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
{
DECLARE_REF(eServiceMP3);
public:
RESULT audioTracks(ePtr<iAudioTrackSelection> &ptr);
RESULT audioChannel(ePtr<iAudioChannelSelection> &ptr);
RESULT subtitle(ePtr<iSubtitleOutput> &ptr);
+ RESULT audioDelay(ePtr<iAudioDelay> &ptr);
// not implemented (yet)
RESULT frontendInfo(ePtr<iFrontendInformation> &ptr) { ptr = 0; return -1; }
RESULT subServices(ePtr<iSubserviceList> &ptr) { ptr = 0; return -1; }
RESULT timeshift(ePtr<iTimeshiftService> &ptr) { ptr = 0; return -1; }
RESULT cueSheet(ePtr<iCueSheet> &ptr) { ptr = 0; return -1; }
- RESULT audioDelay(ePtr<iAudioDelay> &ptr) { ptr = 0; return -1; }
+
RESULT rdsDecoder(ePtr<iRdsDecoder> &ptr) { ptr = 0; return -1; }
- RESULT stream(ePtr<iStreamableService> &ptr) { ptr = 0; return -1; }
RESULT keys(ePtr<iServiceKeys> &ptr) { ptr = 0; return -1; }
+ RESULT stream(ePtr<iStreamableService> &ptr) { ptr = 0; return -1; }
// iPausableService
RESULT pause();
PyObject *getSubtitleList();
PyObject *getCachedSubtitle();
+ // iStreamedService
+ RESULT streamed(ePtr<iStreamedService> &ptr);
+ PyObject *getBufferCharge();
+ int setBufferSize(int size);
+
+ // iAudioDelay
+ int getAC3Delay();
+ int getPCMDelay();
+ void setAC3Delay(int);
+ void setPCMDelay(int);
+
struct audioStream
{
GstPad* pad;
{
}
};
+ struct bufferInfo
+ {
+ int bufferPercent;
+ int avgInRate;
+ int avgOutRate;
+ long long bufferingLeft;
+ bufferInfo()
+ :bufferPercent(0), avgInRate(0), avgOutRate(0), bufferingLeft(-1)
+ {
+ }
+ };
private:
+ static int pcm_delay;
+ static int ac3_delay;
int m_currentAudioStream;
int m_currentSubtitleStream;
int selectAudioStream(int i);
ePtr<eTimer> m_seekTimeout;
void seekTimeoutCB();
friend class eServiceFactoryMP3;
- std::string m_filename;
- std::string m_title;
- eServiceMP3(const char *filename, const char *title);
+ eServiceReference m_ref;
+ int m_buffer_size;
+ bufferInfo m_bufferInfo;
+ eServiceMP3(eServiceReference ref);
Signal2<void,iPlayableService*,int> m_event;
enum
{
};
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 gstCBpadAdded(GstElement *decodebin, GstPad *pad, gpointer data); /* for mpegdemux */
- static void gstCBfilterPadAdded(GstElement *filter, GstPad *pad, gpointer user_data); /* for id3demux */
- static void gstCBnewPad(GstElement *decodebin, GstPad *pad, gboolean last, gpointer data); /* for decodebin */
- static void gstCBunknownType(GstElement *decodebin, GstPad *pad, GstCaps *l, gpointer data);
+ static void gstHTTPSourceSetAgent(GObject *source, GParamSpec *unused, gpointer user_data);
static void gstCBsubtitleAvail(GstElement *element, gpointer user_data);
- static void gstCBsubtitlePadEvent(GstPad *pad, GstEvent *event, 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&);
+ 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<ePangoSubtitlePage> m_subtitle_pages;
+ 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