From e25db62a59e86a62990de43f554af3baecdd47ff Mon Sep 17 00:00:00 2001
From: Yoann Lopes <yoann.lopes@digia.com>
Date: Thu, 20 Jun 2013 17:40:11 +0200
Subject: [PATCH] Multimedia plugins now have a unique JSON metadata 'Keys'
 property.

They previously had the multimedia services they provided as keys. This
was a problem when several plugins were available on the same platform,
providing the same multimedia service, but with different features or
capabilities. Since they had the same key, only the first plugin in the
directory was loaded.

Nevertheless, it was actually working until commit 732dcfe7 in qtbase,
as all plugins were loaded even when sharing the same key.

The services a multimedia plugin provides are now declared in the
'Services' property. To preserve compatibility with third-party plugins,
if that new property doesn't exist it falls back to the 'Keys' property.

Task-number: QTBUG-31868
Task-number: QTBUG-31476
Change-Id: Ic3ba32eeef21b69b922bd3d4feb111101559d132
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
---
 src/multimedia/qmediapluginloader.cpp                      | 7 ++++++-
 src/plugins/android/mediaplayer/mediaplayer.json           | 3 ++-
 src/plugins/audiocapture/audiocapture.json                 | 3 ++-
 src/plugins/avfoundation/camera/avfcamera.json             | 3 ++-
 src/plugins/avfoundation/mediaplayer/avfmediaplayer.json   | 3 ++-
 src/plugins/blackberry/blackberry_mediaservice.json        | 3 ++-
 src/plugins/directshow/directshow.json                     | 3 ++-
 src/plugins/directshow/directshow_camera.json              | 3 ++-
 src/plugins/gstreamer/audiodecoder/audiodecoder.json       | 3 ++-
 src/plugins/gstreamer/camerabin/camerabin.json             | 3 ++-
 src/plugins/gstreamer/gstreamer.json                       | 3 ++-
 src/plugins/gstreamer/mediacapture/mediacapture.json       | 3 ++-
 src/plugins/gstreamer/mediacapture/mediacapturecamera.json | 3 ++-
 src/plugins/gstreamer/mediaplayer/mediaplayer.json         | 3 ++-
 src/plugins/qt7/qt7.json                                   | 3 ++-
 src/plugins/v4l/v4l.json                                   | 3 ++-
 src/plugins/wmf/wmf.json                                   | 3 ++-
 .../mockserviceplugin1/mockserviceplugin1.json             | 3 ++-
 .../mockserviceplugin2/mockserviceplugin2.json             | 3 ++-
 .../mockserviceplugin3/mockserviceplugin3.json             | 3 ++-
 .../mockserviceplugin4/mockserviceplugin4.json             | 3 ++-
 21 files changed, 46 insertions(+), 21 deletions(-)

diff --git a/src/multimedia/qmediapluginloader.cpp b/src/multimedia/qmediapluginloader.cpp
index e23e32a3f..1b4a13f83 100644
--- a/src/multimedia/qmediapluginloader.cpp
+++ b/src/multimedia/qmediapluginloader.cpp
@@ -127,7 +127,12 @@ void QMediaPluginLoader::loadMetadata()
             qDebug() << "QMediaPluginLoader: Inserted index " << i << " into metadata: " << jsonobj;
 #endif
 
