kodi: update to kodi-15.0-beta1-7dacc6e

This commit is contained in:
Stefan Saraev 2015-04-26 16:25:11 +03:00
parent 906b50301c
commit 9beeeebd4a
8 changed files with 125 additions and 1131 deletions

View File

@ -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"

View File

@ -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"

View File

@ -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 <stefan@saraev.ca>
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 <string.h>
#include <ostream>
+#include <iostream>
+#include <dirent.h>
+#include <sys/stat.h>
+
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<CContextItemAddon>(localAddon));
#include <functional>
@@ -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

View File

@ -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 <stefan@saraev.ca>
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()
{
+ // systemctl enable & start on addon enable
+ CallOEWrapper(ID(), false, false);
Start();
}
+ // 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<CService>(addon)->Start();
@@ -145,13 +160,20 @@ void CService::OnPostInstall(bool restart, bool update, bool modal)
@@ -649,6 +661,11 @@ void OnDisabled(const std::string& id)
if (CAddonMgr::Get().GetAddon(id, addon, ADDON_SERVICE, false))
std::static_pointer_cast<CService>(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<CContextItemAddon>(addon));
}
@@ -672,6 +689,14 @@ void OnPreInstall(const AddonPtr& addon)
void OnPostInstall(const AddonPtr& addon, bool update, bool modal)
{
std::shared_ptr<CService> service = std::dynamic_pointer_cast<CService>(localAddon);
if (service)
AddonPtr localAddon;
+ // OE: systemctl stop & disable / enable & start on addon upgrade
+ if (CAddonMgr::Get().GetAddon(addon->ID(), localAddon, ADDON_SERVICE))
+ {
+ // systemctl stop & disable / enable & start on addon upgrade
+ CallOEWrapper(ID(), true, false);
+ CallOEWrapper(ID(), false, false);
service->Start();
+ CallOEWrapper(addon->ID(), true);
+ CallOEWrapper(addon->ID(), false);
+ }
}
}
}
+ // OE
+
if (CAddonMgr::Get().GetAddon(addon->ID(), localAddon, ADDON_SERVICE))
std::static_pointer_cast<CService>(localAddon)->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<CService>(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

View File

@ -1,20 +1,28 @@
From 411b2097affa681e22e8e0fe1a1c30bebd574a0e Mon Sep 17 00:00:00 2001
From aabc63419df8aa69f156afdafb28820c3c9ccdc7 Mon Sep 17 00:00:00 2001
From: fritsch <Peter.Fruehberger@gmail.com>
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<std::string, int> > &list, int &current, 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

View File

@ -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"

View File

@ -8006,517 +8006,6 @@ index 011ae04..fcc6a15 100644
protected:
void QueryCodec(void);
From 3e33a9a5a6874b992bed68821b8d779380a13f14 Mon Sep 17 00:00:00 2001
From: Rainer Hochecker <fernetmenta@online.de>
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 <fernetmenta@online.de>
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 <fernetmenta@online.de>
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 <popcornmix@gmail.com>

View File

@ -8006,517 +8006,6 @@ index 011ae04..fcc6a15 100644
protected:
void QueryCodec(void);
From 3e33a9a5a6874b992bed68821b8d779380a13f14 Mon Sep 17 00:00:00 2001
From: Rainer Hochecker <fernetmenta@online.de>
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 <fernetmenta@online.de>
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 <fernetmenta@online.de>
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 <popcornmix@gmail.com>