diff options
Diffstat (limited to 'src/qtmultimediaquicktools')
3 files changed, 30 insertions, 21 deletions
diff --git a/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp b/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp index 32166502d..ca3a4b2ea 100644 --- a/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp +++ b/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp @@ -138,6 +138,7 @@ QDeclarativeVideoOutput::QDeclarativeVideoOutput(QQuickItem *parent) : { initResource(); setFlag(ItemHasContents, true); + createBackend(nullptr); } QDeclarativeVideoOutput::~QDeclarativeVideoOutput() @@ -148,6 +149,23 @@ QDeclarativeVideoOutput::~QDeclarativeVideoOutput() } /*! + \qmlproperty object QtMultimedia::VideoOutput::videoSurface + \since 5.15 + + This property holds the underlaying video surface that can be used + to render the video frames to this VideoOutput element. + It is similar to setting a QObject with \c videoSurface property as a source, + where this video surface will be set. + + \sa source +*/ + +QAbstractVideoSurface *QDeclarativeVideoOutput::videoSurface() const +{ + return m_backend ? m_backend->videoSurface() : nullptr; +} + +/*! \qmlproperty variant QtMultimedia::VideoOutput::source This property holds the source item providing the video frames like MediaPlayer or Camera. @@ -206,21 +224,10 @@ void QDeclarativeVideoOutput::setSource(QObject *source) } m_sourceType = MediaObjectSource; -#if QT_CONFIG(opengl) } else if (metaObject->indexOfProperty("videoSurface") != -1) { - // Make sure our backend is a QDeclarativeVideoRendererBackend - m_backend.reset(); - createBackend(0); - Q_ASSERT(m_backend); -#ifndef QT_NO_DYNAMIC_CAST - Q_ASSERT(dynamic_cast<QDeclarativeVideoRendererBackend *>(m_backend.data())); -#endif - QAbstractVideoSurface * const surface = m_backend->videoSurface(); - Q_ASSERT(surface); m_source.data()->setProperty("videoSurface", - QVariant::fromValue<QAbstractVideoSurface*>(surface)); + QVariant::fromValue<QAbstractVideoSurface *>(videoSurface())); m_sourceType = VideoSurfaceSource; -#endif } else { m_sourceType = NoSource; } @@ -242,7 +249,8 @@ bool QDeclarativeVideoOutput::createBackend(QMediaService *service) const auto instances = videoBackendFactoryLoader()->instances(QLatin1String("declarativevideobackend")); for (QObject *instance : instances) { if (QDeclarativeVideoBackendFactoryInterface *plugin = qobject_cast<QDeclarativeVideoBackendFactoryInterface*>(instance)) { - m_backend.reset(plugin->create(this)); + if (!m_backend) + m_backend.reset(plugin->create(this)); if (m_backend && m_backend->init(service)) { backendAvailable = true; break; @@ -251,7 +259,8 @@ bool QDeclarativeVideoOutput::createBackend(QMediaService *service) } #if QT_CONFIG(opengl) if (!backendAvailable) { - m_backend.reset(new QDeclarativeVideoRendererBackend(this)); + if (!m_backend) + m_backend.reset(new QDeclarativeVideoRendererBackend(this)); if (m_backend->init(service)) backendAvailable = true; } @@ -293,9 +302,6 @@ void QDeclarativeVideoOutput::_q_updateMediaObject() if (m_mediaObject.data() == mediaObject) return; - if (m_sourceType != VideoSurfaceSource) - m_backend.reset(); - m_mediaObject.clear(); m_service.clear(); diff --git a/src/qtmultimediaquicktools/qdeclarativevideooutput_p.h b/src/qtmultimediaquicktools/qdeclarativevideooutput_p.h index 8ea0dc338..d14731c91 100644 --- a/src/qtmultimediaquicktools/qdeclarativevideooutput_p.h +++ b/src/qtmultimediaquicktools/qdeclarativevideooutput_p.h @@ -67,6 +67,7 @@ class QMediaObject; class QMediaService; class QDeclarativeVideoBackend; class QVideoOutputOrientationHandler; +class QAbstractVideoSurface; class Q_MULTIMEDIAQUICK_EXPORT QDeclarativeVideoOutput : public QQuickItem { @@ -80,6 +81,7 @@ class Q_MULTIMEDIAQUICK_EXPORT QDeclarativeVideoOutput : public QQuickItem Q_PROPERTY(QRectF contentRect READ contentRect NOTIFY contentRectChanged) Q_PROPERTY(QQmlListProperty<QAbstractVideoFilter> filters READ filters); Q_PROPERTY(FlushMode flushMode READ flushMode WRITE setFlushMode NOTIFY flushModeChanged REVISION 13) + Q_PROPERTY(QAbstractVideoSurface* videoSurface READ videoSurface CONSTANT REVISION 15) Q_ENUMS(FlushMode) Q_ENUMS(FillMode) @@ -102,6 +104,8 @@ public: QDeclarativeVideoOutput(QQuickItem *parent = 0); ~QDeclarativeVideoOutput(); + QAbstractVideoSurface *videoSurface() const; + QObject *source() const { return m_source.data(); } void setSource(QObject *source); diff --git a/src/qtmultimediaquicktools/qdeclarativevideooutput_render.cpp b/src/qtmultimediaquicktools/qdeclarativevideooutput_render.cpp index 863cefa4e..bdfa23dfb 100644 --- a/src/qtmultimediaquicktools/qdeclarativevideooutput_render.cpp +++ b/src/qtmultimediaquicktools/qdeclarativevideooutput_render.cpp @@ -46,7 +46,6 @@ #include <QtCore/qloggingcategory.h> #include <private/qmediapluginloader_p.h> #include <private/qsgvideonode_p.h> -#include <private/qvideoframe_p.h> #include <QtGui/QOpenGLContext> #include <QtQuick/QQuickWindow> @@ -304,7 +303,7 @@ QSGNode *QDeclarativeVideoRendererBackend::updatePaintNode(QSGNode *oldNode, if (!runnable) continue; - QVideoFilterRunnable::RunFlags flags = 0; + QVideoFilterRunnable::RunFlags flags; if (i == m_filters.count() - 1) flags |= QVideoFilterRunnable::LastInChain; @@ -363,7 +362,7 @@ QSGNode *QDeclarativeVideoRendererBackend::updatePaintNode(QSGNode *oldNode, videoNode->setTexturedRectGeometry(m_renderedRect, m_sourceTextureRect, qNormalizedOrientation(q->orientation())); if (m_frameChanged) { - QSGVideoNode::FrameFlags flags = 0; + QSGVideoNode::FrameFlags flags; if (isFrameModified) flags |= QSGVideoNode::FrameFiltered; videoNode->setCurrentFrame(m_frame, flags); @@ -372,7 +371,7 @@ QSGNode *QDeclarativeVideoRendererBackend::updatePaintNode(QSGNode *oldNode, || q->flushMode() == QDeclarativeVideoOutput::LastFrame) { m_frameOnFlush = m_surfaceFormat.handleType() == QAbstractVideoBuffer::NoHandle ? m_frame - : qt_imageFromVideoFrame(m_frame); + : m_frame.image(); } //don't keep the frame for more than really necessary |