SVN commit 771266 by thiago: Update changes by Jens. Matches Perforce revision 295237. M +3 -1 CMakeLists.txt M +45 -3 mediaobject.cpp M +1 -0 mediaobject.h --- trunk/kdereview/phonon/gstreamer/CMakeLists.txt #771265:771266 @@ -32,6 +32,8 @@ abstractvideowidget.cpp videowidget.cpp qwidgetvideosink.cpp + streamreader.cpp + phononsrc.cpp message.cpp audioeffect.cpp xvideowidget.cpp @@ -42,7 +44,7 @@ target_link_libraries(phonon_gstreamer ${QT_QTGUI_LIBRARY} ${QT_QTOPENGL_LIBRARY} ${KDE4_PHONON_LIBS} ${OPENGL_gl_LIBRARY} - ${GSTREAMER_LIBRARIES} ${GSTREAMER_INTERFACE_LIBRARY} + ${GSTREAMER_LIBRARIES} ${GSTREAMER_BASE_LIBRARY} ${GSTREAMER_INTERFACE_LIBRARY} ${GSTREAMER_PLUGIN_VIDEO_LIBRARIES} ${GLIB2_LIBRARIES} ${GOBJECT_LIBRARIES}) install(TARGETS phonon_gstreamer DESTINATION ${PLUGIN_INSTALL_DIR}/plugins/phonon_backend) --- trunk/kdereview/phonon/gstreamer/mediaobject.cpp #771265:771266 @@ -22,6 +22,8 @@ #include "videowidget.h" #include "message.h" #include "backend.h" +#include "streamreader.h" +#include "phononsrc.h" #include #include @@ -281,6 +283,36 @@ return true; } +/** + * Create a media source from a media stream + * + * returns true if successful + */ +bool MediaObject::createPipefromStream(const MediaSource &source) +{ + // Remove any existing data source + if (m_datasource) { + gst_bin_remove(GST_BIN(m_pipeline), m_datasource); + // m_pipeline has the only ref to datasource + m_datasource = 0; + } + + m_datasource = GST_ELEMENT(g_object_new(phonon_src_get_type(), NULL)); + if (!m_datasource) + return false; + + StreamReader *streamReader = new StreamReader(source); + g_object_set (G_OBJECT (m_datasource), "iodevice", streamReader, NULL); + + // Link data source into pipeline + gst_bin_add(GST_BIN(m_pipeline), m_datasource); + if (!gst_element_link(m_datasource, m_decodebin)) { + gst_bin_remove(GST_BIN(m_pipeline), m_datasource); + return false; + } + return true; +} + void MediaObject::createPipeline() { m_pipeline = gst_pipeline_new (NULL); @@ -661,8 +693,12 @@ // We have to reset the state completely here, otherwise // remnants of the old pipeline can result in strangenes // such as failing duration queries etc - if (gst_element_set_state(m_pipeline, GST_STATE_NULL) != GST_STATE_CHANGE_SUCCESS) { - setError(tr("Unable to flush pipeline")); + GstState state; + gst_element_set_state(m_pipeline, GST_STATE_NULL); + gst_element_get_state (m_pipeline, &state, NULL, 2000); + if (state != GST_STATE_NULL) { + setError(tr("Unable to flush media pipeline")); + return; } m_source = source; emit currentSourceChanged(m_source); @@ -719,8 +755,14 @@ setError(tr("Source type invalid"), Phonon::NormalError); break; + case MediaSource::Stream: + if (!createPipefromStream(source)) { + setError(tr("Could not open stream.")); + return; + } + break; + case MediaSource::Disc: // CD tracks can be specified by setting the url in the following way uri=cdda:4 - case MediaSource::Stream: default: m_backend->logMessage("Source type not currently supported", Backend::Warning, this); setError(tr("Source type not supported"), Phonon::NormalError); --- trunk/kdereview/phonon/gstreamer/mediaobject.h #771265:771266 @@ -169,6 +169,7 @@ void changeState(State); void setError(const QString &errorString, Phonon::ErrorType error = NormalError); bool createPipefromURL(const QString &url); + bool createPipefromStream(const MediaSource &); private Q_SLOTS: void getStreamInfo();