diff options
author | Artem Dyomin <artem.dyomin@qt.io> | 2024-01-18 10:14:16 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2024-01-22 12:27:49 +0000 |
commit | 67092ac0e8fe2c8464e92cb14143595e62cb9b94 (patch) | |
tree | a5064db8a79a6fcddc9a8c9edbdbfa3d5d5a875f | |
parent | 699bcbbe4308745be55a7db8709ef27c74909488 (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)
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 |