[vlc-devel] [PATCH 3/9] demux: mkv: simplify block handling

Filip Roséen filip at atch.se
Mon Jul 16 05:19:51 CEST 2018


As KaxSimpleBlock and KaxBlock inherit from the same base we can get
rid of all these nasty if-else's by creating an object that refers to
the one we are interested in.
---
 modules/demux/mkv/matroska_segment_seeker.cpp | 17 ++++----
 modules/demux/mkv/mkv.cpp                     | 39 +++++++------------
 2 files changed, 21 insertions(+), 35 deletions(-)

diff --git a/modules/demux/mkv/matroska_segment_seeker.cpp b/modules/demux/mkv/matroska_segment_seeker.cpp
index a4c5daec29..2c17b60328 100644
--- a/modules/demux/mkv/matroska_segment_seeker.cpp
+++ b/modules/demux/mkv/matroska_segment_seeker.cpp
@@ -359,16 +359,13 @@ SegmentSeeker::index_unsearched_range( matroska_segment_c& ms, Range search_area
         if( ms.BlockGet( block, simpleblock, &b_key_picture, &b_discardable_picture, &i_block_duration ) )
             break;
 
-        if( simpleblock ) {
-            block_pos = simpleblock->GetElementPosition();
-            block_pts = simpleblock->GlobalTimecode() / 1000;
-            track_id  = simpleblock->TrackNum();
-        }
-        else {
-            block_pos = block->GetElementPosition();
-            block_pts = block->GlobalTimecode() / 1000;
-            track_id  = block->TrackNum();
-        }
+        KaxInternalBlock& internal_block = simpleblock
+            ? static_cast<KaxInternalBlock&>( *simpleblock )
+            : static_cast<KaxInternalBlock&>( *block );
+
+        block_pos = internal_block.GetElementPosition();
+        block_pts = internal_block.GlobalTimecode() / 1000;
+        track_id  = internal_block.TrackNum();
 
         bool const b_valid_track = ms.FindTrackByBlock( block, simpleblock ) != NULL;
 
diff --git a/modules/demux/mkv/mkv.cpp b/modules/demux/mkv/mkv.cpp
index 407bc50013..220a061e57 100644
--- a/modules/demux/mkv/mkv.cpp
+++ b/modules/demux/mkv/mkv.cpp
@@ -517,6 +517,10 @@ void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock
     demux_sys_t *p_sys = (demux_sys_t *)p_demux->p_sys;
     matroska_segment_c *p_segment = p_sys->p_current_vsegment->CurrentSegment();
 
+    KaxInternalBlock& internal_block = simpleblock
+        ? static_cast<KaxInternalBlock&>( *simpleblock )
+        : static_cast<KaxInternalBlock&>( *block );
+
     if( !p_segment ) return;
 
     mkv_track_t *p_track = p_segment->FindTrackByBlock( block, simpleblock );
@@ -550,28 +554,14 @@ void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock
     }
 
     size_t frame_size = 0;
-    size_t block_size = 0;
-
-    if( simpleblock != NULL )
-        block_size = simpleblock->GetSize();
-    else
-        block_size = block->GetSize();
-
-    const unsigned int i_number_frames = block != NULL ? block->NumberFrames() :
-            ( simpleblock != NULL ? simpleblock->NumberFrames() : 0 );
+    size_t block_size = internal_block.GetSize();
+    const unsigned i_number_frames = internal_block.NumberFrames();
 
     for( unsigned int i_frame = 0; i_frame < i_number_frames; i_frame++ )
     {
         block_t *p_block;
-        DataBuffer *data;
-        if( simpleblock != NULL )
-        {
-            data = &simpleblock->GetBuffer(i_frame);
-        }
-        else
-        {
-            data = &block->GetBuffer(i_frame);
-        }
+        DataBuffer *data = &internal_block.GetBuffer(i_frame);
+
         frame_size += data->Size();
         if( !data->Buffer() || data->Size() > frame_size || frame_size > block_size  )
         {
@@ -746,6 +736,10 @@ static int Demux( demux_t *p_demux)
         return VLC_DEMUXER_EOF;
     }
 
+    KaxInternalBlock& internal_block = block
+        ? static_cast<KaxInternalBlock&>( *block )
+        : static_cast<KaxInternalBlock&>( *simpleblock );
+
     {
         mkv_track_t *p_track = p_segment->FindTrackByBlock( block, simpleblock );
 
@@ -761,10 +755,7 @@ static int Demux( demux_t *p_demux)
 
         if( track.i_skip_until_fpos != std::numeric_limits<uint64_t>::max() ) {
 
-            uint64_t block_fpos = 0;
-
-            if( block ) block_fpos = block->GetElementPosition();
-            else        block_fpos = simpleblock->GetElementPosition();
+            uint64_t block_fpos = internal_block.GetElementPosition();
 
             if ( track.i_skip_until_fpos > block_fpos )
             {
@@ -811,9 +802,7 @@ static int Demux( demux_t *p_demux)
     /* set pts */
     {
         p_sys->i_pts = p_sys->i_mk_chapter_time + VLC_TICK_0;
-
-        if( simpleblock != NULL ) p_sys->i_pts += simpleblock->GlobalTimecode() / INT64_C( 1000 );
-        else                      p_sys->i_pts +=       block->GlobalTimecode() / INT64_C( 1000 );
+        p_sys->i_pts += internal_block.GlobalTimecode() / INT64_C( 1000 );
     }
 
     if ( p_vsegment->CurrentEdition() &&
-- 
2.18.0



More information about the vlc-devel mailing list