summaryrefslogtreecommitdiffstats
path: root/src/multimedia/platform
diff options
context:
space:
mode:
authorJøger Hansegård <joger.hansegard@qt.io>2024-01-28 18:21:52 +0100
committerJøger Hansegård <joger.hansegard@qt.io>2024-01-29 16:26:35 +0100
commit5070a7343504bbde988a903c2ef0a2d18af4303b (patch)
treebfa6f6eb7cd34ba5959bc40b4f70e41a7246c21e /src/multimedia/platform
parent2964b974c24b0e85f7923a2ff0b413d6ba80381c (diff)
Use regular plugin loader also in multimedia unit tests
This patch switches to regular plugin loading also in unit tests by introducing a 'mock' media plugin. This plugin is a static plugin, and does not have to be located in the plugin loader's search path. This allow us to create the mock plugin by setting an environment variable instead injecting a mock factory into the qplatformmediaintegration through private APIs. The purpose of this change is to simplify how we create the multimedia backend, and later get better control over its lifetime. Pick-to: 6.7 6.6 6.5 Change-Id: Ie6cc0ebecc21fb4d81e57cc9f257e4fc82f96e6b Reviewed-by: Artem Dyomin <artem.dyomin@qt.io>
Diffstat (limited to 'src/multimedia/platform')
-rw-r--r--src/multimedia/platform/qplatformmediaintegration.cpp53
-rw-r--r--src/multimedia/platform/qplatformmediaintegration_p.h5
2 files changed, 17 insertions, 41 deletions
diff --git a/src/multimedia/platform/qplatformmediaintegration.cpp b/src/multimedia/platform/qplatformmediaintegration.cpp
index e4258a179..d2ef66b7f 100644
--- a/src/multimedia/platform/qplatformmediaintegration.cpp
+++ b/src/multimedia/platform/qplatformmediaintegration.cpp
@@ -75,10 +75,24 @@ namespace {
struct InstanceHolder
{
- // TODO: replace the mutex with std::once
- QBasicMutex mutex;
+ InstanceHolder()
+ {
+ const auto backends = availableBackends();
+ QString backend = QString::fromUtf8(qgetenv("QT_MEDIA_BACKEND"));
+ if (backend.isEmpty() && !backends.isEmpty())
+ backend = defaultBackend(backends);
+
+ qCDebug(qLcMediaPlugin) << "loading backend" << backend;
+ instance.reset(
+ qLoadPlugin<QPlatformMediaIntegration, QPlatformMediaPlugin>(loader(), backend));
+
+ if (!instance) {
+ qWarning() << "could not load multimedia backend" << backend;
+ instance = std::make_unique<QDummyIntegration>();
+ }
+ }
+
std::unique_ptr<QPlatformMediaIntegration> instance;
- std::function<std::unique_ptr<QPlatformMediaIntegration>()> factory;
};
Q_GLOBAL_STATIC(InstanceHolder, instanceHolder);
@@ -89,42 +103,9 @@ QT_BEGIN_NAMESPACE
QPlatformMediaIntegration *QPlatformMediaIntegration::instance()
{
- QMutexLocker locker(&instanceHolder->mutex);
- if (instanceHolder->instance)
- return instanceHolder->instance.get();
-
- if (instanceHolder->factory) {
- instanceHolder->instance = instanceHolder->factory();
- return instanceHolder->instance.get();
- }
-
- const auto backends = availableBackends();
- QString backend = QString::fromUtf8(qgetenv("QT_MEDIA_BACKEND"));
- if (backend.isEmpty() && !backends.isEmpty())
- backend = defaultBackend(backends);
-
- qCDebug(qLcMediaPlugin) << "loading backend" << backend;
- instanceHolder->instance.reset(
- qLoadPlugin<QPlatformMediaIntegration, QPlatformMediaPlugin>(loader(), backend));
-
- if (!instanceHolder->instance) {
- qWarning() << "could not load multimedia backend" << backend;
- instanceHolder->instance = std::make_unique<QDummyIntegration>();
- }
-
return instanceHolder->instance.get();
}
-/*
- This API is there to be able to test with a mock backend.
-*/
-void QPlatformMediaIntegration::setPlatformFactory(std::function<std::unique_ptr<QPlatformMediaIntegration>()> factory)
-{
- Q_ASSERT((factory == nullptr) ^ (instanceHolder->factory == nullptr));
- instanceHolder->instance.reset();
- instanceHolder->factory = std::move(factory);
-}
-
QList<QCameraDevice> QPlatformMediaIntegration::videoInputs()
{
auto devices = videoDevices();
diff --git a/src/multimedia/platform/qplatformmediaintegration_p.h b/src/multimedia/platform/qplatformmediaintegration_p.h
index 10845326c..3f72c618b 100644
--- a/src/multimedia/platform/qplatformmediaintegration_p.h
+++ b/src/multimedia/platform/qplatformmediaintegration_p.h
@@ -101,11 +101,6 @@ protected:
virtual QPlatformCapturableWindows *createCapturableWindows() { return nullptr; }
private:
- friend class QMockIntegrationFactory;
- // API to be able to test with a mock backend
- static void setPlatformFactory(std::function<std::unique_ptr<QPlatformMediaIntegration>()> factory);
-
-private:
std::unique_ptr<QPlatformVideoDevices> m_videoDevices;
std::once_flag m_videoDevicesOnceFlag;