summaryrefslogtreecommitdiffstats
path: root/src/multimedia
diff options
context:
space:
mode:
authorPiotr Srebrny <piotr.srebrny@qt.io>2021-09-17 14:32:19 +0200
committerLars Knoll <lars.knoll@qt.io>2021-09-17 13:46:41 +0000
commit119d54fabda01bef7b7c95d68729746e667d62cf (patch)
treee24b6888d75cb2429d9e0ae4a7c59cac1154240a /src/multimedia
parentf117648a2d4f443c2bb90ff27070ae46d97a4297 (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.cpp16
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader_p.h4
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;