diff options
author | Artem Dyomin <artem.dyomin@qt.io> | 2024-01-18 10:14:16 +0100 |
---|---|---|
committer | Artem Dyomin <artem.dyomin@qt.io> | 2024-01-21 20:02:40 +0000 |
commit | 4a341efa63036ded55a753c6d723a66afcdaf1c8 (patch) | |
tree | 578bdf303610cdaaa7402c40326cd81a95728b67 /src/multimedia | |
parent | 2d19467fba0f2ad72d033cfd9b7230cc78d65b7a (diff) |
Implement lazy initialization of CapturableWindows
The patch initializes CapturableWindows lazily as its instance is
needed only in specific cases.
Pick-to: 6.7 6.6
Change-Id: Ib80dc92b44127a908f47ec893235bece6ec2ef40
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Artem Dyomin <artem.dyomin@qt.io>
Reviewed-by: Jøger Hansegård <joger.hansegard@qt.io>
Diffstat (limited to 'src/multimedia')
-rw-r--r-- | src/multimedia/platform/qplatformmediaintegration.cpp | 15 | ||||
-rw-r--r-- | src/multimedia/platform/qplatformmediaintegration_p.h | 13 | ||||
-rw-r--r-- | src/multimedia/recording/qwindowcapture.cpp | 2 |
3 files changed, 21 insertions, 9 deletions
diff --git a/src/multimedia/platform/qplatformmediaintegration.cpp b/src/multimedia/platform/qplatformmediaintegration.cpp index 5abed10f4..eee36beff 100644 --- a/src/multimedia/platform/qplatformmediaintegration.cpp +++ b/src/multimedia/platform/qplatformmediaintegration.cpp @@ -135,14 +135,16 @@ QMaybe<QPlatformAudioOutput *> QPlatformMediaIntegration::createAudioOutput(QAud return new QPlatformAudioOutput(q); } -QList<QCapturableWindow> QPlatformMediaIntegration::capturableWindows() +QList<QCapturableWindow> QPlatformMediaIntegration::capturableWindowsList() { - return m_capturableWindows ? m_capturableWindows->windows() : QList<QCapturableWindow>{}; + const auto capturableWindows = this->capturableWindows(); + return capturableWindows ? capturableWindows->windows() : QList<QCapturableWindow>{}; } bool QPlatformMediaIntegration::isCapturableWindowValid(const QCapturableWindowPrivate &window) { - return m_capturableWindows && m_capturableWindows->isWindowValid(window); + const auto capturableWindows = this->capturableWindows(); + return capturableWindows && capturableWindows->isWindowValid(window); } const QPlatformMediaFormatInfo *QPlatformMediaIntegration::formatInfo() @@ -166,6 +168,13 @@ QPlatformVideoDevices *QPlatformMediaIntegration::videoDevices() return m_videoDevices.get(); } +QPlatformCapturableWindows *QPlatformMediaIntegration::capturableWindows() +{ + std::call_once(m_capturableWindowsOnceFlag, + [this]() { m_capturableWindows.reset(createCapturableWindows()); }); + return m_capturableWindows.get(); +} + QPlatformMediaIntegration::QPlatformMediaIntegration() = default; QPlatformMediaIntegration::~QPlatformMediaIntegration() = default; diff --git a/src/multimedia/platform/qplatformmediaintegration_p.h b/src/multimedia/platform/qplatformmediaintegration_p.h index 6755797d9..cc40627d0 100644 --- a/src/multimedia/platform/qplatformmediaintegration_p.h +++ b/src/multimedia/platform/qplatformmediaintegration_p.h @@ -79,16 +79,20 @@ public: virtual QMaybe<QPlatformVideoSink *> createVideoSink(QVideoSink *) { return notAvailable; } - QList<QCapturableWindow> capturableWindows(); + QList<QCapturableWindow> capturableWindowsList(); bool isCapturableWindowValid(const QCapturableWindowPrivate &); QPlatformVideoDevices *videoDevices(); + QPlatformCapturableWindows *capturableWindows(); + protected: virtual QPlatformMediaFormatInfo *createFormatInfo(); virtual QPlatformVideoDevices *createVideoDevices() { return nullptr; } + virtual QPlatformCapturableWindows *createCapturableWindows() { return nullptr; } + private: friend class QMockIntegrationFactory; // API to be able to test with a mock backend @@ -96,14 +100,13 @@ private: struct InstanceHolder; static void setPlatformFactory(Factory factory); -protected: - // TODO: initialize via once_flag and move to private - std::unique_ptr<QPlatformCapturableWindows> m_capturableWindows; - private: std::unique_ptr<QPlatformVideoDevices> m_videoDevices; std::once_flag m_videoDevicesOnceFlag; + std::unique_ptr<QPlatformCapturableWindows> m_capturableWindows; + std::once_flag m_capturableWindowsOnceFlag; + mutable std::unique_ptr<QPlatformMediaFormatInfo> m_formatInfo; mutable std::once_flag m_formatInfoOnceFlg; }; diff --git a/src/multimedia/recording/qwindowcapture.cpp b/src/multimedia/recording/qwindowcapture.cpp index ef4417235..69ad60100 100644 --- a/src/multimedia/recording/qwindowcapture.cpp +++ b/src/multimedia/recording/qwindowcapture.cpp @@ -119,7 +119,7 @@ QWindowCapture::~QWindowCapture() */ QList<QCapturableWindow> QWindowCapture::capturableWindows() { - return QPlatformMediaIntegration::instance()->capturableWindows(); + return QPlatformMediaIntegration::instance()->capturableWindowsList(); } QMediaCaptureSession *QWindowCapture::captureSession() const |