summaryrefslogtreecommitdiffstats
path: root/src/multimedia
diff options
context:
space:
mode:
authorArtem Dyomin <artem.dyomin@qt.io>2024-01-18 10:14:16 +0100
committerArtem Dyomin <artem.dyomin@qt.io>2024-01-21 20:02:40 +0000
commit4a341efa63036ded55a753c6d723a66afcdaf1c8 (patch)
tree578bdf303610cdaaa7402c40326cd81a95728b67 /src/multimedia
parent2d19467fba0f2ad72d033cfd9b7230cc78d65b7a (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.cpp15
-rw-r--r--src/multimedia/platform/qplatformmediaintegration_p.h13
-rw-r--r--src/multimedia/recording/qwindowcapture.cpp2
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