1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
From 88a6cf4e4aaa58229b9b07d66c2abd264dfbc2f1 Mon Sep 17 00:00:00 2001
From: Mladen Milinkovic <maxrd2@smoothware.net>
Date: Fri, 17 Jun 2022 21:34:20 +0200
Subject: [PATCH] Fix deadlock/crash while changing audio stream on
paused/stopped media #71
---
src/videoplayer/backend/audiodecoder.cpp | 2 +-
src/videoplayer/backend/decoder.cpp | 1 +
src/videoplayer/backend/ffplayer.cpp | 2 ++
src/videoplayer/videoplayer.cpp | 2 ++
4 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/src/videoplayer/backend/audiodecoder.cpp b/src/videoplayer/backend/audiodecoder.cpp
index d3d13e78..9c7ee1fc 100644
--- a/src/videoplayer/backend/audiodecoder.cpp
+++ b/src/videoplayer/backend/audiodecoder.cpp
@@ -499,7 +499,7 @@ AudioDecoder::run()
// bytes needed for 100ms of audio
const ALint hwMinBytes = m_vs->audClk.speed() * m_fmtTgt.bytesPerSec * .100;
- while(!m_vs->abortRequested) {
+ while(!m_vs->abortRequested && !isInterruptionRequested()) {
ALint hwBufOffset = 0;
alGetSourcei(m_alSrc, AL_BYTE_OFFSET, &hwBufOffset);
if(!std::isnan(af->pts)) {
diff --git a/src/videoplayer/backend/decoder.cpp b/src/videoplayer/backend/decoder.cpp
index 79b1ad7a..8a69d918 100644
--- a/src/videoplayer/backend/decoder.cpp
+++ b/src/videoplayer/backend/decoder.cpp
@@ -155,6 +155,7 @@ Decoder::abort()
m_queue->abort();
if(m_frameQueue)
m_frameQueue->signal();
+ requestInterruption();
wait();
m_queue->flush();
}
diff --git a/src/videoplayer/backend/ffplayer.cpp b/src/videoplayer/backend/ffplayer.cpp
index 88288285..7b26e4a4 100644
--- a/src/videoplayer/backend/ffplayer.cpp
+++ b/src/videoplayer/backend/ffplayer.cpp
@@ -288,6 +288,8 @@ FFPlayer::activeAudioStream()
void
FFPlayer::activeAudioStream(int streamIndex)
{
+ if(!m_vs)
+ return;
streamIndex = streamIndex < 0 ? -1 : m_vs->demuxer->absoluteStreamIndex(AVMEDIA_TYPE_AUDIO, streamIndex);
m_vs->demuxer->selectStream(AVMEDIA_TYPE_AUDIO, streamIndex);
}
diff --git a/src/videoplayer/videoplayer.cpp b/src/videoplayer/videoplayer.cpp
index 0307ce7d..a42babe5 100644
--- a/src/videoplayer/videoplayer.cpp
+++ b/src/videoplayer/videoplayer.cpp
@@ -301,6 +301,8 @@ VideoPlayer::setupNotifications()
//connect(m_player, &FFPlayer::videoStreamsChanged, this, [this](const QStringList &streams){});
connect(m_player, &FFPlayer::audioStreamsChanged, this, [this](const QStringList &streams){
+ if(m_activeAudioStream >= 0)
+ m_player->activeAudioStream(m_activeAudioStream);
emit audioStreamsChanged(m_audioStreams = streams);
emit activeAudioStreamChanged(m_activeAudioStream = m_player->activeAudioStream());
});
--
GitLab
|