Skip to content

Commit

Permalink
VideoPlayer: rework HandlePlayspeed
Browse files Browse the repository at this point in the history
  • Loading branch information
FernetMenta authored and popcornmix committed Sep 16, 2015
1 parent 74925f1 commit be8e012
Showing 1 changed file with 73 additions and 92 deletions.
165 changes: 73 additions & 92 deletions xbmc/cores/VideoPlayer/VideoPlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@
*/

#include "system.h"
#include "VideoPlayer.h"
#include "VideoPlayerRadioRDS.h"
#include "VideoPlayer.h"

#include "DVDInputStreams/DVDInputStream.h"
#include "DVDInputStreams/DVDFactoryInputStream.h"
Expand Down Expand Up @@ -612,9 +612,9 @@ void CVideoPlayer::CreatePlayers()
m_VideoPlayerVideo = new CVideoPlayerVideo(&m_clock, &m_overlayContainer, m_messenger, m_renderManager);
m_VideoPlayerAudio = new CVideoPlayerAudio(&m_clock, m_messenger);
}
m_VideoPlayerRadioRDS = new CDVDRadioRDSData();
m_VideoPlayerSubtitle = new CVideoPlayerSubtitle(&m_overlayContainer);
m_VideoPlayerTeletext = new CDVDTeletextData();
m_VideoPlayerRadioRDS = new CDVDRadioRDSData();
m_players_created = true;
}

Expand All @@ -623,6 +623,7 @@ void CVideoPlayer::DestroyPlayers()
CSingleLock lock(m_players_lock);
if (!m_players_created)
return;

