aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik van Pienbroek <erik@vanpienbroek.nl>2013-11-20 18:08:35 +0100
committerErik van Pienbroek <erik@vanpienbroek.nl>2014-03-01 21:35:55 +0100
commit93c8f434576fb328d3ae7dc9d7d1dd6edaf26915 (patch)
tree03e2a96fa87bf22df6523028134c0d0e514a7da0
parent86a5608ba677e9c0d5bf1eaee45b2640666edefa (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.cpp45
-rw-r--r--xbmc/settings/AdvancedSettings.cpp10
-rw-r--r--xbmc/settings/AdvancedSettings.h5
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;