-        QJsonArray arr = jsonobj.value(QStringLiteral("Keys")).toArray();
+        QJsonArray arr = jsonobj.value(QStringLiteral("Services")).toArray();
+        // Preserve compatibility with older plugins (made before 5.1) in which
+        // services were declared in the 'Keys' property
+        if (arr.isEmpty())
+            arr = jsonobj.value(QStringLiteral("Keys")).toArray();
+
         foreach (QJsonValue value, arr) {
             QString key = value.toString();
 
diff --git a/src/plugins/android/mediaplayer/mediaplayer.json b/src/plugins/android/mediaplayer/mediaplayer.json
index c4a27ea01..f371ebfd7 100644
--- a/src/plugins/android/mediaplayer/mediaplayer.json
+++ b/src/plugins/android/mediaplayer/mediaplayer.json
@@ -1,3 +1,4 @@
 {
-    "Keys": ["org.qt-project.qt.mediaplayer"]
+    "Keys": ["androidmultimedia"],
+    "Services": ["org.qt-project.qt.mediaplayer"]
 }
diff --git a/src/plugins/audiocapture/audiocapture.json b/src/plugins/audiocapture/audiocapture.json
index d963a2e3e..4c7673da2 100644
--- a/src/plugins/audiocapture/audiocapture.json
+++ b/src/plugins/audiocapture/audiocapture.json
@@ -1,3 +1,4 @@
 {
-    "Keys": ["org.qt-project.qt.audiosource"]
+    "Keys": ["audiocapture"],
+    "Services": ["org.qt-project.qt.audiosource"]
 }
diff --git a/src/plugins/avfoundation/camera/avfcamera.json b/src/plugins/avfoundation/camera/avfcamera.json
index d3a58c758..e4310b62c 100644
--- a/src/plugins/avfoundation/camera/avfcamera.json
+++ b/src/plugins/avfoundation/camera/avfcamera.json
@@ -1,3 +1,4 @@
 {
-    "Keys": ["org.qt-project.qt.camera"]
+    "Keys": ["avfoundationcamera"],
+    "Services": ["org.qt-project.qt.camera"]
 }
diff --git a/src/plugins/avfoundation/mediaplayer/avfmediaplayer.json b/src/plugins/avfoundation/mediaplayer/avfmediaplayer.json
index c4a27ea01..5626edec0 100644
--- a/src/plugins/avfoundation/mediaplayer/avfmediaplayer.json
+++ b/src/plugins/avfoundation/mediaplayer/avfmediaplayer.json
@@ -1,3 +1,4 @@
 {
-    "Keys": ["org.qt-project.qt.mediaplayer"]
+    "Keys": ["avfoundationmediaplayer"],
+    "Services": ["org.qt-project.qt.mediaplayer"]
 }
diff --git a/src/plugins/blackberry/blackberry_mediaservice.json b/src/plugins/blackberry/blackberry_mediaservice.json
index 54c1c9f04..2a59cc770 100644
--- a/src/plugins/blackberry/blackberry_mediaservice.json
+++ b/src/plugins/blackberry/blackberry_mediaservice.json
@@ -1,3 +1,4 @@
 {
-    "Keys": ["org.qt-project.qt.camera", "org.qt-project.qt.mediaplayer"]
+    "Keys": ["blackberrymultimedia"],
+    "Services": ["org.qt-project.qt.camera", "org.qt-project.qt.mediaplayer"]
 }
diff --git a/src/plugins/directshow/directshow.json b/src/plugins/directshow/directshow.json
index 54c1c9f04..b1783b5ed 100644
--- a/src/plugins/directshow/directshow.json
+++ b/src/plugins/directshow/directshow.json
@@ -1,3 +1,4 @@
 {
-    "Keys": ["org.qt-project.qt.camera", "org.qt-project.qt.mediaplayer"]
+    "Keys": ["directshow"],
+    "Services": ["org.qt-project.qt.camera", "org.qt-project.qt.mediaplayer"]
 }
diff --git a/src/plugins/directshow/directshow_camera.json b/src/plugins/directshow/directshow_camera.json
index d3a58c758..c37ce2c9a 100644
--- a/src/plugins/directshow/directshow_camera.json
+++ b/src/plugins/directshow/directshow_camera.json
@@ -1,3 +1,4 @@
 {
-    "Keys": ["org.qt-project.qt.camera"]
+    "Keys": ["directshow"],
+    "Services": ["org.qt-project.qt.camera"]
 }
diff --git a/src/plugins/gstreamer/audiodecoder/audiodecoder.json b/src/plugins/gstreamer/audiodecoder/audiodecoder.json
index 3cc81dc72..4314f2efa 100644
--- a/src/plugins/gstreamer/audiodecoder/audiodecoder.json
+++ b/src/plugins/gstreamer/audiodecoder/audiodecoder.json
@@ -1,3 +1,4 @@
 {
-    "Keys": ["org.qt-project.qt.audiodecode"]
+    "Keys": ["gstreameraudiodecode"],
+    "Services": ["org.qt-project.qt.audiodecode"]
 }
diff --git a/src/plugins/gstreamer/camerabin/camerabin.json b/src/plugins/gstreamer/camerabin/camerabin.json
index d3a58c758..3246b4683 100644
--- a/src/plugins/gstreamer/camerabin/camerabin.json
+++ b/src/plugins/gstreamer/camerabin/camerabin.json
@@ -1,3 +1,4 @@
 {
-    "Keys": ["org.qt-project.qt.camera"]
+    "Keys": ["gstreamercamerabin"],
+    "Services": ["org.qt-project.qt.camera"]
 }
diff --git a/src/plugins/gstreamer/gstreamer.json b/src/plugins/gstreamer/gstreamer.json
index 3f6ccdafd..0656cce4f 100644
--- a/src/plugins/gstreamer/gstreamer.json
+++ b/src/plugins/gstreamer/gstreamer.json
@@ -1,3 +1,4 @@
 {
-    "Keys": ["org.qt-project.qt.mediaplayer", "org.qt-project.qt.audiosource", "org.qt-project.qt.camera", "org.qt-project.qt.audiodecode"]
+    "Keys": ["gstreamer"],
+    "Services": ["org.qt-project.qt.mediaplayer", "org.qt-project.qt.audiosource", "org.qt-project.qt.camera", "org.qt-project.qt.audiodecode"]
 }
diff --git a/src/plugins/gstreamer/mediacapture/mediacapture.json b/src/plugins/gstreamer/mediacapture/mediacapture.json
index d963a2e3e..68ca3f55b 100644
--- a/src/plugins/gstreamer/mediacapture/mediacapture.json
+++ b/src/plugins/gstreamer/mediacapture/mediacapture.json
@@ -1,3 +1,4 @@
 {
-    "Keys": ["org.qt-project.qt.audiosource"]
+    "Keys": ["gstreamermediacapture"],
+    "Services": ["org.qt-project.qt.audiosource"]
 }
diff --git a/src/plugins/gstreamer/mediacapture/mediacapturecamera.json b/src/plugins/gstreamer/mediacapture/mediacapturecamera.json
index b31238363..af9f3575f 100644
--- a/src/plugins/gstreamer/mediacapture/mediacapturecamera.json
+++ b/src/plugins/gstreamer/mediacapture/mediacapturecamera.json
@@ -1,3 +1,4 @@
 {
-    "Keys": ["org.qt-project.qt.audiosource", "org.qt-project.qt.camera"]
+    "Keys": ["gstreamermediacapture"]
+    "Services": ["org.qt-project.qt.audiosource", "org.qt-project.qt.camera"]
 }
diff --git a/src/plugins/gstreamer/mediaplayer/mediaplayer.json b/src/plugins/gstreamer/mediaplayer/mediaplayer.json
index c4a27ea01..bd1a7e64d 100644
--- a/src/plugins/gstreamer/mediaplayer/mediaplayer.json
+++ b/src/plugins/gstreamer/mediaplayer/mediaplayer.json
@@ -1,3 +1,4 @@
 {
-    "Keys": ["org.qt-project.qt.mediaplayer"]
+    "Keys": ["gstreamermediaplayer"],
+    "Services": ["org.qt-project.qt.mediaplayer"]
 }
diff --git a/src/plugins/qt7/qt7.json b/src/plugins/qt7/qt7.json
index c4a27ea01..b4cebad99 100644
--- a/src/plugins/qt7/qt7.json
+++ b/src/plugins/qt7/qt7.json
@@ -1,3 +1,4 @@
 {
-    "Keys": ["org.qt-project.qt.mediaplayer"]
+    "Keys": ["qt7"],
+    "Services": ["org.qt-project.qt.mediaplayer"]
 }
diff --git a/src/plugins/v4l/v4l.json b/src/plugins/v4l/v4l.json
index f87f329c1..467fd526f 100644
--- a/src/plugins/v4l/v4l.json
+++ b/src/plugins/v4l/v4l.json
@@ -1,3 +1,4 @@
 {
-    "Keys": ["org.qt-project.qt.radio"]
+    "Keys": ["v4l"],
+    "Services": ["org.qt-project.qt.radio"]
 }
diff --git a/src/plugins/wmf/wmf.json b/src/plugins/wmf/wmf.json
index b350cef41..e70736480 100644
--- a/src/plugins/wmf/wmf.json
+++ b/src/plugins/wmf/wmf.json
@@ -1,3 +1,4 @@
 {
-    "Keys": ["org.qt-project.qt.mediaplayer", "org.qt-project.qt.audiodecode"]
+    "Keys": ["windowsmediafoundation"],
+    "Services": ["org.qt-project.qt.mediaplayer", "org.qt-project.qt.audiodecode"]
 }
diff --git a/tests/auto/unit/qmediaserviceprovider/mockserviceplugin1/mockserviceplugin1.json b/tests/auto/unit/qmediaserviceprovider/mockserviceplugin1/mockserviceplugin1.json
index c4a27ea01..69ff56452 100644
--- a/tests/auto/unit/qmediaserviceprovider/mockserviceplugin1/mockserviceplugin1.json
+++ b/tests/auto/unit/qmediaserviceprovider/mockserviceplugin1/mockserviceplugin1.json
@@ -1,3 +1,4 @@
 {
-    "Keys": ["org.qt-project.qt.mediaplayer"]
+    "Keys": ["mockserviceplugin1"],
+    "Services": ["org.qt-project.qt.mediaplayer"]
 }
diff --git a/tests/auto/unit/qmediaserviceprovider/mockserviceplugin2/mockserviceplugin2.json b/tests/auto/unit/qmediaserviceprovider/mockserviceplugin2/mockserviceplugin2.json
index ec05f3e52..15d8ed505 100644
--- a/tests/auto/unit/qmediaserviceprovider/mockserviceplugin2/mockserviceplugin2.json
+++ b/tests/auto/unit/qmediaserviceprovider/mockserviceplugin2/mockserviceplugin2.json
@@ -1,3 +1,4 @@
 {
-    "Keys": ["org.qt-project.qt.mediaplayer", "org.qt-project.qt.radio"]
+    "Keys": ["mockserviceplugin2"],
+    "Services": ["org.qt-project.qt.mediaplayer", "org.qt-project.qt.radio"]
 }
diff --git a/tests/auto/unit/qmediaserviceprovider/mockserviceplugin3/mockserviceplugin3.json b/tests/auto/unit/qmediaserviceprovider/mockserviceplugin3/mockserviceplugin3.json
index 58bbc4d74..591a02e51 100644
--- a/tests/auto/unit/qmediaserviceprovider/mockserviceplugin3/mockserviceplugin3.json
+++ b/tests/auto/unit/qmediaserviceprovider/mockserviceplugin3/mockserviceplugin3.json
@@ -1,3 +1,4 @@
 {
-    "Keys": ["org.qt-project.qt.mediaplayer", "org.qt-project.qt.audiosource"]
+    "Keys": ["mockserviceplugin3"],
+    "Services": ["org.qt-project.qt.mediaplayer", "org.qt-project.qt.audiosource"]
 }
diff --git a/tests/auto/unit/qmediaserviceprovider/mockserviceplugin4/mockserviceplugin4.json b/tests/auto/unit/qmediaserviceprovider/mockserviceplugin4/mockserviceplugin4.json
index c4a27ea01..d8b8bd7e9 100644
--- a/tests/auto/unit/qmediaserviceprovider/mockserviceplugin4/mockserviceplugin4.json
+++ b/tests/auto/unit/qmediaserviceprovider/mockserviceplugin4/mockserviceplugin4.json
@@ -1,3 +1,4 @@
 {
-    "Keys": ["org.qt-project.qt.mediaplayer"]
+    "Keys": ["mockserviceplugin4"],
+    "Services": ["org.qt-project.qt.mediaplayer"]
 }
-- 
GitLab