[vlc-commits] demux: mkv: extract block additional data

Francois Cartegnie git at videolan.org
Thu Jul 16 15:10:26 CEST 2020


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Thu Jul 16 09:52:12 2020 +0200| [8fef0da38208be5f4056284e70f903604ae2dff2] | committer: Francois Cartegnie

demux: mkv: extract block additional data

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=8fef0da38208be5f4056284e70f903604ae2dff2
---

 modules/demux/mkv/matroska_segment.cpp        | 20 ++++++++++++++++++--
 modules/demux/mkv/matroska_segment.hpp        |  3 ++-
 modules/demux/mkv/matroska_segment_seeker.cpp |  4 +++-
 modules/demux/mkv/mkv.cpp                     | 13 +++++++++++--
 modules/demux/mkv/mkv.hpp                     |  1 +
 5 files changed, 35 insertions(+), 6 deletions(-)

diff --git a/modules/demux/mkv/matroska_segment.cpp b/modules/demux/mkv/matroska_segment.cpp
index 3ec9d55e04..8fba12df9c 100644
--- a/modules/demux/mkv/matroska_segment.cpp
+++ b/modules/demux/mkv/matroska_segment.cpp
@@ -1172,10 +1172,14 @@ void matroska_segment_c::ESDestroy( )
     }
 }
 
