mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-07-29 13:46:49 +00:00
kodi: update to kodi-15.0-beta1-7dacc6e
This commit is contained in:
parent
906b50301c
commit
9beeeebd4a
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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 ¤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
|
||||
|
||||
|
@ -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"
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
Loading…
x
Reference in New Issue
Block a user