summaryrefslogtreecommitdiffstats
path: root/src/imports
diff options
context:
space:
mode:
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;