From 9beeeebd4afbe41599b2c1bc2b0baa4694ad3b42 Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Sun, 26 Apr 2015 16:25:11 +0300 Subject: [PATCH] kodi: update to kodi-15.0-beta1-7dacc6e --- .../kodi-theme-Confluence/package.mk | 2 +- packages/mediacenter/kodi/package.mk | 2 +- ...100.05-make-binary-addons-executable.patch | 49 +- ...-a-wrapper-to-setup-systemd-services.patch | 139 ++--- .../kodi-999.99-ae-settings-samplerate.patch | 34 +- .../kodi/scripts/systemd-addon-wrapper | 8 +- .../kodi-001-isengard-rpb-backports.patch | 511 ------------------ .../kodi-001-isengard-rpb-backports.patch | 511 ------------------ 8 files changed, 125 insertions(+), 1131 deletions(-) diff --git a/packages/mediacenter/kodi-theme-Confluence/package.mk b/packages/mediacenter/kodi-theme-Confluence/package.mk index 393aa4ab2d..11765719d4 100644 --- a/packages/mediacenter/kodi-theme-Confluence/package.mk +++ b/packages/mediacenter/kodi-theme-Confluence/package.mk @@ -17,7 +17,7 @@ ################################################################################ PKG_NAME="kodi-theme-Confluence" -PKG_VERSION="15.0-beta1-fea3e6c" +PKG_VERSION="15.0-beta1-7dacc6e" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" diff --git a/packages/mediacenter/kodi/package.mk b/packages/mediacenter/kodi/package.mk index 919213879b..98a10c2d82 100644 --- a/packages/mediacenter/kodi/package.mk +++ b/packages/mediacenter/kodi/package.mk @@ -17,7 +17,7 @@ ################################################################################ PKG_NAME="kodi" -PKG_VERSION="15.0-beta1-fea3e6c" +PKG_VERSION="15.0-beta1-7dacc6e" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" diff --git a/packages/mediacenter/kodi/patches/kodi-100.05-make-binary-addons-executable.patch b/packages/mediacenter/kodi/patches/kodi-100.05-make-binary-addons-executable.patch index 2022a1f809..352dc42e0a 100644 --- a/packages/mediacenter/kodi/patches/kodi-100.05-make-binary-addons-executable.patch +++ b/packages/mediacenter/kodi/patches/kodi-100.05-make-binary-addons-executable.patch @@ -1,31 +1,35 @@ -From c39ded1793ba6839bc53cd9a28956d8cc8630c82 Mon Sep 17 00:00:00 2001 +From fb58bfbb6a87666d35fde23ff08cf9a47071e188 Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Mon, 2 Mar 2015 23:50:40 +0200 Subject: [PATCH 05/12] make binary addons executable add executable mode to all files in addon's bin folder ---- - xbmc/addons/AddonInstaller.cpp | 23 +++++++++++++++++++++++ - 1 file changed, 23 insertions(+) -diff --git a/xbmc/addons/AddonInstaller.cpp b/xbmc/addons/AddonInstaller.cpp -index 2af33a3..b8ec673 100644 ---- a/xbmc/addons/AddonInstaller.cpp -+++ b/xbmc/addons/AddonInstaller.cpp -@@ -40,6 +40,9 @@ - #include "dialogs/GUIDialogOK.h" - #include "dialogs/GUIDialogProgress.h" - #include "URL.h" +credits to vpeter4 for the patch +--- + xbmc/addons/Addon.cpp | 26 ++++++++++++++++++++++++++ + 1 file changed, 26 insertions(+) + +diff --git a/xbmc/addons/Addon.cpp b/xbmc/addons/Addon.cpp +index bf5c584..03325dd 100644 +--- a/xbmc/addons/Addon.cpp ++++ b/xbmc/addons/Addon.cpp +@@ -44,6 +44,10 @@ + #include + #include + +#include +#include +#include ++ + using XFILE::CDirectory; + using XFILE::CFile; + using namespace std; +@@ -674,6 +678,28 @@ void OnPostInstall(const AddonPtr& addon, bool update, bool modal) + if (CAddonMgr::Get().GetAddon(addon->ID(), localAddon, ADDON_CONTEXT_ITEM)) + CContextMenuManager::Get().Register(std::static_pointer_cast(localAddon)); - #include - -@@ -869,6 +872,26 @@ bool CAddonInstallJob::Install(const std::string &installFrom, const AddonPtr& r - - void CAddonInstallJob::OnPostInstall(bool reloadAddon) - { ++ // OE: make binary addons executable, creddits to vpeter4 + std::string addonDirPath; + std::string chmodFilePath; + DIR *addonsDir; @@ -33,7 +37,7 @@ index 2af33a3..b8ec673 100644 + struct stat fileStat; + int statRet; + -+ addonDirPath = "/storage/.kodi/addons/" + m_addon->ID() + "/bin/"; ++ addonDirPath = "/storage/.kodi/addons/" + addon->ID() + "/bin/"; + if ((addonsDir = opendir(addonDirPath.c_str())) != NULL) + { + while ((fileDirent = readdir(addonsDir)) != NULL) @@ -45,10 +49,11 @@ index 2af33a3..b8ec673 100644 + } + closedir(addonsDir); + } ++ // OE + - if (!IsModal() && CSettings::Get().GetBool("general.addonnotifications")) - CGUIDialogKaiToast::QueueNotification(m_addon->Icon(), m_addon->Name(), - g_localizeStrings.Get(m_update ? 24065 : 24064), + addon->OnPostInstall(update, modal); + } + -- 2.1.4 diff --git a/packages/mediacenter/kodi/patches/kodi-100.09-use-a-wrapper-to-setup-systemd-services.patch b/packages/mediacenter/kodi/patches/kodi-100.09-use-a-wrapper-to-setup-systemd-services.patch index 163bd8ee09..6a024e1b29 100644 --- a/packages/mediacenter/kodi/patches/kodi-100.09-use-a-wrapper-to-setup-systemd-services.patch +++ b/packages/mediacenter/kodi/patches/kodi-100.09-use-a-wrapper-to-setup-systemd-services.patch @@ -1,86 +1,95 @@ -From 0a2ae6dd9fe63c713e1ea2336ca3263c00fa9bfc Mon Sep 17 00:00:00 2001 +From ba906db17bdb834aedf88ca35b1ce30ea2d2bbd4 Mon Sep 17 00:00:00 2001 From: Stefan Saraev -Date: Fri, 8 Aug 2014 18:22:44 +0300 +Date: Fri, 24 Apr 2015 19:45:20 +0300 Subject: [PATCH 09/12] use a wrapper to setup systemd services --- - xbmc/addons/Service.cpp | 22 ++++++++++++++++++++++ - xbmc/addons/Service.h | 1 + - 2 files changed, 23 insertions(+) + xbmc/addons/Addon.cpp | 30 ++++++++++++++++++++++++++++++ + xbmc/addons/Addon.h | 2 ++ + 2 files changed, 32 insertions(+) -diff --git a/xbmc/addons/Service.cpp b/xbmc/addons/Service.cpp -index 2fc7670..9126ce7 100644 ---- a/xbmc/addons/Service.cpp -+++ b/xbmc/addons/Service.cpp -@@ -53,6 +53,10 @@ AddonPtr CService::Clone() const - bool CService::Start() - { - bool ret = true; -+ -+ // systemctl enable but dont force start -+ CallOEWrapper(ID(), false, true); -+ - switch (m_type) - { - #ifdef HAS_PYTHON -@@ -113,13 +117,24 @@ void CService::BuildServiceType() - } +diff --git a/xbmc/addons/Addon.cpp b/xbmc/addons/Addon.cpp +index 03325dd..b2bfafa 100644 +--- a/xbmc/addons/Addon.cpp ++++ b/xbmc/addons/Addon.cpp +@@ -626,6 +626,13 @@ AddonVersion CAddon::GetDependencyVersion(const std::string &dependencyID) const + return AddonVersion("0.0.0"); } -+void CService::CallOEWrapper(const std::string& ID, bool disable, bool check) ++void CallOEWrapper(const std::string& ID, bool disable) +{ + char cmd[255]; -+ snprintf(cmd, sizeof(cmd), "/usr/lib/openelec/systemd-addon-wrapper %s %d %d", ID.c_str(), disable, check); ++ snprintf(cmd, sizeof(cmd), "/usr/lib/openelec/systemd-addon-wrapper %s %d %d", ID.c_str(), disable); + system(cmd); +} + - void CService::OnDisabled() + void OnEnabled(const std::string& id) { - Stop(); -+ // systemctl stop & disable on addon disable -+ CallOEWrapper(ID(), true, false); - } + // If the addon is a special, call enabled handler +@@ -633,6 +640,11 @@ void OnEnabled(const std::string& id) + if (CAddonMgr::Get().GetAddon(id, addon, ADDON_PVRDLL)) + return addon->OnEnabled(); - void CService::OnEnabled() ++ // OE: systemctl enable & start on addon enable ++ if (CAddonMgr::Get().GetAddon(id, addon, ADDON_SERVICE)) ++ CallOEWrapper(addon->ID(), false); ++ // OE ++ + if (CAddonMgr::Get().GetAddon(id, addon, ADDON_SERVICE)) + std::static_pointer_cast(addon)->Start(); + +@@ -649,6 +661,11 @@ void OnDisabled(const std::string& id) + if (CAddonMgr::Get().GetAddon(id, addon, ADDON_SERVICE, false)) + std::static_pointer_cast(addon)->Stop(); + ++ // OE: systemctl stop & disable on addon disable ++ if (CAddonMgr::Get().GetAddon(id, addon, ADDON_SERVICE, false)) ++ CallOEWrapper(addon->ID(), true); ++ // OE ++ + if (CAddonMgr::Get().GetAddon(id, addon, ADDON_CONTEXT_ITEM, false)) + CContextMenuManager::Get().Unregister(std::static_pointer_cast(addon)); + } +@@ -672,6 +689,14 @@ void OnPreInstall(const AddonPtr& addon) + void OnPostInstall(const AddonPtr& addon, bool update, bool modal) { -+ // systemctl enable & start on addon enable -+ CallOEWrapper(ID(), false, false); - Start(); - } + AddonPtr localAddon; ++ // OE: systemctl stop & disable / enable & start on addon upgrade ++ if (CAddonMgr::Get().GetAddon(addon->ID(), localAddon, ADDON_SERVICE)) ++ { ++ CallOEWrapper(addon->ID(), true); ++ CallOEWrapper(addon->ID(), false); ++ } ++ // OE ++ + if (CAddonMgr::Get().GetAddon(addon->ID(), localAddon, ADDON_SERVICE)) + std::static_pointer_cast(localAddon)->Start(); -@@ -145,13 +160,20 @@ void CService::OnPostInstall(bool restart, bool update, bool modal) - { - std::shared_ptr service = std::dynamic_pointer_cast(localAddon); - if (service) -+ { -+ // systemctl stop & disable / enable & start on addon upgrade -+ CallOEWrapper(ID(), true, false); -+ CallOEWrapper(ID(), false, false); - service->Start(); -+ } - } - } - } - - void CService::OnPreUnInstall() +@@ -706,6 +731,11 @@ void OnPostInstall(const AddonPtr& addon, bool update, bool modal) + void OnPreUnInstall(const AddonPtr& addon) { -+ // systemctl stop & disable on addon ininstall -+ CallOEWrapper(ID(), true, false); - Stop(); - } + AddonPtr localAddon; ++ // OE: systemctl stop & disable on addon ininstall ++ if (CAddonMgr::Get().GetAddon(addon->ID(), localAddon, ADDON_SERVICE)) ++ CallOEWrapper(addon->ID(), true); ++ // OE ++ + if (CAddonMgr::Get().GetAddon(addon->ID(), localAddon, ADDON_SERVICE)) + std::static_pointer_cast(localAddon)->Stop(); -diff --git a/xbmc/addons/Service.h b/xbmc/addons/Service.h -index f7394de..1ba3f27 100644 ---- a/xbmc/addons/Service.h -+++ b/xbmc/addons/Service.h -@@ -47,6 +47,7 @@ namespace ADDON - bool Stop(); - TYPE GetServiceType() { return m_type; } - START_OPTION GetStartOption() { return m_startOption; } -+ void CallOEWrapper(const std::string& ID, bool disable, bool check); - virtual void OnDisabled(); - virtual void OnEnabled(); - virtual bool OnPreInstall(); +diff --git a/xbmc/addons/Addon.h b/xbmc/addons/Addon.h +index ca9cddb..46e30d3 100644 +--- a/xbmc/addons/Addon.h ++++ b/xbmc/addons/Addon.h +@@ -171,6 +171,8 @@ public: + const InfoMap &ExtraInfo() const { return m_props.extrainfo; } + const ADDONDEPS &GetDeps() const { return m_props.dependencies; } + ++ void CallOEWrapper(const std::string& ID, bool disable); ++ + /*! \brief get the required version of a dependency. + \param dependencyID the addon ID of the dependency. + \return the version this addon requires. -- 2.1.4 diff --git a/packages/mediacenter/kodi/patches/kodi-999.99-ae-settings-samplerate.patch b/packages/mediacenter/kodi/patches/kodi-999.99-ae-settings-samplerate.patch index 9f1074764c..53f3705363 100644 --- a/packages/mediacenter/kodi/patches/kodi-999.99-ae-settings-samplerate.patch +++ b/packages/mediacenter/kodi/patches/kodi-999.99-ae-settings-samplerate.patch @@ -1,20 +1,28 @@ -From 411b2097affa681e22e8e0fe1a1c30bebd574a0e Mon Sep 17 00:00:00 2001 +From aabc63419df8aa69f156afdafb28820c3c9ccdc7 Mon Sep 17 00:00:00 2001 From: fritsch Date: Sat, 1 Nov 2014 12:44:54 +0100 Subject: [PATCH] AdvancedSettings: Add minimalSampleRate to ActiveAE cause of broken AVRs out there --- - xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp | 7 +++++++ + xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp | 8 ++++++++ xbmc/settings/AdvancedSettings.cpp | 3 +++ xbmc/settings/AdvancedSettings.h | 2 ++ - 3 files changed, 12 insertions(+) + 3 files changed, 13 insertions(+) diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp -index 0e4d8da..b9d74bf 100644 +index bf7e439..1687bad 100644 --- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp +++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp -@@ -1505,6 +1505,13 @@ void CActiveAE::ApplySettingsToFormat(AEAudioFormat &format, AudioSettings &sett +@@ -28,6 +28,7 @@ using namespace ActiveAE; + #include "cores/AudioEngine/Encoders/AEEncoderFFmpeg.h" + + #include "settings/Settings.h" ++#include "settings/AdvancedSettings.h" + #include "windowing/WindowingFactory.h" + + #define MAX_CACHE_LEVEL 0.5 // total cache time of stream in seconds +@@ -1504,6 +1505,13 @@ void CActiveAE::ApplySettingsToFormat(AEAudioFormat &format, AudioSettings &sett format.m_channelLayout = AE_CH_LAYOUT_2_0; } @@ -29,19 +37,19 @@ index 0e4d8da..b9d74bf 100644 { format.m_sampleRate = m_settings.samplerate; diff --git a/xbmc/settings/AdvancedSettings.cpp b/xbmc/settings/AdvancedSettings.cpp -index 7d04872..3d5432a 100644 +index c4fa298..35728e4 100644 --- a/xbmc/settings/AdvancedSettings.cpp +++ b/xbmc/settings/AdvancedSettings.cpp -@@ -107,6 +107,8 @@ void CAdvancedSettings::Initialize() +@@ -108,6 +108,8 @@ void CAdvancedSettings::Initialize() return; m_audioHeadRoom = 0; + // OpenELEC workaround for broken AVRs + m_minimumSampleRate = 8000; m_ac3Gain = 12.0f; - m_audioApplyDrc = true; + m_audioApplyDrc = -1.0f; m_dvdplayerIgnoreDTSinWAV = false; -@@ -475,6 +477,7 @@ void CAdvancedSettings::ParseSettingsFile(const CStdString &file) +@@ -464,6 +466,7 @@ void CAdvancedSettings::ParseSettingsFile(const std::string &file) { XMLUtils::GetFloat(pElement, "ac3downmixgain", m_ac3Gain, -96.0f, 96.0f); XMLUtils::GetInt(pElement, "headroom", m_audioHeadRoom, 0, 12); @@ -50,18 +58,18 @@ index 7d04872..3d5432a 100644 // 101 on purpose - can be used to never automark as watched XMLUtils::GetFloat(pElement, "playcountminimumpercent", m_audioPlayCountMinimumPercent, 0.0f, 101.0f); diff --git a/xbmc/settings/AdvancedSettings.h b/xbmc/settings/AdvancedSettings.h -index 7df586e..9b79a8a 100644 +index b0b4df1..7137614 100644 --- a/xbmc/settings/AdvancedSettings.h +++ b/xbmc/settings/AdvancedSettings.h -@@ -136,6 +136,8 @@ class CAdvancedSettings : public ISettingCallback, public ISettingsHandler +@@ -140,6 +140,8 @@ class CAdvancedSettings : public ISettingCallback, public ISettingsHandler static void SettingOptionsLoggingComponentsFiller(const CSetting *setting, std::vector< std::pair > &list, int ¤t, void *data); int m_audioHeadRoom; + // OpenELEC workaround for minimum sample Rate + int m_minimumSampleRate; float m_ac3Gain; - CStdString m_audioDefaultPlayer; + std::string m_audioDefaultPlayer; float m_audioPlayCountMinimumPercent; -- -1.9.1 +2.1.4 diff --git a/packages/mediacenter/kodi/scripts/systemd-addon-wrapper b/packages/mediacenter/kodi/scripts/systemd-addon-wrapper index 25c3d62541..a9e4ef7705 100755 --- a/packages/mediacenter/kodi/scripts/systemd-addon-wrapper +++ b/packages/mediacenter/kodi/scripts/systemd-addon-wrapper @@ -22,13 +22,7 @@ if [ ! -d /storage/.config/system.d ] ; then fi if [ -f "/storage/.kodi/addons/$1/system.d/$1.service" ] ; then - if [ "_$3" = "_1" ] ; then - # check if enabled, on kodi start - if ! systemctl is-enabled "$1.service" &>/dev/null ; then - systemctl enable "/storage/.kodi/addons/$1/system.d/$1.service" - systemctl start "$1.service" - fi - elif [ "_$2" = "_1" ] ; then + if [ "_$2" = "_1" ] ; then # disable = true: cleanup systemctl stop "$1.service" systemctl disable "/storage/.kodi/addons/$1/system.d/$1.service" diff --git a/projects/RPi/patches/kodi/kodi-001-isengard-rpb-backports.patch b/projects/RPi/patches/kodi/kodi-001-isengard-rpb-backports.patch index ccba80a8a5..4c670e9869 100644 --- a/projects/RPi/patches/kodi/kodi-001-isengard-rpb-backports.patch +++ b/projects/RPi/patches/kodi/kodi-001-isengard-rpb-backports.patch @@ -8006,517 +8006,6 @@ index 011ae04..fcc6a15 100644 protected: void QueryCodec(void); -From 3e33a9a5a6874b992bed68821b8d779380a13f14 Mon Sep 17 00:00:00 2001 -From: Rainer Hochecker -Date: Fri, 17 Apr 2015 20:18:40 +0200 -Subject: [PATCH 78/89] dvdplayer: reduce time for initial audio sync - ---- - xbmc/cores/dvdplayer/DVDPlayerAudio.cpp | 6 +++--- - xbmc/cores/dvdplayer/DVDPlayerAudio.h | 4 ++-- - 2 files changed, 5 insertions(+), 5 deletions(-) - -diff --git a/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp b/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp -index bd357aa..ebf4d93 100644 ---- a/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp -+++ b/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp -@@ -676,7 +676,7 @@ void CDVDPlayerAudio::HandleSyncError(double duration) - // error because drop/dupe changes the value - if (m_syncclock && fabs(error) > threshold1) - { -- m_errors.Flush(500); -+ m_errors.Flush(); - m_integral = 0.0; - m_resampleratio = 0.0; - return; -@@ -693,13 +693,13 @@ void CDVDPlayerAudio::HandleSyncError(double duration) - // 500ms in order to get first resample ratio early. If we don't adjust rr early, error - // may get above threshold1 again. Too small values for interval result in worse average errors - -- if (!m_errors.Get(m_error, m_syncclock ? 500 : 2000)) -+ if (!m_errors.Get(m_error, m_syncclock ? 100 : 2000)) - return; - - if (fabs(m_error) > threshold1) - { - m_syncclock = true; -- m_errors.Flush(500); -+ m_errors.Flush(100); - m_integral = 0.0; - m_resampleratio = 0.0; - CLog::Log(LOGDEBUG,"CDVDPlayerAudio::HandleSyncError - average error %f above threshold of %f", -diff --git a/xbmc/cores/dvdplayer/DVDPlayerAudio.h b/xbmc/cores/dvdplayer/DVDPlayerAudio.h -index 635c184..bf51863 100644 ---- a/xbmc/cores/dvdplayer/DVDPlayerAudio.h -+++ b/xbmc/cores/dvdplayer/DVDPlayerAudio.h -@@ -69,7 +69,7 @@ class CDVDErrorAverage - m_count++; - } - -- void Flush(int interval = 500) -+ void Flush(int interval = 100) - { - m_buffer = 0.0f; - m_count = 0; -@@ -84,7 +84,7 @@ class CDVDErrorAverage - return 0.0; - } - -- bool Get(double& error, int interval = 500) -+ bool Get(double& error, int interval = 100) - { - if(m_timer.IsTimePast()) - { - -From 9a35c9bd5494c4b9a39339fe5c9205f8f2890a9b Mon Sep 17 00:00:00 2001 -From: Rainer Hochecker -Date: Fri, 3 Apr 2015 10:49:55 +0200 -Subject: [PATCH 79/89] dvdplayer: cosmetics - ---- - xbmc/cores/dvdplayer/DVDPlayer.cpp | 41 ++++++++++++++++++++------------------ - 1 file changed, 22 insertions(+), 19 deletions(-) - -diff --git a/xbmc/cores/dvdplayer/DVDPlayer.cpp b/xbmc/cores/dvdplayer/DVDPlayer.cpp -index 8ceb498..1f220c6 100644 ---- a/xbmc/cores/dvdplayer/DVDPlayer.cpp -+++ b/xbmc/cores/dvdplayer/DVDPlayer.cpp -@@ -1454,16 +1454,18 @@ void CDVDPlayer::Process() - - m_OmxPlayerState.bOmxSentEOFs = true; - } -+ - if(m_CurrentAudio.inited) -- m_dvdPlayerAudio->SendMessage (new CDVDMsg(CDVDMsg::GENERAL_EOF)); -+ m_dvdPlayerAudio->SendMessage(new CDVDMsg(CDVDMsg::GENERAL_EOF)); - if(m_CurrentVideo.inited) -- m_dvdPlayerVideo->SendMessage (new CDVDMsg(CDVDMsg::GENERAL_EOF)); -+ m_dvdPlayerVideo->SendMessage(new CDVDMsg(CDVDMsg::GENERAL_EOF)); - if(m_CurrentSubtitle.inited) - m_dvdPlayerSubtitle->SendMessage(new CDVDMsg(CDVDMsg::GENERAL_EOF)); - if(m_CurrentTeletext.inited) - m_dvdPlayerTeletext->SendMessage(new CDVDMsg(CDVDMsg::GENERAL_EOF)); -- m_CurrentAudio.inited = false; -- m_CurrentVideo.inited = false; -+ -+ m_CurrentAudio.inited = false; -+ m_CurrentVideo.inited = false; - m_CurrentSubtitle.inited = false; - m_CurrentTeletext.inited = false; - -@@ -1573,21 +1575,22 @@ bool CDVDPlayer::CheckIsCurrent(CCurrentStream& current, CDemuxStream* stream, D - - void CDVDPlayer::ProcessPacket(CDemuxStream* pStream, DemuxPacket* pPacket) - { -- /* process packet if it belongs to selected stream. for dvd's don't allow automatic opening of streams*/ -- -- if (CheckIsCurrent(m_CurrentAudio, pStream, pPacket)) -- ProcessAudioData(pStream, pPacket); -- else if (CheckIsCurrent(m_CurrentVideo, pStream, pPacket)) -- ProcessVideoData(pStream, pPacket); -- else if (CheckIsCurrent(m_CurrentSubtitle, pStream, pPacket)) -- ProcessSubData(pStream, pPacket); -- else if (CheckIsCurrent(m_CurrentTeletext, pStream, pPacket)) -- ProcessTeletextData(pStream, pPacket); -- else -- { -- pStream->SetDiscard(AVDISCARD_ALL); -- CDVDDemuxUtils::FreeDemuxPacket(pPacket); // free it since we won't do anything with it -- } -+ // process packet if it belongs to selected stream. -+ // for dvd's don't allow automatic opening of streams*/ -+ -+ if (CheckIsCurrent(m_CurrentAudio, pStream, pPacket)) -+ ProcessAudioData(pStream, pPacket); -+ else if (CheckIsCurrent(m_CurrentVideo, pStream, pPacket)) -+ ProcessVideoData(pStream, pPacket); -+ else if (CheckIsCurrent(m_CurrentSubtitle, pStream, pPacket)) -+ ProcessSubData(pStream, pPacket); -+ else if (CheckIsCurrent(m_CurrentTeletext, pStream, pPacket)) -+ ProcessTeletextData(pStream, pPacket); -+ else -+ { -+ pStream->SetDiscard(AVDISCARD_ALL); -+ CDVDDemuxUtils::FreeDemuxPacket(pPacket); // free it since we won't do anything with it -+ } - } - - void CDVDPlayer::CheckStreamChanges(CCurrentStream& current, CDemuxStream* stream) - -From 7c8937a10c0441e815ec4743dfc38b22c6f38d09 Mon Sep 17 00:00:00 2001 -From: Rainer Hochecker -Date: Fri, 3 Apr 2015 14:03:44 +0200 -Subject: [PATCH 80/89] dvdplayer/omxplayer: protect live streams (pvr) from - stalling - ---- - xbmc/cores/VideoRenderers/RenderManager.cpp | 9 +++++ - xbmc/cores/dvdplayer/DVDClock.cpp | 53 +++++++++++++++-------------- - xbmc/cores/dvdplayer/DVDClock.h | 10 ++++-- - xbmc/cores/dvdplayer/DVDPlayer.cpp | 30 ++++++++++++++++ - xbmc/cores/dvdplayer/DVDPlayer.h | 1 + - xbmc/cores/dvdplayer/DVDPlayerVideo.cpp | 5 +-- - xbmc/linux/OMXClock.cpp | 20 ++++++++++- - xbmc/linux/OMXClock.h | 2 ++ - xbmc/video/VideoReferenceClock.cpp | 8 +++++ - xbmc/video/VideoReferenceClock.h | 1 + - 10 files changed, 106 insertions(+), 33 deletions(-) - -diff --git a/xbmc/cores/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoRenderers/RenderManager.cpp -index 25323ef..25d3809 100644 ---- a/xbmc/cores/VideoRenderers/RenderManager.cpp -+++ b/xbmc/cores/VideoRenderers/RenderManager.cpp -@@ -175,6 +175,15 @@ void CXBMCRenderManager::WaitPresentTime(double presenttime) - return; - } - -+ CDVDClock *dvdclock = CDVDClock::GetMasterClock(); -+ if(dvdclock != NULL && dvdclock->GetSpeedAdjust() != 0.0) -+ { -+ CDVDClock::WaitAbsoluteClock(presenttime * DVD_TIME_BASE); -+ m_presenterr = 0; -+ m_presentcorr = 0; -+ return; -+ } -+ - double clock = CDVDClock::WaitAbsoluteClock(presenttime * DVD_TIME_BASE) / DVD_TIME_BASE; - double target = 0.5; - double error = ( clock - presenttime ) / frametime - target; -diff --git a/xbmc/cores/dvdplayer/DVDClock.cpp b/xbmc/cores/dvdplayer/DVDClock.cpp -index a496ec0..2629530 100644 ---- a/xbmc/cores/dvdplayer/DVDClock.cpp -+++ b/xbmc/cores/dvdplayer/DVDClock.cpp -@@ -29,7 +29,7 @@ - int64_t CDVDClock::m_systemOffset; - int64_t CDVDClock::m_systemFrequency; - CCriticalSection CDVDClock::m_systemsection; --CDVDClock *CDVDClock::m_playerclock = NULL;; -+CDVDClock *CDVDClock::m_playerclock = NULL; - - CDVDClock::CDVDClock() - : m_master(MASTER_CLOCK_NONE) -@@ -42,6 +42,9 @@ CDVDClock::CDVDClock() - m_bReset = true; - m_iDisc = 0; - m_maxspeedadjust = 0.0; -+ m_lastSystemTime = g_VideoReferenceClock.GetTime(); -+ m_systemAdjust = 0; -+ m_speedAdjust = 0; - - m_startClock = 0; - -@@ -103,7 +106,12 @@ CDVDClock* CDVDClock::GetMasterClock() - double CDVDClock::GetClock(bool interpolated /*= true*/) - { - CSharedLock lock(m_critSection); -- return SystemToPlaying(g_VideoReferenceClock.GetTime(interpolated)); -+ -+ int64_t current = g_VideoReferenceClock.GetTime(interpolated); -+ m_systemAdjust += m_speedAdjust * (current - m_lastSystemTime); -+ m_lastSystemTime = current; -+ -+ return SystemToPlaying(current); - } - - double CDVDClock::GetClock(double& absolute, bool interpolated /*= true*/) -@@ -115,8 +123,7 @@ double CDVDClock::GetClock(double& absolute, bool interpolated /*= true*/) - absolute = SystemToAbsolute(current); - } - -- CSharedLock lock(m_critSection); -- return SystemToPlaying(current); -+ return GetClock(interpolated); - } - - void CDVDClock::SetSpeed(int iSpeed) -@@ -145,6 +152,18 @@ void CDVDClock::SetSpeed(int iSpeed) - m_systemUsed = newfreq; - } - -+void CDVDClock::SetSpeedAdjust(double adjust) -+{ -+ CExclusiveLock lock(m_critSection); -+ m_speedAdjust = adjust; -+} -+ -+double CDVDClock::GetSpeedAdjust() -+{ -+ CExclusiveLock lock(m_critSection); -+ return m_speedAdjust; -+} -+ - bool CDVDClock::Update(double clock, double absolute, double limit, const char* log) - { - CExclusiveLock lock(m_critSection); -@@ -174,26 +193,8 @@ void CDVDClock::Discontinuity(double clock, double absolute) - m_pauseClock = m_startClock; - m_iDisc = clock; - m_bReset = false; --} -- --void CDVDClock::Pause() --{ -- CExclusiveLock lock(m_critSection); -- if(!m_pauseClock) -- m_pauseClock = g_VideoReferenceClock.GetTime(); --} -- --void CDVDClock::Resume() --{ -- CExclusiveLock lock(m_critSection); -- if( m_pauseClock ) -- { -- int64_t current; -- current = g_VideoReferenceClock.GetTime(); -- -- m_startClock += current - m_pauseClock; -- m_pauseClock = 0; -- } -+ m_systemAdjust = 0; -+ m_speedAdjust = 0; - } - - void CDVDClock::SetMaxSpeedAdjust(double speed) -@@ -265,6 +266,8 @@ double CDVDClock::SystemToPlaying(int64_t system) - if(m_pauseClock) - m_pauseClock = m_startClock; - m_iDisc = 0; -+ m_systemAdjust = 0; -+ m_speedAdjust = 0; - m_bReset = false; - } - -@@ -273,7 +276,7 @@ double CDVDClock::SystemToPlaying(int64_t system) - else - current = system; - -- return DVD_TIME_BASE * (double)(current - m_startClock) / m_systemUsed + m_iDisc; -+ return DVD_TIME_BASE * (double)(current - m_startClock + m_systemAdjust) / m_systemUsed + m_iDisc; - } - - EMasterClock CDVDClock::GetMaster() -diff --git a/xbmc/cores/dvdplayer/DVDClock.h b/xbmc/cores/dvdplayer/DVDClock.h -index d6b2d0a..cf03af5 100644 ---- a/xbmc/cores/dvdplayer/DVDClock.h -+++ b/xbmc/cores/dvdplayer/DVDClock.h -@@ -66,9 +66,9 @@ class CDVDClock - } - - void Reset() { m_bReset = true; } -- void Pause(); -- void Resume(); - void SetSpeed(int iSpeed); -+ void SetSpeedAdjust(double adjust); -+ double GetSpeedAdjust(); - - double GetClockSpeed(); /**< get the current speed of the clock relative normal system time */ - -@@ -101,7 +101,11 @@ class CDVDClock - static int64_t m_systemOffset; - static CCriticalSection m_systemsection; - -- double m_maxspeedadjust; -+ int64_t m_systemAdjust; -+ int64_t m_lastSystemTime; -+ double m_speedAdjust; -+ -+ double m_maxspeedadjust; - CCriticalSection m_speedsection; - static CDVDClock *m_playerclock; - }; -diff --git a/xbmc/cores/dvdplayer/DVDPlayer.cpp b/xbmc/cores/dvdplayer/DVDPlayer.cpp -index 1f220c6..4db38e2 100644 ---- a/xbmc/cores/dvdplayer/DVDPlayer.cpp -+++ b/xbmc/cores/dvdplayer/DVDPlayer.cpp -@@ -1841,6 +1841,7 @@ void CDVDPlayer::HandlePlaySpeed() - if(m_caching != caching) - SetCaching(caching); - -+ // check buffering levels and adjust clock - if (m_playSpeed == DVD_PLAYSPEED_NORMAL && m_caching == CACHESTATE_DONE) - { - // due to i.e. discontinuities of pts the stream may have drifted away -@@ -1851,6 +1852,31 @@ void CDVDPlayer::HandlePlaySpeed() - CLog::Log(LOGDEBUG,"CDVDPlayer::HandlePlaySpeed - audio stream stalled, tiggering re-sync"); - TriggerResync(); - } -+ -+ if (CachePVRStream()) -+ { -+ if (m_CurrentAudio.id >= 0) -+ { -+ double adjust = -1.0; // a unique value -+ if (m_clock.GetSpeedAdjust() == 0.0 && m_dvdPlayerAudio->GetLevel() < 5) -+ adjust = -0.01; -+ else if (m_clock.GetSpeedAdjust() == 0.0 && m_dvdPlayerAudio->GetLevel() > 95) -+ adjust = 0.01; -+ -+ if (m_clock.GetSpeedAdjust() < 0 && m_dvdPlayerAudio->GetLevel() > 20) -+ adjust = 0.0; -+ else if (m_clock.GetSpeedAdjust() > 0 && m_dvdPlayerAudio->GetLevel() < 80) -+ adjust = 0.0; -+ -+ if (adjust != -1.0) -+ { -+ m_clock.SetSpeedAdjust(adjust); -+ if (m_omxplayer_mode) -+ m_OmxPlayerState.av_clock.OMXSetSpeedAdjust(adjust); -+ CLog::Log(LOGDEBUG, "CDVDPlayer::HandlePlaySpeed set clock adjust: %f", adjust); -+ } -+ } -+ } - } - - if(GetPlaySpeed() != DVD_PLAYSPEED_NORMAL && GetPlaySpeed() != DVD_PLAYSPEED_PAUSE) -@@ -2762,6 +2788,10 @@ void CDVDPlayer::SetCaching(ECacheState state) - m_pInputStream->ResetScanTimeout(0); - } - m_caching = state; -+ -+ m_clock.SetSpeedAdjust(0); -+ if (m_omxplayer_mode) -+ m_OmxPlayerState.av_clock.OMXSetSpeedAdjust(0); - } - - void CDVDPlayer::SetPlaySpeed(int speed) -diff --git a/xbmc/cores/dvdplayer/DVDPlayer.h b/xbmc/cores/dvdplayer/DVDPlayer.h -index 3b8cefb..3dbb809 100644 ---- a/xbmc/cores/dvdplayer/DVDPlayer.h -+++ b/xbmc/cores/dvdplayer/DVDPlayer.h -@@ -68,6 +68,7 @@ class OMXClock - bool OMXStateExecute(bool lock = true) { return false; } - void OMXStateIdle(bool lock = true) {} - bool HDMIClockSync(bool lock = true) { return false; } -+ void OMXSetSpeedAdjust(double adjust, bool lock = true) {} - }; - #endif - -diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp -index 5832c58..f5e6de9 100644 ---- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp -+++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp -@@ -201,10 +201,7 @@ bool CDVDPlayerVideo::OpenStream( CDVDStreamInfo &hint ) - return false; - } - -- if(CSettings::Get().GetBool("videoplayer.usedisplayasclock") && !g_VideoReferenceClock.IsRunning()) -- { -- g_VideoReferenceClock.Create(); -- } -+ g_VideoReferenceClock.Start(); - - if(m_messageQueue.IsInited()) - m_messageQueue.Put(new CDVDMsgVideoCodecChange(hint, codec), 0); -diff --git a/xbmc/linux/OMXClock.cpp b/xbmc/linux/OMXClock.cpp -index 46df52e..4f094df 100644 ---- a/xbmc/linux/OMXClock.cpp -+++ b/xbmc/linux/OMXClock.cpp -@@ -45,6 +45,7 @@ OMXClock::OMXClock() - m_clock = NULL; - m_last_media_time = 0.0f; - m_last_media_time_read = 0.0f; -+ m_speedAdjust = 0; - - pthread_mutex_init(&m_lock, NULL); - } -@@ -477,7 +478,7 @@ bool OMXClock::OMXSetSpeed(int speed, bool lock /* = true */, bool pause_resume - if(lock) - Lock(); - -- CLog::Log(LOGDEBUG, "OMXClock::OMXSetSpeed(%.2f) pause_resume:%d", (float)speed / (float)DVD_PLAYSPEED_NORMAL, pause_resume); -+ CLog::Log(LOGDEBUG, "OMXClock::OMXSetSpeed(%.3f) pause_resume:%d", (float)speed / (float)DVD_PLAYSPEED_NORMAL * (1.0 + m_speedAdjust), pause_resume); - - if (pause_resume) - { -@@ -485,6 +486,8 @@ bool OMXClock::OMXSetSpeed(int speed, bool lock /* = true */, bool pause_resume - OMX_INIT_STRUCTURE(scaleType); - - scaleType.xScale = (speed << 16) / DVD_PLAYSPEED_NORMAL; -+ scaleType.xScale += scaleType.xScale * m_speedAdjust; -+ - OMX_ERRORTYPE omx_err = m_omx_clock.SetConfig(OMX_IndexConfigTimeScale, &scaleType); - if(omx_err != OMX_ErrorNone) - { -@@ -504,6 +507,21 @@ bool OMXClock::OMXSetSpeed(int speed, bool lock /* = true */, bool pause_resume - return true; - } - -+void OMXClock::OMXSetSpeedAdjust(double adjust, bool lock /* = true */) -+{ -+ if(lock) -+ Lock(); -+ // we only support resampling (and hence clock adjustment) in this mode -+ if (CSettings::Get().GetBool("videoplayer.usedisplayasclock")) -+ { -+ m_speedAdjust = adjust; -+ OMXSetSpeed(m_omx_speed, false, true); -+ m_last_media_time = 0.0f; -+ } -+ if(lock) -+ UnLock(); -+} -+ - bool OMXClock::OMXFlush(bool lock) - { - if(m_omx_clock.GetComponent() == NULL) -diff --git a/xbmc/linux/OMXClock.h b/xbmc/linux/OMXClock.h -index 8f06134..df0d4cf 100644 ---- a/xbmc/linux/OMXClock.h -+++ b/xbmc/linux/OMXClock.h -@@ -59,6 +59,7 @@ class OMXClock - COMXCoreComponent m_omx_clock; - double m_last_media_time; - double m_last_media_time_read; -+ double m_speedAdjust; - public: - OMXClock(); - ~OMXClock(); -@@ -82,6 +83,7 @@ class OMXClock - bool OMXPause(bool lock = true); - bool OMXResume(bool lock = true); - bool OMXSetSpeed(int speed, bool lock = true, bool pause_resume = false); -+ void OMXSetSpeedAdjust(double adjust, bool lock = true); - int OMXPlaySpeed() { return m_omx_speed; }; - bool OMXFlush(bool lock = true); - COMXCoreComponent *GetOMXClock(); -diff --git a/xbmc/video/VideoReferenceClock.cpp b/xbmc/video/VideoReferenceClock.cpp -index f97e0bf..a363c36 100644 ---- a/xbmc/video/VideoReferenceClock.cpp -+++ b/xbmc/video/VideoReferenceClock.cpp -@@ -28,6 +28,7 @@ - #include "guilib/GraphicContext.h" - #include "video/videosync/VideoSync.h" - #include "windowing/WindowingFactory.h" -+#include "settings/Settings.h" - - #if defined(HAS_GLX) - #include "video/videosync/VideoSyncGLX.h" -@@ -72,6 +73,13 @@ CVideoReferenceClock::~CVideoReferenceClock() - { - } - -+void CVideoReferenceClock::Start() -+{ -+ CSingleExit lock(g_graphicsContext); -+ if(CSettings::Get().GetBool("videoplayer.usedisplayasclock") && !IsRunning()) -+ Create(); -+} -+ - void CVideoReferenceClock::Stop() - { - CSingleExit lock(g_graphicsContext); -diff --git a/xbmc/video/VideoReferenceClock.h b/xbmc/video/VideoReferenceClock.h -index 937b53e..d0a9c3f 100644 ---- a/xbmc/video/VideoReferenceClock.h -+++ b/xbmc/video/VideoReferenceClock.h -@@ -39,6 +39,7 @@ class CVideoReferenceClock : public CThread - bool GetClockInfo(int& MissedVblanks, double& ClockSpeed, double& RefreshRate); - void SetFineAdjust(double fineadjust); - void RefreshChanged(); -+ void Start(); - void Stop(); - - private: From 1026004dc183fad879d872223a263c5f36aa1056 Mon Sep 17 00:00:00 2001 From: popcornmix diff --git a/projects/RPi2/patches/kodi/kodi-001-isengard-rpb-backports.patch b/projects/RPi2/patches/kodi/kodi-001-isengard-rpb-backports.patch index ccba80a8a5..4c670e9869 100644 --- a/projects/RPi2/patches/kodi/kodi-001-isengard-rpb-backports.patch +++ b/projects/RPi2/patches/kodi/kodi-001-isengard-rpb-backports.patch @@ -8006,517 +8006,6 @@ index 011ae04..fcc6a15 100644 protected: void QueryCodec(void); -From 3e33a9a5a6874b992bed68821b8d779380a13f14 Mon Sep 17 00:00:00 2001 -From: Rainer Hochecker -Date: Fri, 17 Apr 2015 20:18:40 +0200 -Subject: [PATCH 78/89] dvdplayer: reduce time for initial audio sync - ---- - xbmc/cores/dvdplayer/DVDPlayerAudio.cpp | 6 +++--- - xbmc/cores/dvdplayer/DVDPlayerAudio.h | 4 ++-- - 2 files changed, 5 insertions(+), 5 deletions(-) - -diff --git a/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp b/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp -index bd357aa..ebf4d93 100644 ---- a/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp -+++ b/xbmc/cores/dvdplayer/DVDPlayerAudio.cpp -@@ -676,7 +676,7 @@ void CDVDPlayerAudio::HandleSyncError(double duration) - // error because drop/dupe changes the value - if (m_syncclock && fabs(error) > threshold1) - { -- m_errors.Flush(500); -+ m_errors.Flush(); - m_integral = 0.0; - m_resampleratio = 0.0; - return; -@@ -693,13 +693,13 @@ void CDVDPlayerAudio::HandleSyncError(double duration) - // 500ms in order to get first resample ratio early. If we don't adjust rr early, error - // may get above threshold1 again. Too small values for interval result in worse average errors - -- if (!m_errors.Get(m_error, m_syncclock ? 500 : 2000)) -+ if (!m_errors.Get(m_error, m_syncclock ? 100 : 2000)) - return; - - if (fabs(m_error) > threshold1) - { - m_syncclock = true; -- m_errors.Flush(500); -+ m_errors.Flush(100); - m_integral = 0.0; - m_resampleratio = 0.0; - CLog::Log(LOGDEBUG,"CDVDPlayerAudio::HandleSyncError - average error %f above threshold of %f", -diff --git a/xbmc/cores/dvdplayer/DVDPlayerAudio.h b/xbmc/cores/dvdplayer/DVDPlayerAudio.h -index 635c184..bf51863 100644 ---- a/xbmc/cores/dvdplayer/DVDPlayerAudio.h -+++ b/xbmc/cores/dvdplayer/DVDPlayerAudio.h -@@ -69,7 +69,7 @@ class CDVDErrorAverage - m_count++; - } - -- void Flush(int interval = 500) -+ void Flush(int interval = 100) - { - m_buffer = 0.0f; - m_count = 0; -@@ -84,7 +84,7 @@ class CDVDErrorAverage - return 0.0; - } - -- bool Get(double& error, int interval = 500) -+ bool Get(double& error, int interval = 100) - { - if(m_timer.IsTimePast()) - { - -From 9a35c9bd5494c4b9a39339fe5c9205f8f2890a9b Mon Sep 17 00:00:00 2001 -From: Rainer Hochecker -Date: Fri, 3 Apr 2015 10:49:55 +0200 -Subject: [PATCH 79/89] dvdplayer: cosmetics - ---- - xbmc/cores/dvdplayer/DVDPlayer.cpp | 41 ++++++++++++++++++++------------------ - 1 file changed, 22 insertions(+), 19 deletions(-) - -diff --git a/xbmc/cores/dvdplayer/DVDPlayer.cpp b/xbmc/cores/dvdplayer/DVDPlayer.cpp -index 8ceb498..1f220c6 100644 ---- a/xbmc/cores/dvdplayer/DVDPlayer.cpp -+++ b/xbmc/cores/dvdplayer/DVDPlayer.cpp -@@ -1454,16 +1454,18 @@ void CDVDPlayer::Process() - - m_OmxPlayerState.bOmxSentEOFs = true; - } -+ - if(m_CurrentAudio.inited) -- m_dvdPlayerAudio->SendMessage (new CDVDMsg(CDVDMsg::GENERAL_EOF)); -+ m_dvdPlayerAudio->SendMessage(new CDVDMsg(CDVDMsg::GENERAL_EOF)); - if(m_CurrentVideo.inited) -- m_dvdPlayerVideo->SendMessage (new CDVDMsg(CDVDMsg::GENERAL_EOF)); -+ m_dvdPlayerVideo->SendMessage(new CDVDMsg(CDVDMsg::GENERAL_EOF)); - if(m_CurrentSubtitle.inited) - m_dvdPlayerSubtitle->SendMessage(new CDVDMsg(CDVDMsg::GENERAL_EOF)); - if(m_CurrentTeletext.inited) - m_dvdPlayerTeletext->SendMessage(new CDVDMsg(CDVDMsg::GENERAL_EOF)); -- m_CurrentAudio.inited = false; -- m_CurrentVideo.inited = false; -+ -+ m_CurrentAudio.inited = false; -+ m_CurrentVideo.inited = false; - m_CurrentSubtitle.inited = false; - m_CurrentTeletext.inited = false; - -@@ -1573,21 +1575,22 @@ bool CDVDPlayer::CheckIsCurrent(CCurrentStream& current, CDemuxStream* stream, D - - void CDVDPlayer::ProcessPacket(CDemuxStream* pStream, DemuxPacket* pPacket) - { -- /* process packet if it belongs to selected stream. for dvd's don't allow automatic opening of streams*/ -- -- if (CheckIsCurrent(m_CurrentAudio, pStream, pPacket)) -- ProcessAudioData(pStream, pPacket); -- else if (CheckIsCurrent(m_CurrentVideo, pStream, pPacket)) -- ProcessVideoData(pStream, pPacket); -- else if (CheckIsCurrent(m_CurrentSubtitle, pStream, pPacket)) -- ProcessSubData(pStream, pPacket); -- else if (CheckIsCurrent(m_CurrentTeletext, pStream, pPacket)) -- ProcessTeletextData(pStream, pPacket); -- else -- { -- pStream->SetDiscard(AVDISCARD_ALL); -- CDVDDemuxUtils::FreeDemuxPacket(pPacket); // free it since we won't do anything with it -- } -+ // process packet if it belongs to selected stream. -+ // for dvd's don't allow automatic opening of streams*/ -+ -+ if (CheckIsCurrent(m_CurrentAudio, pStream, pPacket)) -+ ProcessAudioData(pStream, pPacket); -+ else if (CheckIsCurrent(m_CurrentVideo, pStream, pPacket)) -+ ProcessVideoData(pStream, pPacket); -+ else if (CheckIsCurrent(m_CurrentSubtitle, pStream, pPacket)) -+ ProcessSubData(pStream, pPacket); -+ else if (CheckIsCurrent(m_CurrentTeletext, pStream, pPacket)) -+ ProcessTeletextData(pStream, pPacket); -+ else -+ { -+ pStream->SetDiscard(AVDISCARD_ALL); -+ CDVDDemuxUtils::FreeDemuxPacket(pPacket); // free it since we won't do anything with it -+ } - } - - void CDVDPlayer::CheckStreamChanges(CCurrentStream& current, CDemuxStream* stream) - -From 7c8937a10c0441e815ec4743dfc38b22c6f38d09 Mon Sep 17 00:00:00 2001 -From: Rainer Hochecker -Date: Fri, 3 Apr 2015 14:03:44 +0200 -Subject: [PATCH 80/89] dvdplayer/omxplayer: protect live streams (pvr) from - stalling - ---- - xbmc/cores/VideoRenderers/RenderManager.cpp | 9 +++++ - xbmc/cores/dvdplayer/DVDClock.cpp | 53 +++++++++++++++-------------- - xbmc/cores/dvdplayer/DVDClock.h | 10 ++++-- - xbmc/cores/dvdplayer/DVDPlayer.cpp | 30 ++++++++++++++++ - xbmc/cores/dvdplayer/DVDPlayer.h | 1 + - xbmc/cores/dvdplayer/DVDPlayerVideo.cpp | 5 +-- - xbmc/linux/OMXClock.cpp | 20 ++++++++++- - xbmc/linux/OMXClock.h | 2 ++ - xbmc/video/VideoReferenceClock.cpp | 8 +++++ - xbmc/video/VideoReferenceClock.h | 1 + - 10 files changed, 106 insertions(+), 33 deletions(-) - -diff --git a/xbmc/cores/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoRenderers/RenderManager.cpp -index 25323ef..25d3809 100644 ---- a/xbmc/cores/VideoRenderers/RenderManager.cpp -+++ b/xbmc/cores/VideoRenderers/RenderManager.cpp -@@ -175,6 +175,15 @@ void CXBMCRenderManager::WaitPresentTime(double presenttime) - return; - } - -+ CDVDClock *dvdclock = CDVDClock::GetMasterClock(); -+ if(dvdclock != NULL && dvdclock->GetSpeedAdjust() != 0.0) -+ { -+ CDVDClock::WaitAbsoluteClock(presenttime * DVD_TIME_BASE); -+ m_presenterr = 0; -+ m_presentcorr = 0; -+ return; -+ } -+ - double clock = CDVDClock::WaitAbsoluteClock(presenttime * DVD_TIME_BASE) / DVD_TIME_BASE; - double target = 0.5; - double error = ( clock - presenttime ) / frametime - target; -diff --git a/xbmc/cores/dvdplayer/DVDClock.cpp b/xbmc/cores/dvdplayer/DVDClock.cpp -index a496ec0..2629530 100644 ---- a/xbmc/cores/dvdplayer/DVDClock.cpp -+++ b/xbmc/cores/dvdplayer/DVDClock.cpp -@@ -29,7 +29,7 @@ - int64_t CDVDClock::m_systemOffset; - int64_t CDVDClock::m_systemFrequency; - CCriticalSection CDVDClock::m_systemsection; --CDVDClock *CDVDClock::m_playerclock = NULL;; -+CDVDClock *CDVDClock::m_playerclock = NULL; - - CDVDClock::CDVDClock() - : m_master(MASTER_CLOCK_NONE) -@@ -42,6 +42,9 @@ CDVDClock::CDVDClock() - m_bReset = true; - m_iDisc = 0; - m_maxspeedadjust = 0.0; -+ m_lastSystemTime = g_VideoReferenceClock.GetTime(); -+ m_systemAdjust = 0; -+ m_speedAdjust = 0; - - m_startClock = 0; - -@@ -103,7 +106,12 @@ CDVDClock* CDVDClock::GetMasterClock() - double CDVDClock::GetClock(bool interpolated /*= true*/) - { - CSharedLock lock(m_critSection); -- return SystemToPlaying(g_VideoReferenceClock.GetTime(interpolated)); -+ -+ int64_t current = g_VideoReferenceClock.GetTime(interpolated); -+ m_systemAdjust += m_speedAdjust * (current - m_lastSystemTime); -+ m_lastSystemTime = current; -+ -+ return SystemToPlaying(current); - } - - double CDVDClock::GetClock(double& absolute, bool interpolated /*= true*/) -@@ -115,8 +123,7 @@ double CDVDClock::GetClock(double& absolute, bool interpolated /*= true*/) - absolute = SystemToAbsolute(current); - } - -- CSharedLock lock(m_critSection); -- return SystemToPlaying(current); -+ return GetClock(interpolated); - } - - void CDVDClock::SetSpeed(int iSpeed) -@@ -145,6 +152,18 @@ void CDVDClock::SetSpeed(int iSpeed) - m_systemUsed = newfreq; - } - -+void CDVDClock::SetSpeedAdjust(double adjust) -+{ -+ CExclusiveLock lock(m_critSection); -+ m_speedAdjust = adjust; -+} -+ -+double CDVDClock::GetSpeedAdjust() -+{ -+ CExclusiveLock lock(m_critSection); -+ return m_speedAdjust; -+} -+ - bool CDVDClock::Update(double clock, double absolute, double limit, const char* log) - { - CExclusiveLock lock(m_critSection); -@@ -174,26 +193,8 @@ void CDVDClock::Discontinuity(double clock, double absolute) - m_pauseClock = m_startClock; - m_iDisc = clock; - m_bReset = false; --} -- --void CDVDClock::Pause() --{ -- CExclusiveLock lock(m_critSection); -- if(!m_pauseClock) -- m_pauseClock = g_VideoReferenceClock.GetTime(); --} -- --void CDVDClock::Resume() --{ -- CExclusiveLock lock(m_critSection); -- if( m_pauseClock ) -- { -- int64_t current; -- current = g_VideoReferenceClock.GetTime(); -- -- m_startClock += current - m_pauseClock; -- m_pauseClock = 0; -- } -+ m_systemAdjust = 0; -+ m_speedAdjust = 0; - } - - void CDVDClock::SetMaxSpeedAdjust(double speed) -@@ -265,6 +266,8 @@ double CDVDClock::SystemToPlaying(int64_t system) - if(m_pauseClock) - m_pauseClock = m_startClock; - m_iDisc = 0; -+ m_systemAdjust = 0; -+ m_speedAdjust = 0; - m_bReset = false; - } - -@@ -273,7 +276,7 @@ double CDVDClock::SystemToPlaying(int64_t system) - else - current = system; - -- return DVD_TIME_BASE * (double)(current - m_startClock) / m_systemUsed + m_iDisc; -+ return DVD_TIME_BASE * (double)(current - m_startClock + m_systemAdjust) / m_systemUsed + m_iDisc; - } - - EMasterClock CDVDClock::GetMaster() -diff --git a/xbmc/cores/dvdplayer/DVDClock.h b/xbmc/cores/dvdplayer/DVDClock.h -index d6b2d0a..cf03af5 100644 ---- a/xbmc/cores/dvdplayer/DVDClock.h -+++ b/xbmc/cores/dvdplayer/DVDClock.h -@@ -66,9 +66,9 @@ class CDVDClock - } - - void Reset() { m_bReset = true; } -- void Pause(); -- void Resume(); - void SetSpeed(int iSpeed); -+ void SetSpeedAdjust(double adjust); -+ double GetSpeedAdjust(); - - double GetClockSpeed(); /**< get the current speed of the clock relative normal system time */ - -@@ -101,7 +101,11 @@ class CDVDClock - static int64_t m_systemOffset; - static CCriticalSection m_systemsection; - -- double m_maxspeedadjust; -+ int64_t m_systemAdjust; -+ int64_t m_lastSystemTime; -+ double m_speedAdjust; -+ -+ double m_maxspeedadjust; - CCriticalSection m_speedsection; - static CDVDClock *m_playerclock; - }; -diff --git a/xbmc/cores/dvdplayer/DVDPlayer.cpp b/xbmc/cores/dvdplayer/DVDPlayer.cpp -index 1f220c6..4db38e2 100644 ---- a/xbmc/cores/dvdplayer/DVDPlayer.cpp -+++ b/xbmc/cores/dvdplayer/DVDPlayer.cpp -@@ -1841,6 +1841,7 @@ void CDVDPlayer::HandlePlaySpeed() - if(m_caching != caching) - SetCaching(caching); - -+ // check buffering levels and adjust clock - if (m_playSpeed == DVD_PLAYSPEED_NORMAL && m_caching == CACHESTATE_DONE) - { - // due to i.e. discontinuities of pts the stream may have drifted away -@@ -1851,6 +1852,31 @@ void CDVDPlayer::HandlePlaySpeed() - CLog::Log(LOGDEBUG,"CDVDPlayer::HandlePlaySpeed - audio stream stalled, tiggering re-sync"); - TriggerResync(); - } -+ -+ if (CachePVRStream()) -+ { -+ if (m_CurrentAudio.id >= 0) -+ { -+ double adjust = -1.0; // a unique value -+ if (m_clock.GetSpeedAdjust() == 0.0 && m_dvdPlayerAudio->GetLevel() < 5) -+ adjust = -0.01; -+ else if (m_clock.GetSpeedAdjust() == 0.0 && m_dvdPlayerAudio->GetLevel() > 95) -+ adjust = 0.01; -+ -+ if (m_clock.GetSpeedAdjust() < 0 && m_dvdPlayerAudio->GetLevel() > 20) -+ adjust = 0.0; -+ else if (m_clock.GetSpeedAdjust() > 0 && m_dvdPlayerAudio->GetLevel() < 80) -+ adjust = 0.0; -+ -+ if (adjust != -1.0) -+ { -+ m_clock.SetSpeedAdjust(adjust); -+ if (m_omxplayer_mode) -+ m_OmxPlayerState.av_clock.OMXSetSpeedAdjust(adjust); -+ CLog::Log(LOGDEBUG, "CDVDPlayer::HandlePlaySpeed set clock adjust: %f", adjust); -+ } -+ } -+ } - } - - if(GetPlaySpeed() != DVD_PLAYSPEED_NORMAL && GetPlaySpeed() != DVD_PLAYSPEED_PAUSE) -@@ -2762,6 +2788,10 @@ void CDVDPlayer::SetCaching(ECacheState state) - m_pInputStream->ResetScanTimeout(0); - } - m_caching = state; -+ -+ m_clock.SetSpeedAdjust(0); -+ if (m_omxplayer_mode) -+ m_OmxPlayerState.av_clock.OMXSetSpeedAdjust(0); - } - - void CDVDPlayer::SetPlaySpeed(int speed) -diff --git a/xbmc/cores/dvdplayer/DVDPlayer.h b/xbmc/cores/dvdplayer/DVDPlayer.h -index 3b8cefb..3dbb809 100644 ---- a/xbmc/cores/dvdplayer/DVDPlayer.h -+++ b/xbmc/cores/dvdplayer/DVDPlayer.h -@@ -68,6 +68,7 @@ class OMXClock - bool OMXStateExecute(bool lock = true) { return false; } - void OMXStateIdle(bool lock = true) {} - bool HDMIClockSync(bool lock = true) { return false; } -+ void OMXSetSpeedAdjust(double adjust, bool lock = true) {} - }; - #endif - -diff --git a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp -index 5832c58..f5e6de9 100644 ---- a/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp -+++ b/xbmc/cores/dvdplayer/DVDPlayerVideo.cpp -@@ -201,10 +201,7 @@ bool CDVDPlayerVideo::OpenStream( CDVDStreamInfo &hint ) - return false; - } - -- if(CSettings::Get().GetBool("videoplayer.usedisplayasclock") && !g_VideoReferenceClock.IsRunning()) -- { -- g_VideoReferenceClock.Create(); -- } -+ g_VideoReferenceClock.Start(); - - if(m_messageQueue.IsInited()) - m_messageQueue.Put(new CDVDMsgVideoCodecChange(hint, codec), 0); -diff --git a/xbmc/linux/OMXClock.cpp b/xbmc/linux/OMXClock.cpp -index 46df52e..4f094df 100644 ---- a/xbmc/linux/OMXClock.cpp -+++ b/xbmc/linux/OMXClock.cpp -@@ -45,6 +45,7 @@ OMXClock::OMXClock() - m_clock = NULL; - m_last_media_time = 0.0f; - m_last_media_time_read = 0.0f; -+ m_speedAdjust = 0; - - pthread_mutex_init(&m_lock, NULL); - } -@@ -477,7 +478,7 @@ bool OMXClock::OMXSetSpeed(int speed, bool lock /* = true */, bool pause_resume - if(lock) - Lock(); - -- CLog::Log(LOGDEBUG, "OMXClock::OMXSetSpeed(%.2f) pause_resume:%d", (float)speed / (float)DVD_PLAYSPEED_NORMAL, pause_resume); -+ CLog::Log(LOGDEBUG, "OMXClock::OMXSetSpeed(%.3f) pause_resume:%d", (float)speed / (float)DVD_PLAYSPEED_NORMAL * (1.0 + m_speedAdjust), pause_resume); - - if (pause_resume) - { -@@ -485,6 +486,8 @@ bool OMXClock::OMXSetSpeed(int speed, bool lock /* = true */, bool pause_resume - OMX_INIT_STRUCTURE(scaleType); - - scaleType.xScale = (speed << 16) / DVD_PLAYSPEED_NORMAL; -+ scaleType.xScale += scaleType.xScale * m_speedAdjust; -+ - OMX_ERRORTYPE omx_err = m_omx_clock.SetConfig(OMX_IndexConfigTimeScale, &scaleType); - if(omx_err != OMX_ErrorNone) - { -@@ -504,6 +507,21 @@ bool OMXClock::OMXSetSpeed(int speed, bool lock /* = true */, bool pause_resume - return true; - } - -+void OMXClock::OMXSetSpeedAdjust(double adjust, bool lock /* = true */) -+{ -+ if(lock) -+ Lock(); -+ // we only support resampling (and hence clock adjustment) in this mode -+ if (CSettings::Get().GetBool("videoplayer.usedisplayasclock")) -+ { -+ m_speedAdjust = adjust; -+ OMXSetSpeed(m_omx_speed, false, true); -+ m_last_media_time = 0.0f; -+ } -+ if(lock) -+ UnLock(); -+} -+ - bool OMXClock::OMXFlush(bool lock) - { - if(m_omx_clock.GetComponent() == NULL) -diff --git a/xbmc/linux/OMXClock.h b/xbmc/linux/OMXClock.h -index 8f06134..df0d4cf 100644 ---- a/xbmc/linux/OMXClock.h -+++ b/xbmc/linux/OMXClock.h -@@ -59,6 +59,7 @@ class OMXClock - COMXCoreComponent m_omx_clock; - double m_last_media_time; - double m_last_media_time_read; -+ double m_speedAdjust; - public: - OMXClock(); - ~OMXClock(); -@@ -82,6 +83,7 @@ class OMXClock - bool OMXPause(bool lock = true); - bool OMXResume(bool lock = true); - bool OMXSetSpeed(int speed, bool lock = true, bool pause_resume = false); -+ void OMXSetSpeedAdjust(double adjust, bool lock = true); - int OMXPlaySpeed() { return m_omx_speed; }; - bool OMXFlush(bool lock = true); - COMXCoreComponent *GetOMXClock(); -diff --git a/xbmc/video/VideoReferenceClock.cpp b/xbmc/video/VideoReferenceClock.cpp -index f97e0bf..a363c36 100644 ---- a/xbmc/video/VideoReferenceClock.cpp -+++ b/xbmc/video/VideoReferenceClock.cpp -@@ -28,6 +28,7 @@ - #include "guilib/GraphicContext.h" - #include "video/videosync/VideoSync.h" - #include "windowing/WindowingFactory.h" -+#include "settings/Settings.h" - - #if defined(HAS_GLX) - #include "video/videosync/VideoSyncGLX.h" -@@ -72,6 +73,13 @@ CVideoReferenceClock::~CVideoReferenceClock() - { - } - -+void CVideoReferenceClock::Start() -+{ -+ CSingleExit lock(g_graphicsContext); -+ if(CSettings::Get().GetBool("videoplayer.usedisplayasclock") && !IsRunning()) -+ Create(); -+} -+ - void CVideoReferenceClock::Stop() - { - CSingleExit lock(g_graphicsContext); -diff --git a/xbmc/video/VideoReferenceClock.h b/xbmc/video/VideoReferenceClock.h -index 937b53e..d0a9c3f 100644 ---- a/xbmc/video/VideoReferenceClock.h -+++ b/xbmc/video/VideoReferenceClock.h -@@ -39,6 +39,7 @@ class CVideoReferenceClock : public CThread - bool GetClockInfo(int& MissedVblanks, double& ClockSpeed, double& RefreshRate); - void SetFineAdjust(double fineadjust); - void RefreshChanged(); -+ void Start(); - void Stop(); - - private: From 1026004dc183fad879d872223a263c5f36aa1056 Mon Sep 17 00:00:00 2001 From: popcornmix