Skip to content
Permalink
Browse files

MythPlayer: Pause the audio when the video is lagging.

When using software decoding and the decoder is struggling to keep up,
audio sync may take a long time to recover after startup or following a
skip. Under certain conditions, playback never recovers and because we
are constantly skipping frames, the user sees no screen updates - and
hence playback looks entirely broken.

By pausing the audio when skipping frames, we allow video playback to
catch up.
  • Loading branch information
Mark Kendall
Mark Kendall committed Apr 7, 2011
1 parent a41a2ad commit afe5669be72c3c452dfb626d362ed9166ac916cd
Showing with 13 additions and 1 deletion.
  1. +12 −1 mythtv/libs/libmythtv/mythplayer.cpp
  2. +1 −0 mythtv/libs/libmythtv/mythplayer.h
@@ -201,7 +201,7 @@ MythPlayer::MythPlayer(bool muted)
avsync_predictor(0), avsync_predictor_enabled(false),
refreshrate(0),
lastsync(false), repeat_delay(0),
disp_timecode(0),
disp_timecode(0), avsync_audiopaused(false),
// Time Code stuff
prevtc(0), prevrp(0),
// LiveTVChain stuff
@@ -1717,12 +1717,23 @@ void MythPlayer::AVSync(VideoFrame *buffer, bool limit_delay)
.arg(-diverge);
}

if (!dropframe && avsync_audiopaused)
{
avsync_audiopaused = false;
audio.Pause(false);
}

if (dropframe)
{
// Reset A/V Sync
lastsync = true;
currentaudiotime = AVSyncGetAudiotime();
VERBOSE(VB_PLAYBACK, LOC + dbg + "dropping frame to catch up.");
if (!audio.IsPaused())
{
audio.Pause(true);
avsync_audiopaused = true;
}
}
else if (!using_null_videoout)
{
@@ -712,6 +712,7 @@ class MTV_PUBLIC MythPlayer
bool decode_extra_audio;
int repeat_delay;
int64_t disp_timecode;
bool avsync_audiopaused;

// Time Code stuff
int prevtc; ///< 32 bit timecode if last VideoFrame shown

0 comments on commit afe5669

Please sign in to comment.
You can’t perform that action at this time.