diff options
author | Rainer Hochecker <fernetmenta@online.de> | 2016-04-09 10:57:06 +0200 |
---|---|---|
committer | Rainer Hochecker <fernetmenta@online.de> | 2016-04-09 17:51:23 +0200 |
commit | 00ef1d00ce8b77fe8906e83f70cbbaa31b378ee6 (patch) | |
tree | 23a13f35faccc29f7bd2db06a26ba7760bb72619 | |
parent | fa97e0f7ac24e65b96968eed3aad183da8c4c9a0 (diff) |
VideoPlayer: rework frame skipping
-rw-r--r-- | xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp index 3d6b426f59..b1701d4eef 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp +++ b/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp @@ -1309,39 +1309,39 @@ void CRenderManager::PrepareNextRender() // internal buffers of driver, assume that driver lets us go one frame in advance double totalLatency = DVD_SEC_TO_TIME(m_displayLatency) - DVD_MSEC_TO_TIME(m_videoDelay) + 2* frametime; - double clocktime = frameOnScreen + totalLatency; + double renderPts = frameOnScreen + totalLatency; - bool next = clocktime >= m_Queue[m_queued.front()].pts; + bool next = renderPts >= m_Queue[m_queued.front()].pts; if (next) { // see if any future queued frames are already due - std::deque<int>::reverse_iterator curr, prev; - int idx; - curr = prev = m_queued.rbegin(); - ++prev; - while (prev != m_queued.rend()) + auto iter = m_queued.begin(); + int idx = *iter; + ++iter; + while (iter != m_queued.end()) { - if (clocktime > m_Queue[*prev].pts + 2 * frametime && // previous frame is late - clocktime > m_Queue[*curr].pts + frametime) // selected frame due + // the slot for rendering in time is [pts .. (pts + frametime)] + // renderer/drivers have internal queues, being slightliy late here does not mean that + // we are really late. If we don't recover here, player will take action + if (renderPts < m_Queue[*iter].pts + 0.8 * frametime) break; - ++curr; - ++prev; + idx = *iter; + ++iter; } - idx = *curr; - /* skip late frames */ + // skip late frames while(m_queued.front() != idx) { requeue(m_discard, m_queued); m_QueueSkip++; } - m_presentstep = PRESENT_FLIP; + m_presentstep = PRESENT_FLIP; m_discard.push_back(m_presentsource); m_presentsource = idx; m_queued.pop_front(); - m_sleeptime = m_Queue[idx].pts - clocktime + frametime; + m_sleeptime = m_Queue[idx].pts - renderPts + frametime; m_presentpts = m_Queue[idx].pts - totalLatency; m_presentevent.notifyAll(); } |