From 60fb11d9a2f5ff659a6ccffe01b4de16c1fb5929 Mon Sep 17 00:00:00 2001 From: Andrew den Exter Date: Thu, 5 Dec 2013 15:38:14 +1000 Subject: [PATCH] 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 --- src/imports/multimedia/multimedia.cpp | 3 ++- src/imports/multimedia/multimedia.pro | 13 ----------- .../qdeclarativevideooutput_backend_p.h | 12 +++++++++- .../qdeclarativevideooutput_p.h | 4 +++- .../qsgvideonode_p.h | 2 +- .../qdeclarativevideooutput.cpp | 23 ++++++++++++++++--- .../qdeclarativevideooutput_render.cpp | 0 .../qdeclarativevideooutput_render_p.h | 0 .../qdeclarativevideooutput_window.cpp | 0 .../qdeclarativevideooutput_window_p.h | 0 .../qsgvideonode_i420.cpp | 4 ++++ .../qsgvideonode_i420.h | 3 +++ .../qsgvideonode_rgb.cpp | 4 ++++ .../qsgvideonode_rgb.h | 3 +++ .../qsgvideonode_texture.cpp | 4 ++++ .../qsgvideonode_texture.h | 3 +++ .../qtmultimediaquicktools.pro | 18 +++++++++++++-- .../qdeclarativevideooutput.pro | 3 --- .../tst_qdeclarativevideooutput.cpp | 2 +- .../qdeclarativevideooutput_window.pro | 3 --- .../tst_qdeclarativevideooutput_window.cpp | 2 +- 21 files changed, 76 insertions(+), 30 deletions(-) rename src/{imports/multimedia => multimedia/qtmultimediaquicktools_headers}/qdeclarativevideooutput_backend_p.h (88%) rename src/{imports/multimedia => multimedia/qtmultimediaquicktools_headers}/qdeclarativevideooutput_p.h (97%) rename src/{imports/multimedia => qtmultimediaquicktools}/qdeclarativevideooutput.cpp (96%) rename src/{imports/multimedia => qtmultimediaquicktools}/qdeclarativevideooutput_render.cpp (100%) rename src/{imports/multimedia => qtmultimediaquicktools}/qdeclarativevideooutput_render_p.h (100%) rename src/{imports/multimedia => qtmultimediaquicktools}/qdeclarativevideooutput_window.cpp (100%) rename src/{imports/multimedia => qtmultimediaquicktools}/qdeclarativevideooutput_window_p.h (100%) rename src/{imports/multimedia => qtmultimediaquicktools}/qsgvideonode_i420.cpp (99%) rename src/{imports/multimedia => qtmultimediaquicktools}/qsgvideonode_i420.h (98%) rename src/{imports/multimedia => qtmultimediaquicktools}/qsgvideonode_rgb.cpp (99%) rename src/{imports/multimedia => qtmultimediaquicktools}/qsgvideonode_rgb.h (98%) rename src/{imports/multimedia => qtmultimediaquicktools}/qsgvideonode_texture.cpp (99%) rename src/{imports/multimedia => qtmultimediaquicktools}/qsgvideonode_texture.h (98%) diff --git a/src/imports/multimedia/multimedia.cpp b/src/imports/multimedia/multimedia.cpp index f05252f5..94b697e8 100644 --- a/src/imports/multimedia/multimedia.cpp +++ b/src/imports/multimedia/multimedia.cpp @@ -45,9 +45,10 @@ #include #include "qsoundeffect.h" +#include + #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 d738dd4f..f6fdfe9c 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 similarity index 88% rename from src/imports/multimedia/qdeclarativevideooutput_backend_p.h rename to src/multimedia/qtmultimediaquicktools_headers/qdeclarativevideooutput_backend_p.h index f731b77f..f7235b51 100644 --- a/src/imports/multimedia/qdeclarativevideooutput_backend_p.h +++ b/src/multimedia/qtmultimediaquicktools_headers/qdeclarativevideooutput_backend_p.h @@ -47,6 +47,7 @@ #include #include #include +#include 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 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 similarity index 97% rename from src/imports/multimedia/qdeclarativevideooutput_p.h rename to src/multimedia/qtmultimediaquicktools_headers/qdeclarativevideooutput_p.h index 07fdb41e..2ca7c293 100644 --- a/src/imports/multimedia/qdeclarativevideooutput_p.h +++ b/src/multimedia/qtmultimediaquicktools_headers/qdeclarativevideooutput_p.h @@ -48,6 +48,8 @@ #include #include +#include + 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 71230ca3..f8cca4fc 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 similarity index 96% rename from src/imports/multimedia/qdeclarativevideooutput.cpp rename to src/qtmultimediaquicktools/qdeclarativevideooutput.cpp index 6d6107e5..321fd5e8 100644 --- a/src/imports/multimedia/qdeclarativevideooutput.cpp +++ b/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp @@ -46,6 +46,7 @@ #include #include #include +#include //#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(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 similarity index 100% rename from src/imports/multimedia/qdeclarativevideooutput_render.cpp rename to src/qtmultimediaquicktools/qdeclarativevideooutput_render.cpp diff --git a/src/imports/multimedia/qdeclarativevideooutput_render_p.h b/src/qtmultimediaquicktools/qdeclarativevideooutput_render_p.h similarity index 100% rename from src/imports/multimedia/qdeclarativevideooutput_render_p.h rename to src/qtmultimediaquicktools/qdeclarativevideooutput_render_p.h diff --git a/src/imports/multimedia/qdeclarativevideooutput_window.cpp b/src/qtmultimediaquicktools/qdeclarativevideooutput_window.cpp similarity index 100% rename from src/imports/multimedia/qdeclarativevideooutput_window.cpp rename to src/qtmultimediaquicktools/qdeclarativevideooutput_window.cpp diff --git a/src/imports/multimedia/qdeclarativevideooutput_window_p.h b/src/qtmultimediaquicktools/qdeclarativevideooutput_window_p.h similarity index 100% rename from src/imports/multimedia/qdeclarativevideooutput_window_p.h rename to src/qtmultimediaquicktools/qdeclarativevideooutput_window_p.h diff --git a/src/imports/multimedia/qsgvideonode_i420.cpp b/src/qtmultimediaquicktools/qsgvideonode_i420.cpp similarity index 99% rename from src/imports/multimedia/qsgvideonode_i420.cpp rename to src/qtmultimediaquicktools/qsgvideonode_i420.cpp index f91fb5a0..d7eb0486 100644 --- a/src/imports/multimedia/qsgvideonode_i420.cpp +++ b/src/qtmultimediaquicktools/qsgvideonode_i420.cpp @@ -46,6 +46,8 @@ #include #include +QT_BEGIN_NAMESPACE + QList 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 similarity index 98% rename from src/imports/multimedia/qsgvideonode_i420.h rename to src/qtmultimediaquicktools/qsgvideonode_i420.h index 96050abb..a9def551 100644 --- a/src/imports/multimedia/qsgvideonode_i420.h +++ b/src/qtmultimediaquicktools/qsgvideonode_i420.h @@ -45,6 +45,8 @@ #include #include +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 similarity index 99% rename from src/imports/multimedia/qsgvideonode_rgb.cpp rename to src/qtmultimediaquicktools/qsgvideonode_rgb.cpp index b0fb7dcf..fbe60c9a 100644 --- a/src/imports/multimedia/qsgvideonode_rgb.cpp +++ b/src/qtmultimediaquicktools/qsgvideonode_rgb.cpp @@ -46,6 +46,8 @@ #include #include +QT_BEGIN_NAMESPACE + QList 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 similarity index 98% rename from src/imports/multimedia/qsgvideonode_rgb.h rename to src/qtmultimediaquicktools/qsgvideonode_rgb.h index ffec4195..141a00e9 100644 --- a/src/imports/multimedia/qsgvideonode_rgb.h +++ b/src/qtmultimediaquicktools/qsgvideonode_rgb.h @@ -45,6 +45,8 @@ #include #include +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 similarity index 99% rename from src/imports/multimedia/qsgvideonode_texture.cpp rename to src/qtmultimediaquicktools/qsgvideonode_texture.cpp index e0d9737b..2320387b 100644 --- a/src/imports/multimedia/qsgvideonode_texture.cpp +++ b/src/qtmultimediaquicktools/qsgvideonode_texture.cpp @@ -46,6 +46,8 @@ #include #include +QT_BEGIN_NAMESPACE + QList 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 similarity index 98% rename from src/imports/multimedia/qsgvideonode_texture.h rename to src/qtmultimediaquicktools/qsgvideonode_texture.h index 8d369ebc..42dadbcb 100644 --- a/src/imports/multimedia/qsgvideonode_texture.h +++ b/src/qtmultimediaquicktools/qsgvideonode_texture.h @@ -45,6 +45,8 @@ #include #include +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 da4d0dc1..6fd38be8 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 b9be929e..573e5559 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 05c507f2..5ee2481f 100644 --- a/tests/auto/integration/qdeclarativevideooutput/tst_qdeclarativevideooutput.cpp +++ b/tests/auto/integration/qdeclarativevideooutput/tst_qdeclarativevideooutput.cpp @@ -46,7 +46,7 @@ #include #include -#include "qdeclarativevideooutput_p.h" +#include "private/qdeclarativevideooutput_p.h" #include #include diff --git a/tests/auto/integration/qdeclarativevideooutput_window/qdeclarativevideooutput_window.pro b/tests/auto/integration/qdeclarativevideooutput_window/qdeclarativevideooutput_window.pro index 3cc5e098..655fbc7b 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 b4bcd504..97a441ae 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 #include #include