diff options
author | Dmytro Poplavskiy <dmytro.poplavskiy@nokia.com> | 2011-11-15 09:56:32 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-11-15 02:28:02 +0100 |
commit | 434075645a2c2978b26222bba385d44fb3e56c89 (patch) | |
tree | b00e94dba2d42bc05ac345ced1ea1e3f10b43af6 /src/imports/multimedia/qdeclarativevideooutput.cpp | |
parent | d6c5d9faa6010f74bf23abbf404d395e01e077ac (diff) |
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 <jonas.rabbe@nokia.com>
Diffstat (limited to 'src/imports/multimedia/qdeclarativevideooutput.cpp')
-rw-r--r-- | src/imports/multimedia/qdeclarativevideooutput.cpp | 34 |
1 files changed, 26 insertions, 8 deletions
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 <QtCore/qmetaobject.h> //#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<QAbstractVideoSurface*>(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<QAbstractVideoSurface*>(m_surface)); + m_sourceType = VideoSurfaceSource; + } else { + m_sourceType = NoSource; } + } else { + m_sourceType = NoSource; } _q_updateMediaObject(); |