Skip to content

Commit

Permalink
MythPlayer: Pause the audio when the video is lagging.
Browse files Browse the repository at this point in the history
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 committed Apr 7, 2011
1 parent a41a2ad commit afe5669
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 1 deletion.
13 changes: 12 additions & 1 deletion mythtv/libs/libmythtv/mythplayer.cpp
Expand Up @@ -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
Expand Down Expand Up @@ -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)
{
Expand Down
1 change: 1 addition & 0 deletions mythtv/libs/libmythtv/mythplayer.h
Expand Up @@ -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
Expand Down

0 comments on commit afe5669

Please sign in to comment.