summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtem Dyomin <artem.dyomin@qt.io>2024-01-18 09:53:08 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2024-01-22 11:11:59 +0000
commit699bcbbe4308745be55a7db8709ef27c74909488 (patch)
tree269652722db71b86c3569d382543715730f73274
parentb953c12bf7e356b6e6b78c28e3c21309eaebf274 (diff)
Implement lazy initialization of VideoDevices
As we extend the usage of QPlatformMediaIntegration, adding it in QSoundEffect, we should make the initialization of not necessary things lazy. VideoDevices might run their own cameras tracking pipeline, so we fix video devices firstly. Pick-to: 6.5 Change-Id: I8e447452b4b02247c0708569539d7f9c35b47799 Reviewed-by: Jøger Hansegård <joger.hansegard@qt.io> Reviewed-by: Artem Dyomin <artem.dyomin@qt.io> (cherry picked from commit 2d19467fba0f2ad72d033cfd9b7230cc78d65b7a) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> (cherry picked from commit b4a22952e1ffc0da9335586e162d654f1567279e)
-rw-r--r--src/multimedia/platform/qplatformmediaintegration.cpp10
-rw-r--r--src/multimedia/platform/qplatformmediaintegration_p.h10
-rw-r--r--src/plugins/multimedia/darwin/qdarwinintegration.mm6
-rw-r--r--src/plugins/multimedia/darwin/qdarwinintegration_p.h1
-rw-r--r--src/plugins/multimedia/ffmpeg/qffmpegmediaintegration.cpp25
-rw-r--r--src/plugins/multimedia/ffmpeg/qffmpegmediaintegration_p.h2
-rw-r--r--src/plugins/multimedia/gstreamer/qgstreamerintegration.cpp13
-rw-r--r--src/plugins/multimedia/gstreamer/qgstreamerintegration_p.h3
-rw-r--r--src/plugins/multimedia/qnx/qqnxmediaintegration.cpp10
-rw-r--r--src/plugins/multimedia/qnx/qqnxmediaintegration_p.h2
-rw-r--r--src/plugins/multimedia/wasm/qwasmmediaintegration.cpp12
-rw-r--r--src/plugins/multimedia/wasm/qwasmmediaintegration_p.h1
-rw-r--r--src/plugins/multimedia/windows/qwindowsintegration.cpp7
-rw-r--r--src/plugins/multimedia/windows/qwindowsintegration_p.h2
-rw-r--r--tests/auto/unit/mockbackend/qmockintegration.cpp12
-rw-r--r--tests/auto/unit/mockbackend/qmockintegration.h3
16 files changed, 83 insertions, 36 deletions
diff --git a/src/multimedia/platform/qplatformmediaintegration.cpp b/src/multimedia/platform/qplatformmediaintegration.cpp
index 1fe5e1cd1..5abed10f4 100644
--- a/src/multimedia/platform/qplatformmediaintegration.cpp
+++ b/src/multimedia/platform/qplatformmediaintegration.cpp
@@ -121,7 +121,8 @@ void QPlatformMediaIntegration::setPlatformFactory(Factory factory)
QList<QCameraDevice> QPlatformMediaIntegration::videoInputs()
{
- return m_videoDevices ? m_videoDevices->videoDevices() : QList<QCameraDevice>{};
+ auto devices = videoDevices();
+ return devices ? devices->videoDevices() : QList<QCameraDevice>{};
}
QMaybe<QPlatformAudioInput *> QPlatformMediaIntegration::createAudioInput(QAudioInput *q)
@@ -158,6 +159,13 @@ QPlatformMediaFormatInfo *QPlatformMediaIntegration::createFormatInfo()
return new QPlatformMediaFormatInfo;
}
+QPlatformVideoDevices *QPlatformMediaIntegration::videoDevices()
+{
+ std::call_once(m_videoDevicesOnceFlag,
+ [this]() { m_videoDevices.reset(createVideoDevices()); });
+ return m_videoDevices.get();
+}
+
QPlatformMediaIntegration::QPlatformMediaIntegration() = default;
QPlatformMediaIntegration::~QPlatformMediaIntegration() = default;
diff --git a/src/multimedia/platform/qplatformmediaintegration_p.h b/src/multimedia/platform/qplatformmediaintegration_p.h
index 3fc97a1ce..6755797d9 100644
--- a/src/multimedia/platform/qplatformmediaintegration_p.h
+++ b/src/multimedia/platform/qplatformmediaintegration_p.h
@@ -82,11 +82,13 @@ public:
QList<QCapturableWindow> capturableWindows();
bool isCapturableWindowValid(const QCapturableWindowPrivate &);
- QPlatformVideoDevices *videoDevices() { return m_videoDevices.get(); }
+ QPlatformVideoDevices *videoDevices();
protected:
virtual QPlatformMediaFormatInfo *createFormatInfo();
+ virtual QPlatformVideoDevices *createVideoDevices() { return nullptr; }
+
private:
friend class QMockIntegrationFactory;
// API to be able to test with a mock backend
@@ -95,9 +97,13 @@ private:
static void setPlatformFactory(Factory factory);
protected:
- std::unique_ptr<QPlatformVideoDevices> m_videoDevices;
+ // 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;
+
mutable std::unique_ptr<QPlatformMediaFormatInfo> m_formatInfo;
mutable std::once_flag m_formatInfoOnceFlg;
};
diff --git a/src/plugins/multimedia/darwin/qdarwinintegration.mm b/src/plugins/multimedia/darwin/qdarwinintegration.mm
index 6491f1952..e30c6d7f5 100644
--- a/src/plugins/multimedia/darwin/qdarwinintegration.mm
+++ b/src/plugins/multimedia/darwin/qdarwinintegration.mm
@@ -42,7 +42,6 @@ QDarwinIntegration::QDarwinIntegration()
if (__builtin_available(macOS 11.0, *))
VTRegisterSupplementalVideoDecoderIfAvailable(kCMVideoCodecType_VP9);
#endif
- m_videoDevices = std::make_unique<QAVFVideoDevices>(this);
}
QPlatformMediaFormatInfo *QDarwinIntegration::createFormatInfo()
@@ -50,6 +49,11 @@ QPlatformMediaFormatInfo *QDarwinIntegration::createFormatInfo()
return new QDarwinFormatInfo();
}
+QPlatformVideoDevices *QDarwinIntegration::createVideoDevices()
+{
+ return new QAVFVideoDevices(this);
+}
+
QMaybe<QPlatformAudioDecoder *> QDarwinIntegration::createAudioDecoder(QAudioDecoder *decoder)
{
return new AVFAudioDecoder(decoder);
diff --git a/src/plugins/multimedia/darwin/qdarwinintegration_p.h b/src/plugins/multimedia/darwin/qdarwinintegration_p.h
index 533b5a441..8333de4ec 100644
--- a/src/plugins/multimedia/darwin/qdarwinintegration_p.h
+++ b/src/plugins/multimedia/darwin/qdarwinintegration_p.h
@@ -37,6 +37,7 @@ public:
protected:
QPlatformMediaFormatInfo *createFormatInfo() override;
+ QPlatformVideoDevices *createVideoDevices() override;
};
QT_END_NAMESPACE
diff --git a/src/plugins/multimedia/ffmpeg/qffmpegmediaintegration.cpp b/src/plugins/multimedia/ffmpeg/qffmpegmediaintegration.cpp
index 2e92b6a80..be573d51d 100644
--- a/src/plugins/multimedia/ffmpeg/qffmpegmediaintegration.cpp
+++ b/src/plugins/multimedia/ffmpeg/qffmpegmediaintegration.cpp
@@ -173,16 +173,6 @@ QFFmpegMediaIntegration::QFFmpegMediaIntegration()
setupFFmpegLogger();
-#if defined(Q_OS_ANDROID)
- m_videoDevices = std::make_unique<QAndroidVideoDevices>(this);
-#elif QT_CONFIG(linux_v4l)
- m_videoDevices = std::make_unique<QV4L2CameraDevices>(this);
-#elif defined Q_OS_DARWIN
- m_videoDevices = std::make_unique<QAVFVideoDevices>(this);
-#elif defined(Q_OS_WINDOWS)
- m_videoDevices = std::make_unique<QWindowsVideoDevices>(this);
-#endif
-
#if QT_CONFIG(xlib)
if (QX11SurfaceCapture::isSupported())
m_capturableWindows = std::make_unique<QX11CapturableWindows>();
@@ -323,6 +313,21 @@ QPlatformMediaFormatInfo *QFFmpegMediaIntegration::createFormatInfo()
return new QFFmpegMediaFormatInfo;
}
+QPlatformVideoDevices *QFFmpegMediaIntegration::createVideoDevices()
+{
+#if defined(Q_OS_ANDROID)
+ return new QAndroidVideoDevices(this);
+#elif QT_CONFIG(linux_v4l)
+ return new QV4L2CameraDevices(this);
+#elif defined Q_OS_DARWIN
+ return new QAVFVideoDevices(this);
+#elif defined(Q_OS_WINDOWS)
+ return new QWindowsVideoDevices(this);
+#else
+ return nullptr;
+#endif
+}
+
#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 b68431ba6..61988309b 100644
--- a/src/plugins/multimedia/ffmpeg/qffmpegmediaintegration_p.h
+++ b/src/plugins/multimedia/ffmpeg/qffmpegmediaintegration_p.h
@@ -47,6 +47,8 @@ public:
protected:
QPlatformMediaFormatInfo *createFormatInfo() override;
+
+ QPlatformVideoDevices *createVideoDevices() override;
};
QT_END_NAMESPACE
diff --git a/src/plugins/multimedia/gstreamer/qgstreamerintegration.cpp b/src/plugins/multimedia/gstreamer/qgstreamerintegration.cpp
index 9c3e92c37..4073565f2 100644
--- a/src/plugins/multimedia/gstreamer/qgstreamerintegration.cpp
+++ b/src/plugins/multimedia/gstreamer/qgstreamerintegration.cpp
@@ -40,7 +40,6 @@ public:
QGstreamerIntegration::QGstreamerIntegration()
{
gst_init(nullptr, nullptr);
- m_videoDevices = std::make_unique<QGstreamerVideoDevices>(this);
}
QPlatformMediaFormatInfo *QGstreamerIntegration::createFormatInfo()
@@ -48,6 +47,11 @@ QPlatformMediaFormatInfo *QGstreamerIntegration::createFormatInfo()
return new QGstreamerFormatInfo();
}
+QPlatformVideoDevices *QGstreamerIntegration::createVideoDevices()
+{
+ return new QGstreamerVideoDevices(this);
+}
+
const QGstreamerFormatInfo *QGstreamerIntegration::gstFormatsInfo()
{
return static_cast<const QGstreamerFormatInfo *>(formatInfo());
@@ -98,11 +102,10 @@ QMaybe<QPlatformAudioOutput *> QGstreamerIntegration::createAudioOutput(QAudioOu
return QGstreamerAudioOutput::create(q);
}
-GstDevice *QGstreamerIntegration::videoDevice(const QByteArray &id) const
+GstDevice *QGstreamerIntegration::videoDevice(const QByteArray &id)
{
- return m_videoDevices
- ? static_cast<QGstreamerVideoDevices *>(m_videoDevices.get())->videoDevice(id)
- : nullptr;
+ const auto devices = videoDevices();
+ return devices ? static_cast<QGstreamerVideoDevices *>(devices)->videoDevice(id) : nullptr;
}
QT_END_NAMESPACE
diff --git a/src/plugins/multimedia/gstreamer/qgstreamerintegration_p.h b/src/plugins/multimedia/gstreamer/qgstreamerintegration_p.h
index d6e7271ff..9cb84c57b 100644
--- a/src/plugins/multimedia/gstreamer/qgstreamerintegration_p.h
+++ b/src/plugins/multimedia/gstreamer/qgstreamerintegration_p.h
@@ -45,10 +45,11 @@ public:
QMaybe<QPlatformAudioOutput *> createAudioOutput(QAudioOutput *) override;
const QGstreamerFormatInfo *gstFormatsInfo();
- GstDevice *videoDevice(const QByteArray &id) const;
+ GstDevice *videoDevice(const QByteArray &id);
protected:
QPlatformMediaFormatInfo *createFormatInfo() override;
+ QPlatformVideoDevices *createVideoDevices() override;
};
QT_END_NAMESPACE
diff --git a/src/plugins/multimedia/qnx/qqnxmediaintegration.cpp b/src/plugins/multimedia/qnx/qqnxmediaintegration.cpp
index a3348579b..7bcfc021f 100644
--- a/src/plugins/multimedia/qnx/qqnxmediaintegration.cpp
+++ b/src/plugins/multimedia/qnx/qqnxmediaintegration.cpp
@@ -32,16 +32,18 @@ public:
}
};
-QQnxMediaIntegration::QQnxMediaIntegration()
-{
- m_videoDevices = std::make_unique<QQnxVideoDevices>(this);
-}
+QQnxMediaIntegration::QQnxMediaIntegration() = default;
QPlatformMediaFormatInfo *QQnxMediaIntegration::createFormatInfo()
{
return new QQnxFormatInfo;
}
+QPlatformVideoDevices *QQnxMediaIntegration::createVideoDevices()
+{
+ return new QQnxVideoDevices(this);
+}
+
QMaybe<QPlatformVideoSink *> QQnxMediaIntegration::createVideoSink(QVideoSink *sink)
{
return new QQnxVideoSink(sink);
diff --git a/src/plugins/multimedia/qnx/qqnxmediaintegration_p.h b/src/plugins/multimedia/qnx/qqnxmediaintegration_p.h
index 21ad0d81f..60fafc246 100644
--- a/src/plugins/multimedia/qnx/qqnxmediaintegration_p.h
+++ b/src/plugins/multimedia/qnx/qqnxmediaintegration_p.h
@@ -41,6 +41,8 @@ public:
protected:
QPlatformMediaFormatInfo *createFormatInfo() override;
+
+ QPlatformVideoDevices *createVideoDevices() override;
};
QT_END_NAMESPACE
diff --git a/src/plugins/multimedia/wasm/qwasmmediaintegration.cpp b/src/plugins/multimedia/wasm/qwasmmediaintegration.cpp
index c1f9810ce..c78d86867 100644
--- a/src/plugins/multimedia/wasm/qwasmmediaintegration.cpp
+++ b/src/plugins/multimedia/wasm/qwasmmediaintegration.cpp
@@ -46,10 +46,7 @@ public:
}
};
-QWasmMediaIntegration::QWasmMediaIntegration()
-{
- m_videoDevices = std::make_unique<QWasmCameraDevices>(this);
-}
+QWasmMediaIntegration::QWasmMediaIntegration() = default;
QMaybe<QPlatformMediaPlayer *> QWasmMediaIntegration::createPlayer(QMediaPlayer *player)
{
@@ -77,6 +74,11 @@ QPlatformMediaFormatInfo *QWasmMediaIntegration::createFormatInfo()
return new QPlatformMediaFormatInfo;
}
+QPlatformVideoDevices *QWasmMediaIntegration::createVideoDevices()
+{
+ return new QWasmCameraDevices(this);
+}
+
QMaybe<QPlatformMediaCaptureSession *> QWasmMediaIntegration::createCaptureSession()
{
return new QWasmMediaCaptureSession();
@@ -100,7 +102,7 @@ QWasmMediaIntegration::createImageCapture(QImageCapture *imageCapture)
QList<QCameraDevice> QWasmMediaIntegration::videoInputs()
{
- return m_videoDevices->videoDevices();
+ return videoDevices()->videoDevices();
}
QT_END_NAMESPACE
diff --git a/src/plugins/multimedia/wasm/qwasmmediaintegration_p.h b/src/plugins/multimedia/wasm/qwasmmediaintegration_p.h
index ca5dce34f..d946c1854 100644
--- a/src/plugins/multimedia/wasm/qwasmmediaintegration_p.h
+++ b/src/plugins/multimedia/wasm/qwasmmediaintegration_p.h
@@ -42,6 +42,7 @@ public:
protected:
QPlatformMediaFormatInfo *createFormatInfo() override;
+ QPlatformVideoDevices *createVideoDevices() override;
};
QT_END_NAMESPACE
diff --git a/src/plugins/multimedia/windows/qwindowsintegration.cpp b/src/plugins/multimedia/windows/qwindowsintegration.cpp
index 279c0992b..5ab780a3f 100644
--- a/src/plugins/multimedia/windows/qwindowsintegration.cpp
+++ b/src/plugins/multimedia/windows/qwindowsintegration.cpp
@@ -37,8 +37,6 @@ QWindowsMediaIntegration::QWindowsMediaIntegration()
{
CoInitialize(NULL);
MFStartup(MF_VERSION);
-
- m_videoDevices = std::make_unique<QWindowsVideoDevices>(this);
}
QWindowsMediaIntegration::~QWindowsMediaIntegration()
@@ -52,6 +50,11 @@ QPlatformMediaFormatInfo *QWindowsMediaIntegration::createFormatInfo()
return new QWindowsFormatInfo();
}
+QPlatformVideoDevices *QWindowsMediaIntegration::createVideoDevices()
+{
+ return new QWindowsVideoDevices(this);
+}
+
QMaybe<QPlatformMediaCaptureSession *> QWindowsMediaIntegration::createCaptureSession()
{
return new QWindowsMediaCaptureService();
diff --git a/src/plugins/multimedia/windows/qwindowsintegration_p.h b/src/plugins/multimedia/windows/qwindowsintegration_p.h
index cc6aa4825..5b355eb1d 100644
--- a/src/plugins/multimedia/windows/qwindowsintegration_p.h
+++ b/src/plugins/multimedia/windows/qwindowsintegration_p.h
@@ -41,6 +41,8 @@ public:
protected:
QPlatformMediaFormatInfo *createFormatInfo() override;
+
+ QPlatformVideoDevices *createVideoDevices() override;
};
QT_END_NAMESPACE
diff --git a/tests/auto/unit/mockbackend/qmockintegration.cpp b/tests/auto/unit/mockbackend/qmockintegration.cpp
index 0cdb21491..8330fcd7f 100644
--- a/tests/auto/unit/mockbackend/qmockintegration.cpp
+++ b/tests/auto/unit/mockbackend/qmockintegration.cpp
@@ -77,13 +77,15 @@ private:
QList<QCameraDevice> m_cameraDevices;
};
-QMockIntegration::QMockIntegration()
-{
- m_videoDevices = std::make_unique<QMockVideoDevices>(this);
-}
+QMockIntegration::QMockIntegration() = default;
QMockIntegration::~QMockIntegration() = default;
+QPlatformVideoDevices *QMockIntegration::createVideoDevices()
+{
+ return new QMockVideoDevices(this);
+}
+
QMaybe<QPlatformAudioDecoder *> QMockIntegration::createAudioDecoder(QAudioDecoder *decoder)
{
if (m_flags & NoAudioDecoderInterface)
@@ -163,7 +165,7 @@ QMaybe<QPlatformAudioOutput *> QMockIntegration::createAudioOutput(QAudioOutput
void QMockIntegration::addNewCamera()
{
- static_cast<QMockVideoDevices &>(*m_videoDevices).addNewCamera();
+ static_cast<QMockVideoDevices *>(videoDevices())->addNewCamera();
}
bool QMockCamera::simpleCamera = false;
diff --git a/tests/auto/unit/mockbackend/qmockintegration.h b/tests/auto/unit/mockbackend/qmockintegration.h
index f361f685f..8ff275bb7 100644
--- a/tests/auto/unit/mockbackend/qmockintegration.h
+++ b/tests/auto/unit/mockbackend/qmockintegration.h
@@ -66,6 +66,9 @@ public:
QMockSurfaceCapture *lastScreenCapture() { return m_lastScreenCapture; }
QMockSurfaceCapture *lastWindowCapture() { return m_lastWindowCapture; }
+protected:
+ QPlatformVideoDevices *createVideoDevices() override;
+
private:
friend class QMockIntegrationFactory;
QMockIntegration();