diff options
author | Franz Koch <franz.koch@elements-net.de> | 2013-06-05 22:57:01 +0200 |
---|---|---|
committer | Joakim Plate <elupus@ecce.se> | 2013-08-01 16:59:01 +0200 |
commit | 352862d1c2d612b930bbd2ea1b487b96878ad333 (patch) | |
tree | ac5a18d1a27924722af69f00c573b7bd3c214b67 | |
parent | 9642034433e34480aca36c42aa68610b9dcf789f (diff) |
[3D] move stereomode detection from filename to stereoscopicsmanager and make the flags configurable via advanced settings.
-rw-r--r-- | xbmc/cores/dvdplayer/DVDPlayer.cpp | 4 | ||||
-rw-r--r-- | xbmc/cores/omxplayer/OMXPlayer.cpp | 11 | ||||
-rw-r--r-- | xbmc/guilib/StereoscopicsManager.cpp | 34 | ||||
-rw-r--r-- | xbmc/guilib/StereoscopicsManager.h | 1 | ||||
-rw-r--r-- | xbmc/settings/AdvancedSettings.cpp | 5 | ||||
-rw-r--r-- | xbmc/settings/AdvancedSettings.h | 3 | ||||
-rw-r--r-- | xbmc/utils/StringUtils.cpp | 10 | ||||
-rw-r--r-- | xbmc/utils/StringUtils.h | 1 |
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 ¤tMode, 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. |