From 434075645a2c2978b26222bba385d44fb3e56c89 Mon Sep 17 00:00:00 2001 From: Dmytro Poplavskiy Date: Tue, 15 Nov 2011 09:56:32 +1000 Subject: Added support for non QMediaObject based VideoOutput sources. VideoOutput element checks first for mediaObject property of source object and if it's not available it checks for videoSurface property. It allows to implement video frames generator and connect it to optimized VideoOutput QML element. Change-Id: I8ee618cf61b9d9100f25e742c631ea8724c188dc Reviewed-by: Jonas Rabbe --- src/imports/multimedia/qdeclarativevideooutput.cpp | 34 +++++++++++++++++----- src/imports/multimedia/qdeclarativevideooutput_p.h | 8 +++++ 2 files changed, 34 insertions(+), 8 deletions(-) (limited to 'src/imports') diff --git a/src/imports/multimedia/qdeclarativevideooutput.cpp b/src/imports/multimedia/qdeclarativevideooutput.cpp index 2371fdb9e..e161d9d5d 100644 --- a/src/imports/multimedia/qdeclarativevideooutput.cpp +++ b/src/imports/multimedia/qdeclarativevideooutput.cpp @@ -55,6 +55,7 @@ #include //#define DEBUG_VIDEOITEM +Q_DECLARE_METATYPE(QAbstractVideoSurface*) class QSGVideoItemSurface : public QAbstractVideoSurface { @@ -153,6 +154,7 @@ private: QDeclarativeVideoOutput::QDeclarativeVideoOutput(QQuickItem *parent) : QQuickItem(parent), + m_sourceType(NoSource), m_fillMode(PreserveAspectFit) { setFlag(ItemHasContents, true); @@ -187,23 +189,39 @@ void QDeclarativeVideoOutput::setSource(QObject *source) if (source == m_source.data()) return; - if (m_source) + if (m_source && m_sourceType == MediaObjectSource) disconnect(0, m_source.data(), SLOT(_q_updateMediaObject())); + if (m_source && m_sourceType == VideoSurfaceSource) + m_source.data()->setProperty("videoSurface", QVariant::fromValue(0)); + + m_surface->stop(); + m_source = source; if (m_source) { const QMetaObject *metaObject = m_source.data()->metaObject(); - const QMetaProperty mediaObjectProperty = metaObject->property( - metaObject->indexOfProperty("mediaObject")); - if (mediaObjectProperty.hasNotifySignal()) { - QMetaMethod method = mediaObjectProperty.notifySignal(); - QMetaObject::connect(m_source.data(), method.methodIndex(), - this, this->metaObject()->indexOfSlot("updateMediaObject()"), - Qt::DirectConnection, 0); + int mediaObjectPropertyIndex = metaObject->indexOfProperty("mediaObject"); + if (mediaObjectPropertyIndex != -1) { + const QMetaProperty mediaObjectProperty = metaObject->property(mediaObjectPropertyIndex); + if (mediaObjectProperty.hasNotifySignal()) { + QMetaMethod method = mediaObjectProperty.notifySignal(); + QMetaObject::connect(m_source.data(), method.methodIndex(), + this, this->metaObject()->indexOfSlot("updateMediaObject()"), + Qt::DirectConnection, 0); + + } + m_sourceType = MediaObjectSource; + } else if (metaObject->indexOfProperty("videoSurface") != -1) { + m_source.data()->setProperty("videoSurface", QVariant::fromValue(m_surface)); + m_sourceType = VideoSurfaceSource; + } else { + m_sourceType = NoSource; } + } else { + m_sourceType = NoSource; } _q_updateMediaObject(); diff --git a/src/imports/multimedia/qdeclarativevideooutput_p.h b/src/imports/multimedia/qdeclarativevideooutput_p.h index 80170f173..c33110c4b 100644 --- a/src/imports/multimedia/qdeclarativevideooutput_p.h +++ b/src/imports/multimedia/qdeclarativevideooutput_p.h @@ -94,10 +94,18 @@ private Q_SLOTS: void _q_updateGeometry(); private: + enum SourceType { + NoSource, + MediaObjectSource, + VideoSurfaceSource + }; + void present(const QVideoFrame &frame); friend class QSGVideoItemSurface; + SourceType m_sourceType; + QWeakPointer m_source; QWeakPointer m_mediaObject; QWeakPointer m_service; -- cgit v1.2.3