diff options
author | VaL Doroshchuk <valentyn.doroshchuk@qt.io> | 2018-06-26 16:18:35 +0200 |
---|---|---|
committer | VaL Doroshchuk <valentyn.doroshchuk@qt.io> | 2018-08-30 10:13:35 +0000 |
commit | 35ace9e289dcaada5e0828a59ca7dfee78a6342c (patch) | |
tree | 3132cb84abb0df2f347e47edb2b196ec0727d218 /src/multimedia | |
parent | 11b90699d2f355f6223a21a9e8491963903cb635 (diff) |
Gstreamer: Introduce custom pipeline
Added an ability to define custom pipeline.
Since new pipeline is used, playbin features will not work.
Registered "qtvideosink" gstreamer element to be used in pipelines.
In case if there is a need to render to QML VideoOutput element.
I.e. if a pipeline is "videotestsrc ! qtvideosink" then QGstVideoRendererSink
will be used as a sink and rendering will be done by one of QSGVideoNode's.
In this case there is a need to create a pipeline after video surface is ready.
Also added an ability to override default video sink and define custom one instead.
QGstreamerVideoRendererInterface::setVideoSink() provides functionality to override default one.
QGstreamerPlayerSession::rendererChanged() can be used to check if the renderer is ready
to create a pipeline or set custom video sink.
Task-number: QTBUG-39327
Change-Id: I635d3a07fb9a5dcf30ee63284a849b0ad3438536
Reviewed-by: VaL Doroshchuk <valentyn.doroshchuk@qt.io>
Diffstat (limited to 'src/multimedia')
6 files changed, 13 insertions, 3 deletions
diff --git a/src/multimedia/gsttools_headers/qgstreamerplayersession_p.h b/src/multimedia/gsttools_headers/qgstreamerplayersession_p.h index 81c385600..447b9816a 100644 --- a/src/multimedia/gsttools_headers/qgstreamerplayersession_p.h +++ b/src/multimedia/gsttools_headers/qgstreamerplayersession_p.h @@ -94,6 +94,8 @@ public: virtual ~QGstreamerPlayerSession(); GstElement *playbin() const; + void setPipeline(GstElement *pipeline); + GstElement *pipeline() const { return m_pipeline; } QGstreamerBusHelper *bus() const { return m_busHelper; } QNetworkRequest request() const; @@ -110,6 +112,7 @@ public: bool isAudioAvailable() const; void setVideoRenderer(QObject *renderer); + QGstreamerVideoRendererInterface *renderer() const { return m_renderer; } bool isVideoAvailable() const; bool isSeekable() const; @@ -174,6 +177,7 @@ signals: void error(int error, const QString &errorString); void invalidMedia(); void playbackRateChanged(qreal); + void rendererChanged(); private slots: void getStreamsInfo(); @@ -209,7 +213,8 @@ private: QMediaPlayer::State m_state; QMediaPlayer::State m_pendingState; QGstreamerBusHelper* m_busHelper; - GstElement* m_playbin; + GstElement *m_playbin = nullptr; // Can be null + GstElement *m_pipeline = nullptr; // Never null GstElement* m_videoSink; diff --git a/src/multimedia/gsttools_headers/qgstreamervideooverlay_p.h b/src/multimedia/gsttools_headers/qgstreamervideooverlay_p.h index 4228f0fd0..f2ca8a23b 100644 --- a/src/multimedia/gsttools_headers/qgstreamervideooverlay_p.h +++ b/src/multimedia/gsttools_headers/qgstreamervideooverlay_p.h @@ -72,6 +72,7 @@ public: virtual ~QGstreamerVideoOverlay(); GstElement *videoSink() const; + void setVideoSink(GstElement *); QSize nativeVideoSize() const; void setWindowHandle(WId id); diff --git a/src/multimedia/gsttools_headers/qgstreamervideorenderer_p.h b/src/multimedia/gsttools_headers/qgstreamervideorenderer_p.h index 2f0b80d45..d87bfcb8f 100644 --- a/src/multimedia/gsttools_headers/qgstreamervideorenderer_p.h +++ b/src/multimedia/gsttools_headers/qgstreamervideorenderer_p.h @@ -72,6 +72,7 @@ public: void setSurface(QAbstractVideoSurface *surface) override; GstElement *videoSink() override; + void setVideoSink(GstElement *) override; void stopRenderer() override; bool isReady() const override { return m_surface != 0; } @@ -84,7 +85,7 @@ private slots: void handleFormatChange(); private: - QVideoSurfaceGstSink *m_videoSink; + GstElement *m_videoSink = nullptr; QPointer<QAbstractVideoSurface> m_surface; }; diff --git a/src/multimedia/gsttools_headers/qgstreamervideorendererinterface_p.h b/src/multimedia/gsttools_headers/qgstreamervideorendererinterface_p.h index 0d172167b..231c843db 100644 --- a/src/multimedia/gsttools_headers/qgstreamervideorendererinterface_p.h +++ b/src/multimedia/gsttools_headers/qgstreamervideorendererinterface_p.h @@ -62,6 +62,7 @@ class QGstreamerVideoRendererInterface public: virtual ~QGstreamerVideoRendererInterface(); virtual GstElement *videoSink() = 0; + virtual void setVideoSink(GstElement *) {}; //stopRenderer() is called when the renderer element is stopped. //it can be reimplemented when video renderer can't detect diff --git a/src/multimedia/gsttools_headers/qgstreamervideowidget_p.h b/src/multimedia/gsttools_headers/qgstreamervideowidget_p.h index 3e3240725..1ddb738df 100644 --- a/src/multimedia/gsttools_headers/qgstreamervideowidget_p.h +++ b/src/multimedia/gsttools_headers/qgstreamervideowidget_p.h @@ -75,6 +75,7 @@ public: virtual ~QGstreamerVideoWidgetControl(); GstElement *videoSink() override; + void setVideoSink(GstElement *) override; QWidget *videoWidget() override; diff --git a/src/multimedia/gsttools_headers/qgstvideorenderersink_p.h b/src/multimedia/gsttools_headers/qgstvideorenderersink_p.h index 3971c959d..d2417a7c9 100644 --- a/src/multimedia/gsttools_headers/qgstvideorenderersink_p.h +++ b/src/multimedia/gsttools_headers/qgstvideorenderersink_p.h @@ -138,12 +138,13 @@ private: bool m_flush; }; -class QGstVideoRendererSink +class Q_GSTTOOLS_EXPORT QGstVideoRendererSink { public: GstVideoSink parent; static QGstVideoRendererSink *createSink(QAbstractVideoSurface *surface); + static void setSurface(QAbstractVideoSurface *surface); private: static GType get_type(); |