delete m_VideoPlayerVideo;
delete m_VideoPlayerAudio;
delete m_VideoPlayerSubtitle;
Expand Down Expand Up @@ -1636,9 +1637,6 @@ void CVideoPlayer::ProcessAudioData(CDemuxStream* pStream, DemuxPacket* pPacket)
{
CheckStreamChanges(m_CurrentAudio, pStream);

// check if we are too slow and need to recache
CheckStartCaching(m_CurrentAudio);

CheckContinuity(m_CurrentAudio, pPacket);
UpdateTimestamps(m_CurrentAudio, pPacket);

Expand Down Expand Up @@ -1675,9 +1673,6 @@ void CVideoPlayer::ProcessVideoData(CDemuxStream* pStream, DemuxPacket* pPacket)
{
CheckStreamChanges(m_CurrentVideo, pStream);

// check if we are too slow and need to recache
CheckStartCaching(m_CurrentVideo);

if( pPacket->iSize != 4) //don't check the EOF_SEQUENCE of stillframes
{
CheckContinuity(m_CurrentVideo, pPacket);
Expand Down Expand Up @@ -1798,42 +1793,42 @@ void CVideoPlayer::HandlePlaySpeed()
ECacheState caching = m_caching;
bool isInMenu = IsInMenu();

if(isInMenu && caching != CACHESTATE_DONE)
if (isInMenu && caching != CACHESTATE_DONE)
caching = CACHESTATE_DONE;

if(caching == CACHESTATE_FULL)
if (caching == CACHESTATE_FULL)
{
double level, delay, offset;
if(GetCachingTimes(level, delay, offset))
if (GetCachingTimes(level, delay, offset))
{
if(level < 0.0)
if (level < 0.0)
{
CGUIDialogKaiToast::QueueNotification(g_localizeStrings.Get(21454), g_localizeStrings.Get(21455));
caching = CACHESTATE_INIT;
}
if(level >= 1.0)
if (level >= 1.0)
caching = CACHESTATE_INIT;
}
else
{
if ((!m_VideoPlayerAudio->AcceptsData() && m_CurrentAudio.id >= 0)
|| (!m_VideoPlayerVideo->AcceptsData() && m_CurrentVideo.id >= 0))
if ((!m_VideoPlayerAudio->AcceptsData() && m_CurrentAudio.id >= 0) ||
(!m_VideoPlayerVideo->AcceptsData() && m_CurrentVideo.id >= 0))
caching = CACHESTATE_INIT;
}
}

if(caching == CACHESTATE_INIT)
if (caching == CACHESTATE_INIT)
{
// if all enabled streams have been inited we are done
if((m_CurrentVideo.id < 0 || m_CurrentVideo.started)
&& (m_CurrentAudio.id < 0 || m_CurrentAudio.started))
if ((m_CurrentVideo.id < 0 || m_CurrentVideo.started) &&
(m_CurrentAudio.id < 0 || m_CurrentAudio.started))
caching = CACHESTATE_PLAY;

// handle situation that we get no data on one stream
if(m_CurrentAudio.id >= 0 && m_CurrentVideo.id >= 0)
if (m_CurrentAudio.id >= 0 && m_CurrentVideo.id >= 0)
{
if ((!m_VideoPlayerAudio->AcceptsData() && !m_CurrentVideo.started)
|| (!m_VideoPlayerVideo->AcceptsData() && !m_CurrentAudio.started))
if ((!m_VideoPlayerAudio->AcceptsData() && !m_CurrentVideo.started) ||
(!m_VideoPlayerVideo->AcceptsData() && !m_CurrentAudio.started))
{
caching = CACHESTATE_DONE;
}
Expand Down Expand Up @@ -1870,52 +1865,76 @@ void CVideoPlayer::HandlePlaySpeed()
}
}

if(caching == CACHESTATE_PLAY)
if (caching == CACHESTATE_PLAY)
{
// if all enabled streams have started playing we are done
if((m_CurrentVideo.id < 0 || !m_VideoPlayerVideo->IsStalled())
&& (m_CurrentAudio.id < 0 || !m_VideoPlayerAudio->IsStalled()))
if ((m_CurrentVideo.id < 0 || !m_VideoPlayerVideo->IsStalled()) &&
(m_CurrentAudio.id < 0 || !m_VideoPlayerAudio->IsStalled()))
caching = CACHESTATE_DONE;
}

if(m_caching != caching)
SetCaching(caching);

// check buffering levels and adjust clock
if (m_playSpeed == DVD_PLAYSPEED_NORMAL && m_caching == CACHESTATE_DONE && !isInMenu)
if (caching == CACHESTATE_DONE)
{
// due to i.e. discontinuities of pts the stream may have drifted away
// from clock too far for audio to sync back.
if (m_CurrentAudio.id >= 0 && m_CurrentAudio.inited &&
m_VideoPlayerAudio->IsStalled() && m_VideoPlayerAudio->GetLevel() == 0)
if (m_playSpeed == DVD_PLAYSPEED_NORMAL && !isInMenu)
{
CLog::Log(LOGDEBUG,"CVideoPlayer::HandlePlaySpeed - audio stream stalled, triggering re-sync");
TriggerResync();
}

if (CachePVRStream())
{
if (m_CurrentAudio.id >= 0)
// take action is audio or video stream is stalles
if (m_VideoPlayerAudio->IsStalled() || m_VideoPlayerVideo->IsStalled())
{
double adjust = -1.0; // a unique value
if (m_clock.GetSpeedAdjust() == 0.0 && m_VideoPlayerAudio->GetLevel() < 5)
adjust = -0.01;
if (CachePVRStream())
{
if ((m_CurrentAudio.started && m_VideoPlayerAudio->GetLevel() == 0) ||
(m_CurrentVideo.started && m_VideoPlayerVideo->GetLevel() == 0))
{
CLog::Log(LOGDEBUG, "Stream stalled, start buffering. Audio: %d - Video: %d",
m_VideoPlayerAudio->GetLevel(),m_VideoPlayerVideo->GetLevel());
caching = CACHESTATE_PVR;
TriggerResync();
}
}
else
{
// start caching if audio and video have run dry
if (m_VideoPlayerAudio->GetLevel() <= 50 &&
m_VideoPlayerVideo->GetLevel() <= 50)
{
caching = CACHESTATE_FULL;
}
else if (m_CurrentAudio.id >= 0 && m_CurrentAudio.inited &&
m_VideoPlayerAudio->GetLevel() == 0)
{
CLog::Log(LOGDEBUG,"CVideoPlayer::HandlePlaySpeed - audio stream stalled, triggering re-sync");
TriggerResync();
}
}
}
// care for live streams
else if (CachePVRStream())
{
if (m_CurrentAudio.id >= 0)
{
double adjust = -1.0; // a unique value
if (m_clock.GetSpeedAdjust() == 0.0 && m_VideoPlayerAudio->GetLevel() < 5)
adjust = -0.01;

if (m_clock.GetSpeedAdjust() < 0 && m_VideoPlayerAudio->GetLevel() > 20)
adjust = 0.0;
if (m_clock.GetSpeedAdjust() < 0 && m_VideoPlayerAudio->GetLevel() > 20)
adjust = 0.0;

if (adjust != -1.0)
{
m_clock.SetSpeedAdjust(adjust);
if (m_omxplayer_mode)
m_OmxPlayerState.av_clock.OMXSetSpeedAdjust(adjust);
CLog::Log(LOGDEBUG, "CVideoPlayer::HandlePlaySpeed set clock adjust: %f", adjust);
if (adjust != -1.0)
{
m_clock.SetSpeedAdjust(adjust);
if (m_omxplayer_mode)
m_OmxPlayerState.av_clock.OMXSetSpeedAdjust(adjust);
CLog::Log(LOGDEBUG, "CVideoPlayer::HandlePlaySpeed set clock adjust: %f", adjust);
}
}
}
}
}

if(GetPlaySpeed() != DVD_PLAYSPEED_NORMAL && GetPlaySpeed() != DVD_PLAYSPEED_PAUSE)
if (m_caching != caching)
SetCaching(caching);

if(m_playSpeed != DVD_PLAYSPEED_NORMAL && m_playSpeed != DVD_PLAYSPEED_PAUSE)
{
if (isInMenu)
{
Expand Down Expand Up @@ -1988,44 +2007,6 @@ void CVideoPlayer::HandlePlaySpeed()
}
}

bool CVideoPlayer::CheckStartCaching(CCurrentStream& current)
{
if(m_caching != CACHESTATE_DONE
|| m_playSpeed != DVD_PLAYSPEED_NORMAL)
return false;

if(IsInMenu())
return false;

if((current.type == STREAM_AUDIO && m_VideoPlayerAudio->IsStalled())
|| (current.type == STREAM_VIDEO && m_VideoPlayerVideo->IsStalled()))
{
if (CachePVRStream())
{
if ((current.type == STREAM_AUDIO && current.started && m_VideoPlayerAudio->GetLevel() == 0) ||
(current.type == STREAM_VIDEO && current.started && m_VideoPlayerVideo->GetLevel() == 0))
{
CLog::Log(LOGDEBUG, "%s stream stalled. start buffering", current.type == STREAM_AUDIO ? "audio" : "video");
SetCaching(CACHESTATE_PVR);
TriggerResync();
}
return true;
}

// don't start caching if it's only a single stream that has run dry
if(m_VideoPlayerAudio->GetLevel() > 50
|| m_VideoPlayerVideo->GetLevel() > 50)
return false;

if(current.inited)
SetCaching(CACHESTATE_FULL);
else
SetCaching(CACHESTATE_INIT);
return true;
}
return false;
}

bool CVideoPlayer::CheckPlayerInit(CCurrentStream& current)
{
if(current.inited)
Expand Down Expand Up @@ -3723,7 +3704,7 @@ void CVideoPlayer::UpdateClockMaster()
void CVideoPlayer::FlushBuffers(bool queued, double pts, bool accurate, bool sync)
{
double startpts;
if(accurate && !m_omxplayer_mode)
if (accurate && !m_omxplayer_mode)
startpts = pts;
else
startpts = DVD_NOPTS_VALUE;
Expand Down Expand Up @@ -3756,7 +3737,7 @@ void CVideoPlayer::FlushBuffers(bool queued, double pts, bool accurate, bool syn
m_CurrentRadioRDS.dts = DVD_NOPTS_VALUE;
m_CurrentRadioRDS.startpts = startpts;

if(queued)
if (queued)
{
m_VideoPlayerAudio->SendMessage(new CDVDMsg(CDVDMsg::GENERAL_RESET));
m_VideoPlayerVideo->SendMessage(new CDVDMsg(CDVDMsg::GENERAL_RESET));
Expand Down

0 comments on commit be8e012

Please sign in to comment.