diff options
author | Rainer Hochecker <fernetmenta@online.de> | 2017-09-17 22:11:24 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-09-17 22:11:24 +0200 |
commit | f5bdcb35aa635e4a1438a0695e4025af3f61cf6e (patch) | |
tree | 25064f47d27fcce53cebbf827a35bd5c2485d2b7 | |
parent | 6772aeb3573942ed4934155590e6a03a60b1799a (diff) | |
parent | b6250900a9760216ea39c35e58483aecb9fb58c3 (diff) |
Merge pull request #12805 from FernetMenta/smooth
VideoPlayer: smooth motion
16 files changed, 76 insertions, 78 deletions
diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/BaseRenderer.h b/xbmc/cores/VideoPlayer/VideoRenderers/BaseRenderer.h index 10afac83f5..949092cb51 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/BaseRenderer.h +++ b/xbmc/cores/VideoPlayer/VideoRenderers/BaseRenderer.h @@ -78,7 +78,7 @@ public: // Render info, can be called before configure virtual CRenderInfo GetRenderInfo() { return CRenderInfo(); } virtual void Update() = 0; - virtual void RenderUpdate(int index, bool clear, unsigned int flags, unsigned int alpha) = 0; + virtual void RenderUpdate(int index, int index2, bool clear, unsigned int flags, unsigned int alpha) = 0; virtual bool RenderCapture(CRenderCapture* capture) = 0; virtual bool ConfigChanged(const VideoPicture &picture) = 0; diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/MMALRenderer.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/MMALRenderer.cpp index 9d4e1eb9ab..ef89e2bbc7 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/MMALRenderer.cpp +++ b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/MMALRenderer.cpp @@ -912,18 +912,18 @@ void CMMALRenderer::Update() ManageRenderArea(); } -void CMMALRenderer::RenderUpdate(int source, bool clear, unsigned int flags, unsigned int alpha) +void CMMALRenderer::RenderUpdate(int index, int index2, bool clear, unsigned int flags, unsigned int alpha) { CSingleLock lock(m_sharedSection); CMMALBuffer *omvb = nullptr; if (!m_bConfigured) { - CLog::Log(LOGDEBUG, LOGVIDEO, "%s::%s - not configured: clear:%d flags:%x alpha:%d source:%d", CLASSNAME, __func__, clear, flags, alpha, source); + CLog::Log(LOGDEBUG, LOGVIDEO, "%s::%s - not configured: clear:%d flags:%x alpha:%d source:%d", CLASSNAME, __func__, clear, flags, alpha, index); goto exit; } - omvb = m_buffers[source]; + omvb = m_buffers[index]; if (g_graphicsContext.GetStereoView() != RENDER_STEREO_VIEW_RIGHT) { @@ -935,7 +935,7 @@ void CMMALRenderer::RenderUpdate(int source, bool clear, unsigned int flags, uns // we only want to upload frames once if (omvb && omvb->m_rendered) { - CLog::Log(LOGDEBUG, LOGVIDEO, "%s::%s - MMAL: clear:%d flags:%x alpha:%d source:%d omvb:%p mmal:%p mflags:%x skipping", CLASSNAME, __func__, clear, flags, alpha, source, omvb, omvb->mmal_buffer, omvb->mmal_buffer->flags); + CLog::Log(LOGDEBUG, LOGVIDEO, "%s::%s - MMAL: clear:%d flags:%x alpha:%d source:%d omvb:%p mmal:%p mflags:%x skipping", CLASSNAME, __func__, clear, flags, alpha, index, omvb, omvb->mmal_buffer, omvb->mmal_buffer->flags); SetVideoRect(m_cachedSourceRect, m_cachedDestRect); goto exit; } @@ -944,7 +944,7 @@ void CMMALRenderer::RenderUpdate(int source, bool clear, unsigned int flags, uns { // dummy buffer from omxplayer if (VERBOSE && g_advancedSettings.CanLogComponent(LOGVIDEO)) - CLog::Log(LOGDEBUG, "%s::%s - OMX: clear:%d flags:%x alpha:%d source:%d omvb:%p", CLASSNAME, __func__, clear, flags, alpha, source, omvb); + CLog::Log(LOGDEBUG, "%s::%s - OMX: clear:%d flags:%x alpha:%d source:%d omvb:%p", CLASSNAME, __func__, clear, flags, alpha, index, omvb); } else if (omvb && omvb->mmal_buffer) { @@ -952,7 +952,7 @@ void CMMALRenderer::RenderUpdate(int source, bool clear, unsigned int flags, uns omvb->mmal_buffer->flags |= MMAL_BUFFER_HEADER_VIDEO_FLAG_INTERLACED | MMAL_BUFFER_HEADER_VIDEO_FLAG_TOP_FIELD_FIRST; else if (flags & RENDER_FLAG_BOT) omvb->mmal_buffer->flags |= MMAL_BUFFER_HEADER_VIDEO_FLAG_INTERLACED; - CLog::Log(LOGDEBUG, LOGVIDEO, "%s::%s - MMAL: clear:%d flags:%x alpha:%d source:%d omvb:%p mmal:%p mflags:%x len:%d data:%p enc:%.4s", CLASSNAME, __func__, clear, flags, alpha, source, omvb, omvb->mmal_buffer, omvb->mmal_buffer->flags, omvb->mmal_buffer->length, omvb->mmal_buffer->data, (char *)&omvb->Encoding()); + CLog::Log(LOGDEBUG, LOGVIDEO, "%s::%s - MMAL: clear:%d flags:%x alpha:%d source:%d omvb:%p mmal:%p mflags:%x len:%d data:%p enc:%.4s", CLASSNAME, __func__, clear, flags, alpha, index, omvb, omvb->mmal_buffer, omvb->mmal_buffer->flags, omvb->mmal_buffer->length, omvb->mmal_buffer->data, (char *)&omvb->Encoding()); assert(omvb->mmal_buffer && omvb->mmal_buffer->data && omvb->mmal_buffer->length); omvb->Acquire(); omvb->m_rendered = true; @@ -960,7 +960,7 @@ void CMMALRenderer::RenderUpdate(int source, bool clear, unsigned int flags, uns mmal_queue_put(m_queue_process, omvb->mmal_buffer); } else - CLog::Log(LOGDEBUG, "%s::%s - MMAL: No buffer to update clear:%d flags:%x alpha:%d source:%d omvb:%p mmal:%p", CLASSNAME, __func__, clear, flags, alpha, source, omvb, omvb ? omvb->mmal_buffer : nullptr); + CLog::Log(LOGDEBUG, "%s::%s - MMAL: No buffer to update clear:%d flags:%x alpha:%d source:%d omvb:%p mmal:%p", CLASSNAME, __func__, clear, flags, alpha, index, omvb, omvb ? omvb->mmal_buffer : nullptr); exit: lock.Leave(); diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/MMALRenderer.h b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/MMALRenderer.h index 9eb6f51161..b00a5626b7 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/MMALRenderer.h +++ b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/MMALRenderer.h @@ -163,7 +163,7 @@ public: virtual bool Supports(ERENDERFEATURE feature) override; virtual bool Supports(ESCALINGMETHOD method) override; - virtual void RenderUpdate(int source, bool clear, unsigned int flags, unsigned int alpha) override; + virtual void RenderUpdate(int index, int index2, bool clear, unsigned int flags, unsigned int alpha) override; virtual void SetVideoRect(const CRect& SrcRect, const CRect& DestRect); virtual bool IsGuiLayer() override { return false; } diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererAML.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererAML.cpp index 00549d9afa..f5a6bc20f7 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererAML.cpp +++ b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererAML.cpp @@ -150,7 +150,7 @@ void CRendererAML::Reset() } } -void CRendererAML::RenderUpdate(int index, bool clear, DWORD flags, DWORD alpha) +void CRendererAML::RenderUpdate(int index, int index2, bool clear, unsigned int flags, unsigned int alpha) { ManageRenderArea(); diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererAML.h b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererAML.h index b498685303..d58e2ee13c 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererAML.h +++ b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererAML.h @@ -46,7 +46,7 @@ public: virtual void UnInit() override {}; virtual void Reset() override; virtual void Update() override {}; - virtual void RenderUpdate(int index, bool clear, unsigned int flags, unsigned int alpha) override; + virtual void RenderUpdate(int index, int index2, bool clear, unsigned int flags, unsigned int alpha) override; virtual bool SupportsMultiPassRendering()override { return false; }; // Player functions diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererMediaCodecSurface.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererMediaCodecSurface.cpp index 3c3306f01f..bd24d71db3 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererMediaCodecSurface.cpp +++ b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererMediaCodecSurface.cpp @@ -119,7 +119,7 @@ void CRendererMediaCodecSurface::Reset() { } -void CRendererMediaCodecSurface::RenderUpdate(int index, bool clear, DWORD flags, DWORD alpha) +void CRendererMediaCodecSurface::RenderUpdate(int index, int index2, bool clear, unsigned int flags, unsigned int alpha) { CXBMCApp::get()->WaitVSync(100); ManageRenderArea(); diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererMediaCodecSurface.h b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererMediaCodecSurface.h index 14ec51e541..201b04cb24 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererMediaCodecSurface.h +++ b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererMediaCodecSurface.h @@ -46,7 +46,7 @@ public: virtual void UnInit() override {}; virtual void Reset() override; virtual void Update() override {}; - virtual void RenderUpdate(int index, bool clear, unsigned int flags, unsigned int alpha) override; + virtual void RenderUpdate(int index, int index2, bool clear, unsigned int flags, unsigned int alpha) override; virtual bool SupportsMultiPassRendering() override { return false; }; // Player functions diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGL.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGL.cpp index f2fdff50ce..7b70d43207 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGL.cpp +++ b/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGL.cpp @@ -143,7 +143,6 @@ CLinuxRendererGL::CLinuxRendererGL() m_fbo.width = 0.0; m_fbo.height = 0.0; m_NumYV12Buffers = 0; - m_iLastRenderBuffer = 0; m_bConfigured = false; m_bValidated = false; m_clearColour = 0.0f; @@ -260,8 +259,6 @@ bool CLinuxRendererGL::Configure(const VideoPicture &picture, float fps, unsigne // frame is loaded after every call to Configure(). m_bValidated = false; - m_iLastRenderBuffer = -1; - m_nonLinStretch = false; m_nonLinStretchGui = false; m_pixelRatio = 1.0; @@ -494,10 +491,12 @@ void CLinuxRendererGL::Update() ValidateRenderTarget(); } -void CLinuxRendererGL::RenderUpdate(int index, bool clear, DWORD flags, DWORD alpha) +void CLinuxRendererGL::RenderUpdate(int index, int index2, bool clear, unsigned int flags, unsigned int alpha) { - m_iLastRenderBuffer = m_iYV12RenderBuffer; - m_iYV12RenderBuffer = index; + if (index2 >= 0) + m_iYV12RenderBuffer = index2; + else + m_iYV12RenderBuffer = index; if (!ValidateRenderer()) { @@ -518,7 +517,7 @@ void CLinuxRendererGL::RenderUpdate(int index, bool clear, DWORD flags, DWORD al ClearBackBuffer(); } - if (alpha<255) + if (alpha < 255) { glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); @@ -530,31 +529,16 @@ void CLinuxRendererGL::RenderUpdate(int index, bool clear, DWORD flags, DWORD al glColor4f(1.0f, 1.0f, 1.0f, 1.0f); } - if(flags & RENDER_FLAG_WEAVE) - { - int top_index = index; - int bot_index = index; + if (!Render(flags, m_iYV12RenderBuffer) && clear) + ClearBackBuffer(); - if((flags & RENDER_FLAG_FIELD0) && m_iLastRenderBuffer > -1) - { - if(flags & RENDER_FLAG_TOP) - bot_index = m_iLastRenderBuffer; - else - top_index = m_iLastRenderBuffer; - } - - glEnable(GL_POLYGON_STIPPLE); - glPolygonStipple(stipple_weave); - Render((flags & ~RENDER_FLAG_FIELDMASK) | RENDER_FLAG_TOP, top_index); - glPolygonStipple(stipple_weave+4); - Render((flags & ~RENDER_FLAG_FIELDMASK) | RENDER_FLAG_BOT, bot_index); - glDisable(GL_POLYGON_STIPPLE); - - } - else + if (index2 >= 0) { - if (!Render(flags, index) && clear) - ClearBackBuffer(); + m_iYV12RenderBuffer = index; + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glColor4f(1.0f, 1.0f, 1.0f, 0.5f); + Render(flags, m_iYV12RenderBuffer); } VerifyGLState(); diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGL.h b/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGL.h index 92c183230a..8a6a0684d6 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGL.h +++ b/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGL.h @@ -113,7 +113,7 @@ public: void Flush() override; void SetBufferSize(int numBuffers) override { m_NumYV12Buffers = numBuffers; } void ReleaseBuffer(int idx) override; - void RenderUpdate(int index, bool clear, DWORD flags, DWORD alpha) override; + void RenderUpdate(int index, int index2, bool clear, unsigned int flags, unsigned int alpha) override; void Update() override; bool RenderCapture(CRenderCapture* capture) override; CRenderInfo GetRenderInfo() override; @@ -175,7 +175,6 @@ protected: int m_iYV12RenderBuffer; int m_NumYV12Buffers; - int m_iLastRenderBuffer; bool m_bConfigured; bool m_bValidated; diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.cpp index f25883ad7b..5df3993267 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.cpp +++ b/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.cpp @@ -361,7 +361,7 @@ void CLinuxRendererGLES::Update() ValidateRenderTarget(); } -void CLinuxRendererGLES::RenderUpdate(int index, bool clear, DWORD flags, DWORD alpha) +void CLinuxRendererGLES::RenderUpdate(int index, int index2, bool clear, unsigned int flags, unsigned int alpha) { m_iYV12RenderBuffer = index; diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.h b/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.h index 063d2f4d5d..a8a7b856b0 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.h +++ b/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.h @@ -121,7 +121,7 @@ public: virtual void SetBufferSize(int numBuffers) override { m_NumYV12Buffers = numBuffers; } virtual bool IsGuiLayer() override; virtual void ReleaseBuffer(int idx) override; - virtual void RenderUpdate(int index, bool clear, DWORD flags, DWORD alpha) override; + virtual void RenderUpdate(int index, int index2, bool clear, unsigned int flags, unsigned int alpha) override; virtual void Update() override; virtual bool RenderCapture(CRenderCapture* capture) override; virtual CRenderInfo GetRenderInfo() override; diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/RenderFlags.h b/xbmc/cores/VideoPlayer/VideoRenderers/RenderFlags.h index b261cdaa6b..c3ae1b08d3 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/RenderFlags.h +++ b/xbmc/cores/VideoPlayer/VideoRenderers/RenderFlags.h @@ -29,7 +29,6 @@ #define RENDER_FLAG_FIELD0 0x80 #define RENDER_FLAG_FIELD1 0x100 -#define RENDER_FLAG_WEAVE 0x200 // #define RENDER_FLAG_LAST 0x40 diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp index b34010a5d8..25ba4391d1 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp +++ b/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp @@ -51,12 +51,6 @@ using namespace KODI::MESSAGING; -static void requeue(std::deque<int> &trg, std::deque<int> &src) -{ - trg.push_back(src.front()); - src.pop_front(); -} - void CRenderManager::CClockSync::Reset() { m_error = 0; @@ -220,6 +214,7 @@ bool CRenderManager::Configure() m_discard.clear(); m_free.clear(); m_presentsource = 0; + m_presentsourcePast = -1; for (int i=1; i < m_QueueSize; i++) m_free.push_back(i); @@ -415,6 +410,7 @@ bool CRenderManager::Flush(bool wait) m_discard.clear(); m_free.clear(); m_presentsource = 0; + m_presentsourcePast = -1; m_presentstep = PRESENT_IDLE; for (int i = 1; i < m_QueueSize; i++) m_free.push_back(i); @@ -683,8 +679,6 @@ void CRenderManager::Render(bool clear, DWORD flags, DWORD alpha, bool gui) if( m.presentmethod == PRESENT_METHOD_BOB ) PresentFields(clear, flags, alpha); - else if( m.presentmethod == PRESENT_METHOD_WEAVE ) - PresentFields(clear, flags | RENDER_FLAG_WEAVE, alpha); else if( m.presentmethod == PRESENT_METHOD_BLEND ) PresentBlend(clear, flags, alpha); else @@ -734,8 +728,7 @@ void CRenderManager::Render(bool clear, DWORD flags, DWORD alpha, bool gui) if (m_presentstep == PRESENT_FRAME) { - if (m.presentmethod == PRESENT_METHOD_BOB || - m.presentmethod == PRESENT_METHOD_WEAVE) + if (m.presentmethod == PRESENT_METHOD_BOB) m_presentstep = PRESENT_FRAME2; else m_presentstep = PRESENT_IDLE; @@ -789,11 +782,11 @@ void CRenderManager::PresentSingle(bool clear, DWORD flags, DWORD alpha) SPresent& m = m_Queue[m_presentsource]; if (m.presentfield == FS_BOT) - m_pRenderer->RenderUpdate(m_presentsource, clear, flags | RENDER_FLAG_BOT, alpha); + m_pRenderer->RenderUpdate(m_presentsource, m_presentsourcePast, clear, flags | RENDER_FLAG_BOT, alpha); else if (m.presentfield == FS_TOP) - m_pRenderer->RenderUpdate(m_presentsource, clear, flags | RENDER_FLAG_TOP, alpha); + m_pRenderer->RenderUpdate(m_presentsource, m_presentsourcePast, clear, flags | RENDER_FLAG_TOP, alpha); else - m_pRenderer->RenderUpdate(m_presentsource, clear, flags, alpha); + m_pRenderer->RenderUpdate(m_presentsource, m_presentsourcePast, clear, flags, alpha); } /* new simpler method of handling interlaced material, * @@ -805,16 +798,16 @@ void CRenderManager::PresentFields(bool clear, DWORD flags, DWORD alpha) if(m_presentstep == PRESENT_FRAME) { if( m.presentfield == FS_BOT) - m_pRenderer->RenderUpdate(m_presentsource, clear, flags | RENDER_FLAG_BOT | RENDER_FLAG_FIELD0, alpha); + m_pRenderer->RenderUpdate(m_presentsource, m_presentsourcePast, clear, flags | RENDER_FLAG_BOT | RENDER_FLAG_FIELD0, alpha); else - m_pRenderer->RenderUpdate(m_presentsource, clear, flags | RENDER_FLAG_TOP | RENDER_FLAG_FIELD0, alpha); + m_pRenderer->RenderUpdate(m_presentsource, m_presentsourcePast, clear, flags | RENDER_FLAG_TOP | RENDER_FLAG_FIELD0, alpha); } else { if( m.presentfield == FS_TOP) - m_pRenderer->RenderUpdate(m_presentsource, clear, flags | RENDER_FLAG_BOT | RENDER_FLAG_FIELD1, alpha); + m_pRenderer->RenderUpdate(m_presentsource, m_presentsourcePast, clear, flags | RENDER_FLAG_BOT | RENDER_FLAG_FIELD1, alpha); else - m_pRenderer->RenderUpdate(m_presentsource, clear, flags | RENDER_FLAG_TOP | RENDER_FLAG_FIELD1, alpha); + m_pRenderer->RenderUpdate(m_presentsource, m_presentsourcePast, clear, flags | RENDER_FLAG_TOP | RENDER_FLAG_FIELD1, alpha); } } @@ -824,13 +817,13 @@ void CRenderManager::PresentBlend(bool clear, DWORD flags, DWORD alpha) if( m.presentfield == FS_BOT ) { - m_pRenderer->RenderUpdate(m_presentsource, clear, flags | RENDER_FLAG_BOT | RENDER_FLAG_NOOSD, alpha); - m_pRenderer->RenderUpdate(m_presentsource, false, flags | RENDER_FLAG_TOP, alpha / 2); + m_pRenderer->RenderUpdate(m_presentsource, m_presentsourcePast, clear, flags | RENDER_FLAG_BOT | RENDER_FLAG_NOOSD, alpha); + m_pRenderer->RenderUpdate(m_presentsource, m_presentsourcePast, false, flags | RENDER_FLAG_TOP, alpha / 2); } else { - m_pRenderer->RenderUpdate(m_presentsource, clear, flags | RENDER_FLAG_TOP | RENDER_FLAG_NOOSD, alpha); - m_pRenderer->RenderUpdate(m_presentsource, false, flags | RENDER_FLAG_BOT, alpha / 2); + m_pRenderer->RenderUpdate(m_presentsource, m_presentsourcePast, clear, flags | RENDER_FLAG_TOP | RENDER_FLAG_NOOSD, alpha); + m_pRenderer->RenderUpdate(m_presentsource, m_presentsourcePast, false, flags | RENDER_FLAG_BOT, alpha / 2); } } @@ -923,8 +916,6 @@ bool CRenderManager::AddVideoPicture(const VideoPicture& picture, volatile std:: { if (deintMethod == VS_INTERLACEMETHOD_RENDER_BLEND) presentmethod = PRESENT_METHOD_BLEND; - else if (deintMethod == VS_INTERLACEMETHOD_RENDER_WEAVE) - presentmethod = PRESENT_METHOD_WEAVE; else if (deintMethod == VS_INTERLACEMETHOD_RENDER_BOB) presentmethod = PRESENT_METHOD_BOB; else @@ -942,7 +933,8 @@ bool CRenderManager::AddVideoPicture(const VideoPicture& picture, volatile std:: m.presentfield = displayField; m.presentmethod = presentmethod; m.pts = picture.pts; - requeue(m_queued, m_free); + m_queued.push_back(m_free.front()); + m_free.pop_front(); m_playerPort->UpdateRenderBuffers(m_queued.size(), m_discard.size(), m_free.size()); // signal to any waiters to check state @@ -1097,6 +1089,12 @@ void CRenderManager::PrepareNextRender() CLog::LogF(LOGDEBUG, LOGAVTIMING, "frameOnScreen: %f renderPts: %f nextFramePts: %f -> diff: %f render: %u forceNext: %u", frameOnScreen, renderPts, nextFramePts, (renderPts - nextFramePts), renderPts >= nextFramePts, m_forceNext); + if (m_presentsourcePast >= 0) + { + m_discard.push_back(m_presentsourcePast); + m_presentsourcePast = -1; + } + if (renderPts >= nextFramePts || m_forceNext) { // see if any future queued frames are already due @@ -1119,8 +1117,13 @@ void CRenderManager::PrepareNextRender() // skip late frames while (m_queued.front() != idx) { - requeue(m_discard, m_queued); - m_QueueSkip++; + if (m_presentsourcePast >= 0) + { + m_discard.push_back(m_presentsourcePast); + m_QueueSkip++; + } + m_presentsourcePast = m_queued.front(); + m_queued.pop_front(); } int lateframes = static_cast<int>((renderPts - m_Queue[idx].pts) * m_fps / DVD_TIME_BASE); @@ -1138,6 +1141,16 @@ void CRenderManager::PrepareNextRender() m_playerPort->UpdateRenderBuffers(m_queued.size(), m_discard.size(), m_free.size()); } + else if (renderPts >= nextFramePts - frametime) + { + m_lateframes = 0; + m_presentstep = PRESENT_FLIP; + m_presentsourcePast = m_presentsource; + m_presentsource = m_queued.front(); + m_queued.pop_front(); + m_presentpts = m_Queue[m_presentsource].pts - m_displayLatency - frametime / 2; + m_presentevent.notifyAll(); + } } void CRenderManager::DiscardBuffer() @@ -1145,7 +1158,10 @@ void CRenderManager::DiscardBuffer() CSingleLock lock2(m_presentlock); while(!m_queued.empty()) - requeue(m_discard, m_queued); + { + m_discard.push_back(m_queued.front()); + m_queued.pop_front(); + } if(m_presentstep == PRESENT_READY) m_presentstep = PRESENT_IDLE; diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.h b/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.h index 4f2a634faa..55f1d1a278 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.h +++ b/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.h @@ -178,7 +178,6 @@ protected: { PRESENT_METHOD_SINGLE = 0, PRESENT_METHOD_BLEND, - PRESENT_METHOD_WEAVE, PRESENT_METHOD_BOB, }; @@ -228,6 +227,7 @@ protected: XbmcThreads::EndTime m_presentTimer; bool m_forceNext = false; int m_presentsource = 0; + int m_presentsourcePast = -1; XbmcThreads::ConditionVariable m_presentevent; CEvent m_flushEvent; CDVDClock &m_dvdClock; diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/WinRenderer.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/WinRenderer.cpp index 379944523d..d748c24e59 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/WinRenderer.cpp +++ b/xbmc/cores/VideoPlayer/VideoRenderers/WinRenderer.cpp @@ -296,7 +296,7 @@ void CWinRenderer::Update() ManageTextures(); } -void CWinRenderer::RenderUpdate(int index, bool clear, unsigned int flags, unsigned int alpha) +void CWinRenderer::RenderUpdate(int index, int index2, bool clear, unsigned int flags, unsigned int alpha) { m_iYV12RenderBuffer = index; diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/WinRenderer.h b/xbmc/cores/VideoPlayer/VideoRenderers/WinRenderer.h index 50e293af55..cd8f4eb0b8 100644 --- a/xbmc/cores/VideoPlayer/VideoRenderers/WinRenderer.h +++ b/xbmc/cores/VideoPlayer/VideoRenderers/WinRenderer.h @@ -63,7 +63,7 @@ public: bool IsConfigured() override { return m_bConfigured; } void Flush() override; CRenderInfo GetRenderInfo() override; - void RenderUpdate(int index, bool clear, unsigned int flags, unsigned int alpha) override; + void RenderUpdate(int index, int index2, bool clear, unsigned int flags, unsigned int alpha) override; void SetBufferSize(int numBuffers) override { m_neededBuffers = numBuffers; } void ReleaseBuffer(int idx) override; bool NeedBuffer(int idx) override; |