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

Francois Cartegnie git at videolan.org
Wed Jul 22 16:17:37 CEST 2020


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

demux: mkv: extract block additional data

(cherry picked from commit 8fef0da38208be5f4056284e70f903604ae2dff2)

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

 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                     | 17 +++++++++++++----
 modules/demux/mkv/mkv.hpp                     |  1 +
 5 files changed, 37 insertions(+), 8 deletions(-)

diff --git a/modules/demux/mkv/matroska_segment.cpp b/modules/demux/mkv/matroska_segment.cpp
index b3d897a533..4b4c73e23c 100644
--- a/modules/demux/mkv/matroska_segment.cpp
+++ b/modules/demux/mkv/matroska_segment.cpp
@@ -1175,10 +1175,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;
@@ -1190,6 +1194,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;
@@ -1197,7 +1202,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
     };
 
@@ -1285,6 +1290,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 7c564d054f..8a7454a1cd 100644
--- a/modules/demux/mkv/matroska_segment.hpp
+++ b/modules/demux/mkv/matroska_segment.hpp
@@ -143,7 +143,8 @@ public:
 
     bool Seek( demux_t &, mtime_t i_mk_date, mtime_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 3f28ae2997..d22c60f444 100644
--- a/modules/demux/mkv/matroska_segment_seeker.cpp
+++ b/modules/demux/mkv/matroska_segment_seeker.cpp
@@ -352,13 +352,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;
 
         if( simpleblock ) {
diff --git a/modules/demux/mkv/mkv.cpp b/modules/demux/mkv/mkv.cpp
index 8b78c46065..647ec0ebac 100644
--- a/modules/demux/mkv/mkv.cpp
+++ b/modules/demux/mkv/mkv.cpp
@@ -487,7 +487,8 @@ static int Seek( demux_t *p_demux, mtime_t i_mk_date, double f_percent, virtual_
 
 /* Needed by matroska_segment::Seek() and Seek */
 void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock,
-                  mtime_t i_pts, mtime_t i_duration, bool b_key_picture,
+                  KaxBlockAdditions *additions,
+                  mtime_t i_pts, int64_t i_duration, bool b_key_picture,
                   bool b_discardable_picture )
 {
     demux_sys_t        *p_sys = p_demux->p_sys;
@@ -703,11 +704,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 )
         {
@@ -735,6 +738,7 @@ static int Demux( demux_t *p_demux)
         {
             msg_Err( p_demux, "invalid track number" );
             delete block;
+            delete additions;
             return 0;
         }
 
@@ -751,7 +755,8 @@ static int Demux( demux_t *p_demux)
             if ( track.i_skip_until_fpos > block_fpos )
             {
                 delete block;
-                return 1; // this block shall be ignored
+                delete additions;
+	        return 1; // this block shall be ignored
             }
         }
     }
@@ -784,6 +789,7 @@ static int Demux( demux_t *p_demux)
             {
                 msg_Err( p_demux, "ES_OUT_SET_PCR failed, aborting." );
                 delete block;
+                delete additions;
                 return 0;
             }
 
@@ -805,12 +811,15 @@ static int Demux( demux_t *p_demux)
     {
         /* nothing left to read in this ordered edition */
         delete block;
+        delete additions;
         return 0;
     }
 
-    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 1;
 }
diff --git a/modules/demux/mkv/mkv.hpp b/modules/demux/mkv/mkv.hpp
index 5b9fa4699c..38a62aa2af 100644
--- a/modules/demux/mkv/mkv.hpp
+++ b/modules/demux/mkv/mkv.hpp
@@ -121,6 +121,7 @@ enum
 using namespace LIBMATROSKA_NAMESPACE;
 
 void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock,
+                  KaxBlockAdditions *additions,
                   mtime_t i_pts, mtime_t i_duration, bool b_key_picture,
                   bool b_discardable_picture );
 



More information about the vlc-commits mailing list