summaryrefslogtreecommitdiffstats
path: root/src/imports
diff options
context:
space:
mode:
authorDmytro Poplavskiy <dmytro.poplavskiy@nokia.com>2011-11-15 09:56:32 +1000
committerQt by Nokia <qt-info@nokia.com>2011-11-15 02:28:02 +0100
commit434075645a2c2978b26222bba385d44fb3e56c89 (patch)
treeb00e94dba2d42bc05ac345ced1ea1e3f10b43af6 /src/imports
parentd6c5d9faa6010f74bf23abbf404d395e01e077ac (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')
-rw-r--r--src/imports/multimedia/qdeclarativevideooutput.cpp34
-rw-r--r--src/imports/multimedia/qdeclarativevideooutput_p.h8
2 files changed, 34 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();
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<QObject> m_source;
QWeakPointer<QMediaObject> m_mediaObject;
QWeakPointer<QMediaService> m_service;