diff --git a/packages/mediacenter/xbmc/patches/todo/xbmc-811.10-xvba_rpi_fixes-0aff5cd.patch b/packages/mediacenter/xbmc/patches/todo/xbmc-811.10-xvba_rpi_fixes-0aff5cd.patch deleted file mode 100644 index 3cacbeaaa4..0000000000 --- a/packages/mediacenter/xbmc/patches/todo/xbmc-811.10-xvba_rpi_fixes-0aff5cd.patch +++ /dev/null @@ -1,192 +0,0 @@ -From d33a276284356e974dcf14e6c86b74064fb0715f Mon Sep 17 00:00:00 2001 -From: xbmc -Date: Sun, 10 Feb 2013 18:38:56 +0100 -Subject: [PATCH 1/2] renderer: add buffering - get clock via IPlayer - ---- - xbmc/cores/IPlayer.h | 2 ++ - xbmc/cores/VideoRenderers/RenderManager.cpp | 9 ++++++--- - xbmc/cores/VideoRenderers/RenderManager.h | 3 +-- - xbmc/cores/dvdplayer/DVDPlayer.cpp | 7 ++++++- - xbmc/cores/dvdplayer/DVDPlayer.h | 2 ++ - 5 files changed, 17 insertions(+), 6 deletions(-) - -diff --git a/xbmc/cores/IPlayer.h b/xbmc/cores/IPlayer.h -index 5ed88d1..f136998 100644 ---- a/xbmc/cores/IPlayer.h -+++ b/xbmc/cores/IPlayer.h -@@ -229,6 +229,8 @@ class IPlayer - */ - virtual void GetSubtitleCapabilities(std::vector &subCaps) { subCaps.assign(1,IPC_SUBS_ALL); }; - -+ virtual double GetClock(double& absolute, bool interpolated = true) {return 0; }; -+ - protected: - IPlayerCallback& m_callback; - }; -diff --git a/xbmc/cores/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoRenderers/RenderManager.cpp -index 9290f80..4664426 100644 ---- a/xbmc/cores/VideoRenderers/RenderManager.cpp -+++ b/xbmc/cores/VideoRenderers/RenderManager.cpp -@@ -325,7 +325,7 @@ void CXBMCRenderManager::RenderUpdate(bool clear, DWORD flags, DWORD alpha) - m_presentevent.Set(); - } - --unsigned int CXBMCRenderManager::PreInit(CDVDClock *pClock) -+unsigned int CXBMCRenderManager::PreInit() - { - CRetakeLock lock(m_sharedSection); - -@@ -333,7 +333,6 @@ unsigned int CXBMCRenderManager::PreInit(CDVDClock *pClock) - m_presenterr = 0.0; - m_errorindex = 0; - memset(m_errorbuff, 0, sizeof(m_errorbuff)); -- m_pClock = pClock; - - m_bIsStarted = false; - m_bPauseDrawing = false; -@@ -1045,7 +1044,11 @@ void CXBMCRenderManager::PrepareNextRender() - } - - double iClockSleep, iPlayingClock, iCurrentClock; -- iPlayingClock = m_pClock->GetClock(iCurrentClock, false); -+ if (g_application.m_pPlayer) -+ iPlayingClock = g_application.m_pPlayer->GetClock(iCurrentClock, false); -+ else -+ iPlayingClock = iCurrentClock = 0; -+ - iClockSleep = m_renderBuffers[idx].pts - iPlayingClock; - - if (m_speed) -diff --git a/xbmc/cores/VideoRenderers/RenderManager.h b/xbmc/cores/VideoRenderers/RenderManager.h -index 6746957..b931f7d 100644 ---- a/xbmc/cores/VideoRenderers/RenderManager.h -+++ b/xbmc/cores/VideoRenderers/RenderManager.h -@@ -72,7 +72,7 @@ class CXBMCRenderManager - int AddVideoPicture(DVDVideoPicture& picture); - - void FlipPage(volatile bool& bStop, double timestamp = 0.0, int source = -1, EFIELDSYNC sync = FS_NONE, int speed = 0); -- unsigned int PreInit(CDVDClock *pClock); -+ unsigned int PreInit(); - void UnInit(); - bool Flush(); - -@@ -225,7 +225,6 @@ class CXBMCRenderManager - int m_presentsource; - CEvent m_presentevent; - CEvent m_flushEvent; -- CDVDClock *m_pClock; - - - OVERLAY::CRenderer m_overlays; -diff --git a/xbmc/cores/dvdplayer/DVDPlayer.cpp b/xbmc/cores/dvdplayer/DVDPlayer.cpp -index 9e6e470..d0c7cd2 100644 ---- a/xbmc/cores/dvdplayer/DVDPlayer.cpp -+++ b/xbmc/cores/dvdplayer/DVDPlayer.cpp -@@ -463,7 +463,7 @@ bool CDVDPlayer::OpenFile(const CFileItem& file, const CPlayerOptions &options) - m_ready.Reset(); - - #if defined(HAS_VIDEO_PLAYBACK) -- g_renderManager.PreInit(&m_clock); -+ g_renderManager.PreInit(); - #endif - - Create(); -@@ -4129,3 +4129,8 @@ bool CDVDPlayer::CachePVRStream(void) const - !g_PVRManager.IsPlayingRecording() && - g_advancedSettings.m_bPVRCacheInDvdPlayer; - } -+ -+double CDVDPlayer::GetClock(double& absolute, bool interpolated) -+{ -+ return m_clock.GetClock(absolute, interpolated); -+} -diff --git a/xbmc/cores/dvdplayer/DVDPlayer.h b/xbmc/cores/dvdplayer/DVDPlayer.h -index 35bf762..ab73950 100644 ---- a/xbmc/cores/dvdplayer/DVDPlayer.h -+++ b/xbmc/cores/dvdplayer/DVDPlayer.h -@@ -254,6 +254,8 @@ class CDVDPlayer : public IPlayer, public CThread, public IDVDPlayer - virtual bool SwitchChannel(const PVR::CPVRChannel &channel); - virtual bool CachePVRStream(void) const; - -+ virtual double GetClock(double& absolute, bool interpolated = true); -+ - enum ECacheState - { CACHESTATE_DONE = 0 - , CACHESTATE_FULL // player is filling up the demux queue --- -1.7.10 - - -From 0aff5cdc544caa87fe5e314e5624c07a160ffe61 Mon Sep 17 00:00:00 2001 -From: xbmc -Date: Sun, 10 Feb 2013 18:40:30 +0100 -Subject: [PATCH 2/2] OMXPlayer: adopt to buffering in renderer - ---- - xbmc/cores/omxplayer/OMXPlayer.cpp | 5 +++++ - xbmc/cores/omxplayer/OMXPlayer.h | 2 ++ - xbmc/cores/omxplayer/OMXPlayerVideo.cpp | 17 +++++++++++++---- - 3 files changed, 20 insertions(+), 4 deletions(-) - -diff --git a/xbmc/cores/omxplayer/OMXPlayer.cpp b/xbmc/cores/omxplayer/OMXPlayer.cpp -index 60aa9ab..1acb9e2 100644 ---- a/xbmc/cores/omxplayer/OMXPlayer.cpp -+++ b/xbmc/cores/omxplayer/OMXPlayer.cpp -@@ -4210,4 +4210,9 @@ void COMXPlayer::GetSubtitleCapabilities(std::vector &subCaps) - subCaps.push_back(IPC_SUBS_ALL); - } - -+double COMXPlayer::GetClock(double& absolute, bool interpolated) -+{ -+ return m_av_clock.GetClock(absolute, interpolated); -+} -+ - #endif -diff --git a/xbmc/cores/omxplayer/OMXPlayer.h b/xbmc/cores/omxplayer/OMXPlayer.h -index ca824c2..57fc7a0 100644 ---- a/xbmc/cores/omxplayer/OMXPlayer.h -+++ b/xbmc/cores/omxplayer/OMXPlayer.h -@@ -332,6 +332,8 @@ class COMXPlayer : public IPlayer, public CThread, public IDVDPlayer - virtual void GetScalingMethods(std::vector &scalingMethods); - virtual void GetAudioCapabilities(std::vector &audioCaps); - virtual void GetSubtitleCapabilities(std::vector &subCaps); -+ -+ virtual double GetClock(double& absolute, bool interpolated = true); - protected: - friend class COMXSelectionStreams; - -diff --git a/xbmc/cores/omxplayer/OMXPlayerVideo.cpp b/xbmc/cores/omxplayer/OMXPlayerVideo.cpp -index 5f3f050..e8ff1aa 100644 ---- a/xbmc/cores/omxplayer/OMXPlayerVideo.cpp -+++ b/xbmc/cores/omxplayer/OMXPlayerVideo.cpp -@@ -452,13 +452,22 @@ void OMXPlayerVideo::Output(int iGroupId, double pts, bool bDropPacket) - m_dropbase = 0.0f; - #endif - -- double pts_media = m_av_clock->OMXMediaTime(false, false); -- ProcessOverlays(iGroupId, pts_media); -- - if (!CThread::m_bStop && m_av_clock->GetAbsoluteClock(false) < (iCurrentClock + iSleepTime + DVD_MSEC_TO_TIME(500)) ) - return; - -- g_renderManager.FlipPage(CThread::m_bStop, (iCurrentClock + iSleepTime) / DVD_TIME_BASE, -1, FS_NONE); -+ int buffer = g_renderManager.WaitForBuffer(m_bStop); -+ while (buffer < 0 && !CThread::m_bStop) -+ { -+ Sleep(1); -+ buffer = g_renderManager.WaitForBuffer(m_bStop); -+ } -+ if (buffer < 0) -+ return; -+ -+ double pts_media = m_av_clock->OMXMediaTime(false, false); -+ ProcessOverlays(iGroupId, pts_media); -+ -+ g_renderManager.FlipPage(CThread::m_bStop, pts, -1, FS_NONE, m_speed); - - //m_av_clock->WaitAbsoluteClock((iCurrentClock + iSleepTime)); - } --- -1.7.10 - diff --git a/packages/mediacenter/xbmc/patches/todo/xbmc-995.10-xvba_rpi_fixes-81496e1.patch b/packages/mediacenter/xbmc/patches/todo/xbmc-995.10-xvba_rpi_fixes-81496e1.patch new file mode 100644 index 0000000000..029e8fa7a0 --- /dev/null +++ b/packages/mediacenter/xbmc/patches/todo/xbmc-995.10-xvba_rpi_fixes-81496e1.patch @@ -0,0 +1,549 @@ +From d33a276284356e974dcf14e6c86b74064fb0715f Mon Sep 17 00:00:00 2001 +From: xbmc +Date: Sun, 10 Feb 2013 18:38:56 +0100 +Subject: [PATCH 1/4] renderer: add buffering - get clock via IPlayer + +--- + xbmc/cores/IPlayer.h | 2 ++ + xbmc/cores/VideoRenderers/RenderManager.cpp | 9 ++++++--- + xbmc/cores/VideoRenderers/RenderManager.h | 3 +-- + xbmc/cores/dvdplayer/DVDPlayer.cpp | 7 ++++++- + xbmc/cores/dvdplayer/DVDPlayer.h | 2 ++ + 5 files changed, 17 insertions(+), 6 deletions(-) + +diff --git a/xbmc/cores/IPlayer.h b/xbmc/cores/IPlayer.h +index 5ed88d1..f136998 100644 +--- a/xbmc/cores/IPlayer.h ++++ b/xbmc/cores/IPlayer.h +@@ -229,6 +229,8 @@ class IPlayer + */ + virtual void GetSubtitleCapabilities(std::vector &subCaps) { subCaps.assign(1,IPC_SUBS_ALL); }; + ++ virtual double GetClock(double& absolute, bool interpolated = true) {return 0; }; ++ + protected: + IPlayerCallback& m_callback; + }; +diff --git a/xbmc/cores/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoRenderers/RenderManager.cpp +index 9290f80..4664426 100644 +--- a/xbmc/cores/VideoRenderers/RenderManager.cpp ++++ b/xbmc/cores/VideoRenderers/RenderManager.cpp +@@ -325,7 +325,7 @@ void CXBMCRenderManager::RenderUpdate(bool clear, DWORD flags, DWORD alpha) + m_presentevent.Set(); + } + +-unsigned int CXBMCRenderManager::PreInit(CDVDClock *pClock) ++unsigned int CXBMCRenderManager::PreInit() + { + CRetakeLock lock(m_sharedSection); + +@@ -333,7 +333,6 @@ unsigned int CXBMCRenderManager::PreInit(CDVDClock *pClock) + m_presenterr = 0.0; + m_errorindex = 0; + memset(m_errorbuff, 0, sizeof(m_errorbuff)); +- m_pClock = pClock; + + m_bIsStarted = false; + m_bPauseDrawing = false; +@@ -1045,7 +1044,11 @@ void CXBMCRenderManager::PrepareNextRender() + } + + double iClockSleep, iPlayingClock, iCurrentClock; +- iPlayingClock = m_pClock->GetClock(iCurrentClock, false); ++ if (g_application.m_pPlayer) ++ iPlayingClock = g_application.m_pPlayer->GetClock(iCurrentClock, false); ++ else ++ iPlayingClock = iCurrentClock = 0; ++ + iClockSleep = m_renderBuffers[idx].pts - iPlayingClock; + + if (m_speed) +diff --git a/xbmc/cores/VideoRenderers/RenderManager.h b/xbmc/cores/VideoRenderers/RenderManager.h +index 6746957..b931f7d 100644 +--- a/xbmc/cores/VideoRenderers/RenderManager.h ++++ b/xbmc/cores/VideoRenderers/RenderManager.h +@@ -72,7 +72,7 @@ class CXBMCRenderManager + int AddVideoPicture(DVDVideoPicture& picture); + + void FlipPage(volatile bool& bStop, double timestamp = 0.0, int source = -1, EFIELDSYNC sync = FS_NONE, int speed = 0); +- unsigned int PreInit(CDVDClock *pClock); ++ unsigned int PreInit(); + void UnInit(); + bool Flush(); + +@@ -225,7 +225,6 @@ class CXBMCRenderManager + int m_presentsource; + CEvent m_presentevent; + CEvent m_flushEvent; +- CDVDClock *m_pClock; + + + OVERLAY::CRenderer m_overlays; +diff --git a/xbmc/cores/dvdplayer/DVDPlayer.cpp b/xbmc/cores/dvdplayer/DVDPlayer.cpp +index 9e6e470..d0c7cd2 100644 +--- a/xbmc/cores/dvdplayer/DVDPlayer.cpp ++++ b/xbmc/cores/dvdplayer/DVDPlayer.cpp +@@ -463,7 +463,7 @@ bool CDVDPlayer::OpenFile(const CFileItem& file, const CPlayerOptions &options) + m_ready.Reset(); + + #if defined(HAS_VIDEO_PLAYBACK) +- g_renderManager.PreInit(&m_clock); ++ g_renderManager.PreInit(); + #endif + + Create(); +@@ -4129,3 +4129,8 @@ bool CDVDPlayer::CachePVRStream(void) const + !g_PVRManager.IsPlayingRecording() && + g_advancedSettings.m_bPVRCacheInDvdPlayer; + } ++ ++double CDVDPlayer::GetClock(double& absolute, bool interpolated) ++{ ++ return m_clock.GetClock(absolute, interpolated); ++} +diff --git a/xbmc/cores/dvdplayer/DVDPlayer.h b/xbmc/cores/dvdplayer/DVDPlayer.h +index 35bf762..ab73950 100644 +--- a/xbmc/cores/dvdplayer/DVDPlayer.h ++++ b/xbmc/cores/dvdplayer/DVDPlayer.h +@@ -254,6 +254,8 @@ class CDVDPlayer : public IPlayer, public CThread, public IDVDPlayer + virtual bool SwitchChannel(const PVR::CPVRChannel &channel); + virtual bool CachePVRStream(void) const; + ++ virtual double GetClock(double& absolute, bool interpolated = true); ++ + enum ECacheState + { CACHESTATE_DONE = 0 + , CACHESTATE_FULL // player is filling up the demux queue +-- +1.7.10 + + +From 113de500903cbe1933e1a50fc7809b8f6b7f2636 Mon Sep 17 00:00:00 2001 +From: xbmc +Date: Fri, 15 Feb 2013 17:00:47 +0100 +Subject: [PATCH 2/4] buffering: some rework + +--- + xbmc/cores/VideoRenderers/OverlayRenderer.cpp | 17 +++++++---------- + xbmc/cores/VideoRenderers/OverlayRenderer.h | 5 ++--- + xbmc/cores/VideoRenderers/RenderManager.cpp | 10 +++------- + xbmc/cores/VideoRenderers/RenderManager.h | 4 ++-- + xbmc/cores/dvdplayer/DVDPlayerVideo.cpp | 18 +++++++++++++++++- + 5 files changed, 31 insertions(+), 23 deletions(-) + +diff --git a/xbmc/cores/VideoRenderers/OverlayRenderer.cpp b/xbmc/cores/VideoRenderers/OverlayRenderer.cpp +index 94aaaf5..f7f74ce 100644 +--- a/xbmc/cores/VideoRenderers/OverlayRenderer.cpp ++++ b/xbmc/cores/VideoRenderers/OverlayRenderer.cpp +@@ -93,24 +93,28 @@ long COverlayMainThread::Release() + + CRenderer::~CRenderer() + { +- for(int i = 0; i < 2; i++) ++ for(int i = 0; i < 10; i++) + Release(m_buffers[i]); + } + +-void CRenderer::AddOverlay(CDVDOverlay* o, double pts) ++void CRenderer::AddOverlay(CDVDOverlay* o, double pts, int index) + { + CSingleLock lock(m_section); + ++ m_decode = index; ++ + SElement e; + e.pts = pts; + e.overlay_dvd = o->Acquire(); + m_buffers[m_decode].push_back(e); + } + +-void CRenderer::AddOverlay(COverlay* o, double pts) ++void CRenderer::AddOverlay(COverlay* o, double pts, int index) + { + CSingleLock lock(m_section); + ++ m_decode = index; ++ + SElement e; + e.pts = pts; + e.overlay = o->Acquire(); +@@ -163,13 +167,6 @@ void CRenderer::Flip() + m_render = (m_render + 1) % m_iNumBuffers; + } + +-void CRenderer::SetBuffer(int idx) +-{ +- CSingleLock lock(m_section); +- Release(m_buffers[idx]); +- m_decode = idx; +-} +- + void CRenderer::ReleaseBuffer(int idx) + { + CSingleLock lock(m_section); +diff --git a/xbmc/cores/VideoRenderers/OverlayRenderer.h b/xbmc/cores/VideoRenderers/OverlayRenderer.h +index c6740a5..0921fc5 100644 +--- a/xbmc/cores/VideoRenderers/OverlayRenderer.h ++++ b/xbmc/cores/VideoRenderers/OverlayRenderer.h +@@ -92,14 +92,13 @@ + CRenderer(); + ~CRenderer(); + +- void AddOverlay(CDVDOverlay* o, double pts); +- void AddOverlay(COverlay* o, double pts); ++ void AddOverlay(CDVDOverlay* o, double pts, int index); ++ void AddOverlay(COverlay* o, double pts, int index); + void AddCleanup(COverlay* o); + void Flip(); + void Render(); + void Flush(); + void SetNumBuffers(int numBuffers) { m_iNumBuffers = numBuffers; } +- void SetBuffer(int idx); + void ReleaseBuffer(int idx); + + protected: +diff --git a/xbmc/cores/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoRenderers/RenderManager.cpp +index 4664426..7094913 100644 +--- a/xbmc/cores/VideoRenderers/RenderManager.cpp ++++ b/xbmc/cores/VideoRenderers/RenderManager.cpp +@@ -228,7 +228,7 @@ CStdString CXBMCRenderManager::GetVSyncState() + return state; + } + +-bool CXBMCRenderManager::Configure(unsigned int width, unsigned int height, unsigned int d_width, unsigned int d_height, float fps, unsigned flags, ERenderFormat format, unsigned extended_format, unsigned int orientation) ++bool CXBMCRenderManager::Configure(unsigned int width, unsigned int height, unsigned int d_width, unsigned int d_height, float fps, unsigned flags, ERenderFormat format, unsigned extended_format, unsigned int orientation, bool buffering) + { + /* make sure any queued frame was fully presented */ + double timeout = m_presenttime + 0.1; +@@ -248,8 +248,8 @@ bool CXBMCRenderManager::Configure(unsigned int width, unsigned int height, unsi + return false; + } + +- // check if decoder supports buffering +- m_bCodecSupportsBuffering = false; ++ // set buffering ++ m_bCodecSupportsBuffering = buffering; + if (format == RENDER_FMT_VDPAU + || format == RENDER_FMT_VDPAU_420 + || format == RENDER_FMT_XVBA) +@@ -959,10 +959,6 @@ int CXBMCRenderManager::WaitForBuffer(volatile bool& bStop) + } + lock.Leave(); + +- { CRetakeLock lock(m_sharedSection); +- m_overlays.SetBuffer((m_iOutputRenderBuffer + 1) % m_iNumRenderBuffers); +- } +- + if (bStop) + return -1; + +diff --git a/xbmc/cores/VideoRenderers/RenderManager.h b/xbmc/cores/VideoRenderers/RenderManager.h +index b931f7d..27bb8a2 100644 +--- a/xbmc/cores/VideoRenderers/RenderManager.h ++++ b/xbmc/cores/VideoRenderers/RenderManager.h +@@ -66,7 +66,7 @@ class CXBMCRenderManager + void SetViewMode(int iViewMode); + + // Functions called from mplayer +- bool Configure(unsigned int width, unsigned int height, unsigned int d_width, unsigned int d_height, float fps, unsigned flags, ERenderFormat format, unsigned extended_format, unsigned int orientation); ++ bool Configure(unsigned int width, unsigned int height, unsigned int d_width, unsigned int d_height, float fps, unsigned flags, ERenderFormat format, unsigned extended_format, unsigned int orientation, bool buffering); + bool IsConfigured(); + + int AddVideoPicture(DVDVideoPicture& picture); +@@ -79,7 +79,7 @@ class CXBMCRenderManager + void AddOverlay(CDVDOverlay* o, double pts) + { + CSharedLock lock(m_sharedSection); +- m_overlays.AddOverlay(o, pts); ++ m_overlays.AddOverlay(o, pts, (m_iOutputRenderBuffer + 1) % m_iNumRenderBuffers); + } + + void AddCleanup(OVERLAY::COverlay* o) +diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +index 109d75b..8a6599c 100644 +--- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp ++++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp +@@ -1132,53 +1132,69 @@ int CDVDPlayerVideo::OutputPicture(const DVDVideoPicture* src, double pts) + } + + CStdString formatstr; ++ bool buffering; + + switch(pPicture->format) + { + case RENDER_FMT_YUV420P: + formatstr = "YV12"; ++ buffering = true; + break; + case RENDER_FMT_YUV420P16: + formatstr = "YV12P16"; ++ buffering = true; + break; + case RENDER_FMT_YUV420P10: + formatstr = "YV12P10"; ++ buffering = true; + break; + case RENDER_FMT_NV12: + formatstr = "NV12"; ++ buffering = true; + break; + case RENDER_FMT_UYVY422: + formatstr = "UYVY"; ++ buffering = true; + break; + case RENDER_FMT_YUYV422: + formatstr = "YUY2"; ++ buffering = true; + break; + case RENDER_FMT_VDPAU: + formatstr = "VDPAU"; ++ buffering = true; + break; + case RENDER_FMT_VDPAU_420: + formatstr = "VDPAU_420"; ++ buffering = true; + break; + case RENDER_FMT_DXVA: + formatstr = "DXVA"; ++ buffering = false; + break; + case RENDER_FMT_VAAPI: + formatstr = "VAAPI"; ++ buffering = false; + break; + case RENDER_FMT_OMXEGL: + formatstr = "OMXEGL"; ++ buffering = false; + break; + case RENDER_FMT_CVBREF: + formatstr = "BGRA"; ++ buffering = false; + break; + case RENDER_FMT_BYPASS: + formatstr = "BYPASS"; ++ buffering = false; + break; + case RENDER_FMT_NONE: + formatstr = "NONE"; ++ buffering = false; + break; + case RENDER_FMT_XVBA: + formatstr = "XVBA"; ++ buffering = true; + break; + } + +@@ -1189,7 +1205,7 @@ int CDVDPlayerVideo::OutputPicture(const DVDVideoPicture* src, double pts) + } + + CLog::Log(LOGDEBUG,"%s - change configuration. %dx%d. framerate: %4.2f. format: %s",__FUNCTION__,pPicture->iWidth, pPicture->iHeight, config_framerate, formatstr.c_str()); +- if(!g_renderManager.Configure(pPicture->iWidth, pPicture->iHeight, pPicture->iDisplayWidth, pPicture->iDisplayHeight, config_framerate, flags, pPicture->format, pPicture->extended_format, m_hints.orientation)) ++ if(!g_renderManager.Configure(pPicture->iWidth, pPicture->iHeight, pPicture->iDisplayWidth, pPicture->iDisplayHeight, config_framerate, flags, pPicture->format, pPicture->extended_format, m_hints.orientation, buffering)) + { + CLog::Log(LOGERROR, "%s - failed to configure renderer", __FUNCTION__); + return EOS_ABORT; +-- +1.7.10 + + +From 4d71be9fa0e34dccbb977199f1bde2f200f8b56e Mon Sep 17 00:00:00 2001 +From: xbmc +Date: Sat, 16 Feb 2013 08:32:18 +0100 +Subject: [PATCH 3/4] add buffering for GLES + +--- + xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp | 10 ---------- + xbmc/cores/VideoRenderers/LinuxRendererGLES.h | 6 ++++-- + 2 files changed, 4 insertions(+), 12 deletions(-) + +diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp +index 2a59e2b..1bf2f3b 100644 +--- a/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp ++++ b/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp +@@ -135,13 +135,6 @@ + delete m_dllSwScale; + } + +-void CLinuxRendererGLES::ManageTextures() +-{ +- m_NumYV12Buffers = 2; +- //m_iYV12RenderBuffer = 0; +- return; +-} +- + bool CLinuxRendererGLES::ValidateRenderTarget() + { + if (!m_bValidated) +@@ -395,7 +388,6 @@ void CLinuxRendererGLES::Update(bool bPauseDrawing) + { + if (!m_bConfigured) return; + ManageDisplay(); +- ManageTextures(); + } + + void CLinuxRendererGLES::RenderUpdate(bool clear, DWORD flags, DWORD alpha) +@@ -409,7 +401,6 @@ void CLinuxRendererGLES::RenderUpdate(bool clear, DWORD flags, DWORD alpha) + if (m_renderMethod & RENDER_BYPASS) + { + ManageDisplay(); +- ManageTextures(); + // if running bypass, then the player might need the src/dst rects + // for sizing video playback on a layer other than the gles layer. + if (m_RenderUpdateCallBackFn) +@@ -449,7 +440,6 @@ void CLinuxRendererGLES::RenderUpdate(bool clear, DWORD flags, DWORD alpha) + return; + + ManageDisplay(); +- ManageTextures(); + + g_graphicsContext.BeginPaint(); + +diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGLES.h b/xbmc/cores/VideoRenderers/LinuxRendererGLES.h +index c6b69db..7bdc3bc 100644 +--- a/xbmc/cores/VideoRenderers/LinuxRendererGLES.h ++++ b/xbmc/cores/VideoRenderers/LinuxRendererGLES.h +@@ -41,7 +41,7 @@ + class COpenMaxVideo; + typedef std::vector Features; + +-#define NUM_BUFFERS 3 ++#define NUM_BUFFERS 10 + + + #undef ALIGN +@@ -138,6 +138,9 @@ class CLinuxRendererGLES : public CBaseRenderer + virtual void UnInit(); + virtual void Reset(); /* resets renderer after seek for example */ + virtual void ReorderDrawPoints(); ++ virtual void SetProcessorSize(int numBuffers) { m_NumYV12Buffers = numBuffers; } ++ virtual unsigned int GetMaxProcessorSize() { return NUM_BUFFERS; } ++ virtual unsigned int GetProcessorSize() { return m_NumYV12Buffers; } + + virtual void RenderUpdate(bool clear, DWORD flags = 0, DWORD alpha = 255); + +@@ -162,7 +165,6 @@ class CLinuxRendererGLES : public CBaseRenderer + protected: + virtual void Render(DWORD flags, int index); + +- virtual void ManageTextures(); + int NextYV12Texture(); + virtual bool ValidateRenderTarget(); + virtual void LoadShaders(int field=FIELD_FULL); +-- +1.7.10 + + +From 81496e1f405980d3be6b05c883bdbfb65d617e3e Mon Sep 17 00:00:00 2001 +From: xbmc +Date: Sun, 10 Feb 2013 18:40:30 +0100 +Subject: [PATCH 4/4] OMXPlayer: adopt to buffering in renderer + +--- + xbmc/cores/omxplayer/OMXPlayer.cpp | 5 +++++ + xbmc/cores/omxplayer/OMXPlayer.h | 2 ++ + xbmc/cores/omxplayer/OMXPlayerVideo.cpp | 24 +++++++++++++++++++----- + 3 files changed, 26 insertions(+), 5 deletions(-) + +diff --git a/xbmc/cores/omxplayer/OMXPlayer.cpp b/xbmc/cores/omxplayer/OMXPlayer.cpp +index 60aa9ab..1acb9e2 100644 +--- a/xbmc/cores/omxplayer/OMXPlayer.cpp ++++ b/xbmc/cores/omxplayer/OMXPlayer.cpp +@@ -4210,4 +4210,9 @@ void COMXPlayer::GetSubtitleCapabilities(std::vector &subCaps) + subCaps.push_back(IPC_SUBS_ALL); + } + ++double COMXPlayer::GetClock(double& absolute, bool interpolated) ++{ ++ return m_av_clock.GetClock(absolute, interpolated); ++} ++ + #endif +diff --git a/xbmc/cores/omxplayer/OMXPlayer.h b/xbmc/cores/omxplayer/OMXPlayer.h +index ca824c2..57fc7a0 100644 +--- a/xbmc/cores/omxplayer/OMXPlayer.h ++++ b/xbmc/cores/omxplayer/OMXPlayer.h +@@ -332,6 +332,8 @@ class COMXPlayer : public IPlayer, public CThread, public IDVDPlayer + virtual void GetScalingMethods(std::vector &scalingMethods); + virtual void GetAudioCapabilities(std::vector &audioCaps); + virtual void GetSubtitleCapabilities(std::vector &subCaps); ++ ++ virtual double GetClock(double& absolute, bool interpolated = true); + protected: + friend class COMXSelectionStreams; + +diff --git a/xbmc/cores/omxplayer/OMXPlayerVideo.cpp b/xbmc/cores/omxplayer/OMXPlayerVideo.cpp +index 5f3f050..88c75db 100644 +--- a/xbmc/cores/omxplayer/OMXPlayerVideo.cpp ++++ b/xbmc/cores/omxplayer/OMXPlayerVideo.cpp +@@ -158,6 +158,8 @@ bool OMXPlayerVideo::OpenStream(CDVDStreamInfo &hints) + m_open = true; + m_send_eos = false; + ++ g_renderManager.EnableBuffering(false); ++ + return true; + } + +@@ -358,7 +360,7 @@ void OMXPlayerVideo::Output(int iGroupId, double pts, bool bDropPacket) + + if(!g_renderManager.Configure(m_hints.width, m_hints.height, + iDisplayWidth, iDisplayHeight, m_fps, flags, format, 0, +- m_hints.orientation)) ++ m_hints.orientation, true)) + { + CLog::Log(LOGERROR, "%s - failed to configure renderer", __FUNCTION__); + return; +@@ -452,13 +454,22 @@ void OMXPlayerVideo::Output(int iGroupId, double pts, bool bDropPacket) + m_dropbase = 0.0f; + #endif + +- double pts_media = m_av_clock->OMXMediaTime(false, false); +- ProcessOverlays(iGroupId, pts_media); +- + if (!CThread::m_bStop && m_av_clock->GetAbsoluteClock(false) < (iCurrentClock + iSleepTime + DVD_MSEC_TO_TIME(500)) ) + return; + +- g_renderManager.FlipPage(CThread::m_bStop, (iCurrentClock + iSleepTime) / DVD_TIME_BASE, -1, FS_NONE); ++ int buffer = g_renderManager.WaitForBuffer(m_bStop); ++ while (buffer < 0 && !CThread::m_bStop) ++ { ++ Sleep(1); ++ buffer = g_renderManager.WaitForBuffer(m_bStop); ++ } ++ if (buffer < 0) ++ return; ++ ++ double pts_media = m_av_clock->OMXMediaTime(false, false); ++ ProcessOverlays(iGroupId, pts_media); ++ ++ g_renderManager.FlipPage(CThread::m_bStop, pts, -1, FS_NONE, m_speed); + + //m_av_clock->WaitAbsoluteClock((iCurrentClock + iSleepTime)); + } +@@ -569,6 +580,7 @@ void OMXPlayerVideo::Process() + m_av_clock->OMXReset(false); + m_av_clock->UnLock(); + m_started = false; ++ g_renderManager.EnableBuffering(false); + } + else if (pMsg->IsType(CDVDMsg::GENERAL_FLUSH)) // private message sent by (COMXPlayerVideo::Flush()) + { +@@ -580,6 +592,7 @@ void OMXPlayerVideo::Process() + m_omxVideo.Reset(); + m_av_clock->OMXReset(false); + m_av_clock->UnLock(); ++ g_renderManager.EnableBuffering(false); + } + else if (pMsg->IsType(CDVDMsg::PLAYER_SETSPEED)) + { +@@ -664,6 +677,7 @@ void OMXPlayerVideo::Process() + m_codecname = m_omxVideo.GetDecoderName(); + m_started = true; + m_messageParent.Put(new CDVDMsgInt(CDVDMsg::PLAYER_STARTED, DVDPLAYER_VIDEO)); ++ g_renderManager.EnableBuffering(true); + } + + // guess next frame pts. iDuration is always valid +-- +1.7.10 +