Merge pull request #3688 from epienbroek/3d_sbs
authorjmarshallnz <jcmarsha@gmail.com>
Sat, 1 Mar 2014 23:03:15 +0000 (12:03 +1300)
committerjmarshallnz <jcmarsha@gmail.com>
Sat, 1 Mar 2014 23:03:15 +0000 (12:03 +1300)
Reduce the amount of false positives while detecting stereo mode

xbmc/guilib/StereoscopicsManager.cpp
xbmc/settings/AdvancedSettings.cpp
xbmc/settings/AdvancedSettings.h

index cb5e3fd..70bb4cd 100644 (file)
@@ -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;
 }
index e21d21e..eff43dd 100644 (file)
@@ -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);
index 1e54c93..3995f35 100644 (file)
@@ -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;