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/gsttools/qgstreamervideorenderer.cpp | |
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/gsttools/qgstreamervideorenderer.cpp')
-rw-r--r-- | src/gsttools/qgstreamervideorenderer.cpp | 46 |
1 files changed, 28 insertions, 18 deletions
diff --git a/src/gsttools/qgstreamervideorenderer.cpp b/src/gsttools/qgstreamervideorenderer.cpp index 412257739..1b5cc8caf 100644 --- a/src/gsttools/qgstreamervideorenderer.cpp +++ b/src/gsttools/qgstreamervideorenderer.cpp @@ -45,25 +45,44 @@ #include <gst/gst.h> +static inline void resetSink(GstElement *&element, GstElement *v = nullptr) +{ + if (element) + gst_object_unref(GST_OBJECT(element)); + + if (v) + qt_gst_object_ref_sink(GST_OBJECT(v)); + + element = v; +} + QGstreamerVideoRenderer::QGstreamerVideoRenderer(QObject *parent) - :QVideoRendererControl(parent),m_videoSink(0), m_surface(0) + : QVideoRendererControl(parent) { } QGstreamerVideoRenderer::~QGstreamerVideoRenderer() { - if (m_videoSink) - gst_object_unref(GST_OBJECT(m_videoSink)); + resetSink(m_videoSink); +} + +void QGstreamerVideoRenderer::setVideoSink(GstElement *sink) +{ + if (!sink) + return; + + resetSink(m_videoSink, sink); + emit sinkChanged(); } GstElement *QGstreamerVideoRenderer::videoSink() { if (!m_videoSink && m_surface) { - m_videoSink = QVideoSurfaceGstSink::createSink(m_surface); - qt_gst_object_ref_sink(GST_OBJECT(m_videoSink)); //Take ownership + auto sink = reinterpret_cast<GstElement *>(QVideoSurfaceGstSink::createSink(m_surface)); + resetSink(m_videoSink, sink); } - return reinterpret_cast<GstElement*>(m_videoSink); + return m_videoSink; } void QGstreamerVideoRenderer::stopRenderer() @@ -80,11 +99,7 @@ QAbstractVideoSurface *QGstreamerVideoRenderer::surface() const void QGstreamerVideoRenderer::setSurface(QAbstractVideoSurface *surface) { if (m_surface != surface) { - //qDebug() << Q_FUNC_INFO << surface; - if (m_videoSink) - gst_object_unref(GST_OBJECT(m_videoSink)); - - m_videoSink = 0; + resetSink(m_videoSink); if (m_surface) { disconnect(m_surface.data(), SIGNAL(supportedFormatsChanged()), @@ -98,6 +113,7 @@ void QGstreamerVideoRenderer::setSurface(QAbstractVideoSurface *surface) if (m_surface) { connect(m_surface.data(), SIGNAL(supportedFormatsChanged()), this, SLOT(handleFormatChange())); + QGstVideoRendererSink::setSurface(m_surface); } if (wasReady != isReady()) @@ -109,11 +125,5 @@ void QGstreamerVideoRenderer::setSurface(QAbstractVideoSurface *surface) void QGstreamerVideoRenderer::handleFormatChange() { - //qDebug() << "Supported formats list has changed, reload video output"; - - if (m_videoSink) - gst_object_unref(GST_OBJECT(m_videoSink)); - - m_videoSink = 0; - emit sinkChanged(); + setVideoSink(nullptr); } |