From 509dedc662a46e37a5024ce357978b8cf70b4988 Mon Sep 17 00:00:00 2001 From: Val Doroshchuk Date: Mon, 7 Jan 2019 14:14:50 +0100 Subject: Introduce QT_MULTIMEDIA_PREFERRED_PLUGINS env var Added comma-separated env var to define preferred backend plugins in descending order if multiple backends are available. Also short names of plugins could be used, e.g. "gst" instead of "gstreamermediaplayer", "av" instead of "avfoundationmediaplayer" etc. [ChangleLog] Added QT_MULTIMEDIA_PREFERRED_PLUGINS to specify preferred plugins if multiple backends are available. Change-Id: Iae1a24f2a36d7d133c5771626e68e89f8273b1bf Task-number: QTBUG-56400 Reviewed-by: Oliver Wolff Reviewed-by: Andy Shaw --- src/multimedia/qmediapluginloader.cpp | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'src/multimedia') diff --git a/src/multimedia/qmediapluginloader.cpp b/src/multimedia/qmediapluginloader.cpp index d0a058ac9..78ba3207f 100644 --- a/src/multimedia/qmediapluginloader.cpp +++ b/src/multimedia/qmediapluginloader.cpp @@ -82,6 +82,7 @@ QList QMediaPluginLoader::instances(QString const &key) if (!m_metadata.contains(key)) return QList(); + QList keys; QList objects; const auto list = m_metadata.value(key); for (const QJsonObject &jsonobj : list) { @@ -91,10 +92,39 @@ QList QMediaPluginLoader::instances(QString const &key) QObject *object = m_factoryLoader->instance(idx); if (!objects.contains(object)) { + QJsonArray arr = jsonobj.value(QStringLiteral("Keys")).toArray(); + keys.append(!arr.isEmpty() ? arr.at(0).toString() : QStringLiteral("")); objects.append(object); } } + static const bool showDebug = qEnvironmentVariableIntValue("QT_DEBUG_PLUGINS"); + static const QStringList preferredPlugins = + qEnvironmentVariable("QT_MULTIMEDIA_PREFERRED_PLUGINS").split(QLatin1Char(','), QString::SkipEmptyParts); + for (int i = preferredPlugins.size() - 1; i >= 0; --i) { + auto name = preferredPlugins[i]; + bool found = false; + for (int j = 0; j < keys.size(); ++j) { + if (!keys[j].startsWith(name)) + continue; + + auto obj = objects[j]; + objects.removeAt(j); + objects.prepend(obj); + auto k = keys[j]; + keys.removeAt(j); + keys.prepend(k); + found = true; + break; + } + + if (showDebug && !found) + qWarning() << "QMediaPluginLoader: pattern" << name << "did not match any loaded plugin"; + } + + if (showDebug) + qDebug() << "QMediaPluginLoader: loaded plugins for key" << key << ":" << keys; + return objects; } -- cgit v1.2.3