summaryrefslogtreecommitdiffstats
path: root/src/multimedia
diff options
context:
space:
mode:
authorJøger Hansegård <joger.hansegard@qt.io>2024-01-28 14:09:08 +0100
committerJøger Hansegård <joger.hansegard@qt.io>2024-01-29 14:41:16 +0100
commit2964b974c24b0e85f7923a2ff0b413d6ba80381c (patch)
tree0e308a3afdf9ceabc1610a48feaccebe92387163 /src/multimedia
parent4d4ce1b8d26363af97b3e0e4800f106d427f38b5 (diff)
Improve performance of retrieving video devices on Windows with FFmpeg
Enumerating USB video devices was slower with the FFmpeg backend on Windows than with the Windows backend. The reason for this issue was that the Windows Media Foundation was not initialized before using WMF APIs to enumerate devices. I suspect that WMF would then have to initialize and uninitialize WMF for every device, and I observed that releasing IMFMediaSource instances in the private createCameraDevice function took over 200 ms. This patch ensures that Windows Media Foundation is initialized before accessing media devices. This reduces the per-device enumeration time to ~10 ms on my computer. Additionally, the patch switches to RAII initialization of the COM runtime, because the COM runtime must be initialized before accessing Windows Media Foundation APIs. Fixes: QTBUG-120026 Task-number: QTBUG-120198 Change-Id: I96084689e603bf460708f7e97b2e01e045cb5023 Reviewed-by: Artem Dyomin <artem.dyomin@qt.io>
Diffstat (limited to 'src/multimedia')
-rw-r--r--src/multimedia/windows/qwindowsmediadevices.cpp4
-rw-r--r--src/multimedia/windows/qwindowsmediadevices_p.h4
2 files changed, 4 insertions, 4 deletions
diff --git a/src/multimedia/windows/qwindowsmediadevices.cpp b/src/multimedia/windows/qwindowsmediadevices.cpp
index fccb7f20f..c622a721c 100644
--- a/src/multimedia/windows/qwindowsmediadevices.cpp
+++ b/src/multimedia/windows/qwindowsmediadevices.cpp
@@ -121,8 +121,6 @@ private:
QWindowsMediaDevices::QWindowsMediaDevices()
: QPlatformMediaDevices()
{
- CoInitialize(nullptr);
-
auto hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), nullptr,
CLSCTX_INPROC_SERVER,__uuidof(IMMDeviceEnumerator),
(void**)&m_deviceEnumerator);
@@ -177,8 +175,6 @@ QWindowsMediaDevices::~QWindowsMediaDevices()
m_deviceEnumerator.Reset();
m_notificationClient.Reset();
m_warmUpAudioClient.Reset();
-
- CoUninitialize();
}
QList<QAudioDevice> QWindowsMediaDevices::availableDevices(QAudioDevice::Mode mode) const
diff --git a/src/multimedia/windows/qwindowsmediadevices_p.h b/src/multimedia/windows/qwindowsmediadevices_p.h
index 92b6260af..c82be8a0d 100644
--- a/src/multimedia/windows/qwindowsmediadevices_p.h
+++ b/src/multimedia/windows/qwindowsmediadevices_p.h
@@ -17,6 +17,8 @@
#include <private/qplatformmediadevices_p.h>
#include <private/qcomptr_p.h>
+#include <QtCore/private/qfunctions_win_p.h>
+#include <private/qwindowsmediafoundation_p.h>
#include <qaudiodevice.h>
@@ -44,6 +46,8 @@ public:
void prepareAudio() override;
private:
+ QComHelper m_comRuntime;
+ QMFRuntimeInit m_wmfRuntime{ QWindowsMediaFoundation::instance() };
QList<QAudioDevice> availableDevices(QAudioDevice::Mode mode) const;
ComPtr<IMMDeviceEnumerator> m_deviceEnumerator;