diff options
author | Jøger Hansegård <joger.hansegard@qt.io> | 2024-01-28 14:09:08 +0100 |
---|---|---|
committer | Jøger Hansegård <joger.hansegard@qt.io> | 2024-01-29 14:41:16 +0100 |
commit | 2964b974c24b0e85f7923a2ff0b413d6ba80381c (patch) | |
tree | 0e308a3afdf9ceabc1610a48feaccebe92387163 /src/multimedia | |
parent | 4d4ce1b8d26363af97b3e0e4800f106d427f38b5 (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.cpp | 4 | ||||
-rw-r--r-- | src/multimedia/windows/qwindowsmediadevices_p.h | 4 |
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; |