aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRainer Hochecker <fernetmenta@online.de>2015-12-31 17:41:33 +0100
committerRainer Hochecker <fernetmenta@online.de>2016-01-04 22:20:18 +0100
commitbef2fb6594db37f765f74a3983b92572e0f29475 (patch)
tree628d29b00d338233f0e24598ee652cedb406c37a
parent00a63cd03435089d76939531784fbc255b191fb3 (diff)
VideoPlayer: fix for snc of a/v streams - count packets received from demuxer
-rw-r--r--xbmc/cores/VideoPlayer/VideoPlayer.cpp29
-rw-r--r--xbmc/cores/VideoPlayer/VideoPlayer.h2
2 files changed, 24 insertions, 7 deletions
diff --git a/xbmc/cores/VideoPlayer/VideoPlayer.cpp b/xbmc/cores/VideoPlayer/VideoPlayer.cpp
index c6f9c8b9a9..75f3022de7 100644
--- a/xbmc/cores/VideoPlayer/VideoPlayer.cpp
+++ b/xbmc/cores/VideoPlayer/VideoPlayer.cpp
@@ -1642,6 +1642,7 @@ void CVideoPlayer::ProcessAudioData(CDemuxStream* pStream, DemuxPacket* pPacket)
}
m_VideoPlayerAudio->SendMessage(new CDVDMsgDemuxerPacket(pPacket, drop));
+ m_CurrentAudio.packets++;
}
void CVideoPlayer::ProcessVideoData(CDemuxStream* pStream, DemuxPacket* pPacket)
@@ -1662,6 +1663,7 @@ void CVideoPlayer::ProcessVideoData(CDemuxStream* pStream, DemuxPacket* pPacket)
drop = true;
m_VideoPlayerVideo->SendMessage(new CDVDMsgDemuxerPacket(pPacket, drop));
+ m_CurrentVideo.packets++;
}
void CVideoPlayer::ProcessSubData(CDemuxStream* pStream, DemuxPacket* pPacket)
@@ -1881,8 +1883,10 @@ void CVideoPlayer::HandlePlaySpeed()
if ((m_CurrentVideo.syncState == IDVDStreamPlayer::SYNC_WAITSYNC) ||
(m_CurrentAudio.syncState == IDVDStreamPlayer::SYNC_WAITSYNC))
{
- bool video = m_CurrentVideo.id < 0 || (m_CurrentVideo.syncState == IDVDStreamPlayer::SYNC_WAITSYNC);
- bool audio = m_CurrentAudio.id < 0 || (m_CurrentAudio.syncState == IDVDStreamPlayer::SYNC_WAITSYNC);
+ bool video = m_CurrentVideo.id < 0 || (m_CurrentVideo.syncState == IDVDStreamPlayer::SYNC_WAITSYNC) ||
+ (m_CurrentVideo.packets == 0 && m_CurrentAudio.packets > 20);
+ bool audio = m_CurrentAudio.id < 0 || (m_CurrentAudio.syncState == IDVDStreamPlayer::SYNC_WAITSYNC) ||
+ (m_CurrentAudio.packets == 0 && m_CurrentVideo.packets > 20);
if (m_CurrentVideo.syncState == IDVDStreamPlayer::SYNC_INSYNC &&
m_CurrentAudio.syncState == IDVDStreamPlayer::SYNC_WAITSYNC)
@@ -1906,19 +1910,20 @@ void CVideoPlayer::HandlePlaySpeed()
CLog::Log(LOGDEBUG, "VideoPlayer::Sync - Video - pts: %f, cache: %f, totalcache: %f",
m_CurrentVideo.starttime, m_CurrentVideo.cachetime, m_CurrentVideo.cachetotal);
- if (m_CurrentAudio.starttime != DVD_NOPTS_VALUE)
+ if (m_CurrentAudio.starttime != DVD_NOPTS_VALUE && m_CurrentAudio.packets > 0)
{
if (m_pInputStream->IsRealtime())
clock = m_CurrentAudio.starttime - m_CurrentAudio.cachetotal - DVD_MSEC_TO_TIME(400);
else
clock = m_CurrentAudio.starttime - m_CurrentAudio.cachetime;
if (m_CurrentVideo.starttime != DVD_NOPTS_VALUE &&
+ (m_CurrentVideo.packets > 0) &&
m_CurrentVideo.starttime - m_CurrentVideo.cachetotal < clock)
{
clock = m_CurrentVideo.starttime - m_CurrentVideo.cachetotal;
}
}
- else if (m_CurrentVideo.starttime != DVD_NOPTS_VALUE)
+ else if (m_CurrentVideo.starttime != DVD_NOPTS_VALUE && m_CurrentVideo.packets > 0)
{
clock = m_CurrentVideo.starttime - m_CurrentVideo.cachetotal;
}
@@ -2742,12 +2747,15 @@ void CVideoPlayer::HandleMessages()
CSingleLock lock(m_StateSection);
/* prioritize data from video player, but only accept data *
* after it has been started to avoid race conditions after seeks */
- if(m_CurrentVideo.syncState == IDVDStreamPlayer::SYNC_INSYNC && !m_VideoPlayerVideo->SubmittedEOS())
+ if(m_CurrentVideo.syncState == IDVDStreamPlayer::SYNC_INSYNC &&
+ (m_CurrentVideo.packets > 0) &&
+ !m_VideoPlayerVideo->SubmittedEOS())
{
if(state.player == VideoPlayer_VIDEO)
m_State = state;
}
- else if(m_CurrentAudio.syncState == IDVDStreamPlayer::SYNC_INSYNC)
+ else if(m_CurrentAudio.syncState == IDVDStreamPlayer::SYNC_INSYNC &&
+ (m_CurrentAudio.packets > 0))
{
if(state.player == VideoPlayer_AUDIO)
m_State = state;
@@ -3503,6 +3511,7 @@ bool CVideoPlayer::OpenAudioStream(CDVDStreamInfo& hint, bool reset)
static_cast<IDVDStreamPlayerAudio*>(player)->SetSpeed(m_streamPlayerSpeed);
m_CurrentAudio.syncState = IDVDStreamPlayer::SYNC_STARTING;
+ m_CurrentAudio.packets = 0;
}
else if (reset)
player->SendMessage(new CDVDMsg(CDVDMsg::GENERAL_RESET), 0);
@@ -3579,6 +3588,7 @@ bool CVideoPlayer::OpenVideoStream(CDVDStreamInfo& hint, bool reset)
static_cast<IDVDStreamPlayerVideo*>(player)->SetSpeed(m_streamPlayerSpeed);
m_CurrentVideo.syncState = IDVDStreamPlayer::SYNC_STARTING;
+ m_CurrentVideo.packets = 0;
}
else if (reset)
player->SendMessage(new CDVDMsg(CDVDMsg::GENERAL_RESET), 0);
@@ -3722,23 +3732,28 @@ void CVideoPlayer::FlushBuffers(bool queued, double pts, bool accurate, bool syn
m_CurrentVideo.inited = false;
m_CurrentSubtitle.inited = false;
m_CurrentTeletext.inited = false;
+ m_CurrentRadioRDS.inited = false;
}
m_CurrentAudio.dts = DVD_NOPTS_VALUE;
m_CurrentAudio.startpts = startpts;
+ m_CurrentAudio.packets = 0;
m_CurrentVideo.dts = DVD_NOPTS_VALUE;
m_CurrentVideo.startpts = startpts;
+ m_CurrentVideo.packets = 0;
m_CurrentSubtitle.dts = DVD_NOPTS_VALUE;
m_CurrentSubtitle.startpts = startpts;
+ m_CurrentSubtitle.packets = 0;
m_CurrentTeletext.dts = DVD_NOPTS_VALUE;
m_CurrentTeletext.startpts = startpts;
+ m_CurrentTeletext.packets = 0;
- m_CurrentRadioRDS.inited = false;
m_CurrentRadioRDS.dts = DVD_NOPTS_VALUE;
m_CurrentRadioRDS.startpts = startpts;
+ m_CurrentRadioRDS.packets = 0;
if (queued)
{
diff --git a/xbmc/cores/VideoPlayer/VideoPlayer.h b/xbmc/cores/VideoPlayer/VideoPlayer.h
index fec2efa42e..df4435a3a9 100644
--- a/xbmc/cores/VideoPlayer/VideoPlayer.h
+++ b/xbmc/cores/VideoPlayer/VideoPlayer.h
@@ -114,6 +114,7 @@ public:
void* stream; // pointer or integer, identifying stream playing. if it changes stream changed
int changes; // remembered counter from stream to track codec changes
bool inited;
+ unsigned int packets;
IDVDStreamPlayer::ESyncState syncState;
double starttime;
double cachetime;
@@ -142,6 +143,7 @@ public:
stream = NULL;
changes = 0;
inited = false;
+ packets = 0;
syncState = IDVDStreamPlayer::SYNC_STARTING;
starttime = DVD_NOPTS_VALUE;
startpts = DVD_NOPTS_VALUE;