Skip to content


Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

MythPlayer: Fix a Live TV channel change deadlock.

This recognises that the decoder loop effectively has 3 different states
- running, partially paused and completely paused. The partial pause
state still allows the playback thread to decode a single frame on
demand, seek and perform position map syncs. Allowing these while the
decoder is changing adds various complications - hence add a new member
state variable, totalDecoderPause, that ensures the decoder loop does
nothing other than check its own pause state when completely paused.

Aside from fixing a deadlock on channel changes, this should also
speedup decoder changes under certain situations and probably prevents a
couple of even more obscure bugs (e.g. if a seek is triggered at the
same time as a channel change).
  • Loading branch information...
commit 4693357f1e34025b2652e6e17d319ab7c8b850a0 1 parent bfa8827
mark-kendall authored
12 mythtv/libs/libmythtv/mythplayer.cpp
@@ -130,7 +130,8 @@ MythPlayer::MythPlayer(bool muted)
parentWidget(NULL), embedid(0),
embx(-1), emby(-1), embw(-1), embh(-1),
// State
- decoderPaused(false), pauseDecoder(false), unpauseDecoder(false),
+ totalDecoderPause(false), decoderPaused(false),
+ pauseDecoder(false), unpauseDecoder(false),
killdecoder(false), decoderSeek(-1), decodeOneFrame(false),
bufferPaused(false), videoPaused(false),
@@ -2779,6 +2780,12 @@ void MythPlayer::DecoderLoop(bool pause)
+ if (totalDecoderPause)
+ {
+ usleep(1000);
+ continue;
+ }
if (!decoder_change_lock.tryLock(1))
if (decoder)
@@ -4493,6 +4500,7 @@ bool MythPlayer::SetVideoByComponentTag(int tag)
void MythPlayer::SetDecoder(DecoderBase *dec)
+ totalDecoderPause = true;
@@ -4509,6 +4517,8 @@ void MythPlayer::SetDecoder(DecoderBase *dec)
+ totalDecoderPause = false;
bool MythPlayer::PosMapFromEnc(unsigned long long start,
1  mythtv/libs/libmythtv/mythplayer.h
@@ -532,6 +532,7 @@ class MPUBLIC MythPlayer
QWaitCondition decoderThreadUnpause;
mutable QMutex decoderPauseLock;
mutable QMutex decoderSeekLock;
+ bool totalDecoderPause;
bool decoderPaused;
bool pauseDecoder;
bool unpauseDecoder;
Please sign in to comment.
Something went wrong with that request. Please try again.