mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-07-29 13:46:49 +00:00
xbmc: update RPi patches
Signed-off-by: Stephan Raue <stephan@openelec.tv>
This commit is contained in:
parent
a20709c1a6
commit
68fd7478cc
@ -1,192 +0,0 @@
|
||||
From d33a276284356e974dcf14e6c86b74064fb0715f Mon Sep 17 00:00:00 2001
|
||||
From: xbmc <fernetmenta@online.de>
|
||||
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<int> &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<CExclusiveLock> 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 <fernetmenta@online.de>
|
||||
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<int> &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<int> &scalingMethods);
|
||||
virtual void GetAudioCapabilities(std::vector<int> &audioCaps);
|
||||
virtual void GetSubtitleCapabilities(std::vector<int> &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
|
||||
|
@ -0,0 +1,549 @@
|
||||
From d33a276284356e974dcf14e6c86b74064fb0715f Mon Sep 17 00:00:00 2001
|
||||
From: xbmc <fernetmenta@online.de>
|
||||
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<int> &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<CExclusiveLock> 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 <fernetmenta@online.de>
|
||||
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<CExclusiveLock> 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 <fernetmenta@online.de>
|
||||
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<int> 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 <fernetmenta@online.de>
|
||||
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<int> &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<int> &scalingMethods);
|
||||
virtual void GetAudioCapabilities(std::vector<int> &audioCaps);
|
||||
virtual void GetSubtitleCapabilities(std::vector<int> &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
|
||||
|
Loading…
x
Reference in New Issue
Block a user