aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFranz Koch <franz.koch@elements-net.de>2013-06-05 22:57:01 +0200
committerJoakim Plate <elupus@ecce.se>2013-08-01 16:59:01 +0200
commit352862d1c2d612b930bbd2ea1b487b96878ad333 (patch)
treeac5a18d1a27924722af69f00c573b7bd3c214b67
parent9642034433e34480aca36c42aa68610b9dcf789f (diff)
[3D] move stereomode detection from filename to stereoscopicsmanager and make the flags configurable via advanced settings.
-rw-r--r--xbmc/cores/dvdplayer/DVDPlayer.cpp4
-rw-r--r--xbmc/cores/omxplayer/OMXPlayer.cpp11
-rw-r--r--xbmc/guilib/StereoscopicsManager.cpp34
-rw-r--r--xbmc/guilib/StereoscopicsManager.h1
-rw-r--r--xbmc/settings/AdvancedSettings.cpp5
-rw-r--r--xbmc/settings/AdvancedSettings.h3
-rw-r--r--xbmc/utils/StringUtils.cpp10
-rw-r--r--xbmc/utils/StringUtils.h1
8 files changed, 62 insertions, 7 deletions
diff --git a/xbmc/cores/dvdplayer/DVDPlayer.cpp b/xbmc/cores/dvdplayer/DVDPlayer.cpp
index 1246b9f060..fe9cebad79 100644
--- a/xbmc/cores/dvdplayer/DVDPlayer.cpp
+++ b/xbmc/cores/dvdplayer/DVDPlayer.cpp
@@ -47,6 +47,7 @@
#include "utils/URIUtils.h"
#include "GUIInfoManager.h"
#include "guilib/GUIWindowManager.h"
+#include "guilib/StereoscopicsManager.h"
#include "Application.h"
#include "ApplicationMessenger.h"
#include "DVDPerformanceCounter.h"
@@ -2918,6 +2919,9 @@ bool CDVDPlayer::OpenVideoStream(int iStream, int source, bool reset)
if(pMenus && pMenus->IsInMenu())
hint.stills = true;
+ if (hint.stereo_mode.empty())
+ hint.stereo_mode = CStereoscopicsManager::Get().DetectStereoModeByString(m_filename);
+
if(m_CurrentVideo.id < 0
|| m_CurrentVideo.hint != hint)
{
diff --git a/xbmc/cores/omxplayer/OMXPlayer.cpp b/xbmc/cores/omxplayer/OMXPlayer.cpp
index b053d4b67b..f6e3bd3e7e 100644
--- a/xbmc/cores/omxplayer/OMXPlayer.cpp
+++ b/xbmc/cores/omxplayer/OMXPlayer.cpp
@@ -81,6 +81,7 @@
#include "utils/URIUtils.h"
#include "GUIInfoManager.h"
#include "guilib/GUIWindowManager.h"
+#include "guilib/StereoscopicsManager.h"
#include "Application.h"
#include "ApplicationMessenger.h"
#include "DVDPerformanceCounter.h"
@@ -3181,6 +3182,9 @@ bool COMXPlayer::OpenVideoStream(int iStream, int source, bool reset)
if(pMenus && pMenus->IsInMenu())
hint.stills = true;
+ if (hint.stereo_mode.empty())
+ hint.stereo_mode = CStereoscopicsManager::Get().DetectStereoModeByString(m_filename);
+
if(m_CurrentVideo.id < 0
|| m_CurrentVideo.hint != hint)
{
@@ -3205,13 +3209,6 @@ bool COMXPlayer::OpenVideoStream(int iStream, int source, bool reset)
else if (reset)
m_omxPlayerVideo.SendMessage(new CDVDMsg(CDVDMsg::GENERAL_RESET));
- unsigned flags = 0;
- if(m_filename.find("3DSBS") != string::npos || m_filename.find("HSBS") != string::npos)
- flags = CONF_FLAGS_STEREO_MODE_SBS;
- else if(m_filename.find("3DTAB") != string::npos || m_filename.find("HTAB") != string::npos)
- flags = CONF_FLAGS_STEREO_MODE_TAB;
- m_omxPlayerVideo.SetFlags(flags);
-
/* store information about stream */
m_CurrentVideo.id = iStream;
m_CurrentVideo.source = source;
diff --git a/xbmc/guilib/StereoscopicsManager.cpp b/xbmc/guilib/StereoscopicsManager.cpp
index b451173280..3cb316cbfb 100644
--- a/xbmc/guilib/StereoscopicsManager.cpp
+++ b/xbmc/guilib/StereoscopicsManager.cpp
@@ -30,11 +30,13 @@
#include "guilib/LocalizeStrings.h"
#include "guilib/Key.h"
#include "guilib/GUIWindowManager.h"
+#include "settings/AdvancedSettings.h"
#include "settings/ISettingCallback.h"
#include "settings/Setting.h"
#include "settings/Settings.h"
#include "rendering/RenderSystem.h"
#include "utils/log.h"
+#include "utils/StringUtils.h"
#include "windowing/WindowingFactory.h"
@@ -84,6 +86,38 @@ RENDER_STEREO_MODE CStereoscopicsManager::GetNextSupportedStereoMode(const RENDE
return mode;
}
+std::string CStereoscopicsManager::DetectStereoModeByString(const std::string &needle)
+{
+ std::string stereoMode;
+ CStdString searchString(needle);
+ CStdStringArray tags;
+ StringUtils::ToUpper(searchString);
+
+ CStdString tag( g_advancedSettings.m_stereoscopicflags_sbs );
+ if (stereoMode.empty() && !tag.IsEmpty())
+ {
+ StringUtils::ToUpper(tag);
+ StringUtils::SplitString(tag, "|", tags);
+ if (StringUtils::ContainsKeyword(searchString, tags))
+ stereoMode = "left_right";
+ }
+
+ tag = g_advancedSettings.m_stereoscopicflags_tab;
+ if (stereoMode.empty() && !tag.IsEmpty())
+ {
+ StringUtils::ToUpper(tag);
+ StringUtils::SplitString(tag, "|", tags);
+ if (StringUtils::ContainsKeyword(searchString, tags))
+ stereoMode = "top_bottom";
+ }
+
+ if (stereoMode.empty())
+ stereoMode = "mono";
+
+ CLog::Log(LOGDEBUG, "StereoscopicsManager: Detected stereo mode in string '%s' is '%s'", needle.c_str(), stereoMode.c_str());
+ return stereoMode;
+}
+
CStdString CStereoscopicsManager::GetLabelForStereoMode(const RENDER_STEREO_MODE &mode)
{
return g_localizeStrings.Get(36502 + mode);
diff --git a/xbmc/guilib/StereoscopicsManager.h b/xbmc/guilib/StereoscopicsManager.h
index 507e0e0f60..07f9e10ea2 100644
--- a/xbmc/guilib/StereoscopicsManager.h
+++ b/xbmc/guilib/StereoscopicsManager.h
@@ -46,6 +46,7 @@ public:
void SetStereoMode(const RENDER_STEREO_MODE &mode);
RENDER_STEREO_MODE GetStereoMode(void);
RENDER_STEREO_MODE GetNextSupportedStereoMode(const RENDER_STEREO_MODE &currentMode, int step = 1);
+ std::string DetectStereoModeByString(const std::string &needle);
CStdString GetLabelForStereoMode(const RENDER_STEREO_MODE &mode);
virtual void OnSettingChanged(const CSetting *setting);
diff --git a/xbmc/settings/AdvancedSettings.cpp b/xbmc/settings/AdvancedSettings.cpp
index 8e053addf5..036da801e3 100644
--- a/xbmc/settings/AdvancedSettings.cpp
+++ b/xbmc/settings/AdvancedSettings.cpp
@@ -395,6 +395,9 @@ void CAdvancedSettings::Initialize()
// internal video extensions
m_videoExtensions += "|.pvr";
+ m_stereoscopicflags_sbs = "3DSBS|3D.SBS|HSBS|H.SBS|H-SBS| SBS |FULL-SBS|FULL.SBS|FULLSBS|FSBS";
+ m_stereoscopicflags_tab = "3DTAB|3D.TAB|HTAB|H.TAB|3DOU|3D.OU|3D.HOU| HOU | OU ";
+
m_logLevelHint = m_logLevel = LOG_LEVEL_NORMAL;
m_extraLogLevels = 0;
@@ -535,6 +538,8 @@ void CAdvancedSettings::ParseSettingsFile(const CStdString &file)
pElement = pRootElement->FirstChildElement("video");
if (pElement)
{
+ XMLUtils::GetString(pElement, "stereoscopicflagssbs", m_stereoscopicflags_sbs);
+ XMLUtils::GetString(pElement, "stereoscopicflagstab", m_stereoscopicflags_tab);
XMLUtils::GetFloat(pElement, "subsdelayrange", m_videoSubsDelayRange, 10, 600);
XMLUtils::GetFloat(pElement, "audiodelayrange", m_videoAudioDelayRange, 10, 600);
XMLUtils::GetInt(pElement, "blackbarcolour", m_videoBlackBarColour, 0, 255);
diff --git a/xbmc/settings/AdvancedSettings.h b/xbmc/settings/AdvancedSettings.h
index bc7c69aa14..224268a47b 100644
--- a/xbmc/settings/AdvancedSettings.h
+++ b/xbmc/settings/AdvancedSettings.h
@@ -395,6 +395,9 @@ class CAdvancedSettings : public ISettingCallback, public ISettingsHandler
CStdString m_videoExtensions;
CStdString m_discStubExtensions;
+ CStdString m_stereoscopicflags_sbs;
+ CStdString m_stereoscopicflags_tab;
+
CStdString m_logFolder;
CStdString m_userAgent;
diff --git a/xbmc/utils/StringUtils.cpp b/xbmc/utils/StringUtils.cpp
index aa5c01969e..686e543d56 100644
--- a/xbmc/utils/StringUtils.cpp
+++ b/xbmc/utils/StringUtils.cpp
@@ -712,6 +712,16 @@ int StringUtils::FindBestMatch(const CStdString &str, const CStdStringArray &str
return best;
}
+bool StringUtils::ContainsKeyword(const CStdString &str, const CStdStringArray &keywords)
+{
+ for (CStdStringArray::const_iterator it = keywords.begin(); it != keywords.end(); it++)
+ {
+ if (str.find(*it) != str.npos)
+ return true;
+ }
+ return false;
+}
+
size_t StringUtils::utf8_strlen(const char *s)
{
size_t length = 0;
diff --git a/xbmc/utils/StringUtils.h b/xbmc/utils/StringUtils.h
index 0cae3e3399..9bf6cf5918 100644
--- a/xbmc/utils/StringUtils.h
+++ b/xbmc/utils/StringUtils.h
@@ -115,6 +115,7 @@ public:
static bool ValidateUUID(const CStdString &uuid); // NB only validates syntax
static double CompareFuzzy(const CStdString &left, const CStdString &right);
static int FindBestMatch(const CStdString &str, const CStdStringArray &strings, double &matchscore);
+ static bool ContainsKeyword(const CStdString &str, const CStdStringArray &keywords);
/*! \brief Escapes the given string to be able to be used as a parameter.