summaryrefslogtreecommitdiffstats
path: root/src/multimedia/platform
diff options
context:
space:
mode:
authorArtem Dyomin <artem.dyomin@qt.io>2023-09-05 18:20:20 +0200
committerArtem Dyomin <artem.dyomin@qt.io>2023-09-06 13:15:07 +0000
commit13c9472acc761f772b0a14b80b24321b924d69e1 (patch)
tree3ce8f082433cf06c1148770b8ae68d9137e30291 /src/multimedia/platform
parentce53fdc205c17a70d8df5297916fa377d2f67c2a (diff)
Fix potential thread-safety on lazy media format initialization
Let's have a common approach of lazy media format initialization for all platforms. The approach was introduced in some recent CR, but it hasn't been integrated due to other reasons. Pick-to: 6.5 6.6 Change-Id: I0fff558463753149d2381a2435f8ba300243f0a8 Reviewed-by: Pavel Dubsky <pavel.dubsky@qt.io> Reviewed-by: Artem Dyomin <artem.dyomin@qt.io>
Diffstat (limited to 'src/multimedia/platform')
-rw-r--r--src/multimedia/platform/qplatformmediaintegration.cpp16
-rw-r--r--src/multimedia/platform/qplatformmediaintegration_p.h9
2 files changed, 23 insertions, 2 deletions
diff --git a/src/multimedia/platform/qplatformmediaintegration.cpp b/src/multimedia/platform/qplatformmediaintegration.cpp
index b094d549c..1fe5e1cd1 100644
--- a/src/multimedia/platform/qplatformmediaintegration.cpp
+++ b/src/multimedia/platform/qplatformmediaintegration.cpp
@@ -14,6 +14,7 @@
#include "qplatformcapturablewindows_p.h"
#include "QtCore/private/qfactoryloader_p.h"
+#include "private/qplatformmediaformatinfo_p.h"
#include "qplatformmediaplugin_p.h"
class QDummyIntegration : public QPlatformMediaIntegration
@@ -23,7 +24,6 @@ public:
{
qCritical("QtMultimedia is not currently supported on this platform or compiler.");
}
- QPlatformMediaFormatInfo *formatInfo() override { return nullptr; }
};
static Q_LOGGING_CATEGORY(qLcMediaPlugin, "qt.multimedia.plugin")
@@ -144,6 +144,20 @@ bool QPlatformMediaIntegration::isCapturableWindowValid(const QCapturableWindowP
return m_capturableWindows && m_capturableWindows->isWindowValid(window);
}
+const QPlatformMediaFormatInfo *QPlatformMediaIntegration::formatInfo()
+{
+ std::call_once(m_formatInfoOnceFlg, [this]() {
+ m_formatInfo.reset(createFormatInfo());
+ Q_ASSERT(m_formatInfo);
+ });
+ return m_formatInfo.get();
+}
+
+QPlatformMediaFormatInfo *QPlatformMediaIntegration::createFormatInfo()
+{
+ return new QPlatformMediaFormatInfo;
+}
+
QPlatformMediaIntegration::QPlatformMediaIntegration() = default;
QPlatformMediaIntegration::~QPlatformMediaIntegration() = default;
diff --git a/src/multimedia/platform/qplatformmediaintegration_p.h b/src/multimedia/platform/qplatformmediaintegration_p.h
index 728425355..3fc97a1ce 100644
--- a/src/multimedia/platform/qplatformmediaintegration_p.h
+++ b/src/multimedia/platform/qplatformmediaintegration_p.h
@@ -21,6 +21,7 @@
#include <qstring.h>
#include <memory>
+#include <mutex>
QT_BEGIN_NAMESPACE
@@ -60,7 +61,7 @@ public:
QPlatformMediaIntegration();
virtual ~QPlatformMediaIntegration();
- virtual QPlatformMediaFormatInfo *formatInfo() = 0;
+ const QPlatformMediaFormatInfo *formatInfo();
virtual QList<QCameraDevice> videoInputs();
virtual QMaybe<QPlatformCamera *> createCamera(QCamera *) { return notAvailable; }
@@ -83,6 +84,9 @@ public:
QPlatformVideoDevices *videoDevices() { return m_videoDevices.get(); }
+protected:
+ virtual QPlatformMediaFormatInfo *createFormatInfo();
+
private:
friend class QMockIntegrationFactory;
// API to be able to test with a mock backend
@@ -93,6 +97,9 @@ private:
protected:
std::unique_ptr<QPlatformVideoDevices> m_videoDevices;
std::unique_ptr<QPlatformCapturableWindows> m_capturableWindows;
+
+ mutable std::unique_ptr<QPlatformMediaFormatInfo> m_formatInfo;
+ mutable std::once_flag m_formatInfoOnceFlg;
};
QT_END_NAMESPACE