From: Felix Domke Date: Wed, 3 Jun 2009 17:00:24 +0000 (+0200) Subject: Merge branch 'master' of git.opendreambox.org:/git/enigma2 X-Git-Tag: 2.6.0~266 X-Git-Url: https://git.cweiske.de/enigma2.git/commitdiff_plain/b23e0f70b3b0e6815b784f29cbe7d09982116c41?hp=ecc23dd3be5128650082a594b7e2939922d7462c Merge branch 'master' of git.opendreambox.org:/git/enigma2 --- diff --git a/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.h b/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.h index 12e21d2f..94843a4e 100644 --- a/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.h +++ b/lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.h @@ -42,6 +42,7 @@ public: RESULT audioDelay(ePtr &ptr) { ptr = 0; return -1; } RESULT rdsDecoder(ePtr &ptr) { ptr = 0; return -1; } RESULT stream(ePtr &ptr) { ptr = 0; return -1; } + RESULT streamed(ePtr &ptr) { ptr = 0; return -1; } RESULT cueSheet(ePtr &ptr); // iPlayableService diff --git a/lib/service/iservice.h b/lib/service/iservice.h index 22ffde6f..373f24ca 100644 --- a/lib/service/iservice.h +++ b/lib/service/iservice.h @@ -742,6 +742,19 @@ public: }; SWIG_TEMPLATE_TYPEDEF(ePtr, iStreamableServicePtr); +SWIG_IGNORE(iStreamedService); +class iStreamedService: public iObject +{ +#ifdef SWIG + iStreamedService(); + ~iStreamedService(); +#endif +public: + virtual PyObject *getBufferCharge()=0; + virtual int setBufferSize(int size)=0; +}; +SWIG_TEMPLATE_TYPEDEF(ePtr, iStreamedServicePtr); + class iServiceKeys_ENUMS { #ifdef SWIG @@ -812,6 +825,8 @@ public: evVideoFramerateChanged, evVideoProgressiveChanged, + evBuffering, + evStopped, evUser = 0x100 @@ -847,6 +862,7 @@ public: virtual SWIG_VOID(RESULT) audioDelay(ePtr &SWIG_OUTPUT)=0; virtual SWIG_VOID(RESULT) rdsDecoder(ePtr &SWIG_OUTPUT)=0; virtual SWIG_VOID(RESULT) stream(ePtr &SWIG_OUTPUT)=0; + virtual SWIG_VOID(RESULT) streamed(ePtr &SWIG_OUTPUT)=0; virtual SWIG_VOID(RESULT) keys(ePtr &SWIG_OUTPUT)=0; }; SWIG_TEMPLATE_TYPEDEF(ePtr, iPlayableServicePtr); diff --git a/lib/service/servicedvb.h b/lib/service/servicedvb.h index 43e4690f..6eba5064 100644 --- a/lib/service/servicedvb.h +++ b/lib/service/servicedvb.h @@ -114,13 +114,14 @@ public: RESULT audioDelay(ePtr &ptr); RESULT rdsDecoder(ePtr &ptr); RESULT keys(ePtr &ptr) { ptr = 0; return -1; } + RESULT streamed(ePtr &ptr) { ptr = 0; return -1; } // iPauseableService RESULT pause(); RESULT unpause(); RESULT setSlowMotion(int ratio); RESULT setFastForward(int ratio); - + // iSeekableService RESULT getLength(pts_t &len); RESULT seekTo(pts_t to); @@ -182,6 +183,7 @@ public: // iStreamableService RESULT stream(ePtr &ptr); PyObject *getStreamingData(); + private: friend class eServiceFactoryDVB; eServiceReference m_reference; diff --git a/lib/service/servicedvbrecord.h b/lib/service/servicedvbrecord.h index 319fbb70..0535f029 100644 --- a/lib/service/servicedvbrecord.h +++ b/lib/service/servicedvbrecord.h @@ -28,7 +28,7 @@ public: RESULT frontendInfo(ePtr &ptr); RESULT subServices(ePtr &ptr); - /* streamable service */ + // iStreamableService PyObject *getStreamingData(); // iSubserviceList diff --git a/lib/service/servicemp3.cpp b/lib/service/servicemp3.cpp index b3f99744..2ddfe925 100644 --- a/lib/service/servicemp3.cpp +++ b/lib/service/servicemp3.cpp @@ -196,6 +196,7 @@ eServiceMP3::eServiceMP3(const char *filename, const char *title): m_filename(fi m_currentSubtitleStream = 0; m_subtitle_widget = 0; m_currentTrickRatio = 0; + m_buffer_size = 1*1024*1024; CONNECT(m_seekTimeout->timeout, eServiceMP3::seekTimeoutCB); CONNECT(m_subtitle_sync_timer->timeout, eServiceMP3::pushSubtitles); CONNECT(m_pump.recv_msg, eServiceMP3::gstPoll); @@ -332,6 +333,7 @@ eServiceMP3::eServiceMP3(const char *filename, const char *title): m_filename(fi } gst_element_set_state (m_gst_playbin, GST_STATE_PLAYING); + setBufferSize(m_buffer_size); } eServiceMP3::~eServiceMP3() @@ -996,56 +998,49 @@ void eServiceMP3::gstBusCall(GstBus *bus, GstMessage *msg) else eDebug("eServiceMP3::gst_message from %s: %s (without structure)", sourceName, GST_MESSAGE_TYPE_NAME(msg)); #endif - if ( GST_MESSAGE_TYPE (msg) == GST_MESSAGE_STATE_CHANGED ) + switch (GST_MESSAGE_TYPE (msg)) { - // only the pipeline message - if(GST_MESSAGE_SRC(msg) != GST_OBJECT(m_gst_playbin)) + case GST_MESSAGE_EOS: + m_event((iPlayableService*)this, evEOF); + break; + case GST_MESSAGE_STATE_CHANGED: + { + if(GST_MESSAGE_SRC(msg) != GST_OBJECT(m_gst_playbin)) return; - GstState old_state, new_state; - gst_message_parse_state_changed(msg, &old_state, &new_state, NULL); + GstState old_state, new_state; + gst_message_parse_state_changed(msg, &old_state, &new_state, NULL); + + if(old_state == new_state) + return; - if(old_state == new_state) - return; - - eDebug("eServiceMP3::state transition %s -> %s", gst_element_state_get_name(old_state), gst_element_state_get_name(new_state)); - - GstStateChange transition = (GstStateChange)GST_STATE_TRANSITION(old_state, new_state); - - switch(transition) - { - case GST_STATE_CHANGE_NULL_TO_READY: - { - } - break; - case GST_STATE_CHANGE_READY_TO_PAUSED: - { - - } break; - case GST_STATE_CHANGE_PAUSED_TO_PLAYING: - { - - } break; - case GST_STATE_CHANGE_PLAYING_TO_PAUSED: - { + eDebug("eServiceMP3::state transition %s -> %s", gst_element_state_get_name(old_state), gst_element_state_get_name(new_state)); - } break; - case GST_STATE_CHANGE_PAUSED_TO_READY: - { - - } break; - case GST_STATE_CHANGE_READY_TO_NULL: + GstStateChange transition = (GstStateChange)GST_STATE_TRANSITION(old_state, new_state); + + switch(transition) { - - } break; - } - } - - switch (GST_MESSAGE_TYPE (msg)) - { - case GST_MESSAGE_EOS: - m_event((iPlayableService*)this, evEOF); + case GST_STATE_CHANGE_NULL_TO_READY: + { + } break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + { + } break; + case GST_STATE_CHANGE_PAUSED_TO_PLAYING: + { + } break; + case GST_STATE_CHANGE_PLAYING_TO_PAUSED: + { + } break; + case GST_STATE_CHANGE_PAUSED_TO_READY: + { + } break; + case GST_STATE_CHANGE_READY_TO_NULL: + { + } break; + } break; + } case GST_MESSAGE_ERROR: { gchar *debug; @@ -1106,7 +1101,6 @@ void eServiceMP3::gstBusCall(GstBus *bus, GstMessage *msg) eDebug("eServiceMP3::/tmp/.id3coverart %d bytes written ", ret); m_event((iPlayableService*)this, evUser+13); } - gst_tag_list_free(tags); m_event((iPlayableService*)this, evUpdatedInfo); break; @@ -1148,6 +1142,7 @@ eDebug("AUDIO STRUCT=%s", g_type); { gst_tag_list_get_string(tags, GST_TAG_AUDIO_CODEC, &g_codec); gst_tag_list_get_string(tags, GST_TAG_LANGUAGE_CODE, &g_lang); + gst_tag_list_free(tags); } audio.language_code = std::string(g_lang); audio.codec = std::string(g_codec); @@ -1155,6 +1150,7 @@ eDebug("AUDIO STRUCT=%s", g_type); m_audioStreams.push_back(audio); g_free (g_lang); g_free (g_codec); + gst_caps_unref(caps); } for (i = 0; i < n_text; i++) @@ -1217,8 +1213,17 @@ eDebug("AUDIO STRUCT=%s", g_type); if (strstr(eventname, "Changed")) m_event((iPlayableService*)this, evVideoProgressiveChanged); } + g_free(eventname); } } + break; + } + case GST_MESSAGE_BUFFERING: + { + GstBufferingMode mode; + gst_message_parse_buffering(msg, &(m_bufferInfo.bufferPercent)); + gst_message_parse_buffering_stats(msg, &mode, &(m_bufferInfo.avgInRate), &(m_bufferInfo.avgOutRate), &(m_bufferInfo.bufferingLeft)); + m_event((iPlayableService*)this, evBuffering); } default: break; @@ -1351,9 +1356,9 @@ void eServiceMP3::pushSubtitles() m_subtitle_widget->setPage(page); m_subtitle_pages.pop_front(); } - } ; - + } gst_object_unref (clock); + gst_object_unref (syncsink); } RESULT eServiceMP3::enableSubtitles(eWidget *parent, ePyObject tuple) @@ -1406,7 +1411,7 @@ RESULT eServiceMP3::disableSubtitles(eWidget *parent) PyObject *eServiceMP3::getCachedSubtitle() { - eDebug("eServiceMP3::getCachedSubtitle"); +// eDebug("eServiceMP3::getCachedSubtitle"); Py_RETURN_NONE; } @@ -1435,6 +1440,31 @@ PyObject *eServiceMP3::getSubtitleList() return l; } +RESULT eServiceMP3::streamed(ePtr &ptr) +{ + ptr = this; + return 0; +} + +PyObject *eServiceMP3::getBufferCharge() +{ + ePyObject tuple = PyTuple_New(5); + PyTuple_SET_ITEM(tuple, 0, PyInt_FromLong(m_bufferInfo.bufferPercent)); + PyTuple_SET_ITEM(tuple, 1, PyInt_FromLong(m_bufferInfo.avgInRate)); + PyTuple_SET_ITEM(tuple, 2, PyInt_FromLong(m_bufferInfo.avgOutRate)); + PyTuple_SET_ITEM(tuple, 3, PyInt_FromLong(m_bufferInfo.bufferingLeft)); + PyTuple_SET_ITEM(tuple, 4, PyInt_FromLong(m_buffer_size)); + return tuple; +} + +int eServiceMP3::setBufferSize(int size) +{ + m_buffer_size = size; + g_object_set (G_OBJECT (m_gst_playbin), "buffer-size", m_buffer_size, NULL); + return 0; +} + + #else #warning gstreamer not available, not building media player #endif diff --git a/lib/service/servicemp3.h b/lib/service/servicemp3.h index f4d657ca..1d77483f 100644 --- a/lib/service/servicemp3.h +++ b/lib/service/servicemp3.h @@ -50,7 +50,7 @@ typedef enum { stPlainText, stSSA, stSRT } 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 + public iServiceInformation, public iSeekableService, public iAudioTrackSelection, public iAudioChannelSelection, public iSubtitleOutput, public iStreamedService, public Object { DECLARE_REF(eServiceMP3); public: @@ -78,8 +78,8 @@ public: RESULT cueSheet(ePtr &ptr) { ptr = 0; return -1; } RESULT audioDelay(ePtr &ptr) { ptr = 0; return -1; } RESULT rdsDecoder(ePtr &ptr) { ptr = 0; return -1; } - RESULT stream(ePtr &ptr) { ptr = 0; return -1; } RESULT keys(ePtr &ptr) { ptr = 0; return -1; } + RESULT stream(ePtr &ptr) { ptr = 0; return -1; } // iPausableService RESULT pause(); @@ -117,6 +117,11 @@ public: PyObject *getSubtitleList(); PyObject *getCachedSubtitle(); + // iStreamedService + RESULT streamed(ePtr &ptr); + PyObject *getBufferCharge(); + int setBufferSize(int size); + struct audioStream { GstPad* pad; @@ -149,6 +154,17 @@ public: { } }; + struct bufferInfo + { + int bufferPercent; + int avgInRate; + int avgOutRate; + long long bufferingLeft; + bufferInfo() + :bufferPercent(0), avgInRate(0), avgOutRate(0), bufferingLeft(-1) + { + } + }; private: int m_currentAudioStream; int m_currentSubtitleStream; @@ -162,6 +178,8 @@ private: friend class eServiceFactoryMP3; std::string m_filename; std::string m_title; + int m_buffer_size; + bufferInfo m_bufferInfo; eServiceMP3(const char *filename, const char *title); Signal2 m_event; enum