From b8e78fec5260e88bd7e3caa9d9066ddb3dcc3bc8 Mon Sep 17 00:00:00 2001 From: MilhouseVH Date: Wed, 26 Oct 2016 23:38:57 +0100 Subject: [PATCH] RBP: Add PLL backport patch for Kodi 17 Beta 4 --- .../RPi/patches/kodi/kodi-002-backport.patch | 185 ++++++++++++++++++ .../RPi2/patches/kodi/kodi-002-backport.patch | 185 ++++++++++++++++++ 2 files changed, 370 insertions(+) create mode 100644 projects/RPi/patches/kodi/kodi-002-backport.patch create mode 100644 projects/RPi2/patches/kodi/kodi-002-backport.patch diff --git a/projects/RPi/patches/kodi/kodi-002-backport.patch b/projects/RPi/patches/kodi/kodi-002-backport.patch new file mode 100644 index 00000000000..3a2beee6ed3 --- /dev/null +++ b/projects/RPi/patches/kodi/kodi-002-backport.patch @@ -0,0 +1,185 @@ +From 1fc5cd103a26697df63075953d6fd556f39c02bd Mon Sep 17 00:00:00 2001 +From: popcornmix +Date: Wed, 26 Oct 2016 23:21:43 +0100 +Subject: [PATCH] squash: Restructure the pll adjust code to avoid adjustment + when sync display is disabled + +--- + .../AudioEngine/Engines/ActiveAE/ActiveAE.cpp | 25 ++++++++-------------- + .../Engines/ActiveAE/ActiveAEStream.cpp | 17 ++++++++++++++- + .../AudioEngine/Engines/ActiveAE/ActiveAEStream.h | 3 ++- + xbmc/linux/RBP.cpp | 17 ++++++++++----- + xbmc/linux/RBP.h | 5 +++-- + 5 files changed, 42 insertions(+), 25 deletions(-) + +diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp +index 497b443..68399ab 100644 +--- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp ++++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp +@@ -34,10 +34,6 @@ using namespace ActiveAE; + #include "windowing/WindowingFactory.h" + #include "utils/log.h" + +-#if defined(TARGET_RASPBERRY_PI) +-#include "linux/RBP.h" +-#endif +- + #define MAX_CACHE_LEVEL 0.4 // total cache time of stream in seconds + #define MAX_WATER_LEVEL 0.2 // buffered time after stream stages in seconds + #define MAX_BUFFER_TIME 0.1 // max time of a buffer in seconds +@@ -2457,21 +2453,18 @@ CSampleBuffer* CActiveAE::SyncStream(CActiveAEStream *stream) + if (!newerror || stream->m_syncState != CAESyncInfo::AESyncState::SYNC_INSYNC) + return ret; + +- if (stream->m_pllAdjust > 0) // pll adjust +- { +-#if defined(TARGET_RASPBERRY_PI) +- double e = std::max(std::min(error / 50.0, 1.0), -1.0); +- double m_plladjust = 1.0 + e * stream->m_pllAdjust; +- double m_last_plladjust = g_RBP.AdjustHDMIClock(m_plladjust); +- CLog::Log(LOGDEBUG, "CDVDPlayerAudio::%s pll:%.5f (%.5f) error:%.6f e:%.6f a:%f", __FUNCTION__, m_plladjust, m_last_plladjust, error, e * stream->m_pllAdjust, stream->m_pllAdjust ); +-#endif +- } +- else if (stream->m_resampleMode) ++ if (stream->m_resampleMode) + { + if (stream->m_processingBuffers) + { +- stream->m_processingBuffers->SetRR(stream->CalcResampleRatio(error), m_settings.atempoThreshold); +- CLog::Log(LOGDEBUG, "CDVDPlayerAudio::%s rr:%.5f threshold:%.3f error:%.6f", __FUNCTION__, stream->m_processingBuffers->GetRR(), m_settings.atempoThreshold, error); ++ double pllAdjustRequest = 0.0, pllAdjustActual = 0.0, e = 0.0; ++ if (stream->m_pllAdjust > 0.0) ++ { ++ e = std::max(std::min(error / 50.0, 1.0), - 1.0); ++ pllAdjustRequest = 1.0 + e * stream->m_pllAdjust; ++ } ++ stream->m_processingBuffers->SetRR(stream->CalcResampleRatio(error), m_settings.atempoThreshold, pllAdjustRequest, stream->m_pllAdjust, pllAdjustActual); ++ CLog::Log(LOGDEBUG, "ActiveAE::%s pll:%.5f (act:%.5f lim:%.5f) rr:%.5f threshold:%.3f error:%.6f", __FUNCTION__, pllAdjustRequest, pllAdjustActual, stream->m_pllAdjust, stream->m_processingBuffers->GetRR(), m_settings.atempoThreshold, error ); + } + } + else if (stream->m_processingBuffers) +diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.cpp +index 394459a..6b009dc 100644 +--- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.cpp ++++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.cpp +@@ -29,6 +29,10 @@ + #include "ActiveAE.h" + #include "ActiveAEStream.h" + ++#if defined(TARGET_RASPBERRY_PI) ++#include "linux/RBP.h" ++#endif ++ + using namespace ActiveAE; + + /* typecast AE to CActiveAE */ +@@ -71,6 +75,7 @@ CActiveAEStream::CActiveAEStream(AEAudioFormat *format, unsigned int streamid) + m_lastPtsJump = 0; + m_errorInterval = 1000; + m_clockSpeed = 1.0; ++ m_pllAdjust = 0.0f; + } + + CActiveAEStream::~CActiveAEStream() +@@ -715,8 +720,18 @@ bool CActiveAEStreamBuffers::IsDrained() + return false; + } + +-void CActiveAEStreamBuffers::SetRR(double rr, double atempoThreshold) ++void CActiveAEStreamBuffers::SetRR(double rr, double atempoThreshold, double pllAdjustRequest, double pllThreshold, double &pllAdjustActual) + { ++#if defined(TARGET_RASPBERRY_PI) ++ if (pllAdjustRequest > 0.0f) // pll adjust ++ { ++ pllAdjustActual = g_RBP.AdjustHDMIClock(pllAdjustRequest); ++ rr = 1.0; ++ } ++ else ++ pllAdjustActual = g_RBP.AdjustHDMIClock(1.0); ++#endif ++ + if (fabs(rr - 1.0) < atempoThreshold) + { + m_resampleBuffers->SetRR(rr); +diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.h b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.h +index 927f93e..80ab096 100644 +--- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.h ++++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.h +@@ -103,7 +103,8 @@ class CActiveAEStreamBuffers + void Flush(); + void SetDrain(bool drain); + bool IsDrained(); +- void SetRR(double rr, double atempoThreshold); ++ void SetRR(double rr, double atempoThreshold, double pllAdjustRequest, double pllThreshold, double &pllAdjustActual); ++ void SetRR(double rr, double atempoThreshold) { double pllAdjustActual; SetRR(rr, atempoThreshold, 0.0, 0.0, pllAdjustActual); } + double GetRR(); + void FillBuffer(); + bool DoesNormalize(); +diff --git a/xbmc/linux/RBP.cpp b/xbmc/linux/RBP.cpp +index 2efc281..5c0fbaf 100644 +--- a/xbmc/linux/RBP.cpp ++++ b/xbmc/linux/RBP.cpp +@@ -49,7 +49,8 @@ CRBP::CRBP() + m_DllBcmHost = new DllBcmHost(); + m_OMX = new COMXCore(); + m_display = DISPMANX_NO_HANDLE; +- m_last_pll_adjust = 1.0; ++ m_requested_pll_adjust = -1.0; ++ m_actual_pll_adjust = -1.0; + m_p = NULL; + m_x = 0; + m_y = 0; +@@ -166,7 +167,8 @@ void CRBP::CloseDisplay(DISPMANX_DISPLAY_HANDLE_T display) + assert(s == 0); + vc_dispmanx_display_close(m_display); + m_display = DISPMANX_NO_HANDLE; +- m_last_pll_adjust = 1.0; ++ m_requested_pll_adjust = -1.0; ++ m_actual_pll_adjust = -1.0; + } + + void CRBP::GetDisplaySize(int &width, int &height) +@@ -529,12 +531,17 @@ void CRBP::uninit_cursor() + double CRBP::AdjustHDMIClock(double adjust) + { + char response[80]; ++ ++ if (adjust == m_requested_pll_adjust) ++ return m_actual_pll_adjust; ++ ++ m_requested_pll_adjust = adjust; + vc_gencmd(response, sizeof response, "hdmi_adjust_clock %f", adjust); + char *p = strchr(response, '='); + if (p) +- m_last_pll_adjust = atof(p+1); +- CLog::Log(LOGDEBUG, "CRBP::%s(%.4f) = %.4f", __func__, adjust, m_last_pll_adjust); +- return m_last_pll_adjust; ++ m_actual_pll_adjust = atof(p+1); ++ CLog::Log(LOGDEBUG, "CRBP::%s(%.5f) = %.5f", __func__, adjust, m_actual_pll_adjust); ++ return m_actual_pll_adjust; + } + + #include "cores/VideoPlayer/DVDClock.h" +diff --git a/xbmc/linux/RBP.h b/xbmc/linux/RBP.h +index 92ed007..9c7f4b1 100644 +--- a/xbmc/linux/RBP.h ++++ b/xbmc/linux/RBP.h +@@ -83,7 +83,7 @@ class CRBP + void VSyncCallback(); + int GetMBox() { return m_mb; } + double AdjustHDMIClock(double adjust); +- double GetAdjustHDMIClock() { return m_last_pll_adjust; } ++ double GetAdjustHDMIClock() { return m_actual_pll_adjust; } + + void SuspendVideoOutput(); + void ResumeVideoOutput(); +@@ -112,7 +112,8 @@ class CRBP + int m_x; + int m_y; + bool m_enabled; +- double m_last_pll_adjust; ++ double m_requested_pll_adjust; ++ double m_actual_pll_adjust; + public: + void init_cursor(); + void set_cursor(const void *pixels, int width, int height, int hotspot_x, int hotspot_y); diff --git a/projects/RPi2/patches/kodi/kodi-002-backport.patch b/projects/RPi2/patches/kodi/kodi-002-backport.patch new file mode 100644 index 00000000000..3a2beee6ed3 --- /dev/null +++ b/projects/RPi2/patches/kodi/kodi-002-backport.patch @@ -0,0 +1,185 @@ +From 1fc5cd103a26697df63075953d6fd556f39c02bd Mon Sep 17 00:00:00 2001 +From: popcornmix +Date: Wed, 26 Oct 2016 23:21:43 +0100 +Subject: [PATCH] squash: Restructure the pll adjust code to avoid adjustment + when sync display is disabled + +--- + .../AudioEngine/Engines/ActiveAE/ActiveAE.cpp | 25 ++++++++-------------- + .../Engines/ActiveAE/ActiveAEStream.cpp | 17 ++++++++++++++- + .../AudioEngine/Engines/ActiveAE/ActiveAEStream.h | 3 ++- + xbmc/linux/RBP.cpp | 17 ++++++++++----- + xbmc/linux/RBP.h | 5 +++-- + 5 files changed, 42 insertions(+), 25 deletions(-) + +diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp +index 497b443..68399ab 100644 +--- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp ++++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp +@@ -34,10 +34,6 @@ using namespace ActiveAE; + #include "windowing/WindowingFactory.h" + #include "utils/log.h" + +-#if defined(TARGET_RASPBERRY_PI) +-#include "linux/RBP.h" +-#endif +- + #define MAX_CACHE_LEVEL 0.4 // total cache time of stream in seconds + #define MAX_WATER_LEVEL 0.2 // buffered time after stream stages in seconds + #define MAX_BUFFER_TIME 0.1 // max time of a buffer in seconds +@@ -2457,21 +2453,18 @@ CSampleBuffer* CActiveAE::SyncStream(CActiveAEStream *stream) + if (!newerror || stream->m_syncState != CAESyncInfo::AESyncState::SYNC_INSYNC) + return ret; + +- if (stream->m_pllAdjust > 0) // pll adjust +- { +-#if defined(TARGET_RASPBERRY_PI) +- double e = std::max(std::min(error / 50.0, 1.0), -1.0); +- double m_plladjust = 1.0 + e * stream->m_pllAdjust; +- double m_last_plladjust = g_RBP.AdjustHDMIClock(m_plladjust); +- CLog::Log(LOGDEBUG, "CDVDPlayerAudio::%s pll:%.5f (%.5f) error:%.6f e:%.6f a:%f", __FUNCTION__, m_plladjust, m_last_plladjust, error, e * stream->m_pllAdjust, stream->m_pllAdjust ); +-#endif +- } +- else if (stream->m_resampleMode) ++ if (stream->m_resampleMode) + { + if (stream->m_processingBuffers) + { +- stream->m_processingBuffers->SetRR(stream->CalcResampleRatio(error), m_settings.atempoThreshold); +- CLog::Log(LOGDEBUG, "CDVDPlayerAudio::%s rr:%.5f threshold:%.3f error:%.6f", __FUNCTION__, stream->m_processingBuffers->GetRR(), m_settings.atempoThreshold, error); ++ double pllAdjustRequest = 0.0, pllAdjustActual = 0.0, e = 0.0; ++ if (stream->m_pllAdjust > 0.0) ++ { ++ e = std::max(std::min(error / 50.0, 1.0), - 1.0); ++ pllAdjustRequest = 1.0 + e * stream->m_pllAdjust; ++ } ++ stream->m_processingBuffers->SetRR(stream->CalcResampleRatio(error), m_settings.atempoThreshold, pllAdjustRequest, stream->m_pllAdjust, pllAdjustActual); ++ CLog::Log(LOGDEBUG, "ActiveAE::%s pll:%.5f (act:%.5f lim:%.5f) rr:%.5f threshold:%.3f error:%.6f", __FUNCTION__, pllAdjustRequest, pllAdjustActual, stream->m_pllAdjust, stream->m_processingBuffers->GetRR(), m_settings.atempoThreshold, error ); + } + } + else if (stream->m_processingBuffers) +diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.cpp +index 394459a..6b009dc 100644 +--- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.cpp ++++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.cpp +@@ -29,6 +29,10 @@ + #include "ActiveAE.h" + #include "ActiveAEStream.h" + ++#if defined(TARGET_RASPBERRY_PI) ++#include "linux/RBP.h" ++#endif ++ + using namespace ActiveAE; + + /* typecast AE to CActiveAE */ +@@ -71,6 +75,7 @@ CActiveAEStream::CActiveAEStream(AEAudioFormat *format, unsigned int streamid) + m_lastPtsJump = 0; + m_errorInterval = 1000; + m_clockSpeed = 1.0; ++ m_pllAdjust = 0.0f; + } + + CActiveAEStream::~CActiveAEStream() +@@ -715,8 +720,18 @@ bool CActiveAEStreamBuffers::IsDrained() + return false; + } + +-void CActiveAEStreamBuffers::SetRR(double rr, double atempoThreshold) ++void CActiveAEStreamBuffers::SetRR(double rr, double atempoThreshold, double pllAdjustRequest, double pllThreshold, double &pllAdjustActual) + { ++#if defined(TARGET_RASPBERRY_PI) ++ if (pllAdjustRequest > 0.0f) // pll adjust ++ { ++ pllAdjustActual = g_RBP.AdjustHDMIClock(pllAdjustRequest); ++ rr = 1.0; ++ } ++ else ++ pllAdjustActual = g_RBP.AdjustHDMIClock(1.0); ++#endif ++ + if (fabs(rr - 1.0) < atempoThreshold) + { + m_resampleBuffers->SetRR(rr); +diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.h b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.h +index 927f93e..80ab096 100644 +--- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.h ++++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAEStream.h +@@ -103,7 +103,8 @@ class CActiveAEStreamBuffers + void Flush(); + void SetDrain(bool drain); + bool IsDrained(); +- void SetRR(double rr, double atempoThreshold); ++ void SetRR(double rr, double atempoThreshold, double pllAdjustRequest, double pllThreshold, double &pllAdjustActual); ++ void SetRR(double rr, double atempoThreshold) { double pllAdjustActual; SetRR(rr, atempoThreshold, 0.0, 0.0, pllAdjustActual); } + double GetRR(); + void FillBuffer(); + bool DoesNormalize(); +diff --git a/xbmc/linux/RBP.cpp b/xbmc/linux/RBP.cpp +index 2efc281..5c0fbaf 100644 +--- a/xbmc/linux/RBP.cpp ++++ b/xbmc/linux/RBP.cpp +@@ -49,7 +49,8 @@ CRBP::CRBP() + m_DllBcmHost = new DllBcmHost(); + m_OMX = new COMXCore(); + m_display = DISPMANX_NO_HANDLE; +- m_last_pll_adjust = 1.0; ++ m_requested_pll_adjust = -1.0; ++ m_actual_pll_adjust = -1.0; + m_p = NULL; + m_x = 0; + m_y = 0; +@@ -166,7 +167,8 @@ void CRBP::CloseDisplay(DISPMANX_DISPLAY_HANDLE_T display) + assert(s == 0); + vc_dispmanx_display_close(m_display); + m_display = DISPMANX_NO_HANDLE; +- m_last_pll_adjust = 1.0; ++ m_requested_pll_adjust = -1.0; ++ m_actual_pll_adjust = -1.0; + } + + void CRBP::GetDisplaySize(int &width, int &height) +@@ -529,12 +531,17 @@ void CRBP::uninit_cursor() + double CRBP::AdjustHDMIClock(double adjust) + { + char response[80]; ++ ++ if (adjust == m_requested_pll_adjust) ++ return m_actual_pll_adjust; ++ ++ m_requested_pll_adjust = adjust; + vc_gencmd(response, sizeof response, "hdmi_adjust_clock %f", adjust); + char *p = strchr(response, '='); + if (p) +- m_last_pll_adjust = atof(p+1); +- CLog::Log(LOGDEBUG, "CRBP::%s(%.4f) = %.4f", __func__, adjust, m_last_pll_adjust); +- return m_last_pll_adjust; ++ m_actual_pll_adjust = atof(p+1); ++ CLog::Log(LOGDEBUG, "CRBP::%s(%.5f) = %.5f", __func__, adjust, m_actual_pll_adjust); ++ return m_actual_pll_adjust; + } + + #include "cores/VideoPlayer/DVDClock.h" +diff --git a/xbmc/linux/RBP.h b/xbmc/linux/RBP.h +index 92ed007..9c7f4b1 100644 +--- a/xbmc/linux/RBP.h ++++ b/xbmc/linux/RBP.h +@@ -83,7 +83,7 @@ class CRBP + void VSyncCallback(); + int GetMBox() { return m_mb; } + double AdjustHDMIClock(double adjust); +- double GetAdjustHDMIClock() { return m_last_pll_adjust; } ++ double GetAdjustHDMIClock() { return m_actual_pll_adjust; } + + void SuspendVideoOutput(); + void ResumeVideoOutput(); +@@ -112,7 +112,8 @@ class CRBP + int m_x; + int m_y; + bool m_enabled; +- double m_last_pll_adjust; ++ double m_requested_pll_adjust; ++ double m_actual_pll_adjust; + public: + void init_cursor(); + void set_cursor(const void *pixels, int width, int height, int hotspot_x, int hotspot_y);