diff options
author | Artem Dyomin <artem.dyomin@qt.io> | 2023-09-05 18:20:20 +0200 |
---|---|---|
committer | Artem Dyomin <artem.dyomin@qt.io> | 2023-09-06 13:15:07 +0000 |
commit | 13c9472acc761f772b0a14b80b24321b924d69e1 (patch) | |
tree | 3ce8f082433cf06c1148770b8ae68d9137e30291 /src/multimedia/platform | |
parent | ce53fdc205c17a70d8df5297916fa377d2f67c2a (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.cpp | 16 | ||||
-rw-r--r-- | src/multimedia/platform/qplatformmediaintegration_p.h | 9 |
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 |