summaryrefslogtreecommitdiffstats
path: root/src/multimedia/platform/gstreamer/common
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2021-02-11 09:20:08 +0100
committerLars Knoll <lars.knoll@qt.io>2021-02-17 08:26:34 +0000
commita8eb585f239c2e5c0a5fed8a1a279fbd076c8446 (patch)
tree8edab7e7e297bc42e3ee214bf803e03a393e8ad8 /src/multimedia/platform/gstreamer/common
parent5b08bbc4a244416ee961e9793cc12a652994573b (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')
-rw-r--r--src/multimedia/platform/gstreamer/common/qgstreamerplayercontrol.cpp4
-rw-r--r--src/multimedia/platform/gstreamer/common/qgstreamerplayercontrol_p.h3
-rw-r--r--src/multimedia/platform/gstreamer/common/qgstreamerplayersession.cpp59
-rw-r--r--src/multimedia/platform/gstreamer/common/qgstreamerplayersession_p.h5
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)