summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew den Exter <andrew.den.exter@jollamobile.com>2013-12-05 15:38:14 +1000
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-01-20 14:26:03 +0100
commit60fb11d9a2f5ff659a6ccffe01b4de16c1fb5929 (patch)
tree9b715c70d25f1b46b3a4caf46e58cb1caa0ad34f
parenta52f552d4274eeaeb3a7362c509e77df501b1349 (diff)
Allow plugins to override the QML VideoOutput type.
Move QDeclarativeVideoOutput to the private QtMultimediaQuickTools library to make the QDeclarativeVideoOutputBackend interface implementable by a plugin. Change-Id: I763c483a1fc9ec56dc7b8be0bc71523f029a36ee Reviewed-by: Yoann Lopes <yoann.lopes@digia.com>
-rw-r--r--src/imports/multimedia/multimedia.cpp3
-rw-r--r--src/imports/multimedia/multimedia.pro13
-rw-r--r--src/multimedia/qtmultimediaquicktools_headers/qdeclarativevideooutput_backend_p.h (renamed from src/imports/multimedia/qdeclarativevideooutput_backend_p.h)12
-rw-r--r--src/multimedia/qtmultimediaquicktools_headers/qdeclarativevideooutput_p.h (renamed from src/imports/multimedia/qdeclarativevideooutput_p.h)4
-rw-r--r--src/multimedia/qtmultimediaquicktools_headers/qsgvideonode_p.h2
-rw-r--r--src/qtmultimediaquicktools/qdeclarativevideooutput.cpp (renamed from src/imports/multimedia/qdeclarativevideooutput.cpp)23
-rw-r--r--src/qtmultimediaquicktools/qdeclarativevideooutput_render.cpp (renamed from src/imports/multimedia/qdeclarativevideooutput_render.cpp)0
-rw-r--r--src/qtmultimediaquicktools/qdeclarativevideooutput_render_p.h (renamed from src/imports/multimedia/qdeclarativevideooutput_render_p.h)0
-rw-r--r--src/qtmultimediaquicktools/qdeclarativevideooutput_window.cpp (renamed from src/imports/multimedia/qdeclarativevideooutput_window.cpp)0
-rw-r--r--src/qtmultimediaquicktools/qdeclarativevideooutput_window_p.h (renamed from src/imports/multimedia/qdeclarativevideooutput_window_p.h)0
-rw-r--r--src/qtmultimediaquicktools/qsgvideonode_i420.cpp (renamed from src/imports/multimedia/qsgvideonode_i420.cpp)4
-rw-r--r--src/qtmultimediaquicktools/qsgvideonode_i420.h (renamed from src/imports/multimedia/qsgvideonode_i420.h)3
-rw-r--r--src/qtmultimediaquicktools/qsgvideonode_rgb.cpp (renamed from src/imports/multimedia/qsgvideonode_rgb.cpp)4
-rw-r--r--src/qtmultimediaquicktools/qsgvideonode_rgb.h (renamed from src/imports/multimedia/qsgvideonode_rgb.h)3
-rw-r--r--src/qtmultimediaquicktools/qsgvideonode_texture.cpp (renamed from src/imports/multimedia/qsgvideonode_texture.cpp)4
-rw-r--r--src/qtmultimediaquicktools/qsgvideonode_texture.h (renamed from src/imports/multimedia/qsgvideonode_texture.h)3
-rw-r--r--src/qtmultimediaquicktools/qtmultimediaquicktools.pro18
-rw-r--r--tests/auto/integration/qdeclarativevideooutput/qdeclarativevideooutput.pro3
-rw-r--r--tests/auto/integration/qdeclarativevideooutput/tst_qdeclarativevideooutput.cpp2
-rw-r--r--tests/auto/integration/qdeclarativevideooutput_window/qdeclarativevideooutput_window.pro3
-rw-r--r--tests/auto/integration/qdeclarativevideooutput_window/tst_qdeclarativevideooutput_window.cpp2
21 files changed, 76 insertions, 30 deletions
diff --git a/src/imports/multimedia/multimedia.cpp b/src/imports/multimedia/multimedia.cpp
index f05252f5c..94b697e85 100644
--- a/src/imports/multimedia/multimedia.cpp
+++ b/src/imports/multimedia/multimedia.cpp
@@ -45,9 +45,10 @@
#include <QtQml/qqmlcomponent.h>
#include "qsoundeffect.h"
+#include <private/qdeclarativevideooutput_p.h>
+
#include "qdeclarativemediametadata_p.h"
#include "qdeclarativeaudio_p.h"
-#include "qdeclarativevideooutput_p.h"
#include "qdeclarativeradio_p.h"
#include "qdeclarativeradiodata_p.h"
#include "qdeclarativecamera_p.h"
diff --git a/src/imports/multimedia/multimedia.pro b/src/imports/multimedia/multimedia.pro
index d738dd4f2..f6fdfe9cc 100644
--- a/src/imports/multimedia/multimedia.pro
+++ b/src/imports/multimedia/multimedia.pro
@@ -3,13 +3,6 @@ QT += qml quick network multimedia-private qtmultimediaquicktools-private
HEADERS += \
qdeclarativeaudio_p.h \
qdeclarativemediametadata_p.h \
- qdeclarativevideooutput_p.h \
- qdeclarativevideooutput_backend_p.h \
- qdeclarativevideooutput_render_p.h \
- qdeclarativevideooutput_window_p.h \
- qsgvideonode_i420.h \
- qsgvideonode_rgb.h \
- qsgvideonode_texture.h \
qdeclarativeradio_p.h \
qdeclarativeradiodata_p.h \
qdeclarativecamera_p.h \
@@ -25,12 +18,6 @@ HEADERS += \
SOURCES += \
multimedia.cpp \
qdeclarativeaudio.cpp \
- qdeclarativevideooutput.cpp \
- qdeclarativevideooutput_render.cpp \
- qdeclarativevideooutput_window.cpp \
- qsgvideonode_i420.cpp \
- qsgvideonode_rgb.cpp \
- qsgvideonode_texture.cpp \
qdeclarativeradio.cpp \
qdeclarativeradiodata.cpp \
qdeclarativecamera.cpp \
diff --git a/src/imports/multimedia/qdeclarativevideooutput_backend_p.h b/src/multimedia/qtmultimediaquicktools_headers/qdeclarativevideooutput_backend_p.h
index f731b77f1..f7235b518 100644
--- a/src/imports/multimedia/qdeclarativevideooutput_backend_p.h
+++ b/src/multimedia/qtmultimediaquicktools_headers/qdeclarativevideooutput_backend_p.h
@@ -47,6 +47,7 @@
#include <QtCore/qsize.h>
#include <QtQuick/qquickitem.h>
#include <QtQuick/qsgnode.h>
+#include <private/qtmultimediaquickdefs_p.h>
QT_BEGIN_NAMESPACE
@@ -54,7 +55,7 @@ class QAbstractVideoSurface;
class QDeclarativeVideoOutput;
class QMediaService;
-class QDeclarativeVideoBackend
+class Q_MULTIMEDIAQUICK_EXPORT QDeclarativeVideoBackend
{
public:
explicit QDeclarativeVideoBackend(QDeclarativeVideoOutput *parent)
@@ -82,6 +83,15 @@ protected:
QPointer<QMediaService> m_service;
};
+class QDeclarativeVideoBackendFactoryInterface
+{
+public:
+ virtual QDeclarativeVideoBackend *create(QDeclarativeVideoOutput *parent) = 0;
+};
+
+#define QDeclarativeVideoBackendFactoryInterface_iid "org.qt-project.qt.declarativevideobackendfactory/5.2"
+Q_DECLARE_INTERFACE(QDeclarativeVideoBackendFactoryInterface, QDeclarativeVideoBackendFactoryInterface_iid)
+
/*
* Helper - returns true if the given orientation has the same aspect as the default (e.g. 180*n)
*/
diff --git a/src/imports/multimedia/qdeclarativevideooutput_p.h b/src/multimedia/qtmultimediaquicktools_headers/qdeclarativevideooutput_p.h
index 07fdb41e3..2ca7c2933 100644
--- a/src/imports/multimedia/qdeclarativevideooutput_p.h
+++ b/src/multimedia/qtmultimediaquicktools_headers/qdeclarativevideooutput_p.h
@@ -48,6 +48,8 @@
#include <QtQuick/qquickitem.h>
#include <QtCore/qpointer.h>
+#include <private/qtmultimediaquickdefs_p.h>
+
QT_BEGIN_NAMESPACE
class QMediaObject;
@@ -55,7 +57,7 @@ class QMediaService;
class QDeclarativeVideoBackend;
class QVideoOutputOrientationHandler;
-class QDeclarativeVideoOutput : public QQuickItem
+class Q_MULTIMEDIAQUICK_EXPORT QDeclarativeVideoOutput : public QQuickItem
{
Q_OBJECT
Q_DISABLE_COPY(QDeclarativeVideoOutput)
diff --git a/src/multimedia/qtmultimediaquicktools_headers/qsgvideonode_p.h b/src/multimedia/qtmultimediaquicktools_headers/qsgvideonode_p.h
index 71230ca35..f8cca4fcc 100644
--- a/src/multimedia/qtmultimediaquicktools_headers/qsgvideonode_p.h
+++ b/src/multimedia/qtmultimediaquicktools_headers/qsgvideonode_p.h
@@ -76,7 +76,7 @@ public:
virtual QSGVideoNode *createNode(const QVideoSurfaceFormat &format) = 0;
};
-#define QSGVideoNodeFactoryInterface_iid "org.qt-project.qt.sgvideonodefactory/5.0"
+#define QSGVideoNodeFactoryInterface_iid "org.qt-project.qt.sgvideonodefactory/5.2"
Q_DECLARE_INTERFACE(QSGVideoNodeFactoryInterface, QSGVideoNodeFactoryInterface_iid)
class Q_MULTIMEDIAQUICK_EXPORT QSGVideoNodeFactoryPlugin : public QObject, public QSGVideoNodeFactoryInterface
diff --git a/src/imports/multimedia/qdeclarativevideooutput.cpp b/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp
index 6d6107e51..321fd5e81 100644
--- a/src/imports/multimedia/qdeclarativevideooutput.cpp
+++ b/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp
@@ -46,6 +46,7 @@
#include <private/qvideooutputorientationhandler_p.h>
#include <QtMultimedia/qmediaobject.h>
#include <QtMultimedia/qmediaservice.h>
+#include <private/qmediapluginloader_p.h>
//#define DEBUG_VIDEOITEM
@@ -211,12 +212,28 @@ void QDeclarativeVideoOutput::setSource(QObject *source)
emit sourceChanged();
}
+Q_GLOBAL_STATIC_WITH_ARGS(QMediaPluginLoader, videoBackendFactoryLoader,
+ (QDeclarativeVideoBackendFactoryInterface_iid, QLatin1String("video/declarativevideobackend"), Qt::CaseInsensitive))
+
bool QDeclarativeVideoOutput::createBackend(QMediaService *service)
{
bool backendAvailable = false;
- m_backend.reset(new QDeclarativeVideoRendererBackend(this));
- if (m_backend->init(service))
- backendAvailable = true;
+
+ foreach (QObject *instance, videoBackendFactoryLoader()->instances(QLatin1String("declarativevideobackend"))) {
+ if (QDeclarativeVideoBackendFactoryInterface *plugin = qobject_cast<QDeclarativeVideoBackendFactoryInterface*>(instance)) {
+ m_backend.reset(plugin->create(this));
+ if (m_backend && m_backend->init(service)) {
+ backendAvailable = true;
+ break;
+ }
+ }
+ }
+
+ if (!backendAvailable) {
+ m_backend.reset(new QDeclarativeVideoRendererBackend(this));
+ if (m_backend->init(service))
+ backendAvailable = true;
+ }
// QDeclarativeVideoWindowBackend only works when there is a service with a QVideoWindowControl.
// Without service, the QDeclarativeVideoRendererBackend should always work.
diff --git a/src/imports/multimedia/qdeclarativevideooutput_render.cpp b/src/qtmultimediaquicktools/qdeclarativevideooutput_render.cpp
index cd03cd6b8..cd03cd6b8 100644
--- a/src/imports/multimedia/qdeclarativevideooutput_render.cpp
+++ b/src/qtmultimediaquicktools/qdeclarativevideooutput_render.cpp
diff --git a/src/imports/multimedia/qdeclarativevideooutput_render_p.h b/src/qtmultimediaquicktools/qdeclarativevideooutput_render_p.h
index 3682c15a6..3682c15a6 100644
--- a/src/imports/multimedia/qdeclarativevideooutput_render_p.h
+++ b/src/qtmultimediaquicktools/qdeclarativevideooutput_render_p.h
diff --git a/src/imports/multimedia/qdeclarativevideooutput_window.cpp b/src/qtmultimediaquicktools/qdeclarativevideooutput_window.cpp
index 2da63c107..2da63c107 100644
--- a/src/imports/multimedia/qdeclarativevideooutput_window.cpp
+++ b/src/qtmultimediaquicktools/qdeclarativevideooutput_window.cpp
diff --git a/src/imports/multimedia/qdeclarativevideooutput_window_p.h b/src/qtmultimediaquicktools/qdeclarativevideooutput_window_p.h
index eb7b35b85..eb7b35b85 100644
--- a/src/imports/multimedia/qdeclarativevideooutput_window_p.h
+++ b/src/qtmultimediaquicktools/qdeclarativevideooutput_window_p.h
diff --git a/src/imports/multimedia/qsgvideonode_i420.cpp b/src/qtmultimediaquicktools/qsgvideonode_i420.cpp
index f91fb5a07..d7eb04863 100644
--- a/src/imports/multimedia/qsgvideonode_i420.cpp
+++ b/src/qtmultimediaquicktools/qsgvideonode_i420.cpp
@@ -46,6 +46,8 @@
#include <QtGui/QOpenGLFunctions>
#include <QtGui/QOpenGLShaderProgram>
+QT_BEGIN_NAMESPACE
+
QList<QVideoFrame::PixelFormat> QSGVideoNodeFactory_I420::supportedPixelFormats(
QAbstractVideoBuffer::HandleType handleType) const
{
@@ -324,3 +326,5 @@ void QSGVideoMaterialShader_YUV420::updateState(const RenderState &state,
if (state.isMatrixDirty())
program()->setUniformValue(m_id_matrix, state.combinedMatrix());
}
+
+QT_END_NAMESPACE
diff --git a/src/imports/multimedia/qsgvideonode_i420.h b/src/qtmultimediaquicktools/qsgvideonode_i420.h
index 96050abb8..a9def5514 100644
--- a/src/imports/multimedia/qsgvideonode_i420.h
+++ b/src/qtmultimediaquicktools/qsgvideonode_i420.h
@@ -45,6 +45,8 @@
#include <private/qsgvideonode_p.h>
#include <QtMultimedia/qvideosurfaceformat.h>
+QT_BEGIN_NAMESPACE
+
class QSGVideoMaterial_YUV420;
class QSGVideoNode_I420 : public QSGVideoNode
{
@@ -70,5 +72,6 @@ public:
QSGVideoNode *createNode(const QVideoSurfaceFormat &format);
};
+QT_END_NAMESPACE
#endif // QSGVIDEONODE_I420_H
diff --git a/src/imports/multimedia/qsgvideonode_rgb.cpp b/src/qtmultimediaquicktools/qsgvideonode_rgb.cpp
index b0fb7dcf8..fbe60c9a7 100644
--- a/src/imports/multimedia/qsgvideonode_rgb.cpp
+++ b/src/qtmultimediaquicktools/qsgvideonode_rgb.cpp
@@ -46,6 +46,8 @@
#include <QtGui/QOpenGLFunctions>
#include <QtGui/QOpenGLShaderProgram>
+QT_BEGIN_NAMESPACE
+
QList<QVideoFrame::PixelFormat> QSGVideoNodeFactory_RGB::supportedPixelFormats(
QAbstractVideoBuffer::HandleType handleType) const
{
@@ -283,3 +285,5 @@ void QSGVideoMaterialShader_RGB::updateState(const RenderState &state,
if (state.isMatrixDirty())
program()->setUniformValue(m_id_matrix, state.combinedMatrix());
}
+
+QT_END_NAMESPACE
diff --git a/src/imports/multimedia/qsgvideonode_rgb.h b/src/qtmultimediaquicktools/qsgvideonode_rgb.h
index ffec41955..141a00e9f 100644
--- a/src/imports/multimedia/qsgvideonode_rgb.h
+++ b/src/qtmultimediaquicktools/qsgvideonode_rgb.h
@@ -45,6 +45,8 @@
#include <private/qsgvideonode_p.h>
#include <QtMultimedia/qvideosurfaceformat.h>
+QT_BEGIN_NAMESPACE
+
class QSGVideoMaterial_RGB;
class QSGVideoNode_RGB : public QSGVideoNode
@@ -70,5 +72,6 @@ public:
QSGVideoNode *createNode(const QVideoSurfaceFormat &format);
};
+QT_END_NAMESPACE
#endif // QSGVIDEONODE_RGB_H
diff --git a/src/imports/multimedia/qsgvideonode_texture.cpp b/src/qtmultimediaquicktools/qsgvideonode_texture.cpp
index e0d9737b0..2320387b1 100644
--- a/src/imports/multimedia/qsgvideonode_texture.cpp
+++ b/src/qtmultimediaquicktools/qsgvideonode_texture.cpp
@@ -46,6 +46,8 @@
#include <QtGui/QOpenGLFunctions>
#include <QtGui/QOpenGLShaderProgram>
+QT_BEGIN_NAMESPACE
+
QList<QVideoFrame::PixelFormat> QSGVideoNodeFactory_Texture::supportedPixelFormats(
QAbstractVideoBuffer::HandleType handleType) const
{
@@ -265,3 +267,5 @@ void QSGVideoMaterialShader_Texture::updateState(const RenderState &state,
if (state.isMatrixDirty())
program()->setUniformValue(m_id_matrix, state.combinedMatrix());
}
+
+QT_END_NAMESPACE
diff --git a/src/imports/multimedia/qsgvideonode_texture.h b/src/qtmultimediaquicktools/qsgvideonode_texture.h
index 8d369ebc1..42dadbcbb 100644
--- a/src/imports/multimedia/qsgvideonode_texture.h
+++ b/src/qtmultimediaquicktools/qsgvideonode_texture.h
@@ -45,6 +45,8 @@
#include <private/qsgvideonode_p.h>
#include <QtMultimedia/qvideosurfaceformat.h>
+QT_BEGIN_NAMESPACE
+
class QSGVideoMaterial_Texture;
class QSGVideoNode_Texture : public QSGVideoNode
@@ -70,5 +72,6 @@ public:
QSGVideoNode *createNode(const QVideoSurfaceFormat &format);
};
+QT_END_NAMESPACE
#endif
diff --git a/src/qtmultimediaquicktools/qtmultimediaquicktools.pro b/src/qtmultimediaquicktools/qtmultimediaquicktools.pro
index da4d0dc1a..6fd38be86 100644
--- a/src/qtmultimediaquicktools/qtmultimediaquicktools.pro
+++ b/src/qtmultimediaquicktools/qtmultimediaquicktools.pro
@@ -11,10 +11,24 @@ DEFINES += QT_BUILD_QTMM_QUICK_LIB
INCLUDEPATH += ../multimedia/qtmultimediaquicktools_headers/
PRIVATE_HEADERS += \
+ ../multimedia/qtmultimediaquicktools_headers/qdeclarativevideooutput_p.h \
+ ../multimedia/qtmultimediaquicktools_headers/qdeclarativevideooutput_backend_p.h \
../multimedia/qtmultimediaquicktools_headers/qsgvideonode_p.h \
../multimedia/qtmultimediaquicktools_headers/qtmultimediaquickdefs_p.h
SOURCES += \
- qsgvideonode_p.cpp
+ qsgvideonode_p.cpp \
+ qdeclarativevideooutput.cpp \
+ qdeclarativevideooutput_render.cpp \
+ qdeclarativevideooutput_window.cpp \
+ qsgvideonode_i420.cpp \
+ qsgvideonode_rgb.cpp \
+ qsgvideonode_texture.cpp
-HEADERS += $$PRIVATE_HEADERS
+HEADERS += \
+ $$PRIVATE_HEADERS \
+ qdeclarativevideooutput_render_p.h \
+ qdeclarativevideooutput_window_p.h \
+ qsgvideonode_i420.h \
+ qsgvideonode_rgb.h \
+ qsgvideonode_texture.h
diff --git a/tests/auto/integration/qdeclarativevideooutput/qdeclarativevideooutput.pro b/tests/auto/integration/qdeclarativevideooutput/qdeclarativevideooutput.pro
index b9be929ea..573e5559e 100644
--- a/tests/auto/integration/qdeclarativevideooutput/qdeclarativevideooutput.pro
+++ b/tests/auto/integration/qdeclarativevideooutput/qdeclarativevideooutput.pro
@@ -3,9 +3,6 @@ TARGET = tst_qdeclarativevideooutput
QT += multimedia-private qml testlib quick
CONFIG += testcase
-OTHER_FILES += \
- ../../../../src/imports/multimedia/qdeclarativevideooutput_p.h
-
SOURCES += \
tst_qdeclarativevideooutput.cpp
diff --git a/tests/auto/integration/qdeclarativevideooutput/tst_qdeclarativevideooutput.cpp b/tests/auto/integration/qdeclarativevideooutput/tst_qdeclarativevideooutput.cpp
index 05c507f25..5ee2481f4 100644
--- a/tests/auto/integration/qdeclarativevideooutput/tst_qdeclarativevideooutput.cpp
+++ b/tests/auto/integration/qdeclarativevideooutput/tst_qdeclarativevideooutput.cpp
@@ -46,7 +46,7 @@
#include <QtQml/qqmlengine.h>
#include <QtQml/qqmlcomponent.h>
-#include "qdeclarativevideooutput_p.h"
+#include "private/qdeclarativevideooutput_p.h"
#include <qabstractvideosurface.h>
#include <qvideorenderercontrol.h>
diff --git a/tests/auto/integration/qdeclarativevideooutput_window/qdeclarativevideooutput_window.pro b/tests/auto/integration/qdeclarativevideooutput_window/qdeclarativevideooutput_window.pro
index 3cc5e0980..655fbc7b9 100644
--- a/tests/auto/integration/qdeclarativevideooutput_window/qdeclarativevideooutput_window.pro
+++ b/tests/auto/integration/qdeclarativevideooutput_window/qdeclarativevideooutput_window.pro
@@ -3,9 +3,6 @@ TARGET = tst_qdeclarativevideooutput_window
QT += multimedia-private qml testlib quick
CONFIG += testcase
-OTHER_FILES += \
- ../../../../src/imports/multimedia/qdeclarativevideooutput_p.h
-
SOURCES += \
tst_qdeclarativevideooutput_window.cpp
diff --git a/tests/auto/integration/qdeclarativevideooutput_window/tst_qdeclarativevideooutput_window.cpp b/tests/auto/integration/qdeclarativevideooutput_window/tst_qdeclarativevideooutput_window.cpp
index b4bcd5045..97a441ae5 100644
--- a/tests/auto/integration/qdeclarativevideooutput_window/tst_qdeclarativevideooutput_window.cpp
+++ b/tests/auto/integration/qdeclarativevideooutput_window/tst_qdeclarativevideooutput_window.cpp
@@ -42,7 +42,7 @@
//TESTED_COMPONENT=plugins/declarative/multimedia
-#include "qdeclarativevideooutput_p.h"
+#include "private/qdeclarativevideooutput_p.h"
#include <QtCore/qobject.h>
#include <QtTest/qtest.h>
#include <QtQml/qqmlengine.h>