diff options
-rw-r--r-- | src/imports/multimedia/qdeclarativevideooutput.cpp | 16 | ||||
-rw-r--r-- | src/imports/multimedia/qdeclarativevideooutput_p.h | 4 | ||||
-rw-r--r-- | src/imports/multimedia/qsgvideonode_rgb.cpp | 4 |
3 files changed, 24 insertions, 0 deletions
diff --git a/src/imports/multimedia/qdeclarativevideooutput.cpp b/src/imports/multimedia/qdeclarativevideooutput.cpp index 82c7da034..0d65becf3 100644 --- a/src/imports/multimedia/qdeclarativevideooutput.cpp +++ b/src/imports/multimedia/qdeclarativevideooutput.cpp @@ -95,6 +95,12 @@ public: return QAbstractVideoSurface::start(format); } + void stop() + { + m_item->stop(); + QAbstractVideoSurface::stop(); + } + virtual bool present(const QVideoFrame &frame) { if (!frame.isValid()) { @@ -272,10 +278,18 @@ void QDeclarativeVideoOutput::_q_updateMediaObject() void QDeclarativeVideoOutput::present(const QVideoFrame &frame) { + m_frameMutex.lock(); m_frame = frame; + m_frameMutex.unlock(); + update(); } +void QDeclarativeVideoOutput::stop() +{ + present(QVideoFrame()); +} + /*! \qmlproperty enumeration VideoOutput::fillMode @@ -353,6 +367,8 @@ QSGNode *QDeclarativeVideoOutput::updatePaintNode(QSGNode *oldNode, UpdatePaintN { QSGVideoNode *videoNode = static_cast<QSGVideoNode *>(oldNode); + QMutexLocker lock(&m_frameMutex); + if (videoNode && videoNode->pixelFormat() != m_frame.pixelFormat()) { #ifdef DEBUG_VIDEOITEM qDebug() << "updatePaintNode: deleting old video node because frame format changed..."; diff --git a/src/imports/multimedia/qdeclarativevideooutput_p.h b/src/imports/multimedia/qdeclarativevideooutput_p.h index d15c164e8..2c63fc9e4 100644 --- a/src/imports/multimedia/qdeclarativevideooutput_p.h +++ b/src/imports/multimedia/qdeclarativevideooutput_p.h @@ -48,6 +48,7 @@ #include <QtMultimedia/qmediaobject.h> #include <QtCore/qsharedpointer.h> +#include <QtCore/qmutex.h> #include "qsgvideonode_p.h" @@ -103,6 +104,7 @@ private: }; void present(const QVideoFrame &frame); + void stop(); friend class QSGVideoItemSurface; @@ -120,6 +122,8 @@ private: QSize m_nativeSize; QRectF m_boundingRect; QRectF m_sourceRect; + + QMutex m_frameMutex; }; QT_END_NAMESPACE diff --git a/src/imports/multimedia/qsgvideonode_rgb.cpp b/src/imports/multimedia/qsgvideonode_rgb.cpp index 41d778ed0..71ca71994 100644 --- a/src/imports/multimedia/qsgvideonode_rgb.cpp +++ b/src/imports/multimedia/qsgvideonode_rgb.cpp @@ -41,6 +41,7 @@ #include "qsgvideonode_rgb.h" #include <QtDeclarative/qsgtexturematerial.h> #include <QtDeclarative/qsgmaterial.h> +#include <QtCore/qmutex.h> #include <QtGui/QOpenGLContext> #include <QtGui/QOpenGLFunctions> #include <QtOpenGL/qglshaderprogram.h> @@ -187,6 +188,7 @@ public: } void setVideoFrame(const QVideoFrame &frame) { + QMutexLocker lock(&m_frameMutex); m_frame = frame; } @@ -194,6 +196,7 @@ public: { QOpenGLFunctions *functions = QOpenGLContext::currentContext()->functions(); + QMutexLocker lock(&m_frameMutex); if (m_frame.isValid() && m_frame.map(QAbstractVideoBuffer::ReadOnly)) { if (m_textureSize != m_frame.size()) { if (!m_textureSize.isEmpty()) @@ -230,6 +233,7 @@ public: } QVideoFrame m_frame; + QMutex m_frameMutex; QSize m_textureSize; QVideoSurfaceFormat m_format; GLuint m_textureId; |