mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-07-28 13:16:41 +00:00
projects/imx6/patches/kodi: update imx6 patches
Signed off by: <stephan@openelec.tv>
This commit is contained in:
parent
ff7d05c3ec
commit
bc792c35da
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,99 @@
|
|||||||
|
From 9ed9dcc8a30bbaf9e23dd8a738ec33824e9f7503 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Rainer Hochecker <fernetmenta@online.de>
|
||||||
|
Date: Fri, 2 Jan 2015 10:02:09 +0100
|
||||||
|
Subject: [PATCH 01/16] renderer: drop old tempfix firstflippage, did not work
|
||||||
|
anyway because RendererHandlesPresent returned always true
|
||||||
|
|
||||||
|
---
|
||||||
|
xbmc/Application.cpp | 2 +-
|
||||||
|
xbmc/cores/VideoRenderers/RenderManager.cpp | 9 ---------
|
||||||
|
xbmc/cores/VideoRenderers/RenderManager.h | 5 -----
|
||||||
|
xbmc/guilib/GUIVideoControl.cpp | 3 +--
|
||||||
|
4 files changed, 2 insertions(+), 17 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/xbmc/Application.cpp b/xbmc/Application.cpp
|
||||||
|
index 5425322..69760da 100644
|
||||||
|
--- a/xbmc/Application.cpp
|
||||||
|
+++ b/xbmc/Application.cpp
|
||||||
|
@@ -2227,7 +2227,7 @@ void CApplication::Render()
|
||||||
|
bool extPlayerActive = m_pPlayer->GetCurrentPlayer() == EPC_EXTPLAYER && m_pPlayer->IsPlaying() && !m_AppFocused;
|
||||||
|
|
||||||
|
m_bPresentFrame = false;
|
||||||
|
- if (!extPlayerActive && g_graphicsContext.IsFullScreenVideo() && !m_pPlayer->IsPausedPlayback() && g_renderManager.RendererHandlesPresent())
|
||||||
|
+ if (!extPlayerActive && g_graphicsContext.IsFullScreenVideo() && !m_pPlayer->IsPausedPlayback())
|
||||||
|
{
|
||||||
|
m_bPresentFrame = g_renderManager.FrameWait(100);
|
||||||
|
hasRendered = true;
|
||||||
|
diff --git a/xbmc/cores/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoRenderers/RenderManager.cpp
|
||||||
|
index b31f3c9..ab894ba 100644
|
||||||
|
--- a/xbmc/cores/VideoRenderers/RenderManager.cpp
|
||||||
|
+++ b/xbmc/cores/VideoRenderers/RenderManager.cpp
|
||||||
|
@@ -293,19 +293,12 @@ bool CXBMCRenderManager::Configure(unsigned int width, unsigned int height, unsi
|
||||||
|
m_sleeptime = 1.0;
|
||||||
|
m_presentevent.notifyAll();
|
||||||
|
|
||||||
|
- m_firstFlipPage = false; // tempfix
|
||||||
|
-
|
||||||
|
CLog::Log(LOGDEBUG, "CXBMCRenderManager::Configure - %d", m_QueueSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
-bool CXBMCRenderManager::RendererHandlesPresent() const
|
||||||
|
-{
|
||||||
|
- return IsConfigured() && (m_firstFlipPage || m_format != RENDER_FMT_BYPASS);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
bool CXBMCRenderManager::IsConfigured() const
|
||||||
|
{
|
||||||
|
if (!m_pRenderer)
|
||||||
|
@@ -661,8 +654,6 @@ void CXBMCRenderManager::FlipPage(volatile bool& bStop, double timestamp /* = 0L
|
||||||
|
|
||||||
|
if(!m_pRenderer) return;
|
||||||
|
|
||||||
|
- m_firstFlipPage = true; // tempfix
|
||||||
|
-
|
||||||
|
EPRESENTMETHOD presentmethod;
|
||||||
|
|
||||||
|
EDEINTERLACEMODE deinterlacemode = CMediaSettings::Get().GetCurrentVideoSettings().m_DeinterlaceMode;
|
||||||
|
diff --git a/xbmc/cores/VideoRenderers/RenderManager.h b/xbmc/cores/VideoRenderers/RenderManager.h
|
||||||
|
index d3c2f1d..1086066 100644
|
||||||
|
--- a/xbmc/cores/VideoRenderers/RenderManager.h
|
||||||
|
+++ b/xbmc/cores/VideoRenderers/RenderManager.h
|
||||||
|
@@ -143,8 +143,6 @@ public:
|
||||||
|
|
||||||
|
void UpdateResolution();
|
||||||
|
|
||||||
|
- bool RendererHandlesPresent() const;
|
||||||
|
-
|
||||||
|
#ifdef HAS_GL
|
||||||
|
CLinuxRendererGL *m_pRenderer;
|
||||||
|
#elif defined(HAS_MMAL)
|
||||||
|
@@ -267,9 +265,6 @@ protected:
|
||||||
|
//set to true when adding something to m_captures, set to false when m_captures is made empty
|
||||||
|
//std::list::empty() isn't thread safe, using an extra bool will save a lock per render when no captures are requested
|
||||||
|
bool m_hasCaptures;
|
||||||
|
-
|
||||||
|
- // temporary fix for RendererHandlesPresent after #2811
|
||||||
|
- bool m_firstFlipPage;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern CXBMCRenderManager g_renderManager;
|
||||||
|
diff --git a/xbmc/guilib/GUIVideoControl.cpp b/xbmc/guilib/GUIVideoControl.cpp
|
||||||
|
index 22d0fc8..c47a6d5 100644
|
||||||
|
--- a/xbmc/guilib/GUIVideoControl.cpp
|
||||||
|
+++ b/xbmc/guilib/GUIVideoControl.cpp
|
||||||
|
@@ -43,8 +43,7 @@ CGUIVideoControl::~CGUIVideoControl(void)
|
||||||
|
void CGUIVideoControl::Process(unsigned int currentTime, CDirtyRegionList &dirtyregions)
|
||||||
|
{
|
||||||
|
// TODO Proper processing which marks when its actually changed. Just mark always for now.
|
||||||
|
- if (g_renderManager.RendererHandlesPresent())
|
||||||
|
- MarkDirtyRegion();
|
||||||
|
+ MarkDirtyRegion();
|
||||||
|
|
||||||
|
CGUIControl::Process(currentTime, dirtyregions);
|
||||||
|
}
|
||||||
|
--
|
||||||
|
1.9.3
|
||||||
|
|
@ -0,0 +1,95 @@
|
|||||||
|
From 5c961dd12ad9e7949777e7140636c173924b3523 Mon Sep 17 00:00:00 2001
|
||||||
|
From: smallint <tahoma@gmx.de>
|
||||||
|
Date: Fri, 2 Jan 2015 15:35:33 +0000
|
||||||
|
Subject: [PATCH 02/16] Set dirty flag in teletext dialog if required
|
||||||
|
|
||||||
|
---
|
||||||
|
xbmc/video/dialogs/GUIDialogTeletext.cpp | 19 +++++++++++++++++++
|
||||||
|
xbmc/video/dialogs/GUIDialogTeletext.h | 1 +
|
||||||
|
2 files changed, 20 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/xbmc/video/dialogs/GUIDialogTeletext.cpp b/xbmc/video/dialogs/GUIDialogTeletext.cpp
|
||||||
|
index c552ae6..9be4548 100644
|
||||||
|
--- a/xbmc/video/dialogs/GUIDialogTeletext.cpp
|
||||||
|
+++ b/xbmc/video/dialogs/GUIDialogTeletext.cpp
|
||||||
|
@@ -46,7 +46,10 @@ CGUIDialogTeletext::~CGUIDialogTeletext()
|
||||||
|
bool CGUIDialogTeletext::OnAction(const CAction& action)
|
||||||
|
{
|
||||||
|
if (m_TextDecoder.HandleAction(action))
|
||||||
|
+ {
|
||||||
|
+ MarkDirtyRegion();
|
||||||
|
return true;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
return CGUIDialog::OnAction(action);
|
||||||
|
}
|
||||||
|
@@ -54,6 +57,7 @@ bool CGUIDialogTeletext::OnAction(const CAction& action)
|
||||||
|
bool CGUIDialogTeletext::OnBack(int actionID)
|
||||||
|
{
|
||||||
|
m_bClose = true;
|
||||||
|
+ MarkDirtyRegion();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -79,6 +83,12 @@ bool CGUIDialogTeletext::OnMessage(CGUIMessage& message)
|
||||||
|
return CGUIDialog::OnMessage(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
+void CGUIDialogTeletext::Process(unsigned int currentTime, CDirtyRegionList &dirtyregions)
|
||||||
|
+{
|
||||||
|
+ CGUIDialog::Process(currentTime, dirtyregions);
|
||||||
|
+ m_renderRegion = m_vertCoords;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
void CGUIDialogTeletext::Render()
|
||||||
|
{
|
||||||
|
// Do not render if we have no texture
|
||||||
|
@@ -93,12 +103,18 @@ void CGUIDialogTeletext::Render()
|
||||||
|
if (!m_bClose)
|
||||||
|
{
|
||||||
|
if (teletextFadeAmount < 100)
|
||||||
|
+ {
|
||||||
|
teletextFadeAmount = std::min(100, teletextFadeAmount + 5);
|
||||||
|
+ MarkDirtyRegion();
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (teletextFadeAmount > 0)
|
||||||
|
+ {
|
||||||
|
teletextFadeAmount = std::max(0, teletextFadeAmount - 10);
|
||||||
|
+ MarkDirtyRegion();
|
||||||
|
+ }
|
||||||
|
|
||||||
|
if (teletextFadeAmount == 0)
|
||||||
|
Close();
|
||||||
|
@@ -109,6 +125,7 @@ void CGUIDialogTeletext::Render()
|
||||||
|
{
|
||||||
|
m_pTxtTexture->Update(m_TextDecoder.GetWidth(), m_TextDecoder.GetHeight(), m_TextDecoder.GetWidth()*4, XB_FMT_A8R8G8B8, textureBuffer, false);
|
||||||
|
m_TextDecoder.RenderingDone();
|
||||||
|
+ MarkDirtyRegion();
|
||||||
|
}
|
||||||
|
|
||||||
|
color_t color = ((color_t)(teletextFadeAmount * 2.55f) & 0xff) << 24 | 0xFFFFFF;
|
||||||
|
@@ -184,4 +201,6 @@ void CGUIDialogTeletext::SetCoordinates()
|
||||||
|
top,
|
||||||
|
right,
|
||||||
|
bottom);
|
||||||
|
+
|
||||||
|
+ MarkDirtyRegion();
|
||||||
|
}
|
||||||
|
diff --git a/xbmc/video/dialogs/GUIDialogTeletext.h b/xbmc/video/dialogs/GUIDialogTeletext.h
|
||||||
|
index 51aced5..e8e11f8 100644
|
||||||
|
--- a/xbmc/video/dialogs/GUIDialogTeletext.h
|
||||||
|
+++ b/xbmc/video/dialogs/GUIDialogTeletext.h
|
||||||
|
@@ -32,6 +32,7 @@ public:
|
||||||
|
virtual bool OnMessage(CGUIMessage& message);
|
||||||
|
virtual bool OnAction(const CAction& action);
|
||||||
|
virtual bool OnBack(int actionID);
|
||||||
|
+ virtual void Process(unsigned int currentTime, CDirtyRegionList &dirtyregions);
|
||||||
|
virtual void Render();
|
||||||
|
virtual void OnInitWindow();
|
||||||
|
virtual void OnDeinitWindow(int nextWindowID);
|
||||||
|
--
|
||||||
|
1.9.3
|
||||||
|
|
@ -0,0 +1,659 @@
|
|||||||
|
From 33dc66131f501609f2a50db217e0810ef9f876ac Mon Sep 17 00:00:00 2001
|
||||||
|
From: smallint <tahoma@gmx.de>
|
||||||
|
Date: Sat, 16 Aug 2014 17:29:15 +0200
|
||||||
|
Subject: [PATCH 03/16] renderer: improve rendering to gui and separate video
|
||||||
|
layer
|
||||||
|
|
||||||
|
---
|
||||||
|
xbmc/Application.cpp | 10 +---
|
||||||
|
xbmc/cores/VideoRenderers/BaseRenderer.h | 1 +
|
||||||
|
xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp | 52 +++++++++++++--------
|
||||||
|
xbmc/cores/VideoRenderers/LinuxRendererGLES.h | 2 +
|
||||||
|
xbmc/cores/VideoRenderers/MMALRenderer.cpp | 15 ------
|
||||||
|
xbmc/cores/VideoRenderers/MMALRenderer.h | 1 +
|
||||||
|
xbmc/cores/VideoRenderers/OverlayRenderer.cpp | 18 +++++++
|
||||||
|
xbmc/cores/VideoRenderers/OverlayRenderer.h | 1 +
|
||||||
|
xbmc/cores/VideoRenderers/RenderManager.cpp | 62 ++++++++++++++++++++-----
|
||||||
|
xbmc/cores/VideoRenderers/RenderManager.h | 5 +-
|
||||||
|
xbmc/guilib/GUIControl.h | 3 ++
|
||||||
|
xbmc/guilib/GUIControlGroup.cpp | 7 +++
|
||||||
|
xbmc/guilib/GUIControlGroup.h | 1 +
|
||||||
|
xbmc/guilib/GUIVideoControl.cpp | 31 ++++++++++++-
|
||||||
|
xbmc/guilib/GUIVideoControl.h | 1 +
|
||||||
|
xbmc/guilib/GUIWindowManager.cpp | 22 ++++++++-
|
||||||
|
xbmc/guilib/GUIWindowManager.h | 1 +
|
||||||
|
xbmc/video/windows/GUIWindowFullScreen.cpp | 31 ++++++++++++-
|
||||||
|
xbmc/video/windows/GUIWindowFullScreen.h | 2 +
|
||||||
|
19 files changed, 204 insertions(+), 62 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/xbmc/Application.cpp b/xbmc/Application.cpp
|
||||||
|
index 69760da..bc33a79 100644
|
||||||
|
--- a/xbmc/Application.cpp
|
||||||
|
+++ b/xbmc/Application.cpp
|
||||||
|
@@ -2175,9 +2175,6 @@ bool CApplication::RenderNoPresent()
|
||||||
|
// dont show GUI when playing full screen video
|
||||||
|
if (g_graphicsContext.IsFullScreenVideo())
|
||||||
|
{
|
||||||
|
- g_graphicsContext.SetRenderingResolution(g_graphicsContext.GetVideoResolution(), false);
|
||||||
|
- g_renderManager.Render(true, 0, 255);
|
||||||
|
-
|
||||||
|
// close window overlays
|
||||||
|
CGUIDialog *overlay = (CGUIDialog *)g_windowManager.GetWindow(WINDOW_DIALOG_VIDEO_OVERLAY);
|
||||||
|
if (overlay) overlay->Close(true);
|
||||||
|
@@ -2230,7 +2227,6 @@ void CApplication::Render()
|
||||||
|
if (!extPlayerActive && g_graphicsContext.IsFullScreenVideo() && !m_pPlayer->IsPausedPlayback())
|
||||||
|
{
|
||||||
|
m_bPresentFrame = g_renderManager.FrameWait(100);
|
||||||
|
- hasRendered = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
@@ -2273,8 +2269,6 @@ void CApplication::Render()
|
||||||
|
if(!g_Windowing.BeginRender())
|
||||||
|
return;
|
||||||
|
|
||||||
|
- g_renderManager.FrameMove();
|
||||||
|
-
|
||||||
|
CDirtyRegionList dirtyRegions = g_windowManager.GetDirty();
|
||||||
|
if(g_graphicsContext.GetStereoMode())
|
||||||
|
{
|
||||||
|
@@ -2296,8 +2290,6 @@ void CApplication::Render()
|
||||||
|
hasRendered = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
- g_renderManager.FrameFinish();
|
||||||
|
-
|
||||||
|
g_Windowing.EndRender();
|
||||||
|
|
||||||
|
// execute post rendering actions (finalize window closing)
|
||||||
|
@@ -2322,7 +2314,7 @@ void CApplication::Render()
|
||||||
|
flip = true;
|
||||||
|
|
||||||
|
//fps limiter, make sure each frame lasts at least singleFrameTime milliseconds
|
||||||
|
- if (limitFrames || !flip)
|
||||||
|
+ if (limitFrames || !(flip || m_bPresentFrame))
|
||||||
|
{
|
||||||
|
if (!limitFrames)
|
||||||
|
singleFrameTime = 40; //if not flipping, loop at 25 fps
|
||||||
|
diff --git a/xbmc/cores/VideoRenderers/BaseRenderer.h b/xbmc/cores/VideoRenderers/BaseRenderer.h
|
||||||
|
index 850aa6f..8988e35 100644
|
||||||
|
--- a/xbmc/cores/VideoRenderers/BaseRenderer.h
|
||||||
|
+++ b/xbmc/cores/VideoRenderers/BaseRenderer.h
|
||||||
|
@@ -94,6 +94,7 @@ public:
|
||||||
|
virtual void SetBufferSize(int numBuffers) { }
|
||||||
|
virtual void ReleaseBuffer(int idx) { }
|
||||||
|
virtual bool NeedBufferForRef(int idx) { return false; }
|
||||||
|
+ virtual bool IsGuiLayer() { return true; }
|
||||||
|
|
||||||
|
virtual bool Supports(ERENDERFEATURE feature) { return false; }
|
||||||
|
|
||||||
|
diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp b/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp
|
||||||
|
index 81fe19b..a765461 100644
|
||||||
|
--- a/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp
|
||||||
|
+++ b/xbmc/cores/VideoRenderers/LinuxRendererGLES.cpp
|
||||||
|
@@ -526,32 +526,16 @@ void CLinuxRendererGLES::Update()
|
||||||
|
|
||||||
|
void CLinuxRendererGLES::RenderUpdate(bool clear, DWORD flags, DWORD alpha)
|
||||||
|
{
|
||||||
|
- if (!m_bConfigured) return;
|
||||||
|
+ if (!m_bConfigured)
|
||||||
|
+ return;
|
||||||
|
|
||||||
|
// if its first pass, just init textures and return
|
||||||
|
if (ValidateRenderTarget())
|
||||||
|
return;
|
||||||
|
|
||||||
|
- if (m_renderMethod & RENDER_BYPASS)
|
||||||
|
+ if (!IsGuiLayer())
|
||||||
|
{
|
||||||
|
- ManageDisplay();
|
||||||
|
- // 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)
|
||||||
|
- (*m_RenderUpdateCallBackFn)(m_RenderUpdateCallBackCtx, m_sourceRect, m_destRect);
|
||||||
|
-
|
||||||
|
- CRect old = g_graphicsContext.GetScissors();
|
||||||
|
-
|
||||||
|
- g_graphicsContext.BeginPaint();
|
||||||
|
- g_graphicsContext.SetScissors(m_destRect);
|
||||||
|
-
|
||||||
|
- glEnable(GL_BLEND);
|
||||||
|
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
- glClearColor(0, 0, 0, 0);
|
||||||
|
- glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
-
|
||||||
|
- g_graphicsContext.SetScissors(old);
|
||||||
|
- g_graphicsContext.EndPaint();
|
||||||
|
+ RenderUpdateVideo(clear, flags, alpha);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -606,6 +590,26 @@ void CLinuxRendererGLES::RenderUpdate(bool clear, DWORD flags, DWORD alpha)
|
||||||
|
g_graphicsContext.EndPaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
+void CLinuxRendererGLES::RenderUpdateVideo(bool clear, DWORD flags, DWORD alpha)
|
||||||
|
+{
|
||||||
|
+ if (!m_bConfigured)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ if (IsGuiLayer())
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ if (m_renderMethod & RENDER_BYPASS)
|
||||||
|
+ {
|
||||||
|
+ ManageDisplay();
|
||||||
|
+ // 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)
|
||||||
|
+ (*m_RenderUpdateCallBackFn)(m_RenderUpdateCallBackCtx, m_sourceRect, m_destRect);
|
||||||
|
+
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
void CLinuxRendererGLES::FlipPage(int source)
|
||||||
|
{
|
||||||
|
if( source >= 0 && source < m_NumYV12Buffers )
|
||||||
|
@@ -3055,5 +3059,13 @@ void CLinuxRendererGLES::AddProcessor(CDVDVideoCodecIMXBuffer *buffer, int index
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+bool CLinuxRendererGLES::IsGuiLayer()
|
||||||
|
+{
|
||||||
|
+ if (m_format == RENDER_FMT_BYPASS)
|
||||||
|
+ return false;
|
||||||
|
+ else
|
||||||
|
+ return true;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
#endif
|
||||||
|
|
||||||
|
diff --git a/xbmc/cores/VideoRenderers/LinuxRendererGLES.h b/xbmc/cores/VideoRenderers/LinuxRendererGLES.h
|
||||||
|
index d8bf35d..b865033 100644
|
||||||
|
--- a/xbmc/cores/VideoRenderers/LinuxRendererGLES.h
|
||||||
|
+++ b/xbmc/cores/VideoRenderers/LinuxRendererGLES.h
|
||||||
|
@@ -144,6 +144,7 @@ public:
|
||||||
|
virtual void SetBufferSize(int numBuffers) { m_NumYV12Buffers = numBuffers; }
|
||||||
|
virtual unsigned int GetMaxBufferSize() { return NUM_BUFFERS; }
|
||||||
|
virtual unsigned int GetOptimalBufferSize();
|
||||||
|
+ virtual bool IsGuiLayer();
|
||||||
|
|
||||||
|
virtual void RenderUpdate(bool clear, DWORD flags = 0, DWORD alpha = 255);
|
||||||
|
|
||||||
|
@@ -177,6 +178,7 @@ public:
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void Render(DWORD flags, int index);
|
||||||
|
+ void RenderUpdateVideo(bool clear, DWORD flags = 0, DWORD alpha = 255);
|
||||||
|
|
||||||
|
int NextYV12Texture();
|
||||||
|
virtual bool ValidateRenderTarget();
|
||||||
|
diff --git a/xbmc/cores/VideoRenderers/MMALRenderer.cpp b/xbmc/cores/VideoRenderers/MMALRenderer.cpp
|
||||||
|
index 03a05de..69ff30a 100644
|
||||||
|
--- a/xbmc/cores/VideoRenderers/MMALRenderer.cpp
|
||||||
|
+++ b/xbmc/cores/VideoRenderers/MMALRenderer.cpp
|
||||||
|
@@ -347,21 +347,6 @@ void CMMALRenderer::RenderUpdate(bool clear, DWORD flags, DWORD alpha)
|
||||||
|
// for sizing video playback on a layer other than the gles layer.
|
||||||
|
if (m_RenderUpdateCallBackFn)
|
||||||
|
(*m_RenderUpdateCallBackFn)(m_RenderUpdateCallBackCtx, m_sourceRect, m_destRect);
|
||||||
|
-
|
||||||
|
- SetVideoRect(m_sourceRect, m_destRect);
|
||||||
|
-
|
||||||
|
- CRect old = g_graphicsContext.GetScissors();
|
||||||
|
-
|
||||||
|
- g_graphicsContext.BeginPaint();
|
||||||
|
- g_graphicsContext.SetScissors(m_destRect);
|
||||||
|
-
|
||||||
|
- glEnable(GL_BLEND);
|
||||||
|
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
- glClearColor(0, 0, 0, 0);
|
||||||
|
- glClear(GL_COLOR_BUFFER_BIT);
|
||||||
|
-
|
||||||
|
- g_graphicsContext.SetScissors(old);
|
||||||
|
- g_graphicsContext.EndPaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CMMALRenderer::FlipPage(int source)
|
||||||
|
diff --git a/xbmc/cores/VideoRenderers/MMALRenderer.h b/xbmc/cores/VideoRenderers/MMALRenderer.h
|
||||||
|
index 8ca0b94..62d513e 100644
|
||||||
|
--- a/xbmc/cores/VideoRenderers/MMALRenderer.h
|
||||||
|
+++ b/xbmc/cores/VideoRenderers/MMALRenderer.h
|
||||||
|
@@ -90,6 +90,7 @@ public:
|
||||||
|
virtual unsigned int GetMaxBufferSize() { return NUM_BUFFERS; }
|
||||||
|
virtual unsigned int GetOptimalBufferSize() { return NUM_BUFFERS; }
|
||||||
|
virtual void SetVideoRect(const CRect& SrcRect, const CRect& DestRect);
|
||||||
|
+ virtual bool IsGuiLayer() { return false; }
|
||||||
|
|
||||||
|
void vout_input_port_cb(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer);
|
||||||
|
protected:
|
||||||
|
diff --git a/xbmc/cores/VideoRenderers/OverlayRenderer.cpp b/xbmc/cores/VideoRenderers/OverlayRenderer.cpp
|
||||||
|
index ea07d9f..e8c4bec 100644
|
||||||
|
--- a/xbmc/cores/VideoRenderers/OverlayRenderer.cpp
|
||||||
|
+++ b/xbmc/cores/VideoRenderers/OverlayRenderer.cpp
|
||||||
|
@@ -306,6 +306,24 @@ void CRenderer::Render(COverlay* o, float adjust_height)
|
||||||
|
o->Render(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
+bool CRenderer::HasOverlay(int idx)
|
||||||
|
+{
|
||||||
|
+ bool hasOverlay = false;
|
||||||
|
+
|
||||||
|
+ CSingleLock lock(m_section);
|
||||||
|
+
|
||||||
|
+ SElementV& list = m_buffers[idx];
|
||||||
|
+ for(SElementV::iterator it = list.begin(); it != list.end(); ++it)
|
||||||
|
+ {
|
||||||
|
+ if (it->overlay || it->overlay_dvd)
|
||||||
|
+ {
|
||||||
|
+ hasOverlay = true;
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ return hasOverlay;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
COverlay* CRenderer::Convert(CDVDOverlaySSA* o, double pts)
|
||||||
|
{
|
||||||
|
CRect src, dst;
|
||||||
|
diff --git a/xbmc/cores/VideoRenderers/OverlayRenderer.h b/xbmc/cores/VideoRenderers/OverlayRenderer.h
|
||||||
|
index 9b8e9da..ca02644 100644
|
||||||
|
--- a/xbmc/cores/VideoRenderers/OverlayRenderer.h
|
||||||
|
+++ b/xbmc/cores/VideoRenderers/OverlayRenderer.h
|
||||||
|
@@ -100,6 +100,7 @@ namespace OVERLAY {
|
||||||
|
void Render(int idx);
|
||||||
|
void Flush();
|
||||||
|
void Release(int idx);
|
||||||
|
+ bool HasOverlay(int idx);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
diff --git a/xbmc/cores/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoRenderers/RenderManager.cpp
|
||||||
|
index ab894ba..63bbdcc 100644
|
||||||
|
--- a/xbmc/cores/VideoRenderers/RenderManager.cpp
|
||||||
|
+++ b/xbmc/cores/VideoRenderers/RenderManager.cpp
|
||||||
|
@@ -120,6 +120,7 @@ CXBMCRenderManager::CXBMCRenderManager()
|
||||||
|
m_QueueSize = 2;
|
||||||
|
m_QueueSkip = 0;
|
||||||
|
m_format = RENDER_FMT_NONE;
|
||||||
|
+ m_renderedOverlay = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
CXBMCRenderManager::~CXBMCRenderManager()
|
||||||
|
@@ -233,7 +234,7 @@ bool CXBMCRenderManager::Configure(unsigned int width, unsigned int height, unsi
|
||||||
|
|
||||||
|
/* make sure any queued frame was fully presented */
|
||||||
|
XbmcThreads::EndTime endtime(5000);
|
||||||
|
- while(m_presentstep != PRESENT_IDLE)
|
||||||
|
+ while(m_presentstep != PRESENT_IDLE && m_presentstep != PRESENT_READY)
|
||||||
|
{
|
||||||
|
if(endtime.IsTimePast())
|
||||||
|
{
|
||||||
|
@@ -292,6 +293,7 @@ bool CXBMCRenderManager::Configure(unsigned int width, unsigned int height, unsi
|
||||||
|
m_presentpts = DVD_NOPTS_VALUE;
|
||||||
|
m_sleeptime = 1.0;
|
||||||
|
m_presentevent.notifyAll();
|
||||||
|
+ m_renderedOverlay = false;
|
||||||
|
|
||||||
|
CLog::Log(LOGDEBUG, "CXBMCRenderManager::Configure - %d", m_QueueSize);
|
||||||
|
}
|
||||||
|
@@ -766,22 +768,58 @@ void CXBMCRenderManager::RegisterRenderFeaturesCallBack(const void *ctx, RenderF
|
||||||
|
m_pRenderer->RegisterRenderFeaturesCallBack(ctx, fn);
|
||||||
|
}
|
||||||
|
|
||||||
|
-void CXBMCRenderManager::Render(bool clear, DWORD flags, DWORD alpha)
|
||||||
|
+void CXBMCRenderManager::Render(bool clear, DWORD flags, DWORD alpha, bool gui)
|
||||||
|
{
|
||||||
|
CSharedLock lock(m_sharedSection);
|
||||||
|
|
||||||
|
- SPresent& m = m_Queue[m_presentsource];
|
||||||
|
+ if (!gui && m_pRenderer->IsGuiLayer())
|
||||||
|
+ return;
|
||||||
|
|
||||||
|
- 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
|
||||||
|
- PresentSingle(clear, flags, alpha);
|
||||||
|
+ if (!gui || m_pRenderer->IsGuiLayer())
|
||||||
|
+ {
|
||||||
|
+ SPresent& m = m_Queue[m_presentsource];
|
||||||
|
+
|
||||||
|
+ 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
|
||||||
|
+ PresentSingle(clear, flags, alpha);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (gui)
|
||||||
|
+ {
|
||||||
|
+ m_renderedOverlay = m_overlays.HasOverlay(m_presentsource);
|
||||||
|
+ m_overlays.Render(m_presentsource);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+bool CXBMCRenderManager::IsGuiLayer()
|
||||||
|
+{
|
||||||
|
+ { CSingleLock lock(m_presentlock);
|
||||||
|
+
|
||||||
|
+ if (!m_pRenderer)
|
||||||
|
+ return false;
|
||||||
|
+
|
||||||
|
+ if (m_pRenderer->IsGuiLayer() || m_renderedOverlay || m_overlays.HasOverlay(m_presentsource))
|
||||||
|
+ return true;
|
||||||
|
+ }
|
||||||
|
+ return false;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+bool CXBMCRenderManager::IsVideoLayer()
|
||||||
|
+{
|
||||||
|
+ { CSingleLock lock(m_presentlock);
|
||||||
|
|
||||||
|
- m_overlays.Render(m_presentsource);
|
||||||
|
+ if (!m_pRenderer)
|
||||||
|
+ return false;
|
||||||
|
+
|
||||||
|
+ if (!m_pRenderer->IsGuiLayer())
|
||||||
|
+ return true;
|
||||||
|
+ }
|
||||||
|
+ return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* simple present method */
|
||||||
|
diff --git a/xbmc/cores/VideoRenderers/RenderManager.h b/xbmc/cores/VideoRenderers/RenderManager.h
|
||||||
|
index 1086066..7280423 100644
|
||||||
|
--- a/xbmc/cores/VideoRenderers/RenderManager.h
|
||||||
|
+++ b/xbmc/cores/VideoRenderers/RenderManager.h
|
||||||
|
@@ -60,7 +60,9 @@ public:
|
||||||
|
void FrameMove();
|
||||||
|
void FrameFinish();
|
||||||
|
bool FrameWait(int ms);
|
||||||
|
- void Render(bool clear, DWORD flags = 0, DWORD alpha = 255);
|
||||||
|
+ void Render(bool clear, DWORD flags = 0, DWORD alpha = 255, bool gui = true);
|
||||||
|
+ bool IsGuiLayer();
|
||||||
|
+ bool IsVideoLayer();
|
||||||
|
void SetupScreenshot();
|
||||||
|
|
||||||
|
CRenderCapture* AllocRenderCapture();
|
||||||
|
@@ -257,6 +259,7 @@ protected:
|
||||||
|
|
||||||
|
|
||||||
|
OVERLAY::CRenderer m_overlays;
|
||||||
|
+ bool m_renderedOverlay;
|
||||||
|
|
||||||
|
void RenderCapture(CRenderCapture* capture);
|
||||||
|
void RemoveCapture(CRenderCapture* capture);
|
||||||
|
diff --git a/xbmc/guilib/GUIControl.h b/xbmc/guilib/GUIControl.h
|
||||||
|
index b303ccc..6e0b92e 100644
|
||||||
|
--- a/xbmc/guilib/GUIControl.h
|
||||||
|
+++ b/xbmc/guilib/GUIControl.h
|
||||||
|
@@ -83,6 +83,9 @@ public:
|
||||||
|
virtual void Process(unsigned int currentTime, CDirtyRegionList &dirtyregions);
|
||||||
|
virtual void DoRender();
|
||||||
|
virtual void Render() {};
|
||||||
|
+ // Called after the actual rendering is completed to trigger additional
|
||||||
|
+ // non GUI rendering operations
|
||||||
|
+ virtual void RenderEx() {};
|
||||||
|
|
||||||
|
/*! \brief Returns whether or not we have processed */
|
||||||
|
bool HasProcessed() const { return m_hasProcessed; };
|
||||||
|
diff --git a/xbmc/guilib/GUIControlGroup.cpp b/xbmc/guilib/GUIControlGroup.cpp
|
||||||
|
index 7858e42..bdd7f54 100644
|
||||||
|
--- a/xbmc/guilib/GUIControlGroup.cpp
|
||||||
|
+++ b/xbmc/guilib/GUIControlGroup.cpp
|
||||||
|
@@ -133,6 +133,13 @@ void CGUIControlGroup::Render()
|
||||||
|
g_graphicsContext.RestoreOrigin();
|
||||||
|
}
|
||||||
|
|
||||||
|
+void CGUIControlGroup::RenderEx()
|
||||||
|
+{
|
||||||
|
+ for (iControls it = m_children.begin(); it != m_children.end(); ++it)
|
||||||
|
+ (*it)->RenderEx();
|
||||||
|
+ CGUIControl::RenderEx();
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
bool CGUIControlGroup::OnAction(const CAction &action)
|
||||||
|
{
|
||||||
|
ASSERT(false); // unimplemented
|
||||||
|
diff --git a/xbmc/guilib/GUIControlGroup.h b/xbmc/guilib/GUIControlGroup.h
|
||||||
|
index 054757f..0b38a56 100644
|
||||||
|
--- a/xbmc/guilib/GUIControlGroup.h
|
||||||
|
+++ b/xbmc/guilib/GUIControlGroup.h
|
||||||
|
@@ -42,6 +42,7 @@ public:
|
||||||
|
|
||||||
|
virtual void Process(unsigned int currentTime, CDirtyRegionList &dirtyregions);
|
||||||
|
virtual void Render();
|
||||||
|
+ virtual void RenderEx();
|
||||||
|
virtual bool OnAction(const CAction &action);
|
||||||
|
virtual bool OnMessage(CGUIMessage& message);
|
||||||
|
virtual bool SendControlMessage(CGUIMessage& message);
|
||||||
|
diff --git a/xbmc/guilib/GUIVideoControl.cpp b/xbmc/guilib/GUIVideoControl.cpp
|
||||||
|
index c47a6d5..126e95f 100644
|
||||||
|
--- a/xbmc/guilib/GUIVideoControl.cpp
|
||||||
|
+++ b/xbmc/guilib/GUIVideoControl.cpp
|
||||||
|
@@ -42,8 +42,11 @@ CGUIVideoControl::~CGUIVideoControl(void)
|
||||||
|
|
||||||
|
void CGUIVideoControl::Process(unsigned int currentTime, CDirtyRegionList &dirtyregions)
|
||||||
|
{
|
||||||
|
+ g_renderManager.FrameMove();
|
||||||
|
+
|
||||||
|
// TODO Proper processing which marks when its actually changed. Just mark always for now.
|
||||||
|
- MarkDirtyRegion();
|
||||||
|
+ if (g_renderManager.IsGuiLayer())
|
||||||
|
+ MarkDirtyRegion();
|
||||||
|
|
||||||
|
CGUIControl::Process(currentTime, dirtyregions);
|
||||||
|
}
|
||||||
|
@@ -67,14 +70,38 @@ void CGUIVideoControl::Render()
|
||||||
|
|
||||||
|
#ifdef HAS_VIDEO_PLAYBACK
|
||||||
|
color_t alpha = g_graphicsContext.MergeAlpha(0xFF000000) >> 24;
|
||||||
|
- g_renderManager.Render(false, 0, alpha);
|
||||||
|
+ if (g_renderManager.IsVideoLayer())
|
||||||
|
+ {
|
||||||
|
+ CRect old = g_graphicsContext.GetScissors();
|
||||||
|
+ CRect region = GetRenderRegion();
|
||||||
|
+ region.Intersect(old);
|
||||||
|
+ g_graphicsContext.BeginPaint();
|
||||||
|
+ g_graphicsContext.SetScissors(region);
|
||||||
|
+ g_graphicsContext.Clear(0);
|
||||||
|
+ g_graphicsContext.SetScissors(old);
|
||||||
|
+ g_graphicsContext.EndPaint();
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ g_renderManager.Render(false, 0, alpha);
|
||||||
|
#else
|
||||||
|
((CDummyVideoPlayer *)g_application.m_pPlayer->GetInternal())->Render();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
+ // TODO: remove this crap: HAS_VIDEO_PLAYBACK
|
||||||
|
+ // instantiateing a vidio control having no playback is complete nonsense
|
||||||
|
CGUIControl::Render();
|
||||||
|
}
|
||||||
|
|
||||||
|
+void CGUIVideoControl::RenderEx()
|
||||||
|
+{
|
||||||
|
+#ifdef HAS_VIDEO_PLAYBACK
|
||||||
|
+ if (g_application.m_pPlayer->IsPlayingVideo() && g_renderManager.IsStarted())
|
||||||
|
+ g_renderManager.Render(false, 0, 255, false);
|
||||||
|
+ g_renderManager.FrameFinish();
|
||||||
|
+#endif
|
||||||
|
+ CGUIControl::RenderEx();
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
EVENT_RESULT CGUIVideoControl::OnMouseEvent(const CPoint &point, const CMouseEvent &event)
|
||||||
|
{
|
||||||
|
if (!g_application.m_pPlayer->IsPlayingVideo()) return EVENT_RESULT_UNHANDLED;
|
||||||
|
diff --git a/xbmc/guilib/GUIVideoControl.h b/xbmc/guilib/GUIVideoControl.h
|
||||||
|
index a692d01..0f89a9a 100644
|
||||||
|
--- a/xbmc/guilib/GUIVideoControl.h
|
||||||
|
+++ b/xbmc/guilib/GUIVideoControl.h
|
||||||
|
@@ -44,6 +44,7 @@ public:
|
||||||
|
|
||||||
|
virtual void Process(unsigned int currentTime, CDirtyRegionList &dirtyregions);
|
||||||
|
virtual void Render();
|
||||||
|
+ virtual void RenderEx();
|
||||||
|
virtual EVENT_RESULT OnMouseEvent(const CPoint &point, const CMouseEvent &event);
|
||||||
|
virtual bool CanFocus() const;
|
||||||
|
virtual bool CanFocusFromPoint(const CPoint &point) const;
|
||||||
|
diff --git a/xbmc/guilib/GUIWindowManager.cpp b/xbmc/guilib/GUIWindowManager.cpp
|
||||||
|
index 788bbe9..ef97251 100644
|
||||||
|
--- a/xbmc/guilib/GUIWindowManager.cpp
|
||||||
|
+++ b/xbmc/guilib/GUIWindowManager.cpp
|
||||||
|
@@ -547,6 +547,24 @@ void CGUIWindowManager::RenderPass() const
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+void CGUIWindowManager::RenderEx() const
|
||||||
|
+{
|
||||||
|
+ CGUIWindow* pWindow = GetWindow(GetActiveWindow());
|
||||||
|
+ if (pWindow)
|
||||||
|
+ pWindow->RenderEx();
|
||||||
|
+
|
||||||
|
+ // We don't call RenderEx for now on dialogs since it is used
|
||||||
|
+ // to trigger non gui video rendering. We can activate it later at any time.
|
||||||
|
+ /*
|
||||||
|
+ vector<CGUIWindow *> &activeDialogs = m_activeDialogs;
|
||||||
|
+ for (iDialog it = activeDialogs.begin(); it != activeDialogs.end(); ++it)
|
||||||
|
+ {
|
||||||
|
+ if ((*it)->IsDialogRunning())
|
||||||
|
+ (*it)->RenderEx();
|
||||||
|
+ }
|
||||||
|
+ */
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
bool CGUIWindowManager::Render()
|
||||||
|
{
|
||||||
|
assert(g_application.IsCurrentThread());
|
||||||
|
@@ -586,13 +604,15 @@ bool CGUIWindowManager::Render()
|
||||||
|
if (g_advancedSettings.m_guiVisualizeDirtyRegions)
|
||||||
|
{
|
||||||
|
g_graphicsContext.SetRenderingResolution(g_graphicsContext.GetResInfo(), false);
|
||||||
|
- const CDirtyRegionList &markedRegions = m_tracker.GetMarkedRegions();
|
||||||
|
+ const CDirtyRegionList &markedRegions = m_tracker.GetMarkedRegions();
|
||||||
|
for (CDirtyRegionList::const_iterator i = markedRegions.begin(); i != markedRegions.end(); ++i)
|
||||||
|
CGUITexture::DrawQuad(*i, 0x0fff0000);
|
||||||
|
for (CDirtyRegionList::const_iterator i = dirtyRegions.begin(); i != dirtyRegions.end(); ++i)
|
||||||
|
CGUITexture::DrawQuad(*i, 0x4c00ff00);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ RenderEx();
|
||||||
|
+
|
||||||
|
return hasRendered;
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/xbmc/guilib/GUIWindowManager.h b/xbmc/guilib/GUIWindowManager.h
|
||||||
|
index 4f1f96f..ea7239a 100644
|
||||||
|
--- a/xbmc/guilib/GUIWindowManager.h
|
||||||
|
+++ b/xbmc/guilib/GUIWindowManager.h
|
||||||
|
@@ -144,6 +144,7 @@ public:
|
||||||
|
#endif
|
||||||
|
private:
|
||||||
|
void RenderPass() const;
|
||||||
|
+ void RenderEx() const;
|
||||||
|
|
||||||
|
void LoadNotOnDemandWindows();
|
||||||
|
void UnloadNotOnDemandWindows();
|
||||||
|
diff --git a/xbmc/video/windows/GUIWindowFullScreen.cpp b/xbmc/video/windows/GUIWindowFullScreen.cpp
|
||||||
|
index dfbf773..ed7c090 100644
|
||||||
|
--- a/xbmc/video/windows/GUIWindowFullScreen.cpp
|
||||||
|
+++ b/xbmc/video/windows/GUIWindowFullScreen.cpp
|
||||||
|
@@ -353,6 +353,12 @@ bool CGUIWindowFullScreen::OnAction(const CAction &action)
|
||||||
|
return CGUIWindow::OnAction(action);
|
||||||
|
}
|
||||||
|
|
||||||
|
+void CGUIWindowFullScreen::ClearBackground()
|
||||||
|
+{
|
||||||
|
+ if (g_renderManager.IsVideoLayer())
|
||||||
|
+ g_graphicsContext.Clear(0);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
void CGUIWindowFullScreen::OnWindowLoaded()
|
||||||
|
{
|
||||||
|
CGUIWindow::OnWindowLoaded();
|
||||||
|
@@ -455,6 +461,7 @@ bool CGUIWindowFullScreen::OnMessage(CGUIMessage& message)
|
||||||
|
#ifdef HAS_VIDEO_PLAYBACK
|
||||||
|
// make sure renderer is uptospeed
|
||||||
|
g_renderManager.Update();
|
||||||
|
+ g_renderManager.FrameFinish();
|
||||||
|
#endif
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
@@ -730,22 +737,40 @@ void CGUIWindowFullScreen::FrameMove()
|
||||||
|
SET_CONTROL_HIDDEN(BLUE_BAR);
|
||||||
|
SET_CONTROL_HIDDEN(CONTROL_GROUP_CHOOSER);
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ g_renderManager.FrameMove();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGUIWindowFullScreen::Process(unsigned int currentTime, CDirtyRegionList &dirtyregion)
|
||||||
|
{
|
||||||
|
+ if (g_renderManager.IsGuiLayer())
|
||||||
|
+ MarkDirtyRegion();
|
||||||
|
+
|
||||||
|
+ CGUIWindow::Process(currentTime, dirtyregion);
|
||||||
|
+
|
||||||
|
// TODO: This isn't quite optimal - ideally we'd only be dirtying up the actual video render rect
|
||||||
|
// which is probably the job of the renderer as it can more easily track resizing etc.
|
||||||
|
- MarkDirtyRegion();
|
||||||
|
- CGUIWindow::Process(currentTime, dirtyregion);
|
||||||
|
m_renderRegion.SetRect(0, 0, (float)g_graphicsContext.GetWidth(), (float)g_graphicsContext.GetHeight());
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGUIWindowFullScreen::Render()
|
||||||
|
{
|
||||||
|
+ g_graphicsContext.SetRenderingResolution(g_graphicsContext.GetVideoResolution(), false);
|
||||||
|
+ g_renderManager.Render(true, 0, 255);
|
||||||
|
+ g_graphicsContext.SetRenderingResolution(m_coordsRes, m_needsScaling);
|
||||||
|
CGUIWindow::Render();
|
||||||
|
}
|
||||||
|
|
||||||
|
+void CGUIWindowFullScreen::RenderEx()
|
||||||
|
+{
|
||||||
|
+ CGUIWindow::RenderEx();
|
||||||
|
+ g_graphicsContext.SetRenderingResolution(g_graphicsContext.GetVideoResolution(), false);
|
||||||
|
+#ifdef HAS_VIDEO_PLAYBACK
|
||||||
|
+ g_renderManager.Render(false, 0, 255, false);
|
||||||
|
+ g_renderManager.FrameFinish();
|
||||||
|
+#endif
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
void CGUIWindowFullScreen::ChangetheTimeCode(int remote)
|
||||||
|
{
|
||||||
|
if (remote >= REMOTE_0 && remote <= REMOTE_9)
|
||||||
|
@@ -851,6 +876,8 @@ void CGUIWindowFullScreen::ToggleOSD()
|
||||||
|
else
|
||||||
|
pOSD->DoModal();
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ MarkDirtyRegion();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CGUIWindowFullScreen::TriggerOSD()
|
||||||
|
diff --git a/xbmc/video/windows/GUIWindowFullScreen.h b/xbmc/video/windows/GUIWindowFullScreen.h
|
||||||
|
index 03608af..5a9b101 100644
|
||||||
|
--- a/xbmc/video/windows/GUIWindowFullScreen.h
|
||||||
|
+++ b/xbmc/video/windows/GUIWindowFullScreen.h
|
||||||
|
@@ -30,9 +30,11 @@ public:
|
||||||
|
virtual ~CGUIWindowFullScreen(void);
|
||||||
|
virtual bool OnMessage(CGUIMessage& message);
|
||||||
|
virtual bool OnAction(const CAction &action);
|
||||||
|
+ virtual void ClearBackground();
|
||||||
|
virtual void FrameMove();
|
||||||
|
virtual void Process(unsigned int currentTime, CDirtyRegionList &dirtyregion);
|
||||||
|
virtual void Render();
|
||||||
|
+ virtual void RenderEx();
|
||||||
|
virtual void OnWindowLoaded();
|
||||||
|
void ChangetheTimeCode(int remote);
|
||||||
|
void ChangetheTVGroup(bool next);
|
||||||
|
--
|
||||||
|
1.9.3
|
||||||
|
|
@ -0,0 +1,25 @@
|
|||||||
|
From 0eebba44430bb98521d9ff22478a0893869bda03 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Rainer Hochecker <fernetmenta@online.de>
|
||||||
|
Date: Mon, 5 Jan 2015 11:29:15 +0100
|
||||||
|
Subject: [PATCH 04/16] guilib: mark control dirty when setting to invisible
|
||||||
|
|
||||||
|
---
|
||||||
|
xbmc/guilib/GUIControl.cpp | 2 ++
|
||||||
|
1 file changed, 2 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/xbmc/guilib/GUIControl.cpp b/xbmc/guilib/GUIControl.cpp
|
||||||
|
index e3d04db..ff2086b 100644
|
||||||
|
--- a/xbmc/guilib/GUIControl.cpp
|
||||||
|
+++ b/xbmc/guilib/GUIControl.cpp
|
||||||
|
@@ -511,6 +511,8 @@ void CGUIControl::SetVisible(bool bVisible, bool setVisState)
|
||||||
|
{
|
||||||
|
m_forceHidden = !bVisible;
|
||||||
|
SetInvalid();
|
||||||
|
+ if (m_forceHidden)
|
||||||
|
+ MarkDirtyRegion();
|
||||||
|
}
|
||||||
|
if (m_forceHidden)
|
||||||
|
{ // reset any visible animations that are in process
|
||||||
|
--
|
||||||
|
1.9.3
|
||||||
|
|
@ -0,0 +1,27 @@
|
|||||||
|
From 0d91676f4100a43304702c76d737e05cc665cca5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Rainer Hochecker <fernetmenta@online.de>
|
||||||
|
Date: Tue, 6 Jan 2015 13:13:27 +0100
|
||||||
|
Subject: [PATCH 05/16] renderer: exit gfx lock when waiting for present time
|
||||||
|
|
||||||
|
---
|
||||||
|
xbmc/cores/VideoRenderers/RenderManager.cpp | 3 +++
|
||||||
|
1 file changed, 3 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/xbmc/cores/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoRenderers/RenderManager.cpp
|
||||||
|
index 63bbdcc..b394d7b 100644
|
||||||
|
--- a/xbmc/cores/VideoRenderers/RenderManager.cpp
|
||||||
|
+++ b/xbmc/cores/VideoRenderers/RenderManager.cpp
|
||||||
|
@@ -381,7 +381,10 @@ void CXBMCRenderManager::FrameFinish()
|
||||||
|
SPresent& m = m_Queue[m_presentsource];
|
||||||
|
|
||||||
|
if(g_graphicsContext.IsFullScreenVideo())
|
||||||
|
+ {
|
||||||
|
+ CSingleExit lock(g_graphicsContext);
|
||||||
|
WaitPresentTime(m.timestamp);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
m_clock_framefinish = GetPresentTime();
|
||||||
|
|
||||||
|
--
|
||||||
|
1.9.3
|
||||||
|
|
@ -0,0 +1,94 @@
|
|||||||
|
From 0607a56a5f0eb916d2c27613bcd8db7d3c357aee Mon Sep 17 00:00:00 2001
|
||||||
|
From: Rainer Hochecker <fernetmenta@online.de>
|
||||||
|
Date: Fri, 23 Jan 2015 07:41:46 +0100
|
||||||
|
Subject: [PATCH 06/16] renderer: fix sequence from WaitFrame, Render,
|
||||||
|
FrameMove to WaitFrame, FrameMove, Render
|
||||||
|
|
||||||
|
---
|
||||||
|
xbmc/Application.cpp | 12 +++++++++---
|
||||||
|
xbmc/cores/VideoRenderers/RenderManager.cpp | 12 ++++++++++--
|
||||||
|
xbmc/cores/VideoRenderers/RenderManager.h | 3 ++-
|
||||||
|
3 files changed, 21 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/xbmc/Application.cpp b/xbmc/Application.cpp
|
||||||
|
index bc33a79..a79c7dd 100644
|
||||||
|
--- a/xbmc/Application.cpp
|
||||||
|
+++ b/xbmc/Application.cpp
|
||||||
|
@@ -2217,16 +2217,17 @@ void CApplication::Render()
|
||||||
|
bool limitFrames = false;
|
||||||
|
unsigned int singleFrameTime = 10; // default limit 100 fps
|
||||||
|
|
||||||
|
+ // Whether externalplayer is playing and we're unfocused
|
||||||
|
+ bool extPlayerActive = m_pPlayer->GetCurrentPlayer() == EPC_EXTPLAYER && m_pPlayer->IsPlaying() && !m_AppFocused;
|
||||||
|
+
|
||||||
|
{
|
||||||
|
// Less fps in DPMS
|
||||||
|
bool lowfps = m_dpmsIsActive || g_Windowing.EnableFrameLimiter();
|
||||||
|
- // Whether externalplayer is playing and we're unfocused
|
||||||
|
- bool extPlayerActive = m_pPlayer->GetCurrentPlayer() == EPC_EXTPLAYER && m_pPlayer->IsPlaying() && !m_AppFocused;
|
||||||
|
|
||||||
|
m_bPresentFrame = false;
|
||||||
|
if (!extPlayerActive && g_graphicsContext.IsFullScreenVideo() && !m_pPlayer->IsPausedPlayback())
|
||||||
|
{
|
||||||
|
- m_bPresentFrame = g_renderManager.FrameWait(100);
|
||||||
|
+ m_bPresentFrame = g_renderManager.HasFrame();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
@@ -2327,6 +2328,11 @@ void CApplication::Render()
|
||||||
|
if (flip)
|
||||||
|
g_graphicsContext.Flip(dirtyRegions);
|
||||||
|
|
||||||
|
+ if (!extPlayerActive && g_graphicsContext.IsFullScreenVideo() && !m_pPlayer->IsPausedPlayback())
|
||||||
|
+ {
|
||||||
|
+ g_renderManager.FrameWait(100);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
m_lastFrameTime = XbmcThreads::SystemClockMillis();
|
||||||
|
CTimeUtils::UpdateFrameTime(flip);
|
||||||
|
|
||||||
|
diff --git a/xbmc/cores/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoRenderers/RenderManager.cpp
|
||||||
|
index b394d7b..36c2842 100644
|
||||||
|
--- a/xbmc/cores/VideoRenderers/RenderManager.cpp
|
||||||
|
+++ b/xbmc/cores/VideoRenderers/RenderManager.cpp
|
||||||
|
@@ -316,13 +316,21 @@ void CXBMCRenderManager::Update()
|
||||||
|
m_pRenderer->Update();
|
||||||
|
}
|
||||||
|
|
||||||
|
-bool CXBMCRenderManager::FrameWait(int ms)
|
||||||
|
+void CXBMCRenderManager::FrameWait(int ms)
|
||||||
|
{
|
||||||
|
XbmcThreads::EndTime timeout(ms);
|
||||||
|
CSingleLock lock(m_presentlock);
|
||||||
|
while(m_presentstep == PRESENT_IDLE && !timeout.IsTimePast())
|
||||||
|
m_presentevent.wait(lock, timeout.MillisLeft());
|
||||||
|
- return m_presentstep != PRESENT_IDLE;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+bool CXBMCRenderManager::HasFrame()
|
||||||
|
+{
|
||||||
|
+ CSingleLock lock(m_presentlock);
|
||||||
|
+ if (m_presentstep == PRESENT_FRAME || m_presentstep == PRESENT_FRAME2)
|
||||||
|
+ return true;
|
||||||
|
+ else
|
||||||
|
+ return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CXBMCRenderManager::FrameMove()
|
||||||
|
diff --git a/xbmc/cores/VideoRenderers/RenderManager.h b/xbmc/cores/VideoRenderers/RenderManager.h
|
||||||
|
index 7280423..b80319a 100644
|
||||||
|
--- a/xbmc/cores/VideoRenderers/RenderManager.h
|
||||||
|
+++ b/xbmc/cores/VideoRenderers/RenderManager.h
|
||||||
|
@@ -59,7 +59,8 @@ public:
|
||||||
|
void Update();
|
||||||
|
void FrameMove();
|
||||||
|
void FrameFinish();
|
||||||
|
- bool FrameWait(int ms);
|
||||||
|
+ void FrameWait(int ms);
|
||||||
|
+ bool HasFrame();
|
||||||
|
void Render(bool clear, DWORD flags = 0, DWORD alpha = 255, bool gui = true);
|
||||||
|
bool IsGuiLayer();
|
||||||
|
bool IsVideoLayer();
|
||||||
|
--
|
||||||
|
1.9.3
|
||||||
|
|
@ -0,0 +1,80 @@
|
|||||||
|
From 264be7a32fdb566ecf69933189553128c589c800 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Stanislav Vlasic <svlasic@gmail.com>
|
||||||
|
Date: Mon, 13 Oct 2014 13:20:11 +0200
|
||||||
|
Subject: [PATCH 07/16] Add aml_support_hevc function and recognize S812 chip
|
||||||
|
|
||||||
|
---
|
||||||
|
xbmc/utils/AMLUtils.cpp | 26 ++++++++++++++++++++++++--
|
||||||
|
xbmc/utils/AMLUtils.h | 5 ++++-
|
||||||
|
2 files changed, 28 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/xbmc/utils/AMLUtils.cpp b/xbmc/utils/AMLUtils.cpp
|
||||||
|
index 9553745..ac921db 100644
|
||||||
|
--- a/xbmc/utils/AMLUtils.cpp
|
||||||
|
+++ b/xbmc/utils/AMLUtils.cpp
|
||||||
|
@@ -159,6 +159,22 @@ void aml_permissions()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+bool aml_support_hevc()
|
||||||
|
+{
|
||||||
|
+ char valstr[1024];
|
||||||
|
+ if(aml_get_sysfs_str("/sys/class/amstream/vcodec_profile", valstr, 1024) != 0)
|
||||||
|
+ {
|
||||||
|
+ return false;
|
||||||
|
+ }
|
||||||
|
+ char* p = strstr(valstr, "hevc:");
|
||||||
|
+ if(p == NULL)
|
||||||
|
+ {
|
||||||
|
+ return false;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return true;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
enum AML_DEVICE_TYPE aml_get_device_type()
|
||||||
|
{
|
||||||
|
static enum AML_DEVICE_TYPE aml_device_type = AML_DEVICE_TYPE_UNINIT;
|
||||||
|
@@ -173,8 +189,14 @@ enum AML_DEVICE_TYPE aml_get_device_type()
|
||||||
|
aml_device_type = AML_DEVICE_TYPE_M3;
|
||||||
|
else if (cpu_hardware.find("Meson6") != std::string::npos)
|
||||||
|
aml_device_type = AML_DEVICE_TYPE_M6;
|
||||||
|
- else if (cpu_hardware.find("Meson8") != std::string::npos)
|
||||||
|
- aml_device_type = AML_DEVICE_TYPE_M8;
|
||||||
|
+ else if ((cpu_hardware.find("Meson8") != std::string::npos) && (cpu_hardware.find("Meson8B") == std::string::npos))
|
||||||
|
+ {
|
||||||
|
+ if (aml_support_hevc())
|
||||||
|
+ aml_device_type = AML_DEVICE_TYPE_M8M2;
|
||||||
|
+ else
|
||||||
|
+ aml_device_type = AML_DEVICE_TYPE_M8;
|
||||||
|
+ } else if (cpu_hardware.find("Meson8B") != std::string::npos)
|
||||||
|
+ aml_device_type = AML_DEVICE_TYPE_M8B;
|
||||||
|
else
|
||||||
|
aml_device_type = AML_DEVICE_TYPE_UNKNOWN;
|
||||||
|
}
|
||||||
|
diff --git a/xbmc/utils/AMLUtils.h b/xbmc/utils/AMLUtils.h
|
||||||
|
index 9778e9b..208f9d3 100644
|
||||||
|
--- a/xbmc/utils/AMLUtils.h
|
||||||
|
+++ b/xbmc/utils/AMLUtils.h
|
||||||
|
@@ -28,7 +28,9 @@ enum AML_DEVICE_TYPE
|
||||||
|
AML_DEVICE_TYPE_M1,
|
||||||
|
AML_DEVICE_TYPE_M3,
|
||||||
|
AML_DEVICE_TYPE_M6,
|
||||||
|
- AML_DEVICE_TYPE_M8
|
||||||
|
+ AML_DEVICE_TYPE_M8, // S802
|
||||||
|
+ AML_DEVICE_TYPE_M8B, // S805
|
||||||
|
+ AML_DEVICE_TYPE_M8M2 // S812
|
||||||
|
};
|
||||||
|
|
||||||
|
enum AML_DISPLAY_AXIS_PARAM
|
||||||
|
@@ -48,6 +50,7 @@ bool aml_present();
|
||||||
|
void aml_permissions();
|
||||||
|
bool aml_hw3d_present();
|
||||||
|
bool aml_wired_present();
|
||||||
|
+bool aml_support_hevc();
|
||||||
|
enum AML_DEVICE_TYPE aml_get_device_type();
|
||||||
|
void aml_cpufreq_min(bool limit);
|
||||||
|
void aml_cpufreq_max(bool limit);
|
||||||
|
--
|
||||||
|
1.9.3
|
||||||
|
|
@ -0,0 +1,814 @@
|
|||||||
|
From 22a9bc18b49eb5858b5c7511c9573a861fa81232 Mon Sep 17 00:00:00 2001
|
||||||
|
From: "Chris \"Koying\" Browet" <cbro@semperpax.com>
|
||||||
|
Date: Wed, 31 Dec 2014 15:08:12 +0100
|
||||||
|
Subject: [PATCH 08/16] CHG: Extract SysfsUtils from the AML utils
|
||||||
|
|
||||||
|
---
|
||||||
|
xbmc/cores/dvdplayer/DVDCodecs/Video/AMLCodec.cpp | 46 +++++-----
|
||||||
|
xbmc/utils/AMLUtils.cpp | 95 ++++----------------
|
||||||
|
xbmc/utils/AMLUtils.h | 5 --
|
||||||
|
xbmc/utils/Makefile.in | 1 +
|
||||||
|
xbmc/utils/SysfsUtils.cpp | 104 ++++++++++++++++++++++
|
||||||
|
xbmc/utils/SysfsUtils.h | 32 +++++++
|
||||||
|
xbmc/windowing/egl/EGLNativeTypeAmlogic.cpp | 100 ++++++++++-----------
|
||||||
|
xbmc/windowing/egl/EGLNativeTypeIMX.cpp | 44 ++-------
|
||||||
|
xbmc/windowing/egl/EGLNativeTypeIMX.h | 2 -
|
||||||
|
9 files changed, 234 insertions(+), 195 deletions(-)
|
||||||
|
create mode 100644 xbmc/utils/SysfsUtils.cpp
|
||||||
|
create mode 100644 xbmc/utils/SysfsUtils.h
|
||||||
|
|
||||||
|
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/AMLCodec.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/AMLCodec.cpp
|
||||||
|
index 26db4a1..b74d361 100644
|
||||||
|
--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/AMLCodec.cpp
|
||||||
|
+++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/AMLCodec.cpp
|
||||||
|
@@ -33,6 +33,7 @@
|
||||||
|
#include "utils/AMLUtils.h"
|
||||||
|
#include "utils/log.h"
|
||||||
|
#include "utils/StringUtils.h"
|
||||||
|
+#include "utils/SysfsUtils.h"
|
||||||
|
#include "utils/TimeUtils.h"
|
||||||
|
|
||||||
|
#if defined(TARGET_ANDROID)
|
||||||
|
@@ -1643,7 +1644,7 @@ bool CAMLCodec::OpenDecoder(CDVDStreamInfo &hints)
|
||||||
|
m_dll->codec_set_cntl_avthresh(&am_private->vcodec, AV_SYNC_THRESH);
|
||||||
|
m_dll->codec_set_cntl_syncthresh(&am_private->vcodec, 0);
|
||||||
|
// disable tsync, we are playing video disconnected from audio.
|
||||||
|
- aml_set_sysfs_int("/sys/class/tsync/enable", 0);
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/tsync/enable", 0);
|
||||||
|
|
||||||
|
am_private->am_pkt.codec = &am_private->vcodec;
|
||||||
|
pre_header_feeding(am_private, &am_private->am_pkt);
|
||||||
|
@@ -1655,15 +1656,15 @@ bool CAMLCodec::OpenDecoder(CDVDStreamInfo &hints)
|
||||||
|
|
||||||
|
m_display_rect = CRect(0, 0, CDisplaySettings::Get().GetCurrentResolutionInfo().iWidth, CDisplaySettings::Get().GetCurrentResolutionInfo().iHeight);
|
||||||
|
|
||||||
|
- char buffer[256] = {0};
|
||||||
|
- aml_get_sysfs_str("/sys/class/ppmgr/ppscaler", buffer, 255);
|
||||||
|
- if (!strstr(buffer, "enabled")) // Scaler not enabled, use screen size
|
||||||
|
+ std::string strScaler;
|
||||||
|
+ SysfsUtils::GetString("/sys/class/ppmgr/ppscaler", strScaler);
|
||||||
|
+ if (strScaler.find("enabled") != std::string::npos) // Scaler not enabled, use screen size
|
||||||
|
{
|
||||||
|
CLog::Log(LOGDEBUG, "ppscaler not enabled");
|
||||||
|
- memset(buffer, 0, 256);
|
||||||
|
- aml_get_sysfs_str("/sys/class/display/mode", buffer, 255);
|
||||||
|
+ std::string mode;
|
||||||
|
+ SysfsUtils::GetString("/sys/class/display/mode", mode);
|
||||||
|
RESOLUTION_INFO res;
|
||||||
|
- if (aml_mode_to_resolution(buffer, &res))
|
||||||
|
+ if (aml_mode_to_resolution(mode.c_str(), &res))
|
||||||
|
m_display_rect = CRect(0, 0, res.iScreenWidth, res.iScreenHeight);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1671,11 +1672,11 @@ bool CAMLCodec::OpenDecoder(CDVDStreamInfo &hints)
|
||||||
|
// if display is set to 1080xxx, then disable deinterlacer for HD content
|
||||||
|
// else bandwidth usage is too heavy and it will slow down video decoder.
|
||||||
|
char display_mode[256] = {0};
|
||||||
|
- aml_get_sysfs_str("/sys/class/display/mode", display_mode, 255);
|
||||||
|
+ SysfsUtils::GetString("/sys/class/display/mode", display_mode, 255);
|
||||||
|
if (strstr(display_mode,"1080"))
|
||||||
|
- aml_set_sysfs_int("/sys/module/di/parameters/bypass_all", 1);
|
||||||
|
+ SysfsUtils::SetInt("/sys/module/di/parameters/bypass_all", 1);
|
||||||
|
else
|
||||||
|
- aml_set_sysfs_int("/sys/module/di/parameters/bypass_all", 0);
|
||||||
|
+ SysfsUtils::SetInt("/sys/module/di/parameters/bypass_all", 0);
|
||||||
|
*/
|
||||||
|
|
||||||
|
m_opened = true;
|
||||||
|
@@ -1708,7 +1709,7 @@ void CAMLCodec::CloseDecoder()
|
||||||
|
free(am_private->extradata);
|
||||||
|
am_private->extradata = NULL;
|
||||||
|
// return tsync to default so external apps work
|
||||||
|
- aml_set_sysfs_int("/sys/class/tsync/enable", 1);
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/tsync/enable", 1);
|
||||||
|
|
||||||
|
ShowMainVideo(false);
|
||||||
|
}
|
||||||
|
@@ -1721,8 +1722,9 @@ void CAMLCodec::Reset()
|
||||||
|
return;
|
||||||
|
|
||||||
|
// set the system blackout_policy to leave the last frame showing
|
||||||
|
- int blackout_policy = aml_get_sysfs_int("/sys/class/video/blackout_policy");
|
||||||
|
- aml_set_sysfs_int("/sys/class/video/blackout_policy", 0);
|
||||||
|
+ int blackout_policy;
|
||||||
|
+ SysfsUtils::GetInt("/sys/class/video/blackout_policy", blackout_policy);
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/video/blackout_policy", 0);
|
||||||
|
|
||||||
|
// restore the speed (some amcodec versions require this)
|
||||||
|
if (m_speed != DVD_PLAYSPEED_NORMAL)
|
||||||
|
@@ -1742,7 +1744,7 @@ void CAMLCodec::Reset()
|
||||||
|
pre_header_feeding(am_private, &am_private->am_pkt);
|
||||||
|
|
||||||
|
// restore the saved system blackout_policy value
|
||||||
|
- aml_set_sysfs_int("/sys/class/video/blackout_policy", blackout_policy);
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/video/blackout_policy", blackout_policy);
|
||||||
|
|
||||||
|
// reset some interal vars
|
||||||
|
m_1st_pts = 0;
|
||||||
|
@@ -2065,7 +2067,7 @@ void CAMLCodec::ShowMainVideo(const bool show)
|
||||||
|
if (saved_disable_video == disable_video)
|
||||||
|
return;
|
||||||
|
|
||||||
|
- aml_set_sysfs_int("/sys/class/video/disable_video", disable_video);
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/video/disable_video", disable_video);
|
||||||
|
saved_disable_video = disable_video;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -2074,7 +2076,7 @@ void CAMLCodec::SetVideoZoom(const float zoom)
|
||||||
|
// input zoom range is 0.5 to 2.0 with a default of 1.0.
|
||||||
|
// output zoom range is 2 to 300 with default of 100.
|
||||||
|
// we limit that to a range of 50 to 200 with default of 100.
|
||||||
|
- aml_set_sysfs_int("/sys/class/video/zoom", (int)(100 * zoom));
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/video/zoom", (int)(100 * zoom));
|
||||||
|
}
|
||||||
|
|
||||||
|
void CAMLCodec::SetVideoContrast(const int contrast)
|
||||||
|
@@ -2082,19 +2084,19 @@ void CAMLCodec::SetVideoContrast(const int contrast)
|
||||||
|
// input contrast range is 0 to 100 with default of 50.
|
||||||
|
// output contrast range is -255 to 255 with default of 0.
|
||||||
|
int aml_contrast = (255 * (contrast - 50)) / 50;
|
||||||
|
- aml_set_sysfs_int("/sys/class/video/contrast", aml_contrast);
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/video/contrast", aml_contrast);
|
||||||
|
}
|
||||||
|
void CAMLCodec::SetVideoBrightness(const int brightness)
|
||||||
|
{
|
||||||
|
// input brightness range is 0 to 100 with default of 50.
|
||||||
|
// output brightness range is -127 to 127 with default of 0.
|
||||||
|
int aml_brightness = (127 * (brightness - 50)) / 50;
|
||||||
|
- aml_set_sysfs_int("/sys/class/video/brightness", aml_brightness);
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/video/brightness", aml_brightness);
|
||||||
|
}
|
||||||
|
void CAMLCodec::SetVideoSaturation(const int saturation)
|
||||||
|
{
|
||||||
|
// output saturation range is -127 to 127 with default of 127.
|
||||||
|
- aml_set_sysfs_int("/sys/class/video/saturation", saturation);
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/video/saturation", saturation);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CAMLCodec::GetRenderFeatures(Features &renderFeatures)
|
||||||
|
@@ -2110,7 +2112,7 @@ void CAMLCodec::GetRenderFeatures(Features &renderFeatures)
|
||||||
|
void CAMLCodec::SetVideo3dMode(const int mode3d)
|
||||||
|
{
|
||||||
|
CLog::Log(LOGDEBUG, "CAMLCodec::SetVideo3dMode:mode3d(0x%x)", mode3d);
|
||||||
|
- aml_set_sysfs_int("/sys/class/ppmgr/ppmgr_3d_mode", mode3d);
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/ppmgr/ppmgr_3d_mode", mode3d);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string CAMLCodec::GetStereoMode()
|
||||||
|
@@ -2313,9 +2315,9 @@ void CAMLCodec::SetVideoRect(const CRect &SrcRect, const CRect &DestRect)
|
||||||
|
char video_axis[256] = {};
|
||||||
|
sprintf(video_axis, "%d %d %d %d", (int)dst_rect.x1, (int)dst_rect.y1, (int)dst_rect.x2, (int)dst_rect.y2);
|
||||||
|
|
||||||
|
- aml_set_sysfs_str("/sys/class/video/axis", video_axis);
|
||||||
|
+ SysfsUtils::SetString("/sys/class/video/axis", video_axis);
|
||||||
|
// make sure we are in 'full stretch' so we can stretch
|
||||||
|
- aml_set_sysfs_int("/sys/class/video/screen_mode", 1);
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/video/screen_mode", 1);
|
||||||
|
|
||||||
|
// we only get called once gui has changed to something
|
||||||
|
// that would show video playback, so show it.
|
||||||
|
diff --git a/xbmc/utils/AMLUtils.cpp b/xbmc/utils/AMLUtils.cpp
|
||||||
|
index ac921db..c127c84 100644
|
||||||
|
--- a/xbmc/utils/AMLUtils.cpp
|
||||||
|
+++ b/xbmc/utils/AMLUtils.cpp
|
||||||
|
@@ -28,77 +28,22 @@
|
||||||
|
#include "AMLUtils.h"
|
||||||
|
#include "utils/CPUInfo.h"
|
||||||
|
#include "utils/log.h"
|
||||||
|
+#include "utils/SysfsUtils.h"
|
||||||
|
#include "utils/StringUtils.h"
|
||||||
|
#include "utils/AMLUtils.h"
|
||||||
|
#include "guilib/gui3d.h"
|
||||||
|
|
||||||
|
-int aml_set_sysfs_str(const char *path, const char *val)
|
||||||
|
-{
|
||||||
|
- int fd = open(path, O_CREAT | O_RDWR | O_TRUNC, 0644);
|
||||||
|
- if (fd >= 0)
|
||||||
|
- {
|
||||||
|
- write(fd, val, strlen(val));
|
||||||
|
- close(fd);
|
||||||
|
- return 0;
|
||||||
|
- }
|
||||||
|
- return -1;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-int aml_get_sysfs_str(const char *path, char *valstr, const int size)
|
||||||
|
-{
|
||||||
|
- int fd = open(path, O_RDONLY);
|
||||||
|
- if (fd >= 0)
|
||||||
|
- {
|
||||||
|
- read(fd, valstr, size - 1);
|
||||||
|
- valstr[strlen(valstr)] = '\0';
|
||||||
|
- close(fd);
|
||||||
|
- return 0;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- sprintf(valstr, "%s", "fail");
|
||||||
|
- return -1;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-int aml_set_sysfs_int(const char *path, const int val)
|
||||||
|
-{
|
||||||
|
- int fd = open(path, O_CREAT | O_RDWR | O_TRUNC, 0644);
|
||||||
|
- if (fd >= 0)
|
||||||
|
- {
|
||||||
|
- char bcmd[16];
|
||||||
|
- sprintf(bcmd, "%d", val);
|
||||||
|
- write(fd, bcmd, strlen(bcmd));
|
||||||
|
- close(fd);
|
||||||
|
- return 0;
|
||||||
|
- }
|
||||||
|
- return -1;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-int aml_get_sysfs_int(const char *path)
|
||||||
|
-{
|
||||||
|
- int val = -1;
|
||||||
|
- int fd = open(path, O_RDONLY);
|
||||||
|
- if (fd >= 0)
|
||||||
|
- {
|
||||||
|
- char bcmd[16];
|
||||||
|
- read(fd, bcmd, sizeof(bcmd));
|
||||||
|
- val = strtol(bcmd, NULL, 16);
|
||||||
|
- close(fd);
|
||||||
|
- }
|
||||||
|
- return val;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
bool aml_present()
|
||||||
|
{
|
||||||
|
static int has_aml = -1;
|
||||||
|
if (has_aml == -1)
|
||||||
|
{
|
||||||
|
- int rtn = aml_get_sysfs_int("/sys/class/audiodsp/digital_raw");
|
||||||
|
- if (rtn != -1)
|
||||||
|
+ if (SysfsUtils::Has("/sys/class/audiodsp/digital_raw"))
|
||||||
|
has_aml = 1;
|
||||||
|
else
|
||||||
|
has_aml = 0;
|
||||||
|
if (has_aml)
|
||||||
|
- CLog::Log(LOGNOTICE, "aml_present, rtn(%d)", rtn);
|
||||||
|
+ CLog::Log(LOGNOTICE, "AML device detected");
|
||||||
|
}
|
||||||
|
return has_aml == 1;
|
||||||
|
}
|
||||||
|
@@ -108,10 +53,12 @@ bool aml_hw3d_present()
|
||||||
|
static int has_hw3d = -1;
|
||||||
|
if (has_hw3d == -1)
|
||||||
|
{
|
||||||
|
- if (aml_get_sysfs_int("/sys/class/ppmgr/ppmgr_3d_mode") != -1)
|
||||||
|
+ if (SysfsUtils::Has("/sys/class/ppmgr/ppmgr_3d_mode"))
|
||||||
|
has_hw3d = 1;
|
||||||
|
else
|
||||||
|
has_hw3d = 0;
|
||||||
|
+ if (has_hw3d)
|
||||||
|
+ CLog::Log(LOGNOTICE, "AML 3D support detected");
|
||||||
|
}
|
||||||
|
return has_hw3d == 1;
|
||||||
|
}
|
||||||
|
@@ -121,8 +68,8 @@ bool aml_wired_present()
|
||||||
|
static int has_wired = -1;
|
||||||
|
if (has_wired == -1)
|
||||||
|
{
|
||||||
|
- char test[64] = {0};
|
||||||
|
- if (aml_get_sysfs_str("/sys/class/net/eth0/operstate", test, 63) != -1)
|
||||||
|
+ std::string test;
|
||||||
|
+ if (SysfsUtils::GetString("/sys/class/net/eth0/operstate", test) != -1)
|
||||||
|
has_wired = 1;
|
||||||
|
else
|
||||||
|
has_wired = 0;
|
||||||
|
@@ -161,18 +108,12 @@ void aml_permissions()
|
||||||
|
|
||||||
|
bool aml_support_hevc()
|
||||||
|
{
|
||||||
|
- char valstr[1024];
|
||||||
|
- if(aml_get_sysfs_str("/sys/class/amstream/vcodec_profile", valstr, 1024) != 0)
|
||||||
|
+ std::string valstr;
|
||||||
|
+ if(SysfsUtils::GetString("/sys/class/amstream/vcodec_profile", valstr) != 0)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
- char* p = strstr(valstr, "hevc:");
|
||||||
|
- if(p == NULL)
|
||||||
|
- {
|
||||||
|
- return false;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- return true;
|
||||||
|
+ return (valstr.find("hevc:") != std::string::npos);
|
||||||
|
}
|
||||||
|
|
||||||
|
enum AML_DEVICE_TYPE aml_get_device_type()
|
||||||
|
@@ -216,7 +157,7 @@ void aml_cpufreq_min(bool limit)
|
||||||
|
if (limit)
|
||||||
|
cpufreq = 600000;
|
||||||
|
|
||||||
|
- aml_set_sysfs_int("/sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq", cpufreq);
|
||||||
|
+ SysfsUtils::SetInt("/sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq", cpufreq);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
@@ -231,8 +172,8 @@ void aml_cpufreq_max(bool limit)
|
||||||
|
if (limit)
|
||||||
|
cpufreq = 800000;
|
||||||
|
|
||||||
|
- aml_set_sysfs_int("/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq", cpufreq);
|
||||||
|
- aml_set_sysfs_str("/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor", "ondemand");
|
||||||
|
+ SysfsUtils::SetInt("/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq", cpufreq);
|
||||||
|
+ SysfsUtils::SetString("/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor", "ondemand");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -244,7 +185,7 @@ void aml_set_audio_passthrough(bool passthrough)
|
||||||
|
{
|
||||||
|
// m1 uses 1, m3 and above uses 2
|
||||||
|
int raw = aml_get_device_type() == AML_DEVICE_TYPE_M1 ? 1:2;
|
||||||
|
- aml_set_sysfs_int("/sys/class/audiodsp/digital_raw", passthrough ? raw:0);
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/audiodsp/digital_raw", passthrough ? raw:0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -314,11 +255,11 @@ void aml_probe_hdmi_audio()
|
||||||
|
|
||||||
|
int aml_axis_value(AML_DISPLAY_AXIS_PARAM param)
|
||||||
|
{
|
||||||
|
- char axis[20] = {0};
|
||||||
|
+ std::string axis;
|
||||||
|
int value[8];
|
||||||
|
|
||||||
|
- aml_get_sysfs_str("/sys/class/display/axis", axis, 19);
|
||||||
|
- sscanf(axis, "%d %d %d %d %d %d %d %d", &value[0], &value[1], &value[2], &value[3], &value[4], &value[5], &value[6], &value[7]);
|
||||||
|
+ SysfsUtils::GetString("/sys/class/display/axis", axis);
|
||||||
|
+ sscanf(axis.c_str(), "%d %d %d %d %d %d %d %d", &value[0], &value[1], &value[2], &value[3], &value[4], &value[5], &value[6], &value[7]);
|
||||||
|
|
||||||
|
return value[param];
|
||||||
|
}
|
||||||
|
diff --git a/xbmc/utils/AMLUtils.h b/xbmc/utils/AMLUtils.h
|
||||||
|
index 208f9d3..6b0048a 100644
|
||||||
|
--- a/xbmc/utils/AMLUtils.h
|
||||||
|
+++ b/xbmc/utils/AMLUtils.h
|
||||||
|
@@ -41,11 +41,6 @@ enum AML_DISPLAY_AXIS_PARAM
|
||||||
|
AML_DISPLAY_AXIS_PARAM_HEIGHT
|
||||||
|
};
|
||||||
|
|
||||||
|
-int aml_set_sysfs_str(const char *path, const char *val);
|
||||||
|
-int aml_get_sysfs_str(const char *path, char *valstr, const int size);
|
||||||
|
-int aml_set_sysfs_int(const char *path, const int val);
|
||||||
|
-int aml_get_sysfs_int(const char *path);
|
||||||
|
-
|
||||||
|
bool aml_present();
|
||||||
|
void aml_permissions();
|
||||||
|
bool aml_hw3d_present();
|
||||||
|
diff --git a/xbmc/utils/Makefile.in b/xbmc/utils/Makefile.in
|
||||||
|
index e203447..2d89fcd 100644
|
||||||
|
--- a/xbmc/utils/Makefile.in
|
||||||
|
+++ b/xbmc/utils/Makefile.in
|
||||||
|
@@ -79,6 +79,7 @@ SRCS += XMLUtils.cpp
|
||||||
|
SRCS += Utf8Utils.cpp
|
||||||
|
SRCS += XSLTUtils.cpp
|
||||||
|
SRCS += ActorProtocol.cpp
|
||||||
|
+SRCS += SysfsUtils.cpp
|
||||||
|
|
||||||
|
ifeq (@USE_OPENGLES@,1)
|
||||||
|
SRCS += AMLUtils.cpp
|
||||||
|
diff --git a/xbmc/utils/SysfsUtils.cpp b/xbmc/utils/SysfsUtils.cpp
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..ca62986
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/xbmc/utils/SysfsUtils.cpp
|
||||||
|
@@ -0,0 +1,104 @@
|
||||||
|
+/*
|
||||||
|
+ * Copyright (C) 2011-2014 Team XBMC
|
||||||
|
+ * http://xbmc.org
|
||||||
|
+ *
|
||||||
|
+ * This Program is free software; you can redistribute it and/or modify
|
||||||
|
+ * it under the terms of the GNU General Public License as published by
|
||||||
|
+ * the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
+ * any later version.
|
||||||
|
+ *
|
||||||
|
+ * This Program is distributed in the hope that it will be useful,
|
||||||
|
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
+ * GNU General Public License for more details.
|
||||||
|
+ *
|
||||||
|
+ * You should have received a copy of the GNU General Public License
|
||||||
|
+ * along with XBMC; see the file COPYING. If not, see
|
||||||
|
+ * <http://www.gnu.org/licenses/>.
|
||||||
|
+ *
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#include "SysfsUtils.h"
|
||||||
|
+#include "utils/log.h"
|
||||||
|
+
|
||||||
|
+#include <unistd.h>
|
||||||
|
+#include <stdio.h>
|
||||||
|
+#include <stdlib.h>
|
||||||
|
+#include <fcntl.h>
|
||||||
|
+#include <string.h>
|
||||||
|
+
|
||||||
|
+int SysfsUtils::SetString(const std::string& path, const std::string& valstr)
|
||||||
|
+{
|
||||||
|
+ int fd = open(path.c_str(), O_CREAT | O_RDWR | O_TRUNC, 0644);
|
||||||
|
+ if (fd >= 0)
|
||||||
|
+ {
|
||||||
|
+ write(fd, valstr.c_str(), valstr.size());
|
||||||
|
+ close(fd);
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+ CLog::Log(LOGERROR, "%s: error writing %s",__FUNCTION__, path.c_str());
|
||||||
|
+ return -1;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int SysfsUtils::GetString(const std::string& path, std::string& valstr)
|
||||||
|
+{
|
||||||
|
+ int len;
|
||||||
|
+ char buf[256] = {0};
|
||||||
|
+
|
||||||
|
+ int fd = open(path.c_str(), O_RDONLY);
|
||||||
|
+ if (fd >= 0)
|
||||||
|
+ {
|
||||||
|
+ valstr.clear();
|
||||||
|
+ while ((len = read(fd, buf, 256)) > 0)
|
||||||
|
+ valstr.append(buf, len);
|
||||||
|
+ close(fd);
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ CLog::Log(LOGERROR, "%s: error reading %s",__FUNCTION__, path.c_str());
|
||||||
|
+ valstr = "fail";
|
||||||
|
+ return -1;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int SysfsUtils::SetInt(const std::string& path, const int val)
|
||||||
|
+{
|
||||||
|
+ int fd = open(path.c_str(), O_CREAT | O_RDWR | O_TRUNC, 0644);
|
||||||
|
+ if (fd >= 0)
|
||||||
|
+ {
|
||||||
|
+ char bcmd[16];
|
||||||
|
+ sprintf(bcmd, "%d", val);
|
||||||
|
+ write(fd, bcmd, strlen(bcmd));
|
||||||
|
+ close(fd);
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ CLog::Log(LOGERROR, "%s: error writing %s",__FUNCTION__, path.c_str());
|
||||||
|
+ return -1;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+int SysfsUtils::GetInt(const std::string& path, int& val)
|
||||||
|
+{
|
||||||
|
+ int fd = open(path.c_str(), O_RDONLY);
|
||||||
|
+ if (fd >= 0)
|
||||||
|
+ {
|
||||||
|
+ char bcmd[16];
|
||||||
|
+ read(fd, bcmd, sizeof(bcmd));
|
||||||
|
+ val = strtol(bcmd, NULL, 16);
|
||||||
|
+ close(fd);
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ CLog::Log(LOGERROR, "%s: error reading %s",__FUNCTION__, path.c_str());
|
||||||
|
+ return -1;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+bool SysfsUtils::Has(const std::string &path)
|
||||||
|
+{
|
||||||
|
+ int fd = open(path.c_str(), O_RDONLY);
|
||||||
|
+ if (fd >= 0)
|
||||||
|
+ {
|
||||||
|
+ close(fd);
|
||||||
|
+ return true;
|
||||||
|
+ }
|
||||||
|
+ return false;
|
||||||
|
+}
|
||||||
|
diff --git a/xbmc/utils/SysfsUtils.h b/xbmc/utils/SysfsUtils.h
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..fe038bf
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/xbmc/utils/SysfsUtils.h
|
||||||
|
@@ -0,0 +1,32 @@
|
||||||
|
+#pragma once
|
||||||
|
+/*
|
||||||
|
+ * Copyright (C) 2011-2013 Team XBMC
|
||||||
|
+ * http://xbmc.org
|
||||||
|
+ *
|
||||||
|
+ * This Program is free software; you can redistribute it and/or modify
|
||||||
|
+ * it under the terms of the GNU General Public License as published by
|
||||||
|
+ * the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
+ * any later version.
|
||||||
|
+ *
|
||||||
|
+ * This Program is distributed in the hope that it will be useful,
|
||||||
|
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
+ * GNU General Public License for more details.
|
||||||
|
+ *
|
||||||
|
+ * You should have received a copy of the GNU General Public License
|
||||||
|
+ * along with XBMC; see the file COPYING. If not, see
|
||||||
|
+ * <http://www.gnu.org/licenses/>.
|
||||||
|
+ *
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#include <string>
|
||||||
|
+
|
||||||
|
+class SysfsUtils
|
||||||
|
+{
|
||||||
|
+public:
|
||||||
|
+ static int SetString(const std::string& path, const std::string& valstr);
|
||||||
|
+ static int GetString(const std::string& path, std::string& valstr);
|
||||||
|
+ static int SetInt(const std::string& path, const int val);
|
||||||
|
+ static int GetInt(const std::string& path, int& val);
|
||||||
|
+ static bool Has(const std::string& path);
|
||||||
|
+};
|
||||||
|
diff --git a/xbmc/windowing/egl/EGLNativeTypeAmlogic.cpp b/xbmc/windowing/egl/EGLNativeTypeAmlogic.cpp
|
||||||
|
index 7064836..0cce3ea 100644
|
||||||
|
--- a/xbmc/windowing/egl/EGLNativeTypeAmlogic.cpp
|
||||||
|
+++ b/xbmc/windowing/egl/EGLNativeTypeAmlogic.cpp
|
||||||
|
@@ -22,6 +22,7 @@
|
||||||
|
#include "guilib/gui3d.h"
|
||||||
|
#include "utils/AMLUtils.h"
|
||||||
|
#include "utils/StringUtils.h"
|
||||||
|
+#include "utils/SysfsUtils.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <linux/fb.h>
|
||||||
|
@@ -49,13 +50,12 @@ CEGLNativeTypeAmlogic::~CEGLNativeTypeAmlogic()
|
||||||
|
|
||||||
|
bool CEGLNativeTypeAmlogic::CheckCompatibility()
|
||||||
|
{
|
||||||
|
- char name[256] = {0};
|
||||||
|
+ std::string name;
|
||||||
|
std::string modalias = "/sys/class/graphics/" + m_framebuffer_name + "/device/modalias";
|
||||||
|
|
||||||
|
- aml_get_sysfs_str(modalias.c_str(), name, 255);
|
||||||
|
- CStdString strName = name;
|
||||||
|
- StringUtils::Trim(strName);
|
||||||
|
- if (strName == "platform:mesonfb")
|
||||||
|
+ SysfsUtils::GetString(modalias, name);
|
||||||
|
+ StringUtils::Trim(name);
|
||||||
|
+ if (name == "platform:mesonfb")
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
@@ -127,9 +127,9 @@ bool CEGLNativeTypeAmlogic::DestroyNativeWindow()
|
||||||
|
|
||||||
|
bool CEGLNativeTypeAmlogic::GetNativeResolution(RESOLUTION_INFO *res) const
|
||||||
|
{
|
||||||
|
- char mode[256] = {0};
|
||||||
|
- aml_get_sysfs_str("/sys/class/display/mode", mode, 255);
|
||||||
|
- return aml_mode_to_resolution(mode, res);
|
||||||
|
+ std::string mode;
|
||||||
|
+ SysfsUtils::GetString("/sys/class/display/mode", mode);
|
||||||
|
+ return aml_mode_to_resolution(mode.c_str(), res);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CEGLNativeTypeAmlogic::SetNativeResolution(const RESOLUTION_INFO &res)
|
||||||
|
@@ -180,8 +180,8 @@ bool CEGLNativeTypeAmlogic::SetNativeResolution(const RESOLUTION_INFO &res)
|
||||||
|
|
||||||
|
bool CEGLNativeTypeAmlogic::ProbeResolutions(std::vector<RESOLUTION_INFO> &resolutions)
|
||||||
|
{
|
||||||
|
- char valstr[256] = {0};
|
||||||
|
- aml_get_sysfs_str("/sys/class/amhdmitx/amhdmitx0/disp_cap", valstr, 255);
|
||||||
|
+ std::string valstr;
|
||||||
|
+ SysfsUtils::GetString("/sys/class/amhdmitx/amhdmitx0/disp_cap", valstr);
|
||||||
|
std::vector<std::string> probe_str = StringUtils::Split(valstr, "\n");
|
||||||
|
|
||||||
|
resolutions.clear();
|
||||||
|
@@ -210,7 +210,7 @@ bool CEGLNativeTypeAmlogic::GetPreferredResolution(RESOLUTION_INFO *res) const
|
||||||
|
bool CEGLNativeTypeAmlogic::ShowWindow(bool show)
|
||||||
|
{
|
||||||
|
std::string blank_framebuffer = "/sys/class/graphics/" + m_framebuffer_name + "/blank";
|
||||||
|
- aml_set_sysfs_int(blank_framebuffer.c_str(), show ? 0 : 1);
|
||||||
|
+ SysfsUtils::SetInt(blank_framebuffer.c_str(), show ? 0 : 1);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -218,7 +218,7 @@ bool CEGLNativeTypeAmlogic::SetDisplayResolution(const char *resolution)
|
||||||
|
{
|
||||||
|
CStdString mode = resolution;
|
||||||
|
// switch display resolution
|
||||||
|
- aml_set_sysfs_str("/sys/class/display/mode", mode.c_str());
|
||||||
|
+ SysfsUtils::SetString("/sys/class/display/mode", mode.c_str());
|
||||||
|
SetupVideoScaling(mode.c_str());
|
||||||
|
|
||||||
|
return true;
|
||||||
|
@@ -226,67 +226,67 @@ bool CEGLNativeTypeAmlogic::SetDisplayResolution(const char *resolution)
|
||||||
|
|
||||||
|
void CEGLNativeTypeAmlogic::SetupVideoScaling(const char *mode)
|
||||||
|
{
|
||||||
|
- aml_set_sysfs_int("/sys/class/graphics/fb0/blank", 1);
|
||||||
|
- aml_set_sysfs_int("/sys/class/graphics/fb0/free_scale", 0);
|
||||||
|
- aml_set_sysfs_int("/sys/class/graphics/fb1/free_scale", 0);
|
||||||
|
- aml_set_sysfs_int("/sys/class/ppmgr/ppscaler", 0);
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/graphics/fb0/blank", 1);
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/graphics/fb0/free_scale", 0);
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/graphics/fb1/free_scale", 0);
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/ppmgr/ppscaler", 0);
|
||||||
|
|
||||||
|
if (strstr(mode, "1080"))
|
||||||
|
{
|
||||||
|
- aml_set_sysfs_str("/sys/class/graphics/fb0/request2XScale", "8");
|
||||||
|
- aml_set_sysfs_str("/sys/class/graphics/fb1/scale_axis", "1280 720 1920 1080");
|
||||||
|
- aml_set_sysfs_str("/sys/class/graphics/fb1/scale", "0x10001");
|
||||||
|
+ SysfsUtils::SetString("/sys/class/graphics/fb0/request2XScale", "8");
|
||||||
|
+ SysfsUtils::SetString("/sys/class/graphics/fb1/scale_axis", "1280 720 1920 1080");
|
||||||
|
+ SysfsUtils::SetString("/sys/class/graphics/fb1/scale", "0x10001");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
- aml_set_sysfs_str("/sys/class/graphics/fb0/request2XScale", "16 1280 720");
|
||||||
|
+ SysfsUtils::SetString("/sys/class/graphics/fb0/request2XScale", "16 1280 720");
|
||||||
|
}
|
||||||
|
|
||||||
|
- aml_set_sysfs_int("/sys/class/graphics/fb0/blank", 0);
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/graphics/fb0/blank", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CEGLNativeTypeAmlogic::EnableFreeScale()
|
||||||
|
{
|
||||||
|
// enable OSD free scale using frame buffer size of 720p
|
||||||
|
- aml_set_sysfs_int("/sys/class/graphics/fb0/free_scale", 0);
|
||||||
|
- aml_set_sysfs_int("/sys/class/graphics/fb1/free_scale", 0);
|
||||||
|
- aml_set_sysfs_int("/sys/class/graphics/fb0/scale_width", 1280);
|
||||||
|
- aml_set_sysfs_int("/sys/class/graphics/fb0/scale_height", 720);
|
||||||
|
- aml_set_sysfs_int("/sys/class/graphics/fb1/scale_width", 1280);
|
||||||
|
- aml_set_sysfs_int("/sys/class/graphics/fb1/scale_height", 720);
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/graphics/fb0/free_scale", 0);
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/graphics/fb1/free_scale", 0);
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/graphics/fb0/scale_width", 1280);
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/graphics/fb0/scale_height", 720);
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/graphics/fb1/scale_width", 1280);
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/graphics/fb1/scale_height", 720);
|
||||||
|
|
||||||
|
// enable video free scale (scaling to 1920x1080 with frame buffer size 1280x720)
|
||||||
|
- aml_set_sysfs_int("/sys/class/ppmgr/ppscaler", 0);
|
||||||
|
- aml_set_sysfs_int("/sys/class/video/disable_video", 1);
|
||||||
|
- aml_set_sysfs_int("/sys/class/ppmgr/ppscaler", 1);
|
||||||
|
- aml_set_sysfs_str("/sys/class/ppmgr/ppscaler_rect", "0 0 1919 1079 0");
|
||||||
|
- aml_set_sysfs_str("/sys/class/ppmgr/disp", "1280 720");
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/ppmgr/ppscaler", 0);
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/video/disable_video", 1);
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/ppmgr/ppscaler", 1);
|
||||||
|
+ SysfsUtils::SetString("/sys/class/ppmgr/ppscaler_rect", "0 0 1919 1079 0");
|
||||||
|
+ SysfsUtils::SetString("/sys/class/ppmgr/disp", "1280 720");
|
||||||
|
//
|
||||||
|
- aml_set_sysfs_int("/sys/class/graphics/fb0/scale_width", 1280);
|
||||||
|
- aml_set_sysfs_int("/sys/class/graphics/fb0/scale_height", 720);
|
||||||
|
- aml_set_sysfs_int("/sys/class/graphics/fb1/scale_width", 1280);
|
||||||
|
- aml_set_sysfs_int("/sys/class/graphics/fb1/scale_height", 720);
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/graphics/fb0/scale_width", 1280);
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/graphics/fb0/scale_height", 720);
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/graphics/fb1/scale_width", 1280);
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/graphics/fb1/scale_height", 720);
|
||||||
|
//
|
||||||
|
- aml_set_sysfs_int("/sys/class/video/disable_video", 2);
|
||||||
|
- aml_set_sysfs_str("/sys/class/display/axis", "0 0 1279 719 0 0 0 0");
|
||||||
|
- aml_set_sysfs_str("/sys/class/ppmgr/ppscaler_rect", "0 0 1279 719 1");
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/video/disable_video", 2);
|
||||||
|
+ SysfsUtils::SetString("/sys/class/display/axis", "0 0 1279 719 0 0 0 0");
|
||||||
|
+ SysfsUtils::SetString("/sys/class/ppmgr/ppscaler_rect", "0 0 1279 719 1");
|
||||||
|
//
|
||||||
|
- aml_set_sysfs_int("/sys/class/graphics/fb0/free_scale", 1);
|
||||||
|
- aml_set_sysfs_int("/sys/class/graphics/fb1/free_scale", 1);
|
||||||
|
- aml_set_sysfs_str("/sys/class/graphics/fb0/free_scale_axis", "0 0 1279 719");
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/graphics/fb0/free_scale", 1);
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/graphics/fb1/free_scale", 1);
|
||||||
|
+ SysfsUtils::SetString("/sys/class/graphics/fb0/free_scale_axis", "0 0 1279 719");
|
||||||
|
}
|
||||||
|
|
||||||
|
void CEGLNativeTypeAmlogic::DisableFreeScale()
|
||||||
|
{
|
||||||
|
// turn off frame buffer freescale
|
||||||
|
- aml_set_sysfs_int("/sys/class/graphics/fb0/free_scale", 0);
|
||||||
|
- aml_set_sysfs_int("/sys/class/graphics/fb1/free_scale", 0);
|
||||||
|
- aml_set_sysfs_str("/sys/class/graphics/fb0/free_scale_axis", "0 0 1279 719");
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/graphics/fb0/free_scale", 0);
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/graphics/fb1/free_scale", 0);
|
||||||
|
+ SysfsUtils::SetString("/sys/class/graphics/fb0/free_scale_axis", "0 0 1279 719");
|
||||||
|
|
||||||
|
- aml_set_sysfs_int("/sys/class/ppmgr/ppscaler", 0);
|
||||||
|
- aml_set_sysfs_int("/sys/class/video/disable_video", 0);
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/ppmgr/ppscaler", 0);
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/video/disable_video", 0);
|
||||||
|
// now default video display to off
|
||||||
|
- aml_set_sysfs_int("/sys/class/video/disable_video", 1);
|
||||||
|
+ SysfsUtils::SetInt("/sys/class/video/disable_video", 1);
|
||||||
|
|
||||||
|
// revert display axis
|
||||||
|
int fd0;
|
||||||
|
@@ -297,9 +297,9 @@ void CEGLNativeTypeAmlogic::DisableFreeScale()
|
||||||
|
struct fb_var_screeninfo vinfo;
|
||||||
|
if (ioctl(fd0, FBIOGET_VSCREENINFO, &vinfo) == 0)
|
||||||
|
{
|
||||||
|
- char daxis_str[255] = {0};
|
||||||
|
+ char daxis_str[256] = {0};
|
||||||
|
sprintf(daxis_str, "%d %d %d %d 0 0 0 0", 0, 0, vinfo.xres-1, vinfo.yres-1);
|
||||||
|
- aml_set_sysfs_str("/sys/class/display/axis", daxis_str);
|
||||||
|
+ SysfsUtils::SetString("/sys/class/display/axis", daxis_str);
|
||||||
|
}
|
||||||
|
close(fd0);
|
||||||
|
}
|
||||||
|
diff --git a/xbmc/windowing/egl/EGLNativeTypeIMX.cpp b/xbmc/windowing/egl/EGLNativeTypeIMX.cpp
|
||||||
|
index 04cadc8..9893558 100644
|
||||||
|
--- a/xbmc/windowing/egl/EGLNativeTypeIMX.cpp
|
||||||
|
+++ b/xbmc/windowing/egl/EGLNativeTypeIMX.cpp
|
||||||
|
@@ -28,6 +28,7 @@
|
||||||
|
#include "utils/log.h"
|
||||||
|
#include "utils/RegExp.h"
|
||||||
|
#include "utils/StringUtils.h"
|
||||||
|
+#include "utils/SysfsUtils.h"
|
||||||
|
#include "utils/Environment.h"
|
||||||
|
#include "guilib/gui3d.h"
|
||||||
|
#include "windowing/WindowingFactory.h"
|
||||||
|
@@ -190,7 +191,7 @@ bool CEGLNativeTypeIMX::DestroyNativeWindow()
|
||||||
|
bool CEGLNativeTypeIMX::GetNativeResolution(RESOLUTION_INFO *res) const
|
||||||
|
{
|
||||||
|
std::string mode;
|
||||||
|
- get_sysfs_str("/sys/class/graphics/fb0/mode", mode);
|
||||||
|
+ SysfsUtils::GetString("/sys/class/graphics/fb0/mode", mode);
|
||||||
|
return ModeToResolution(mode, res);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -200,14 +201,14 @@ bool CEGLNativeTypeIMX::SetNativeResolution(const RESOLUTION_INFO &res)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
std::string mode;
|
||||||
|
- get_sysfs_str("/sys/class/graphics/fb0/mode", mode);
|
||||||
|
+ SysfsUtils::GetString("/sys/class/graphics/fb0/mode", mode);
|
||||||
|
if (res.strId == mode)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
DestroyNativeWindow();
|
||||||
|
DestroyNativeDisplay();
|
||||||
|
|
||||||
|
- set_sysfs_str("/sys/class/graphics/fb0/mode", res.strId);
|
||||||
|
+ SysfsUtils::SetString("/sys/class/graphics/fb0/mode", res.strId);
|
||||||
|
|
||||||
|
CreateNativeDisplay();
|
||||||
|
|
||||||
|
@@ -225,7 +226,7 @@ bool CEGLNativeTypeIMX::ProbeResolutions(std::vector<RESOLUTION_INFO> &resolutio
|
||||||
|
return false;
|
||||||
|
|
||||||
|
std::string valstr;
|
||||||
|
- get_sysfs_str("/sys/class/graphics/fb0/modes", valstr);
|
||||||
|
+ SysfsUtils::GetString("/sys/class/graphics/fb0/modes", valstr);
|
||||||
|
std::vector<std::string> probe_str;
|
||||||
|
probe_str = StringUtils::Split(valstr, "\n");
|
||||||
|
|
||||||
|
@@ -257,41 +258,6 @@ bool CEGLNativeTypeIMX::ShowWindow(bool show)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
-int CEGLNativeTypeIMX::get_sysfs_str(std::string path, std::string& valstr) const
|
||||||
|
-{
|
||||||
|
- int len;
|
||||||
|
- char buf[256] = {0};
|
||||||
|
-
|
||||||
|
- int fd = open(path.c_str(), O_RDONLY);
|
||||||
|
- if (fd >= 0)
|
||||||
|
- {
|
||||||
|
- while ((len = read(fd, buf, 255)) > 0)
|
||||||
|
- valstr.append(buf, len);
|
||||||
|
- close(fd);
|
||||||
|
- }
|
||||||
|
- else
|
||||||
|
- {
|
||||||
|
- CLog::Log(LOGERROR, "%s: error reading %s",__FUNCTION__, path.c_str());
|
||||||
|
- valstr = "fail";
|
||||||
|
- return -1;
|
||||||
|
- }
|
||||||
|
- return 0;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-int CEGLNativeTypeIMX::set_sysfs_str(std::string path, std::string val) const
|
||||||
|
-{
|
||||||
|
- int fd = open(path.c_str(), O_WRONLY);
|
||||||
|
- if (fd >= 0)
|
||||||
|
- {
|
||||||
|
- val += '\n';
|
||||||
|
- write(fd, val.c_str(), val.size());
|
||||||
|
- close(fd);
|
||||||
|
- return 0;
|
||||||
|
- }
|
||||||
|
- CLog::Log(LOGERROR, "%s: error writing %s",__FUNCTION__, path.c_str());
|
||||||
|
- return -1;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
bool CEGLNativeTypeIMX::ModeToResolution(std::string mode, RESOLUTION_INFO *res) const
|
||||||
|
{
|
||||||
|
if (!res)
|
||||||
|
diff --git a/xbmc/windowing/egl/EGLNativeTypeIMX.h b/xbmc/windowing/egl/EGLNativeTypeIMX.h
|
||||||
|
index d5e5739..0298cb5 100644
|
||||||
|
--- a/xbmc/windowing/egl/EGLNativeTypeIMX.h
|
||||||
|
+++ b/xbmc/windowing/egl/EGLNativeTypeIMX.h
|
||||||
|
@@ -50,8 +50,6 @@ public:
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool m_readonly;
|
||||||
|
- int get_sysfs_str(std::string path, std::string& valstr) const;
|
||||||
|
- int set_sysfs_str(std::string path, std::string val) const;
|
||||||
|
bool ModeToResolution(std::string mode, RESOLUTION_INFO *res) const;
|
||||||
|
|
||||||
|
EGLNativeDisplayType m_display;
|
||||||
|
--
|
||||||
|
1.9.3
|
||||||
|
|
@ -0,0 +1,25 @@
|
|||||||
|
From 11a9bc199b0ebd9e6cfb9b82547bb3c5379b1104 Mon Sep 17 00:00:00 2001
|
||||||
|
From: smallint <tahoma@gmx.de>
|
||||||
|
Date: Mon, 19 Jan 2015 20:38:42 +0100
|
||||||
|
Subject: [PATCH 09/16] [imx] Fixed mode change after SysfsUtils port
|
||||||
|
|
||||||
|
---
|
||||||
|
xbmc/windowing/egl/EGLNativeTypeIMX.cpp | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/xbmc/windowing/egl/EGLNativeTypeIMX.cpp b/xbmc/windowing/egl/EGLNativeTypeIMX.cpp
|
||||||
|
index 9893558..061f6e6 100644
|
||||||
|
--- a/xbmc/windowing/egl/EGLNativeTypeIMX.cpp
|
||||||
|
+++ b/xbmc/windowing/egl/EGLNativeTypeIMX.cpp
|
||||||
|
@@ -208,7 +208,7 @@ bool CEGLNativeTypeIMX::SetNativeResolution(const RESOLUTION_INFO &res)
|
||||||
|
DestroyNativeWindow();
|
||||||
|
DestroyNativeDisplay();
|
||||||
|
|
||||||
|
- SysfsUtils::SetString("/sys/class/graphics/fb0/mode", res.strId);
|
||||||
|
+ SysfsUtils::SetString("/sys/class/graphics/fb0/mode", res.strId + "\n");
|
||||||
|
|
||||||
|
CreateNativeDisplay();
|
||||||
|
|
||||||
|
--
|
||||||
|
1.9.3
|
||||||
|
|
@ -0,0 +1,67 @@
|
|||||||
|
From 9c9935180aa9297d35855db674b7eb7f732714e9 Mon Sep 17 00:00:00 2001
|
||||||
|
From: smallint <tahoma@gmx.de>
|
||||||
|
Date: Thu, 5 Feb 2015 19:35:05 +0000
|
||||||
|
Subject: [PATCH 10/16] [imx] Added de-interlacing method enumerations
|
||||||
|
FAST_MOTION and FAST_MOTION_DOUBLE
|
||||||
|
|
||||||
|
---
|
||||||
|
language/English/strings.po | 14 +++++++++++++-
|
||||||
|
xbmc/settings/VideoSettings.h | 3 +++
|
||||||
|
xbmc/video/dialogs/GUIDialogVideoSettings.cpp | 2 ++
|
||||||
|
3 files changed, 18 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/language/English/strings.po b/language/English/strings.po
|
||||||
|
index 15090fc..d994570 100755
|
||||||
|
--- a/language/English/strings.po
|
||||||
|
+++ b/language/English/strings.po
|
||||||
|
@@ -7548,7 +7548,19 @@ msgctxt "#16333"
|
||||||
|
msgid "MMAL - Bob (Half)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
-#empty strings from id 16334 to 16399
|
||||||
|
+#. Description of OSD video settings for deinterlace method with label #16334
|
||||||
|
+#: xbmc/video/dialogs/GUIDialogVideoSettings.cpp
|
||||||
|
+msgctxt "#16334"
|
||||||
|
+msgid "IMX - Fast motion"
|
||||||
|
+msgstr ""
|
||||||
|
+
|
||||||
|
+#. Description of OSD video settings for deinterlace method with label #16335
|
||||||
|
+#: xbmc/video/dialogs/GUIDialogVideoSettings.cpp
|
||||||
|
+msgctxt "#16335"
|
||||||
|
+msgid "IMX - Fast motion (Double)"
|
||||||
|
+msgstr ""
|
||||||
|
+
|
||||||
|
+#empty strings from id 16336 to 16399
|
||||||
|
|
||||||
|
#: xbmc/video/dialogs/GUIDialogVideoSettings.cpp
|
||||||
|
msgctxt "#16400"
|
||||||
|
diff --git a/xbmc/settings/VideoSettings.h b/xbmc/settings/VideoSettings.h
|
||||||
|
index 6eaef1d..8644250 100644
|
||||||
|
--- a/xbmc/settings/VideoSettings.h
|
||||||
|
+++ b/xbmc/settings/VideoSettings.h
|
||||||
|
@@ -72,6 +72,9 @@ enum EINTERLACEMETHOD
|
||||||
|
VS_INTERLACEMETHOD_MMAL_BOB = 27,
|
||||||
|
VS_INTERLACEMETHOD_MMAL_BOB_HALF = 28,
|
||||||
|
|
||||||
|
+ VS_INTERLACEMETHOD_IMX_FASTMOTION = 29,
|
||||||
|
+ VS_INTERLACEMETHOD_IMX_FASTMOTION_DOUBLE = 30,
|
||||||
|
+
|
||||||
|
VS_INTERLACEMETHOD_MAX // do not use and keep as last enum value.
|
||||||
|
};
|
||||||
|
|
||||||
|
diff --git a/xbmc/video/dialogs/GUIDialogVideoSettings.cpp b/xbmc/video/dialogs/GUIDialogVideoSettings.cpp
|
||||||
|
index ca65fdc..d350a02 100644
|
||||||
|
--- a/xbmc/video/dialogs/GUIDialogVideoSettings.cpp
|
||||||
|
+++ b/xbmc/video/dialogs/GUIDialogVideoSettings.cpp
|
||||||
|
@@ -266,6 +266,8 @@ void CGUIDialogVideoSettings::InitializeSettings()
|
||||||
|
entries.push_back(make_pair(16331, VS_INTERLACEMETHOD_MMAL_ADVANCED_HALF));
|
||||||
|
entries.push_back(make_pair(16332, VS_INTERLACEMETHOD_MMAL_BOB));
|
||||||
|
entries.push_back(make_pair(16333, VS_INTERLACEMETHOD_MMAL_BOB_HALF));
|
||||||
|
+ entries.push_back(make_pair(16334, VS_INTERLACEMETHOD_IMX_FASTMOTION));
|
||||||
|
+ entries.push_back(make_pair(16335, VS_INTERLACEMETHOD_IMX_FASTMOTION_DOUBLE));
|
||||||
|
|
||||||
|
/* remove unsupported methods */
|
||||||
|
for (StaticIntegerSettingOptions::iterator it = entries.begin(); it != entries.end(); )
|
||||||
|
--
|
||||||
|
1.9.3
|
||||||
|
|
@ -0,0 +1,52 @@
|
|||||||
|
From ba9b668fcbfd4f6bcfd67b22bcdc850a140ac65c Mon Sep 17 00:00:00 2001
|
||||||
|
From: smallint <tahoma@gmx.de>
|
||||||
|
Date: Thu, 5 Feb 2015 19:37:13 +0000
|
||||||
|
Subject: [PATCH 11/16] [RenderManager] preserve field type for
|
||||||
|
Renderer::RenderUpdate
|
||||||
|
|
||||||
|
---
|
||||||
|
xbmc/cores/VideoRenderers/RenderManager.cpp | 12 +++++++++++-
|
||||||
|
1 file changed, 11 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/xbmc/cores/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoRenderers/RenderManager.cpp
|
||||||
|
index 36c2842..85c3565 100644
|
||||||
|
--- a/xbmc/cores/VideoRenderers/RenderManager.cpp
|
||||||
|
+++ b/xbmc/cores/VideoRenderers/RenderManager.cpp
|
||||||
|
@@ -676,7 +676,10 @@ void CXBMCRenderManager::FlipPage(volatile bool& bStop, double timestamp /* = 0L
|
||||||
|
deinterlacemode = VS_DEINTERLACEMODE_OFF;
|
||||||
|
|
||||||
|
if (deinterlacemode == VS_DEINTERLACEMODE_OFF)
|
||||||
|
+ {
|
||||||
|
presentmethod = PRESENT_METHOD_SINGLE;
|
||||||
|
+ sync = FS_NONE;
|
||||||
|
+ }
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (deinterlacemode == VS_DEINTERLACEMODE_AUTO && sync == FS_NONE)
|
||||||
|
@@ -691,6 +694,7 @@ void CXBMCRenderManager::FlipPage(volatile bool& bStop, double timestamp /* = 0L
|
||||||
|
else if (interlacemethod == VS_INTERLACEMETHOD_RENDER_BOB_INVERTED) { presentmethod = PRESENT_METHOD_BOB; invert = true; }
|
||||||
|
else if (interlacemethod == VS_INTERLACEMETHOD_DXVA_BOB) presentmethod = PRESENT_METHOD_BOB;
|
||||||
|
else if (interlacemethod == VS_INTERLACEMETHOD_DXVA_BEST) presentmethod = PRESENT_METHOD_BOB;
|
||||||
|
+ else if (interlacemethod == VS_INTERLACEMETHOD_IMX_FASTMOTION_DOUBLE) presentmethod = PRESENT_METHOD_BOB;
|
||||||
|
else presentmethod = PRESENT_METHOD_SINGLE;
|
||||||
|
|
||||||
|
/* default to odd field if we want to deinterlace and don't know better */
|
||||||
|
@@ -837,8 +841,14 @@ bool CXBMCRenderManager::IsVideoLayer()
|
||||||
|
void CXBMCRenderManager::PresentSingle(bool clear, DWORD flags, DWORD alpha)
|
||||||
|
{
|
||||||
|
CSingleLock lock(g_graphicsContext);
|
||||||
|
+ SPresent& m = m_Queue[m_presentsource];
|
||||||
|
|
||||||
|
- m_pRenderer->RenderUpdate(clear, flags, alpha);
|
||||||
|
+ if (m.presentfield == FS_BOT)
|
||||||
|
+ m_pRenderer->RenderUpdate(clear, flags | RENDER_FLAG_BOT, alpha);
|
||||||
|
+ else if (m.presentfield == FS_TOP)
|
||||||
|
+ m_pRenderer->RenderUpdate(clear, flags | RENDER_FLAG_TOP, alpha);
|
||||||
|
+ else
|
||||||
|
+ m_pRenderer->RenderUpdate(clear, flags, alpha);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* new simpler method of handling interlaced material, *
|
||||||
|
--
|
||||||
|
1.9.3
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
@ -1,8 +1,8 @@
|
|||||||
From 03fe0bd48acc0399ede41e220d757ceba8be2937 Mon Sep 17 00:00:00 2001
|
From 85ca69f3fc1f9bfd30f828921db1283366c7bfea Mon Sep 17 00:00:00 2001
|
||||||
From: wolfgar <stephan.rafin@laposte.net>
|
From: wolfgar <stephan.rafin@laposte.net>
|
||||||
Date: Sat, 14 Feb 2015 03:06:03 +0100
|
Date: Sat, 14 Feb 2015 03:06:03 +0100
|
||||||
Subject: [PATCH] [iMX6] Implement rendercapture for latest rendering rework
|
Subject: [PATCH 13/16] [iMX6] Implement rendercapture for latest rendering
|
||||||
blit fb using g2d when no deinterlacing is required
|
rework blit fb using g2d when no deinterlacing is required
|
||||||
|
|
||||||
---
|
---
|
||||||
configure.in | 2 +-
|
configure.in | 2 +-
|
||||||
@ -14,7 +14,7 @@ Subject: [PATCH] [iMX6] Implement rendercapture for latest rendering rework
|
|||||||
6 files changed, 401 insertions(+), 137 deletions(-)
|
6 files changed, 401 insertions(+), 137 deletions(-)
|
||||||
|
|
||||||
diff --git a/configure.in b/configure.in
|
diff --git a/configure.in b/configure.in
|
||||||
index 23bf0aa..d395add 100644
|
index 32e37c5..a8cdca0 100644
|
||||||
--- a/configure.in
|
--- a/configure.in
|
||||||
+++ b/configure.in
|
+++ b/configure.in
|
||||||
@@ -1935,7 +1935,7 @@ for codecs in `echo $add_codecs | sed 's/,/ /g'`; do
|
@@ -1935,7 +1935,7 @@ for codecs in `echo $add_codecs | sed 's/,/ /g'`; do
|
||||||
@ -891,5 +891,5 @@ index dca3f2f..e414454 100644
|
|||||||
|
|
||||||
|
|
||||||
--
|
--
|
||||||
1.9.1
|
1.9.3
|
||||||
|
|
@ -0,0 +1,24 @@
|
|||||||
|
From 1ec717d9197fb0086c76197519f2b522b4ec73af Mon Sep 17 00:00:00 2001
|
||||||
|
From: smallint <tahoma@gmx.de>
|
||||||
|
Date: Fri, 20 Feb 2015 15:40:29 +0100
|
||||||
|
Subject: [PATCH 15/16] [imx] Output associated pts for TRACE_FRAMES
|
||||||
|
|
||||||
|
---
|
||||||
|
xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecIMX.cpp | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
diff --git a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecIMX.cpp b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecIMX.cpp
|
||||||
|
index fcd8b02..7789e38 100644
|
||||||
|
--- a/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecIMX.cpp
|
||||||
|
+++ b/xbmc/cores/dvdplayer/DVDCodecs/Video/DVDVideoCodecIMX.cpp
|
||||||
|
@@ -885,6 +885,7 @@ int CDVDVideoCodecIMX::Decode(BYTE *pData, int iSize, double dts, double pts)
|
||||||
|
|
||||||
|
#ifdef TRACE_FRAMES
|
||||||
|
CLog::Log(LOGDEBUG, "+ %02d dts %f pts %f (VPU)\n", idx, dts, pts);
|
||||||
|
+ CLog::Log(LOGDEBUG, "+ %02d dts %f pts %f (VPU)\n", idx, buffer->GetDts(), buffer->GetPts());
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (!m_usePTS)
|
||||||
|
--
|
||||||
|
1.9.3
|
||||||
|
|
@ -0,0 +1,34 @@
|
|||||||
|
From d2113f254cabde119734440620d16aca7444acd8 Mon Sep 17 00:00:00 2001
|
||||||
|
From: wolfgar <stephan.rafin@laposte.net>
|
||||||
|
Date: Sat, 21 Feb 2015 23:45:26 +0100
|
||||||
|
Subject: [PATCH 16/16] Add guard to fix build on non iMX6 arch
|
||||||
|
|
||||||
|
---
|
||||||
|
xbmc/windowing/egl/EGLNativeTypeIMX.cpp | 4 ++--
|
||||||
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/xbmc/windowing/egl/EGLNativeTypeIMX.cpp b/xbmc/windowing/egl/EGLNativeTypeIMX.cpp
|
||||||
|
index 25dbc9b..f482075 100644
|
||||||
|
--- a/xbmc/windowing/egl/EGLNativeTypeIMX.cpp
|
||||||
|
+++ b/xbmc/windowing/egl/EGLNativeTypeIMX.cpp
|
||||||
|
@@ -96,7 +96,7 @@ void CEGLNativeTypeIMX::Initialize()
|
||||||
|
CLog::Log(LOGERROR, "%s - Error while opening /dev/fb0.\n", __FUNCTION__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
-
|
||||||
|
+#ifdef HAS_IMXVPU
|
||||||
|
struct mxcfb_color_key colorKey;
|
||||||
|
struct mxcfb_gbl_alpha gbl_alpha;
|
||||||
|
struct mxcfb_loc_alpha lalpha;
|
||||||
|
@@ -117,7 +117,7 @@ void CEGLNativeTypeIMX::Initialize()
|
||||||
|
colorKey.color_key = (16 << 16)|(8 << 8)|16;
|
||||||
|
if (ioctl(fd, MXCFB_SET_CLR_KEY, &colorKey) < 0)
|
||||||
|
CLog::Log(LOGERROR, "%s - Failed to setup color keying\n", __FUNCTION__);
|
||||||
|
-
|
||||||
|
+#endif
|
||||||
|
// Unblank the fb
|
||||||
|
if (ioctl(fd, FBIOBLANK, 0) < 0)
|
||||||
|
{
|
||||||
|
--
|
||||||
|
1.9.3
|
||||||
|
|
@ -1,26 +0,0 @@
|
|||||||
From 467c583ca00c3512d93745ae6bee7ae26ebcb13e Mon Sep 17 00:00:00 2001
|
|
||||||
From: fritsch <Peter.Fruehberger@gmail.com>
|
|
||||||
Date: Sun, 21 Dec 2014 12:58:30 +0100
|
|
||||||
Subject: [PATCH] IMX: Disable deinterlacing by default (user can enable it if
|
|
||||||
he wants)
|
|
||||||
|
|
||||||
---
|
|
||||||
xbmc/settings/VideoSettings.cpp | 2 +-
|
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/xbmc/settings/VideoSettings.cpp b/xbmc/settings/VideoSettings.cpp
|
|
||||||
index 65105e8..e61f49a 100644
|
|
||||||
--- a/xbmc/settings/VideoSettings.cpp
|
|
||||||
+++ b/xbmc/settings/VideoSettings.cpp
|
|
||||||
@@ -29,7 +29,7 @@
|
|
||||||
|
|
||||||
CVideoSettings::CVideoSettings()
|
|
||||||
{
|
|
||||||
- m_DeinterlaceMode = VS_DEINTERLACEMODE_AUTO;
|
|
||||||
+ m_DeinterlaceMode = VS_DEINTERLACEMODE_OFF;
|
|
||||||
m_InterlaceMethod = VS_INTERLACEMETHOD_AUTO;
|
|
||||||
m_ScalingMethod = VS_SCALINGMETHOD_LINEAR;
|
|
||||||
m_ViewMode = ViewModeNormal;
|
|
||||||
--
|
|
||||||
1.9.1
|
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user