diff options
author | Andrew den Exter <andrew.den.exter@jollamobile.com> | 2013-12-05 15:38:14 +1000 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-01-20 14:26:03 +0100 |
commit | 60fb11d9a2f5ff659a6ccffe01b4de16c1fb5929 (patch) | |
tree | 9b715c70d25f1b46b3a4caf46e58cb1caa0ad34f | |
parent | a52f552d4274eeaeb3a7362c509e77df501b1349 (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>
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> |