dvd/omxplayer Subs couldn't be turned on if no relevant subs existed
authorJoakim Plate <elupus@ecce.se>
Sun, 9 Feb 2014 19:51:03 +0000 (20:51 +0100)
committerJoakim Plate <elupus@ecce.se>
Sun, 9 Feb 2014 19:51:03 +0000 (20:51 +0100)
Original patch by: ace20022

xbmc/cores/dvdplayer/DVDPlayer.cpp
xbmc/cores/dvdplayer/DVDPlayer.h
xbmc/cores/omxplayer/OMXPlayer.cpp
xbmc/cores/omxplayer/OMXPlayer.h

index 4f1f67e..1cf1da6 100644 (file)
@@ -231,17 +231,27 @@ private:
   bool original;
   bool preferextsubs;
   bool subson;
+  PredicateSubtitleFilter filter;
 public:
   PredicateSubtitlePriority(std::string& lang)
     : audiolang(lang),
       original(StringUtils::EqualsNoCase(CSettings::Get().GetString("locale.subtitlelanguage"), "original")),
       preferextsubs(CSettings::Get().GetBool("subtitles.preferexternal")),
-      subson(CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleOn)
+      subson(CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleOn),
+      filter(lang)
   {
   };
 
+  bool relevant(const SelectionStream& ss) const
+  {
+    return !filter(ss);
+  }
+
   bool operator()(const SelectionStream& lh, const SelectionStream& rh) const
   {
+    PREDICATE_RETURN(relevant(lh)
+                   , relevant(rh));
+
     PREDICATE_RETURN(lh.type_index == CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleStream
                    , rh.type_index == CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleStream);
 
@@ -810,31 +820,32 @@ void CDVDPlayer::OpenDefaultStreams(bool reset)
     CloseAudioStream(true);
 
   // enable  or disable subtitles
-  SetSubtitleVisibleInternal(CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleOn);
+  bool visible = CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleOn;
 
   // open subtitle stream
   SelectionStream as = m_SelectionStreams.Get(STREAM_AUDIO, GetAudioStream());
-  PredicateSubtitleFilter psf(as.language);
-  streams = m_SelectionStreams.RemoveIf(STREAM_SUBTITLE, psf);
   PredicateSubtitlePriority psp(as.language);
-  std::stable_sort(streams.begin(), streams.end(), psp);
+  streams = m_SelectionStreams.Get(STREAM_SUBTITLE, psp);
   valid   = false;
   for(SelectionStreams::iterator it = streams.begin(); it != streams.end() && !valid; ++it)
   {
     if(OpenSubtitleStream(it->id, it->source))
     {
       valid = true;
-      if(it->flags & CDemuxStream::FLAG_FORCED)
-        SetSubtitleVisibleInternal(true);
+      if(!psp.relevant(*it))
+        visible = false;
+      else if(it->flags & CDemuxStream::FLAG_FORCED)
+        visible = true;
     }
   }
   if(!valid)
   {
     CloseSubtitleStream(true);
-    if (m_pInputStream && !(m_pInputStream->IsStreamType(DVDSTREAM_TYPE_DVD) || m_pInputStream->IsStreamType(DVDSTREAM_TYPE_BLURAY)))
-      SetSubtitleVisibleInternal(false);
+    visible = false;
   }
 
+  SetSubtitleVisibleInternal(visible);
+
   // open teletext stream
   streams = m_SelectionStreams.Get(STREAM_TELETEXT);
   valid   = false;
index 79ecec4..e2a836b 100644 (file)
@@ -154,14 +154,6 @@ public:
     return streams;
   }
 
-  template<typename Filter>
-  SelectionStreams RemoveIf(StreamType type, Filter filter)
-  {
-    SelectionStreams streams = Get(type);
-    streams.erase(std::remove_if(streams.begin(), streams.end(), filter), streams.end());
-    return streams;
-  }
-
   void             Clear   (StreamType type, StreamSource source);
   int              Source  (StreamSource source, std::string filename);
 
index 25b0220..aa1bd76 100644 (file)
@@ -275,17 +275,27 @@ private:
   bool original;
   bool preferextsubs;
   bool subson;
+  PredicateSubtitleFilter filter;
 public:
   PredicateSubtitlePriority(std::string& lang)
     : audiolang(lang),
       original(StringUtils::EqualsNoCase(CSettings::Get().GetString("locale.subtitlelanguage"), "original")),
       preferextsubs(CSettings::Get().GetBool("subtitles.preferexternal")),
-      subson(CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleOn)
+      subson(CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleOn),
+      filter(lang)
   {
   };
 
+  bool relevant(const OMXSelectionStream& ss) const
+  {
+    return !filter(ss);
+  }
+
   bool operator()(const OMXSelectionStream& lh, const OMXSelectionStream& rh) const
   {
+    PREDICATE_RETURN(relevant(lh)
+                   , relevant(rh));
+
     PREDICATE_RETURN(lh.type_index == CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleStream
                    , rh.type_index == CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleStream);
 
@@ -866,31 +876,32 @@ void COMXPlayer::OpenDefaultStreams(bool reset)
     CloseAudioStream(true);
 
   // enable  or disable subtitles
-  SetSubtitleVisibleInternal(CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleOn);
+  bool visible = CMediaSettings::Get().GetCurrentVideoSettings().m_SubtitleOn;
 
   // open subtitle stream
   OMXSelectionStream as = m_SelectionStreams.Get(STREAM_AUDIO, GetAudioStream());
-  PredicateSubtitleFilter psf(as.language);
-  streams = m_SelectionStreams.RemoveIf(STREAM_SUBTITLE, psf);
   PredicateSubtitlePriority psp(as.language);
-  std::stable_sort(streams.begin(), streams.end(), psp);
+  streams = m_SelectionStreams.Get(STREAM_SUBTITLE, psp);
   valid   = false;
   for(OMXSelectionStreams::iterator it = streams.begin(); it != streams.end() && !valid; ++it)
   {
     if(OpenSubtitleStream(it->id, it->source))
     {
       valid = true;
-      if(it->flags & CDemuxStream::FLAG_FORCED)
-        SetSubtitleVisibleInternal(true);
+      if(!psp.relevant(*it))
+        visible = false;
+      else if(it->flags & CDemuxStream::FLAG_FORCED)
+        visible = true;
     }
   }
   if(!valid)
   {
     CloseSubtitleStream(true);
-    if (m_pInputStream && !(m_pInputStream->IsStreamType(DVDSTREAM_TYPE_DVD) || m_pInputStream->IsStreamType(DVDSTREAM_TYPE_BLURAY)))
-      SetSubtitleVisibleInternal(false);
+    visible = false;
   }
 
+  SetSubtitleVisibleInternal(visible);
+
   // open teletext stream
   streams = m_SelectionStreams.Get(STREAM_TELETEXT);
   valid   = false;
index 7c76da9..778aa12 100644 (file)
@@ -148,14 +148,6 @@ public:
     return streams;
   }
 
-  template<typename Filter>
-  OMXSelectionStreams RemoveIf(StreamType type, Filter filter)
-  {
-    OMXSelectionStreams streams = Get(type);
-    streams.erase(std::remove_if(streams.begin(), streams.end(), filter), streams.end());
-    return streams;
-  }
-
   void             Clear   (StreamType type, StreamSource source);
   int              Source  (StreamSource source, std::string filename);