diff options
author | Erik van Pienbroek <erik@vanpienbroek.nl> | 2013-11-20 18:08:35 +0100 |
---|---|---|
committer | Erik van Pienbroek <erik@vanpienbroek.nl> | 2014-03-01 21:35:55 +0100 |
commit | 93c8f434576fb328d3ae7dc9d7d1dd6edaf26915 (patch) | |
tree | 03e2a96fa87bf22df6523028134c0d0e514a7da0 | |
parent | 86a5608ba677e9c0d5bf1eaee45b2640666edefa (diff) |
Reduce the amount of false positives while detecting stereo mode
Initially the CStereoscopicsManager::DetectStereoModeByString
function considered file names containing strings like " SBS "
to be 3D content. However, it turned out this also caused false
positives, for example when opening PVR recordings from the
Dutch TV channel "SBS 6".
Reduced the amount of false positives by also searching for
the keyword "3D" in the file name before considering a file
to be 3D content and by using regular expressions
-rw-r--r-- | xbmc/guilib/StereoscopicsManager.cpp | 45 | ||||
-rw-r--r-- | xbmc/settings/AdvancedSettings.cpp | 10 | ||||
-rw-r--r-- | xbmc/settings/AdvancedSettings.h | 5 |
3 files changed, 35 insertions, 25 deletions
diff --git a/xbmc/guilib/StereoscopicsManager.cpp b/xbmc/guilib/StereoscopicsManager.cpp index cb5e3fdeb1..70bb4cdbb5 100644 --- a/xbmc/guilib/StereoscopicsManager.cpp +++ b/xbmc/guilib/StereoscopicsManager.cpp @@ -42,6 +42,7 @@ #include "settings/Settings.h" #include "rendering/RenderSystem.h" #include "utils/log.h" +#include "utils/RegExp.h" #include "utils/StringUtils.h" #include "URL.h" #include "windowing/WindowingFactory.h" @@ -145,33 +146,39 @@ RENDER_STEREO_MODE CStereoscopicsManager::GetNextSupportedStereoMode(const RENDE std::string CStereoscopicsManager::DetectStereoModeByString(const std::string &needle) { - std::string stereoMode; + std::string stereoMode = "mono"; CStdString searchString(needle); - CStdStringArray tags; - StringUtils::ToUpper(searchString); + CRegExp re(true); - CStdString tag( g_advancedSettings.m_stereoscopicflags_sbs ); - if (stereoMode.empty() && !tag.empty()) + if (!re.RegComp(g_advancedSettings.m_stereoscopicregex_3d.c_str())) { - StringUtils::ToUpper(tag); - StringUtils::SplitString(tag, "|", tags); - if (StringUtils::ContainsKeyword(searchString, tags)) - stereoMode = "left_right"; + CLog::Log(LOGERROR, "%s: Invalid RegExp for matching 3d content:'%s'", __FUNCTION__, g_advancedSettings.m_stereoscopicregex_3d.c_str()); + return stereoMode; } - tag = g_advancedSettings.m_stereoscopicflags_tab; - if (stereoMode.empty() && !tag.empty()) + if (re.RegFind(searchString) == -1) + return stereoMode; // no match found for 3d content, assume mono mode + + if (!re.RegComp(g_advancedSettings.m_stereoscopicregex_sbs.c_str())) { - StringUtils::ToUpper(tag); - StringUtils::SplitString(tag, "|", tags); - if (StringUtils::ContainsKeyword(searchString, tags)) - stereoMode = "top_bottom"; + CLog::Log(LOGERROR, "%s: Invalid RegExp for matching 3d SBS content:'%s'", __FUNCTION__, g_advancedSettings.m_stereoscopicregex_sbs.c_str()); + return stereoMode; } - if (stereoMode.empty()) - stereoMode = "mono"; - else - CLog::Log(LOGDEBUG, "StereoscopicsManager: Detected stereo mode in string '%s' is '%s'", CURL::GetRedacted(needle).c_str(), stereoMode.c_str()); + if (re.RegFind(searchString) > -1) + { + stereoMode = "left_right"; + return stereoMode; + } + + if (!re.RegComp(g_advancedSettings.m_stereoscopicregex_tab.c_str())) + { + CLog::Log(LOGERROR, "%s: Invalid RegExp for matching 3d TAB content:'%s'", __FUNCTION__, g_advancedSettings.m_stereoscopicregex_tab.c_str()); + return stereoMode; + } + + if (re.RegFind(searchString) > -1) + stereoMode = "top_bottom"; return stereoMode; } diff --git a/xbmc/settings/AdvancedSettings.cpp b/xbmc/settings/AdvancedSettings.cpp index e21d21e3b9..eff43dd384 100644 --- a/xbmc/settings/AdvancedSettings.cpp +++ b/xbmc/settings/AdvancedSettings.cpp @@ -401,8 +401,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|HALF-SBS"; - m_stereoscopicflags_tab = "3DTAB|3D.TAB|HTAB|H.TAB|3DOU|3D.OU|3D.HOU| HOU | OU |HALF-TAB"; + m_stereoscopicregex_3d = "[-. _]3d[-. _]"; + m_stereoscopicregex_sbs = "[-. _]h?sbs[-. _]"; + m_stereoscopicregex_tab = "[-. _]h?tab[-. _]"; m_logLevelHint = m_logLevel = LOG_LEVEL_NORMAL; m_extraLogLevels = 0; @@ -544,8 +545,9 @@ 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::GetString(pElement, "stereoscopicregex3d", m_stereoscopicregex_3d); + XMLUtils::GetString(pElement, "stereoscopicregexsbs", m_stereoscopicregex_sbs); + XMLUtils::GetString(pElement, "stereoscopicregextab", m_stereoscopicregex_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 1e54c939a1..3995f35279 100644 --- a/xbmc/settings/AdvancedSettings.h +++ b/xbmc/settings/AdvancedSettings.h @@ -400,8 +400,9 @@ class CAdvancedSettings : public ISettingCallback, public ISettingsHandler CStdString m_discStubExtensions; CStdString m_subtitlesExtensions; - CStdString m_stereoscopicflags_sbs; - CStdString m_stereoscopicflags_tab; + CStdString m_stereoscopicregex_3d; + CStdString m_stereoscopicregex_sbs; + CStdString m_stereoscopicregex_tab; CStdString m_logFolder; |