summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtem Dyomin <artem.dyomin@qt.io>2024-01-18 10:14:16 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2024-01-22 12:27:49 +0000
commit67092ac0e8fe2c8464e92cb14143595e62cb9b94 (patch)
treea5064db8a79a6fcddc9a8c9edbdbfa3d5d5a875f
parent699bcbbe4308745be55a7db8709ef27c74909488 (diff)
Implement lazy initialization of CapturableWindows
The patch initializes CapturableWindows lazily as its instance is needed only in specific cases. 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> (cherry picked from commit 4a341efa63036ded55a753c6d723a66afcdaf1c8) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> (cherry picked from commit 3b03b0ec58efcf86063e9fb400b07aebe26f423a)
-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
-rw-r--r--src/plugins/multimedia/ffmpeg/qffmpegmediaintegration.cpp22
-rw-r--r--src/plugins/multimedia/ffmpeg/qffmpegmediaintegration_p.h2
5 files changed, 36 insertions, 18 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
diff --git a/src/plugins/multimedia/ffmpeg/qffmpegmediaintegration.cpp b/src/plugins/multimedia/ffmpeg/qffmpegmediaintegration.cpp
index be573d51d..b2c2081bb 100644
--- a/src/plugins/multimedia/ffmpeg/qffmpegmediaintegration.cpp
+++ b/src/plugins/multimedia/ffmpeg/qffmpegmediaintegration.cpp
@@ -173,15 +173,6 @@ QFFmpegMediaIntegration::QFFmpegMediaIntegration()
setupFFmpegLogger();
-#if QT_CONFIG(xlib)
- if (QX11SurfaceCapture::isSupported())
- m_capturableWindows = std::make_unique<QX11CapturableWindows>();
-#elif defined Q_OS_MACOS
- m_capturableWindows = std::make_unique<QCGCapturableWindows>();
-#elif defined(Q_OS_WINDOWS)
- m_capturableWindows = std::make_unique<QWinCapturableWindows>();
-#endif
-
#ifndef QT_NO_DEBUG
qDebug() << "Available HW decoding frameworks:";
for (auto type : QFFmpeg::HWAccel::decodingDeviceTypes())
@@ -328,6 +319,19 @@ QPlatformVideoDevices *QFFmpegMediaIntegration::createVideoDevices()
#endif
}
+QPlatformCapturableWindows *QFFmpegMediaIntegration::createCapturableWindows()
+{
+#if QT_CONFIG(xlib)
+ if (QX11SurfaceCapture::isSupported())
+ return new QX11CapturableWindows;
+#elif defined Q_OS_MACOS
+ return new QCGCapturableWindows;
+#elif defined(Q_OS_WINDOWS)
+ return new QWinCapturableWindows;
+#endif
+ return nullptr;
+}
+
#ifdef Q_OS_ANDROID
Q_DECL_EXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void * /*reserved*/)
diff --git a/src/plugins/multimedia/ffmpeg/qffmpegmediaintegration_p.h b/src/plugins/multimedia/ffmpeg/qffmpegmediaintegration_p.h
index 61988309b..5e174f327 100644
--- a/src/plugins/multimedia/ffmpeg/qffmpegmediaintegration_p.h
+++ b/src/plugins/multimedia/ffmpeg/qffmpegmediaintegration_p.h
@@ -49,6 +49,8 @@ protected:
QPlatformMediaFormatInfo *createFormatInfo() override;
QPlatformVideoDevices *createVideoDevices() override;
+
+ QPlatformCapturableWindows *createCapturableWindows() override;
};
QT_END_NAMESPACE