diff options
Diffstat (limited to 'src/multimedia')
-rw-r--r-- | src/multimedia/audio/audio.pri | 2 | ||||
-rw-r--r-- | src/multimedia/audio/qaudiodevicefactory.cpp | 10 | ||||
-rw-r--r-- | src/multimedia/audio/qaudiopluginloader.cpp | 176 | ||||
-rw-r--r-- | src/multimedia/audio/qaudiopluginloader_p.h | 100 | ||||
-rw-r--r-- | src/multimedia/audio/qaudiosystemplugin.h | 6 | ||||
-rw-r--r-- | src/multimedia/gsttools_headers/qgstbufferpoolinterface_p.h | 7 | ||||
-rw-r--r-- | src/multimedia/multimedia.pro | 2 | ||||
-rw-r--r-- | src/multimedia/playback/qmediaplaylistioplugin_p.h | 7 | ||||
-rw-r--r-- | src/multimedia/qmediapluginloader.cpp | 196 | ||||
-rw-r--r-- | src/multimedia/qmediapluginloader_p.h | 13 | ||||
-rw-r--r-- | src/multimedia/qmediaserviceproviderplugin.h | 7 | ||||
-rw-r--r-- | src/multimedia/qtmultimediaquicktools_headers/qsgvideonode_p.h | 17 |
12 files changed, 88 insertions, 455 deletions
diff --git a/src/multimedia/audio/audio.pri b/src/multimedia/audio/audio.pri index a2cdaa379..b58ecbb0c 100644 --- a/src/multimedia/audio/audio.pri +++ b/src/multimedia/audio/audio.pri @@ -16,7 +16,6 @@ PUBLIC_HEADERS += \ PRIVATE_HEADERS += \ audio/qaudiobuffer_p.h \ audio/qaudiodevicefactory_p.h \ - audio/qaudiopluginloader_p.h \ audio/qwavedecoder_p.h \ audio/qsamplecache_p.h \ audio/qaudiodecoder_p.h @@ -30,7 +29,6 @@ SOURCES += \ audio/qaudiosystemplugin.cpp \ audio/qaudiosystem.cpp \ audio/qaudiodevicefactory.cpp \ - audio/qaudiopluginloader.cpp \ audio/qsoundeffect.cpp \ audio/qwavedecoder_p.cpp \ audio/qsamplecache_p.cpp \ diff --git a/src/multimedia/audio/qaudiodevicefactory.cpp b/src/multimedia/audio/qaudiodevicefactory.cpp index 9dcf8b1c5..24972dd53 100644 --- a/src/multimedia/audio/qaudiodevicefactory.cpp +++ b/src/multimedia/audio/qaudiodevicefactory.cpp @@ -44,7 +44,7 @@ #include "qaudiosystem.h" #include "qaudiosystemplugin.h" -#include "qaudiopluginloader_p.h" +#include "qmediapluginloader_p.h" #include "qaudiodevicefactory_p.h" #ifndef QT_NO_AUDIO_BACKEND @@ -66,8 +66,8 @@ QT_BEGIN_NAMESPACE #if !defined (QT_NO_LIBRARY) && !defined(QT_NO_SETTINGS) -Q_GLOBAL_STATIC_WITH_ARGS(QAudioPluginLoader, audioLoader, - (QAudioSystemFactoryInterface_iid, QLatin1String("/audio"), Qt::CaseInsensitive)) +Q_GLOBAL_STATIC_WITH_ARGS(QMediaPluginLoader, audioLoader, + (QAudioSystemFactoryInterface_iid, QLatin1String("audio"), Qt::CaseInsensitive)) #endif class QNullDeviceInfo : public QAbstractAudioDeviceInfo @@ -142,15 +142,13 @@ QList<QAudioDeviceInfo> QAudioDeviceFactory::availableDevices(QAudio::Mode mode) #endif #if !defined (QT_NO_LIBRARY) && !defined(QT_NO_SETTINGS) - QAudioPluginLoader* l = audioLoader(); + QMediaPluginLoader* l = audioLoader(); foreach (const QString& key, l->keys()) { QAudioSystemFactoryInterface* plugin = qobject_cast<QAudioSystemFactoryInterface*>(l->instance(key)); if (plugin) { foreach (QByteArray const& handle, plugin->availableDevices(mode)) devices << QAudioDeviceInfo(key, handle, mode); } - - delete plugin; } #endif diff --git a/src/multimedia/audio/qaudiopluginloader.cpp b/src/multimedia/audio/qaudiopluginloader.cpp deleted file mode 100644 index 0ef3c4557..000000000 --- a/src/multimedia/audio/qaudiopluginloader.cpp +++ /dev/null @@ -1,176 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/ -** -** This file is part of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qaudiosystemplugin.h" -#include "qaudiopluginloader_p.h" - -#include <QtCore/qcoreapplication.h> -#include <QtCore/qpluginloader.h> -#include <QtCore/qfactoryinterface.h> -#include <QtCore/qdir.h> -#include <QtCore/qdebug.h> - -QT_BEGIN_NAMESPACE - -QAudioPluginLoader::QAudioPluginLoader(const char *iid, const QString &location, Qt::CaseSensitivity): - m_iid(iid) -{ - m_location = location + QLatin1Char('/'); - load(); -} - -QAudioPluginLoader::~QAudioPluginLoader() -{ - for (int i = 0; i < m_plugins.count(); i++ ) { - delete m_plugins.at(i); - } -} - -QStringList QAudioPluginLoader::pluginList() const -{ -#if !defined QT_NO_DEBUG - const bool showDebug = qgetenv("QT_DEBUG_PLUGINS").toInt() > 0; -#endif - - QStringList paths = QCoreApplication::libraryPaths(); -#ifdef QTM_PLUGIN_PATH - paths << QLatin1String(QTM_PLUGIN_PATH); -#endif -#if !defined QT_NO_DEBUG - if (showDebug) - qDebug() << "Plugin paths:" << paths; -#endif - - //temp variable to avoid multiple identic path - QSet<QString> processed; - - /* Discover a bunch o plugins */ - QStringList plugins; - - /* Enumerate our plugin paths */ - for (int i=0; i < paths.count(); i++) { - if (processed.contains(paths.at(i))) - continue; - processed.insert(paths.at(i)); - QDir pluginsDir(paths.at(i)+m_location); - if (!pluginsDir.exists()) - continue; - - QStringList files = pluginsDir.entryList(QDir::Files); -#if !defined QT_NO_DEBUG - if (showDebug) - qDebug()<<"Looking for plugins in "<<pluginsDir.path()<<files; -#endif - for (int j=0; j < files.count(); j++) { - const QString &file = files.at(j); - plugins << pluginsDir.absoluteFilePath(file); - } - } - return plugins; -} - -QStringList QAudioPluginLoader::keys() const -{ - QMutexLocker locker(const_cast<QMutex *>(&m_mutex)); - - QStringList list; - for (int i = 0; i < m_plugins.count(); i++) { - QAudioSystemPlugin* p = qobject_cast<QAudioSystemPlugin*>(m_plugins.at(i)->instance()); - if (p) list << p->keys(); - } - - return list; -} - -QObject* QAudioPluginLoader::instance(QString const &key) -{ - QMutexLocker locker(&m_mutex); - - for (int i = 0; i < m_plugins.count(); i++) { - QAudioSystemPlugin* p = qobject_cast<QAudioSystemPlugin*>(m_plugins.at(i)->instance()); - if (p && p->keys().contains(key)) - return m_plugins.at(i)->instance(); - } - return 0; -} - -QList<QObject*> QAudioPluginLoader::instances(QString const &key) -{ - QMutexLocker locker(&m_mutex); - - QList<QObject*> list; - for (int i = 0; i < m_plugins.count(); i++) { - QAudioSystemPlugin* p = qobject_cast<QAudioSystemPlugin*>(m_plugins.at(i)->instance()); - if (p && p->keys().contains(key)) - list << m_plugins.at(i)->instance(); - } - return list; -} - -void QAudioPluginLoader::load() -{ - if (!m_plugins.isEmpty()) - return; - -#if !defined QT_NO_DEBUG - const bool showDebug = qgetenv("QT_DEBUG_PLUGINS").toInt() > 0; -#endif - - QStringList plugins = pluginList(); - for (int i=0; i < plugins.count(); i++) { - QPluginLoader* loader = new QPluginLoader(plugins.at(i)); - QObject *o = loader->instance(); - if (o != 0 && o->qt_metacast(m_iid) != 0) { - m_plugins.append(loader); - } else { -#if !defined QT_NO_DEBUG - if (showDebug) - qWarning() << "QAudioPluginLoader: Failed to load plugin: " - << plugins.at(i) << loader->errorString(); -#endif - delete o; - //we are not calling loader->unload here for it may cause problem on some device - delete loader; - } - } -} -QT_END_NAMESPACE - diff --git a/src/multimedia/audio/qaudiopluginloader_p.h b/src/multimedia/audio/qaudiopluginloader_p.h deleted file mode 100644 index cb30c386d..000000000 --- a/src/multimedia/audio/qaudiopluginloader_p.h +++ /dev/null @@ -1,100 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). -** Contact: http://www.qt-project.org/ -** -** This file is part of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QAUDIOPLUGINLOADER_H -#define QAUDIOPLUGINLOADER_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include <qtmultimediadefs.h> -#include <QObject> -#include <QtCore/qstring.h> -#include <QtCore/qmap.h> -#include <QtCore/qmutex.h> -#include <QtCore/qpluginloader.h> - - -QT_BEGIN_HEADER - -QT_BEGIN_NAMESPACE - -QT_MODULE(Multimedia) - - -class QAudioPluginLoader -{ -public: - QAudioPluginLoader(const char *iid, - const QString &suffix = QString(), - Qt::CaseSensitivity = Qt::CaseSensitive); - - ~QAudioPluginLoader(); - - QStringList keys() const; - QObject* instance(QString const &key); - QList<QObject*> instances(QString const &key); - -private: - QStringList pluginList() const; - void load(); - - QMutex m_mutex; - - QByteArray m_iid; - QString m_location; - QList<QPluginLoader*> m_plugins; -}; - -QT_END_NAMESPACE - -QT_END_HEADER - - -#endif // QAUDIOPLUGINLOADER_H diff --git a/src/multimedia/audio/qaudiosystemplugin.h b/src/multimedia/audio/qaudiosystemplugin.h index 232d8a5ec..d48d89c32 100644 --- a/src/multimedia/audio/qaudiosystemplugin.h +++ b/src/multimedia/audio/qaudiosystemplugin.h @@ -45,7 +45,6 @@ #include <QtCore/qstring.h> #include <QtCore/qplugin.h> -#include <QtCore/qfactoryinterface.h> #include <qtmultimediadefs.h> #include <qtmedianamespace.h> @@ -61,7 +60,7 @@ QT_BEGIN_NAMESPACE QT_MODULE(Multimedia) -struct Q_MULTIMEDIA_EXPORT QAudioSystemFactoryInterface : public QFactoryInterface +struct Q_MULTIMEDIA_EXPORT QAudioSystemFactoryInterface { virtual QList<QByteArray> availableDevices(QAudio::Mode) const = 0; virtual QAbstractAudioInput* createInput(const QByteArray& device) = 0; @@ -76,13 +75,12 @@ Q_DECLARE_INTERFACE(QAudioSystemFactoryInterface, QAudioSystemFactoryInterface_i class Q_MULTIMEDIA_EXPORT QAudioSystemPlugin : public QObject, public QAudioSystemFactoryInterface { Q_OBJECT - Q_INTERFACES(QAudioSystemFactoryInterface:QFactoryInterface) + Q_INTERFACES(QAudioSystemFactoryInterface) public: QAudioSystemPlugin(QObject *parent = 0); ~QAudioSystemPlugin(); - virtual QStringList keys() const = 0; virtual QList<QByteArray> availableDevices(QAudio::Mode) const = 0; virtual QAbstractAudioInput* createInput(const QByteArray& device) = 0; virtual QAbstractAudioOutput* createOutput(const QByteArray& device) = 0; diff --git a/src/multimedia/gsttools_headers/qgstbufferpoolinterface_p.h b/src/multimedia/gsttools_headers/qgstbufferpoolinterface_p.h index 3e2430e56..7bb906aa5 100644 --- a/src/multimedia/gsttools_headers/qgstbufferpoolinterface_p.h +++ b/src/multimedia/gsttools_headers/qgstbufferpoolinterface_p.h @@ -57,7 +57,6 @@ #include <qvideosurfaceformat.h> #include <QtCore/qobject.h> #include <QtCore/qplugin.h> -#include <QtCore/qfactoryinterface.h> #include <gst/gst.h> @@ -68,7 +67,7 @@ const QLatin1String QGstBufferPoolPluginKey("bufferpool"); /*! Abstract interface for video buffers allocation. */ -class QGstBufferPoolInterface : public QFactoryInterface +class QGstBufferPoolInterface { public: virtual ~QGstBufferPoolInterface() {} @@ -96,7 +95,7 @@ Q_DECLARE_INTERFACE(QGstBufferPoolInterface, QGstBufferPoolInterface_iid) class QGstBufferPoolPlugin : public QObject, public QGstBufferPoolInterface { Q_OBJECT - Q_INTERFACES(QGstBufferPoolInterface:QFactoryInterface) + Q_INTERFACES(QGstBufferPoolInterface) public: explicit QGstBufferPoolPlugin(QObject *parent = 0); virtual ~QGstBufferPoolPlugin() {} @@ -116,8 +115,6 @@ public: This method is called from gstreamer video sink thread. */ virtual QAbstractVideoBuffer *prepareVideoBuffer(GstBuffer *buffer, int bytesPerLine) = 0; - - virtual QStringList keys() const = 0; }; QT_END_NAMESPACE diff --git a/src/multimedia/multimedia.pro b/src/multimedia/multimedia.pro index e7d7b2f3a..d29ba7291 100644 --- a/src/multimedia/multimedia.pro +++ b/src/multimedia/multimedia.pro @@ -2,7 +2,7 @@ load(qt_module) TARGET = QtMultimedia QPRO_PWD = $$PWD -QT = core network gui +QT = core-private network gui CONFIG += module MODULE_PRI += ../../modules/qt_multimedia.pri diff --git a/src/multimedia/playback/qmediaplaylistioplugin_p.h b/src/multimedia/playback/qmediaplaylistioplugin_p.h index 60a12cd4a..5371a9392 100644 --- a/src/multimedia/playback/qmediaplaylistioplugin_p.h +++ b/src/multimedia/playback/qmediaplaylistioplugin_p.h @@ -55,7 +55,6 @@ #include <QtCore/qobject.h> #include <QtCore/qplugin.h> -#include <QtCore/qfactoryinterface.h> #include <qtmultimediadefs.h> @@ -92,7 +91,7 @@ public: virtual void close() = 0; }; -struct Q_MULTIMEDIA_EXPORT QMediaPlaylistIOInterface : public QFactoryInterface +struct Q_MULTIMEDIA_EXPORT QMediaPlaylistIOInterface { virtual bool canRead(QIODevice *device, const QByteArray &format = QByteArray() ) const = 0; virtual bool canRead(const QUrl& location, const QByteArray &format = QByteArray()) const = 0; @@ -111,7 +110,7 @@ Q_DECLARE_INTERFACE(QMediaPlaylistIOInterface, QMediaPlaylistIOInterface_iid); class Q_MULTIMEDIA_EXPORT QMediaPlaylistIOPlugin : public QObject, public QMediaPlaylistIOInterface { Q_OBJECT -Q_INTERFACES(QMediaPlaylistIOInterface:QFactoryInterface) +Q_INTERFACES(QMediaPlaylistIOInterface) public: explicit QMediaPlaylistIOPlugin(QObject *parent = 0); virtual ~QMediaPlaylistIOPlugin(); @@ -121,8 +120,6 @@ public: virtual bool canWrite(QIODevice *device, const QByteArray &format) const = 0; - virtual QStringList keys() const = 0; - virtual QMediaPlaylistReader *createReader(QIODevice *device, const QByteArray &format = QByteArray()) = 0; virtual QMediaPlaylistReader *createReader(const QUrl& location, const QByteArray &format = QByteArray()) = 0; diff --git a/src/multimedia/qmediapluginloader.cpp b/src/multimedia/qmediapluginloader.cpp index 2fc8aba62..42787fdd2 100644 --- a/src/multimedia/qmediapluginloader.cpp +++ b/src/multimedia/qmediapluginloader.cpp @@ -41,191 +41,105 @@ #include "qmediapluginloader_p.h" #include <QtCore/qcoreapplication.h> -#include <QtCore/qpluginloader.h> -#include <QtCore/qdir.h> #include <QtCore/qdebug.h> +#include <QtCore/qjsonarray.h> +#include <private/qfactoryloader_p.h> #include "qmediaserviceproviderplugin.h" -#if defined(Q_OS_MAC) -# include <CoreFoundation/CoreFoundation.h> -#endif - QT_BEGIN_NAMESPACE -typedef QMap<QString,QObjectList> ObjectListMap; -Q_GLOBAL_STATIC(ObjectListMap, staticMediaPlugins); - - -QMediaPluginLoader::QMediaPluginLoader(const char *iid, const QString &location, Qt::CaseSensitivity): +QMediaPluginLoader::QMediaPluginLoader(const char *iid, const QString &location, Qt::CaseSensitivity caseSensitivity): m_iid(iid) { m_location = QString::fromLatin1("/%1").arg(location); - load(); + m_factoryLoader = new QFactoryLoader(m_iid, m_location, caseSensitivity); + loadMetadata(); } -QStringList QMediaPluginLoader::keys() const +QMediaPluginLoader::~QMediaPluginLoader() { - return m_instances.keys(); + delete m_factoryLoader; } -QObject* QMediaPluginLoader::instance(QString const &key) +QStringList QMediaPluginLoader::keys() const { - return m_instances.value(key).value(0); + return m_metadata.keys(); } -QList<QObject*> QMediaPluginLoader::instances(QString const &key) +QObject* QMediaPluginLoader::instance(QString const &key) { - return m_instances.value(key); -} + if (!m_metadata.contains(key)) + return 0; -//to be used for testing purposes only -void QMediaPluginLoader::setStaticPlugins(const QString &location, const QObjectList& objects) -{ - staticMediaPlugins()->insert(QString::fromLatin1("/%1").arg(location), objects); + int idx = m_metadata.value(key).first().value(QStringLiteral("index")).toDouble(); + if (idx < 0) + return 0; + + return m_factoryLoader->instance(idx); } -QStringList QMediaPluginLoader::availablePlugins() const +QList<QObject*> QMediaPluginLoader::instances(QString const &key) { - QStringList paths; - QStringList plugins; - -#if defined(Q_OS_MAC) - QString imageSuffix(qgetenv("DYLD_IMAGE_SUFFIX")); - - // Bundle plugin directory - CFBundleRef mainBundle = CFBundleGetMainBundle(); - if (mainBundle != 0) { - CFURLRef baseUrl = CFBundleCopyBundleURL(mainBundle); - CFURLRef pluginUrlPart = CFBundleCopyBuiltInPlugInsURL(mainBundle); - CFStringRef pluginPathPart = CFURLCopyFileSystemPath(pluginUrlPart, kCFURLPOSIXPathStyle); - CFURLRef pluginUrl = CFURLCreateCopyAppendingPathComponent(0, baseUrl, pluginPathPart, true); - CFStringRef pluginPath = CFURLCopyFileSystemPath(pluginUrl, kCFURLPOSIXPathStyle); - - CFIndex length = CFStringGetLength(pluginPath); - UniChar buffer[length]; - CFStringGetCharacters(pluginPath, CFRangeMake(0, length), buffer); - - paths << QString(reinterpret_cast<const QChar *>(buffer), length); - - CFRelease(pluginPath); - CFRelease(pluginUrl); - CFRelease(pluginPathPart); - CFRelease(pluginUrlPart); - CFRelease(baseUrl); - } -#endif - - // Qt paths - paths << QCoreApplication::libraryPaths(); - - foreach (const QString &path, paths) { - QDir typeDir(path + m_location); - foreach (const QString &file, typeDir.entryList(QDir::Files, QDir::Name)) { -#if defined(Q_OS_MAC) - if (!imageSuffix.isEmpty()) { // Only add appropriate images - if (file.lastIndexOf(imageSuffix, -6) == -1) - continue; - } else { - int foundSuffix = file.lastIndexOf(QLatin1String("_debug.dylib")); - if (foundSuffix == -1) { - foundSuffix = file.lastIndexOf(QLatin1String("_profile.dylib")); - } - if (foundSuffix != -1) { - /* - If this is a "special" version of the plugin, prefer the release - version, where available. - Avoids warnings like: - - objc[23101]: Class TransparentQTMovieView is implemented in both - libqqt7engine_debug.dylib and libqqt7engine.dylib. One of the two - will be used. Which one is undefined. - - Note, this code relies on QDir::Name sorting! - */ - - QString preferred = - typeDir.absoluteFilePath(file.left(foundSuffix) + QLatin1String(".dylib")); - - if (plugins.contains(preferred)) { - continue; - } - } - } -#elif defined(Q_OS_UNIX) - // Ignore separate debug files - if (file.endsWith(QLatin1String(".debug"))) - continue; -#elif defined(Q_OS_WIN) - // Ignore non-dlls - if (!file.endsWith(QLatin1String(".dll"), Qt::CaseInsensitive)) - continue; -#endif - plugins << typeDir.absoluteFilePath(file); + if (!m_metadata.contains(key)) + return QList<QObject*>(); + + QList<QObject *> objects; + foreach (QJsonObject jsonobj, m_metadata.value(key)) { + int idx = jsonobj.value(QStringLiteral("index")).toDouble(); + if (idx < 0) + continue; + + QObject *object = m_factoryLoader->instance(idx); + if (!objects.contains(object)) { + objects.append(object); } } - return plugins; + return objects; } -void QMediaPluginLoader::load() +void QMediaPluginLoader::loadMetadata() { - if (!m_instances.isEmpty()) - return; - #if !defined QT_NO_DEBUG const bool showDebug = qgetenv("QT_DEBUG_PLUGINS").toInt() > 0; #endif - if (staticMediaPlugins() && staticMediaPlugins()->contains(m_location)) { - foreach(QObject *o, staticMediaPlugins()->value(m_location)) { - if (o != 0 && o->qt_metacast(m_iid) != 0) { - QFactoryInterface* p = qobject_cast<QFactoryInterface*>(o); - if (p != 0) { - foreach (QString const &key, p->keys()) - m_instances[key].append(o); - } - } - } - } else { - QSet<QString> loadedPlugins; - - foreach (const QString &plugin, availablePlugins()) { - QString fileName = QFileInfo(plugin).fileName(); - //don't try to load plugin with the same name if it's already loaded - if (loadedPlugins.contains(fileName)) { #if !defined QT_NO_DEBUG - if (showDebug) - qDebug() << "Skip loading plugin" << plugin; + if (showDebug) + qDebug() << "QMediaPluginLoader: loading metadata for iid " << m_iid << " at location " << m_location; #endif - continue; - } - - QPluginLoader loader(plugin); - QObject *o = loader.instance(); - if (o != 0 && o->qt_metacast(m_iid) != 0) { - QFactoryInterface* p = qobject_cast<QFactoryInterface*>(o); - if (p != 0) { - foreach (const QString &key, p->keys()) - m_instances[key].append(o); + if (!m_metadata.isEmpty()) { +#if !defined QT_NO_DEBUG + if (showDebug) + qDebug() << "QMediaPluginLoader: already loaded metadata, returning"; +#endif + return; + } - loadedPlugins.insert(fileName); + QList<QJsonObject> meta = m_factoryLoader->metaData(); + for (int i = 0; i < meta.size(); i++) { + QJsonObject jsonobj = meta.at(i).value(QStringLiteral("MetaData")).toObject(); + jsonobj.insert(QStringLiteral("index"), i); #if !defined QT_NO_DEBUG - if (showDebug) - qDebug() << "Loaded plugin" << plugin << "services:" << p->keys(); + if (showDebug) + qDebug() << "QMediaPluginLoader: Inserted index " << i << " into metadata: " << jsonobj; #endif - } - continue; - } else { + QJsonArray arr = jsonobj.value(QStringLiteral("Keys")).toArray(); + foreach (QJsonValue value, arr) { + QString key = value.toString(); + + if (!m_metadata.contains(key)) { #if !defined QT_NO_DEBUG if (showDebug) - qWarning() << "QMediaPluginLoader: Failed to load plugin: " << plugin << loader.errorString(); + qDebug() << "QMediaPluginLoader: Inserting new list for key: " << key; #endif + m_metadata.insert(key, QList<QJsonObject>()); } - loader.unload(); + m_metadata[key].append(jsonobj); } } } diff --git a/src/multimedia/qmediapluginloader_p.h b/src/multimedia/qmediapluginloader_p.h index 963b6bc40..bf5e61571 100644 --- a/src/multimedia/qmediapluginloader_p.h +++ b/src/multimedia/qmediapluginloader_p.h @@ -58,6 +58,7 @@ #include <QtCore/qstring.h> #include <QtCore/qstringlist.h> #include <QtCore/qmap.h> +#include <QtCore/qjsonobject.h> QT_BEGIN_HEADER @@ -66,7 +67,7 @@ QT_BEGIN_NAMESPACE QT_MODULE(Multimedia) - +class QFactoryLoader; class QMediaServiceProviderPlugin; class Q_MULTIMEDIA_EXPORT QMediaPluginLoader @@ -75,20 +76,20 @@ public: QMediaPluginLoader(const char *iid, const QString &suffix = QString(), Qt::CaseSensitivity = Qt::CaseSensitive); + ~QMediaPluginLoader(); QStringList keys() const; QObject* instance(QString const &key); QList<QObject*> instances(QString const &key); - static void setStaticPlugins(const QString &location, const QObjectList& objects); - private: - void load(); - QStringList availablePlugins() const; + void loadMetadata(); QByteArray m_iid; QString m_location; - QMap<QString, QList<QObject *> > m_instances; + QMap<QString, QList<QJsonObject> > m_metadata; + + QFactoryLoader *m_factoryLoader; }; QT_END_NAMESPACE diff --git a/src/multimedia/qmediaserviceproviderplugin.h b/src/multimedia/qmediaserviceproviderplugin.h index 49638b116..0d98a28e9 100644 --- a/src/multimedia/qmediaserviceproviderplugin.h +++ b/src/multimedia/qmediaserviceproviderplugin.h @@ -44,7 +44,6 @@ #include <QtCore/qstringlist.h> #include <QtCore/qplugin.h> -#include <QtCore/qfactoryinterface.h> #include <qtmedianamespace.h> #include <qtmultimediadefs.h> @@ -106,9 +105,8 @@ private: Q_DECLARE_OPERATORS_FOR_FLAGS(QMediaServiceProviderHint::Features) -struct Q_MULTIMEDIA_EXPORT QMediaServiceProviderFactoryInterface : public QFactoryInterface +struct Q_MULTIMEDIA_EXPORT QMediaServiceProviderFactoryInterface { - virtual QStringList keys() const = 0; virtual QMediaService* create(QString const& key) = 0; virtual void release(QMediaService *service) = 0; }; @@ -158,10 +156,9 @@ Q_DECLARE_INTERFACE(QMediaServiceFeaturesInterface, QMediaServiceFeaturesInterfa class Q_MULTIMEDIA_EXPORT QMediaServiceProviderPlugin : public QObject, public QMediaServiceProviderFactoryInterface { Q_OBJECT - Q_INTERFACES(QMediaServiceProviderFactoryInterface:QFactoryInterface) + Q_INTERFACES(QMediaServiceProviderFactoryInterface) public: - virtual QStringList keys() const = 0; virtual QMediaService* create(const QString& key) = 0; virtual void release(QMediaService *service) = 0; }; diff --git a/src/multimedia/qtmultimediaquicktools_headers/qsgvideonode_p.h b/src/multimedia/qtmultimediaquicktools_headers/qsgvideonode_p.h index f82a337ed..6bdfc2b91 100644 --- a/src/multimedia/qtmultimediaquicktools_headers/qsgvideonode_p.h +++ b/src/multimedia/qtmultimediaquicktools_headers/qsgvideonode_p.h @@ -48,7 +48,6 @@ #include <QtMultimedia/qvideoframe.h> #include <QtMultimedia/qvideosurfaceformat.h> #include <QtGui/qopenglfunctions.h> -#include <QtCore/qfactoryinterface.h> QT_BEGIN_HEADER @@ -74,14 +73,24 @@ private: int m_orientation; }; -class QSGVideoNodeFactory : public QFactoryInterface { +class QSGVideoNodeFactoryInterface +{ public: virtual QList<QVideoFrame::PixelFormat> supportedPixelFormats(QAbstractVideoBuffer::HandleType handleType) const = 0; virtual QSGVideoNode *createNode(const QVideoSurfaceFormat &format) = 0; }; -#define QSGVideoNodeFactory_iid "com.nokia.Qt.QSGVideoNodeFactory" -Q_DECLARE_INTERFACE(QSGVideoNodeFactory, QSGVideoNodeFactory_iid) +#define QSGVideoNodeFactoryInterface_iid "com.nokia.Qt.QSGVideoNodeFactoryInterface" +Q_DECLARE_INTERFACE(QSGVideoNodeFactoryInterface, QSGVideoNodeFactoryInterface_iid) + +class QSGVideoNodeFactoryPlugin : public QObject, public QSGVideoNodeFactoryInterface +{ + Q_OBJECT + Q_INTERFACES(QSGVideoNodeFactoryInterface) +public: + virtual QList<QVideoFrame::PixelFormat> supportedPixelFormats(QAbstractVideoBuffer::HandleType handleType) const = 0; + virtual QSGVideoNode *createNode(const QVideoSurfaceFormat &format) = 0; +}; QT_END_NAMESPACE |