aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRainer Hochecker <fernetmenta@online.de>2017-09-17 22:11:24 +0200
committerGitHub <noreply@github.com>2017-09-17 22:11:24 +0200
commitf5bdcb35aa635e4a1438a0695e4025af3f61cf6e (patch)
tree25064f47d27fcce53cebbf827a35bd5c2485d2b7
parent6772aeb3573942ed4934155590e6a03a60b1799a (diff)
parentb6250900a9760216ea39c35e58483aecb9fb58c3 (diff)
Merge pull request #12805 from FernetMenta/smooth
VideoPlayer: smooth motion
-rw-r--r--xbmc/cores/VideoPlayer/VideoRenderers/BaseRenderer.h2
-rw-r--r--xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/MMALRenderer.cpp14
-rw-r--r--xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/MMALRenderer.h2
-rw-r--r--xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererAML.cpp2
-rw-r--r--xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererAML.h2
-rw-r--r--xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererMediaCodecSurface.cpp2
-rw-r--r--xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererMediaCodecSurface.h2
-rw-r--r--xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGL.cpp44
-rw-r--r--xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGL.h3
-rw-r--r--xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.cpp2
-rw-r--r--xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.h2
-rw-r--r--xbmc/cores/VideoPlayer/VideoRenderers/RenderFlags.h1
-rw-r--r--xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp70
-rw-r--r--xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.h2
-rw-r--r--xbmc/cores/VideoPlayer/VideoRenderers/WinRenderer.cpp2
-rw-r--r--xbmc/cores/VideoPlayer/VideoRenderers/WinRenderer.h2
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;