aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorFelix Domke <tmbinc@elitedvb.net>2009-06-03 19:00:24 +0200
committerFelix Domke <tmbinc@elitedvb.net>2009-06-03 19:00:24 +0200
commitb23e0f70b3b0e6815b784f29cbe7d09982116c41 (patch)
tree0dcdd621c07b398b77a3075f33fb46e15e6eece9 /lib
parentecc23dd3be5128650082a594b7e2939922d7462c (diff)
parentcb7672200eece518f92ab0f0cb0afa9275065c7e (diff)
downloadenigma2-b23e0f70b3b0e6815b784f29cbe7d09982116c41.tar.gz
enigma2-b23e0f70b3b0e6815b784f29cbe7d09982116c41.zip
Merge branch 'master' of git.opendreambox.org:/git/enigma2
Diffstat (limited to 'lib')
-rw-r--r--lib/python/Plugins/Extensions/DVDPlayer/src/servicedvd.h1
-rw-r--r--lib/service/iservice.h16
-rw-r--r--lib/service/servicedvb.h4
-rw-r--r--lib/service/servicedvbrecord.h2
-rw-r--r--lib/service/servicemp3.cpp124
-rw-r--r--lib/service/servicemp3.h22
6 files changed, 118 insertions, 51 deletions
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<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 streamed(ePtr<iStreamedService> &ptr) { ptr = 0; return -1; }
RESULT cueSheet(ePtr<iCueSheet> &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<iStreamableService>, 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<iStreamedService>, 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<iAudioDelay> &SWIG_OUTPUT)=0;
virtual SWIG_VOID(RESULT) rdsDecoder(ePtr<iRdsDecoder> &SWIG_OUTPUT)=0;
virtual SWIG_VOID(RESULT) stream(ePtr<iStreamableService> &SWIG_OUTPUT)=0;
+ virtual SWIG_VOID(RESULT) streamed(ePtr<iStreamedService> &SWIG_OUTPUT)=0;
virtual SWIG_VOID(RESULT) keys(ePtr<iServiceKeys> &SWIG_OUTPUT)=0;
};
SWIG_TEMPLATE_TYPEDEF(ePtr<iPlayableService>, 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<iAudioDelay> &ptr);
RESULT rdsDecoder(ePtr<iRdsDecoder> &ptr);
RESULT keys(ePtr<iServiceKeys> &ptr) { ptr = 0; return -1; }
+ RESULT streamed(ePtr<iStreamedService> &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<iStreamableService> &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<iFrontendInformation> &ptr);
RESULT subServices(ePtr<iSubserviceList> &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<iStreamedService> &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<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();
@@ -117,6 +117,11 @@ public:
PyObject *getSubtitleList();
PyObject *getCachedSubtitle();
+ // iStreamedService
+ RESULT streamed(ePtr<iStreamedService> &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<void,iPlayableService*,int> m_event;
enum