summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPiotr Srebrny <piotr.srebrny@qt.io>2022-05-25 12:30:28 +0200
committerPiotr Srebrny <piotr.srebrny@qt.io>2022-05-27 14:46:35 +0000
commit8230ed46c9fef72591ed4741ab902913b49f3558 (patch)
treed87c6e1eae43c36b1cebf6b92b70e06bede83b43
parent33093140d3a10246e5d1fa7f0bb10e1676186f36 (diff)
Avoid deadlock, don't emit signals while holding mutex
Emitting signals requires grabbing the event loop lock. This can lead to deadlock between Renderer and Decoder, which occurs when Decoder running from event loop tries to access Renderer that is emitting a signal. Change-Id: Ia1fdf06d37fd49e199ef1f1552a98f63aa757995 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
-rw-r--r--src/plugins/multimedia/ffmpeg/qffmpegdecoder.cpp4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/plugins/multimedia/ffmpeg/qffmpegdecoder.cpp b/src/plugins/multimedia/ffmpeg/qffmpegdecoder.cpp
index 3aaf1f781..6968eebaa 100644
--- a/src/plugins/multimedia/ffmpeg/qffmpegdecoder.cpp
+++ b/src/plugins/multimedia/ffmpeg/qffmpegdecoder.cpp
@@ -685,7 +685,9 @@ void VideoRenderer::loop()
if (streamDecoder->isAtEnd()) {
timeOut = -1;
eos.storeRelease(true);
+ mutex.unlock();
emit atEnd();
+ mutex.lock();
return;
}
timeOut = 1;
@@ -877,7 +879,9 @@ void AudioRenderer::loop()
processedUSecs = audioSink->processedUSecs();
timeOut = -1;
eos.storeRelease(true);
+ mutex.unlock();
emit atEnd();
+ mutex.lock();
return;
}
timeOut = 1;