diff options
author | Lars Knoll <lars.knoll@qt.io> | 2021-02-11 09:20:08 +0100 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2021-02-17 08:26:34 +0000 |
commit | a8eb585f239c2e5c0a5fed8a1a279fbd076c8446 (patch) | |
tree | 8edab7e7e297bc42e3ee214bf803e03a393e8ad8 /src/multimedia/platform/gstreamer/common | |
parent | 5b08bbc4a244416ee961e9793cc12a652994573b (diff) |
Rework how to set a video output surface
Setting a video output should not require QMediaService
anymore.
Reverse the logic, by making QAbstractVideoSurface the primary
interface. Use runtime method lookup to get a pointer to the
video surface from QVideoWidget/QGraphicsVideoItem.
QAbstractVideoSurface is now the primary interface for setting
up a video output. We will need to add some API there to allow for
windows/fullscreen rendering.
With this change, QVideoRendererControl/QVideoWindowControl can
also be retired as an abstraction layer in the longer term.
Change-Id: Iedff18c6b95fedc7cb914075a8c84081080deab1
Reviewed-by: Doris Verria <doris.verria@qt.io>
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/multimedia/platform/gstreamer/common')
4 files changed, 30 insertions, 41 deletions
diff --git a/src/multimedia/platform/gstreamer/common/qgstreamerplayercontrol.cpp b/src/multimedia/platform/gstreamer/common/qgstreamerplayercontrol.cpp index c8fdd00a3..f856bc3d8 100644 --- a/src/multimedia/platform/gstreamer/common/qgstreamerplayercontrol.cpp +++ b/src/multimedia/platform/gstreamer/common/qgstreamerplayercontrol.cpp @@ -385,9 +385,9 @@ QMediaMetaData QGstreamerPlayerControl::metaData() const return m_session->metaData(); } -void QGstreamerPlayerControl::setVideoOutput(QObject *output) +void QGstreamerPlayerControl::setVideoSurface(QAbstractVideoSurface *surface) { - m_session->setVideoRenderer(output); + m_session->setVideoRenderer(surface); } bool QGstreamerPlayerControl::isAudioAvailable() const diff --git a/src/multimedia/platform/gstreamer/common/qgstreamerplayercontrol_p.h b/src/multimedia/platform/gstreamer/common/qgstreamerplayercontrol_p.h index 1c4321663..a73ea1b94 100644 --- a/src/multimedia/platform/gstreamer/common/qgstreamerplayercontrol_p.h +++ b/src/multimedia/platform/gstreamer/common/qgstreamerplayercontrol_p.h @@ -82,7 +82,6 @@ public: bool isAudioAvailable() const override; bool isVideoAvailable() const override; - void setVideoOutput(QObject *output); bool isSeekable() const override; QMediaTimeRange availablePlaybackRanges() const override; @@ -101,6 +100,8 @@ public: QMediaMetaData metaData() const override; + void setVideoSurface(QAbstractVideoSurface *surface) override; + public Q_SLOTS: void setPosition(qint64 pos) override; diff --git a/src/multimedia/platform/gstreamer/common/qgstreamerplayersession.cpp b/src/multimedia/platform/gstreamer/common/qgstreamerplayersession.cpp index 6f4bb61d5..d63d7be89 100644 --- a/src/multimedia/platform/gstreamer/common/qgstreamerplayersession.cpp +++ b/src/multimedia/platform/gstreamer/common/qgstreamerplayersession.cpp @@ -40,7 +40,7 @@ #include <private/qgstreamerplayersession_p.h> #include <private/qgstreamerbushelper_p.h> -#include <private/qgstreamervideorendererinterface_p.h> +#include <private/qgstreamervideorenderer_p.h> #include <private/qgstutils_p.h> #include <private/qgstvideorenderersink_p.h> #include <private/qgstreamermetadata_p.h> @@ -552,42 +552,8 @@ void QGstreamerPlayerSession::updateVideoRenderer() qDebug() << "Video sink has chaged, reload video output"; #endif - if (m_videoOutput) - setVideoRenderer(m_videoOutput); -} - -void QGstreamerPlayerSession::setVideoRenderer(QObject *videoOutput) -{ -#ifdef DEBUG_PLAYBIN - qDebug() << Q_FUNC_INFO; -#endif - if (m_videoOutput != videoOutput) { - if (m_videoOutput) { - disconnect(m_videoOutput, SIGNAL(sinkChanged()), - this, SLOT(updateVideoRenderer())); - disconnect(m_videoOutput, SIGNAL(readyChanged(bool)), - this, SLOT(updateVideoRenderer())); - - m_busHelper->removeMessageFilter(m_videoOutput); - } - - m_videoOutput = videoOutput; - - if (m_videoOutput) { - connect(m_videoOutput, SIGNAL(sinkChanged()), - this, SLOT(updateVideoRenderer())); - connect(m_videoOutput, SIGNAL(readyChanged(bool)), - this, SLOT(updateVideoRenderer())); - - m_busHelper->installMessageFilter(m_videoOutput); - } - } - - m_renderer = qobject_cast<QGstreamerVideoRendererInterface*>(videoOutput); - emit rendererChanged(); - // No sense to continue if custom pipeline requested. - if (!m_playbin) + if (!m_playbin || !m_videoOutput) return; GstElement *videoSink = 0; @@ -683,6 +649,27 @@ void QGstreamerPlayerSession::setVideoRenderer(QObject *videoOutput) } } +void QGstreamerPlayerSession::setVideoRenderer(QAbstractVideoSurface *videoOutput) +{ + if (!m_videoOutput) { + m_videoOutput = new QGstreamerVideoRenderer; +#ifdef DEBUG_PLAYBIN + qDebug() << Q_FUNC_INFO; +#endif + connect(m_videoOutput, SIGNAL(sinkChanged()), + this, SLOT(updateVideoRenderer())); + connect(m_videoOutput, SIGNAL(readyChanged(bool)), + this, SLOT(updateVideoRenderer())); + + m_busHelper->installMessageFilter(m_videoOutput); + m_renderer = qobject_cast<QGstreamerVideoRendererInterface*>(m_videoOutput); + emit rendererChanged(); + } + + m_videoOutput->setSurface(videoOutput); + updateVideoRenderer(); +} + void QGstreamerPlayerSession::finishVideoOutputChange() { if (!m_playbin || !m_pendingVideoSink) diff --git a/src/multimedia/platform/gstreamer/common/qgstreamerplayersession_p.h b/src/multimedia/platform/gstreamer/common/qgstreamerplayersession_p.h index 1a3b329a7..80594e36a 100644 --- a/src/multimedia/platform/gstreamer/common/qgstreamerplayersession_p.h +++ b/src/multimedia/platform/gstreamer/common/qgstreamerplayersession_p.h @@ -73,6 +73,7 @@ class QGstreamerBusHelper; class QGstreamerMessage; class QGstreamerVideoRendererInterface; +class QGstreamerVideoRenderer; typedef enum { GST_AUTOPLUG_SELECT_TRY, @@ -108,7 +109,7 @@ public: bool isAudioAvailable() const; - void setVideoRenderer(QObject *renderer); + void setVideoRenderer(QAbstractVideoSurface *renderer); QGstreamerVideoRendererInterface *renderer() const { return m_renderer; } bool isVideoAvailable() const; @@ -223,7 +224,7 @@ private: GstElement *m_volumeElement = nullptr; GstBus *m_bus = nullptr; - QObject *m_videoOutput = nullptr; + QGstreamerVideoRenderer *m_videoOutput = nullptr; QGstreamerVideoRendererInterface *m_renderer = nullptr; #if QT_CONFIG(gstreamer_app) |