diff options
author | Piotr Srebrny <piotr.srebrny@qt.io> | 2021-09-17 14:32:19 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2021-09-17 13:46:41 +0000 |
commit | 119d54fabda01bef7b7c95d68729746e667d62cf (patch) | |
tree | e24b6888d75cb2429d9e0ae4a7c59cac1154240a /src/multimedia | |
parent | f117648a2d4f443c2bb90ff27070ae46d97a4297 (diff) |
Use condition variable to wait for finalize event inside lock section
The current implemetation does not work as the semaphore is initialized
to 1. The stopRecording() function does not wait for OnFinlize().
Pick-to: 6.2
Change-Id: Id5742bbaf0b055fcf9f6ff38e7cd7f2aaa47ce15
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/multimedia')
-rw-r--r-- | src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader.cpp | 16 | ||||
-rw-r--r-- | src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader_p.h | 4 |
2 files changed, 7 insertions, 13 deletions
diff --git a/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader.cpp b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader.cpp index 670e39f7e..2e338476e 100644 --- a/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader.cpp +++ b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader.cpp @@ -53,8 +53,7 @@ QT_BEGIN_NAMESPACE enum { MEDIA_TYPE_INDEX_DEFAULT = 0xffffffff }; QWindowsMediaDeviceReader::QWindowsMediaDeviceReader(QObject *parent) - : QObject(parent), - m_finalizeSemaphore(1) + : QObject(parent) { m_durationTimer.setInterval(100); connect(&m_durationTimer, SIGNAL(timeout()), this, SLOT(updateDuration())); @@ -758,26 +757,21 @@ bool QWindowsMediaDeviceReader::startRecording(const QString &fileName, const GU void QWindowsMediaDeviceReader::stopRecording() { - // The semaphore is used to ensure the video is properly saved - // to disk, e.g, before the app exits. Released on OnFinalize. - // Acquire it BEFORE locking the mutex, to avoid deadlocks. - m_finalizeSemaphore.acquire(); QMutexLocker locker(&m_mutex); if (m_sinkWriter && m_recording) { HRESULT hr = m_sinkWriter->Finalize(); - if (!SUCCEEDED(hr)) { - m_finalizeSemaphore.release(); + if (SUCCEEDED(hr)) { + m_hasFinalized.wait(&m_mutex); + } else { m_sinkWriter->Release(); m_sinkWriter = nullptr; QMetaObject::invokeMethod(this, "recordingError", Qt::QueuedConnection, Q_ARG(int, hr)); } - } else { - m_finalizeSemaphore.release(); } m_recording = false; @@ -1047,8 +1041,8 @@ STDMETHODIMP QWindowsMediaDeviceReader::OnFinalize(HRESULT) m_sinkWriter->Release(); m_sinkWriter = nullptr; } - m_finalizeSemaphore.release(); emit recordingStopped(); + m_hasFinalized.notify_one(); return S_OK; } diff --git a/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader_p.h b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader_p.h index 3e3aec0fc..e7af22e5d 100644 --- a/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader_p.h +++ b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader_p.h @@ -58,7 +58,7 @@ #include <QtCore/qobject.h> #include <QtCore/qmutex.h> -#include <QtCore/qsemaphore.h> +#include <QtCore/qwaitcondition.h> #include <QtCore/qtimer.h> #include <qvideoframe.h> #include <qcameradevice.h> @@ -146,7 +146,7 @@ private: long m_cRef = 1; QMutex m_mutex; - QSemaphore m_finalizeSemaphore; + QWaitCondition m_hasFinalized; IMFMediaSource *m_videoSource = nullptr; IMFMediaType *m_videoMediaType = nullptr; IMFMediaSource *m_audioSource = nullptr; |