-int matroska_segment_c::BlockGet( KaxBlock * & pp_block, KaxSimpleBlock * & pp_simpleblock, bool *pb_key_picture, bool *pb_discardable_picture, int64_t *pi_duration )
+int matroska_segment_c::BlockGet( KaxBlock * & pp_block, KaxSimpleBlock * & pp_simpleblock,
+                                  KaxBlockAdditions * & pp_additions,
+                                  bool *pb_key_picture, bool *pb_discardable_picture,
+                                  int64_t *pi_duration )
 {
     pp_simpleblock = NULL;
     pp_block = NULL;
+    pp_additions = NULL;
 
     *pb_key_picture         = true;
     *pb_discardable_picture = false;
@@ -1187,6 +1191,7 @@ int matroska_segment_c::BlockGet( KaxBlock * & pp_block, KaxSimpleBlock * & pp_s
         demux_t            * const p_demuxer;
         KaxBlock          *& block;
         KaxSimpleBlock    *& simpleblock;
+        KaxBlockAdditions *& additions;
 
         int64_t            & i_duration;
         bool               & b_key_picture;
@@ -1194,7 +1199,7 @@ int matroska_segment_c::BlockGet( KaxBlock * & pp_block, KaxSimpleBlock * & pp_s
         bool                 b_cluster_timecode;
 
     } payload = {
-        this, &ep, &sys.demuxer, pp_block, pp_simpleblock,
+        this, &ep, &sys.demuxer, pp_block, pp_simpleblock, pp_additions,
         *pi_duration, *pb_key_picture, *pb_discardable_picture, true
     };
 
@@ -1282,6 +1287,17 @@ int matroska_segment_c::BlockGet( KaxBlock * & pp_block, KaxSimpleBlock * & pp_s
 
             vars.ep->Keep ();
         }
+        E_CASE( KaxBlockAdditions, kadditions )
+        {
+            EbmlElement *el;
+            int i_upper_level = 0;
+            try
+            {
+                kadditions.Read( vars.obj->es, EBML_CONTEXT(&kadditions), i_upper_level, el, false );
+                vars.additions = &kadditions;
+                vars.ep->Keep ();
+            } catch (...) {}
+        }
         E_CASE( KaxBlockDuration, kduration )
         {
             kduration.ReadData( vars.obj->es.I_O() );
diff --git a/modules/demux/mkv/matroska_segment.hpp b/modules/demux/mkv/matroska_segment.hpp
index 2879a7622f..a844b66cf4 100644
--- a/modules/demux/mkv/matroska_segment.hpp
+++ b/modules/demux/mkv/matroska_segment.hpp
@@ -145,7 +145,8 @@ public:
 
     bool Seek( demux_t &, vlc_tick_t i_mk_date, vlc_tick_t i_mk_time_offset, bool b_accurate );
 
-    int BlockGet( KaxBlock * &, KaxSimpleBlock * &, bool *, bool *, int64_t *);
+    int BlockGet( KaxBlock * &, KaxSimpleBlock * &, KaxBlockAdditions * &,
+                  bool *, bool *, int64_t *);
 
     mkv_track_t * FindTrackByBlock(const KaxBlock *, const KaxSimpleBlock * );
 
diff --git a/modules/demux/mkv/matroska_segment_seeker.cpp b/modules/demux/mkv/matroska_segment_seeker.cpp
index 8498e0163e..217f513887 100644
--- a/modules/demux/mkv/matroska_segment_seeker.cpp
+++ b/modules/demux/mkv/matroska_segment_seeker.cpp
@@ -349,13 +349,15 @@ SegmentSeeker::index_unsearched_range( matroska_segment_c& ms, Range search_area
     {
         KaxBlock * block;
         KaxSimpleBlock * simpleblock;
+        KaxBlockAdditions *additions;
 
         bool     b_key_picture;
         bool     b_discardable_picture;
         int64_t  i_block_duration;
         track_id_t track_id;
 
-        if( ms.BlockGet( block, simpleblock, &b_key_picture, &b_discardable_picture, &i_block_duration ) )
+        if( ms.BlockGet( block, simpleblock, additions,
+                         &b_key_picture, &b_discardable_picture, &i_block_duration ) )
             break;
 
         KaxInternalBlock& internal_block = simpleblock
diff --git a/modules/demux/mkv/mkv.cpp b/modules/demux/mkv/mkv.cpp
index 6f71936e22..4de13671b6 100644
--- a/modules/demux/mkv/mkv.cpp
+++ b/modules/demux/mkv/mkv.cpp
@@ -515,6 +515,7 @@ static int Seek( demux_t *p_demux, vlc_tick_t i_mk_date, double f_percent, virtu
 
 /* Needed by matroska_segment::Seek() and Seek */
 void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock,
+                  KaxBlockAdditions *additions,
                   vlc_tick_t i_pts, int64_t i_duration, bool b_key_picture,
                   bool b_discardable_picture )
 {
@@ -733,11 +734,13 @@ static int Demux( demux_t *p_demux)
 
     KaxBlock *block;
     KaxSimpleBlock *simpleblock;
+    KaxBlockAdditions *additions;
     int64_t i_block_duration = 0;
     bool b_key_picture;
     bool b_discardable_picture;
 
-    if( p_segment->BlockGet( block, simpleblock, &b_key_picture, &b_discardable_picture, &i_block_duration ) )
+    if( p_segment->BlockGet( block, simpleblock, additions,
+                             &b_key_picture, &b_discardable_picture, &i_block_duration ) )
     {
         if ( p_vsegment->CurrentEdition() && p_vsegment->CurrentEdition()->b_ordered )
         {
@@ -769,6 +772,7 @@ static int Demux( demux_t *p_demux)
         {
             msg_Err( p_demux, "invalid track number" );
             delete block;
+            delete additions;
             return VLC_DEMUXER_EGENERIC;
         }
 
@@ -782,6 +786,7 @@ static int Demux( demux_t *p_demux)
             if ( track.i_skip_until_fpos > block_fpos )
             {
                 delete block;
+                delete additions;
                 return VLC_DEMUXER_SUCCESS; // this block shall be ignored
             }
         }
@@ -815,6 +820,7 @@ static int Demux( demux_t *p_demux)
             {
                 msg_Err( p_demux, "ES_OUT_SET_PCR failed, aborting." );
                 delete block;
+                delete additions;
                 return VLC_DEMUXER_EGENERIC;
             }
 
@@ -834,12 +840,15 @@ static int Demux( demux_t *p_demux)
     {
         /* nothing left to read in this ordered edition */
         delete block;
+        delete additions;
         return VLC_DEMUXER_EOF;
     }
 
-    BlockDecode( p_demux, block, simpleblock, p_sys->i_pts, i_block_duration, b_key_picture, b_discardable_picture );
+    BlockDecode( p_demux, block, simpleblock, additions,
+                 p_sys->i_pts, i_block_duration, b_key_picture, b_discardable_picture );
 
     delete block;
+    delete additions;
 
     return VLC_DEMUXER_SUCCESS;
 }
diff --git a/modules/demux/mkv/mkv.hpp b/modules/demux/mkv/mkv.hpp
index a061254228..924d460b23 100644
--- a/modules/demux/mkv/mkv.hpp
+++ b/modules/demux/mkv/mkv.hpp
@@ -120,6 +120,7 @@ enum
 using namespace LIBMATROSKA_NAMESPACE;
 
 void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock,
+                  KaxBlockAdditions *additions,
                   vlc_tick_t i_pts, vlc_tick_t i_duration, bool b_key_picture,
                   bool b_discardable_picture );
 



More information about the vlc-commits mailing list