[vlc-devel] [PATCH 05/11] mkv: store priority tracks

Filip Roséen filip at videolabs.io
Sat May 21 02:17:57 CEST 2016


When seeking, we should prioritize tracks depending on what type of ES
they are; this patch addes a data-member to matroska_segment_c that will
keep track of which tracks are more important than other.

It also adds logic to ParseTracks that will initialize this data-member
with the appropriate track-ids.
---
 modules/demux/mkv/matroska_segment.hpp       |  1 +
 modules/demux/mkv/matroska_segment_parse.cpp | 30 ++++++++++++++++++++++++++++
 2 files changed, 31 insertions(+)

diff --git a/modules/demux/mkv/matroska_segment.hpp b/modules/demux/mkv/matroska_segment.hpp
index c39c275..0aa01be 100644
--- a/modules/demux/mkv/matroska_segment.hpp
+++ b/modules/demux/mkv/matroska_segment.hpp
@@ -93,6 +93,7 @@ public:
 
     /* all tracks */
     tracks_map_t tracks;
+    std::vector<mkv_track_t::track_id_t> priority_tracks;
 
     /* from seekhead */
     int                     i_seekhead_count;
diff --git a/modules/demux/mkv/matroska_segment_parse.cpp b/modules/demux/mkv/matroska_segment_parse.cpp
index 413bd16..affb934 100644
--- a/modules/demux/mkv/matroska_segment_parse.cpp
+++ b/modules/demux/mkv/matroska_segment_parse.cpp
@@ -712,6 +712,36 @@ void matroska_segment_c::ParseTracks( KaxTracks *tracks )
 
     TrackHandlers::Dispatcher().iterate(
       tracks->begin(), tracks->end(), TrackHandlers::Payload( payload ) );
+
+    // find track(s) with highest priority //
+    {
+        int   score = -1;
+        int es_type = -1;
+
+        for( tracks_map_t::const_iterator it = this->tracks.begin(); it != this->tracks.end(); ++it )
+        {
+            int track_score = -1;
+
+            switch( it->second.fmt.i_cat )
+            {
+                case VIDEO_ES: ++track_score;
+                case AUDIO_ES: ++track_score;
+                case   SPU_ES: ++track_score;
+                default:
+                  if( score < track_score )
+                  {
+                      es_type = it->second.fmt.i_cat;
+                      score   = track_score;
+                  }
+            }
+        }
+
+        for( tracks_map_t::const_iterator it = this->tracks.begin(); it != this->tracks.end(); ++it )
+        {
+            if( it->second.fmt.i_cat == es_type )
+                priority_tracks.push_back( it->first );
+        }
+    }
 }
 
 /*****************************************************************************
-- 
2.8.2



More information about the vlc-devel mailing list