diff options
author | Rainer Hochecker <fernetmenta@online.de> | 2015-04-13 20:10:09 +0200 |
---|---|---|
committer | Rainer Hochecker <fernetmenta@online.de> | 2015-04-13 20:10:09 +0200 |
commit | e8b8ada72156f6d08f582e1892089e3232a2feb7 (patch) | |
tree | 97077370148d6dfe52ce3de2def33fed27a2d26f | |
parent | cc252ce781bd00c06a5d422ce5192d73aafed4f1 (diff) | |
parent | bfa955a5eac113e5ca0fbb59f37dcc387e045691 (diff) |
Merge pull request #6924 from FernetMenta/sync2
dvdplayer: improve audio sync for large packet durations
-rw-r--r-- | xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.cpp | 2 | ||||
-rw-r--r-- | xbmc/cores/dvdplayer/DVDPlayerAudio.cpp | 35 |
2 files changed, 33 insertions, 4 deletions
diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.cpp index daa242a912..b8b1485f58 100644 --- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.cpp +++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEBuffer.cpp @@ -415,4 +415,6 @@ void CActiveAEBufferPoolResample::Flush() m_outputSamples.front()->Return(); m_outputSamples.pop_front(); } + if (m_resampler) + ChangeResampler(); } diff --git a/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp b/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp index 2f83d655b5..74df969217 100644 --- a/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp +++ b/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp @@ -435,8 +435,11 @@ int CDVDPlayerAudio::DecodeFrame(DVDAudioFrame &audioframe) if (speed == DVD_PLAYSPEED_NORMAL) { - m_dvdAudio.Resume(); - m_syncclock = true; + if (speed != m_speed) + { + m_dvdAudio.Resume(); + m_syncclock = true; + } } else { @@ -757,8 +760,24 @@ bool CDVDPlayerAudio::OutputPacket(DVDAudioFrame &audioframe) double clock = m_pClock->GetClock(absolute); double error = m_dvdAudio.GetPlayingPts() - clock; m_dvdAudio.SetResampleRatio(1.0); - if (error > 0) + + // sync audio by skipping or dropping frames if we are above or + // below a given threshold. the constants are aligned with known + // durations: DTS = 11ms, AC3 = 32ms + // during this stage audio is muted + if (error > DVD_MSEC_TO_TIME(10)) { + unsigned int nb_frames = audioframe.nb_frames; + double duration = audioframe.duration; + + // reduce large packets for better sync, i.e. FLAC can have 96ms packets + // 32ms because I know this works good for AC3 + if (audioframe.duration > DVD_MSEC_TO_TIME(32) && audioframe.sample_rate) + { + audioframe.nb_frames = 0.032 * audioframe.sample_rate; + audioframe.duration = ((double)audioframe.nb_frames * DVD_TIME_BASE) / audioframe.sample_rate; + } + int dups = std::min(DVD_MSEC_TO_TIME(100), error) / audioframe.duration; if (dups > 0) CLog::Log(LOGNOTICE,"CDVDPlayerAudio::OutputPacket duplicate %d packets of duration %d", @@ -767,14 +786,22 @@ bool CDVDPlayerAudio::OutputPacket(DVDAudioFrame &audioframe) { m_dvdAudio.AddPackets(audioframe); } + + audioframe.nb_frames = nb_frames; + audioframe.duration = duration; + m_dvdAudio.AddPackets(audioframe); } - else + else if (error < -DVD_MSEC_TO_TIME(32)) { m_dvdAudio.SetPlayingPts(audioframe.pts); CLog::Log(LOGNOTICE,"CDVDPlayerAudio::OutputPacket skipping a packets of duration %d", DVD_TIME_TO_MSEC(audioframe.duration)); } + else + { + m_dvdAudio.AddPackets(audioframe); + } } else if (m_synctype == SYNC_DISCON) { |