diff options
author | Piotr Srebrny <piotr.srebrny@qt.io> | 2022-05-25 12:30:28 +0200 |
---|---|---|
committer | Piotr Srebrny <piotr.srebrny@qt.io> | 2022-05-27 14:46:35 +0000 |
commit | 8230ed46c9fef72591ed4741ab902913b49f3558 (patch) | |
tree | d87c6e1eae43c36b1cebf6b92b70e06bede83b43 | |
parent | 33093140d3a10246e5d1fa7f0bb10e1676186f36 (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.cpp | 4 |
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; |