[vlc-devel] [PATCH 2/2] demux: mkv: self discard prerolled discardable content

Francois Cartegnie fcvlcdev at free.fr
Thu Aug 4 12:02:26 CEST 2016


---
 modules/demux/mkv/mkv.cpp  |  3 ++-
 modules/demux/mkv/util.cpp | 21 ++++++++++++++-------
 modules/demux/mkv/util.hpp |  3 ++-
 3 files changed, 18 insertions(+), 9 deletions(-)

diff --git a/modules/demux/mkv/mkv.cpp b/modules/demux/mkv/mkv.cpp
index 0c90e4b..a0f71be 100644
--- a/modules/demux/mkv/mkv.cpp
+++ b/modules/demux/mkv/mkv.cpp
@@ -680,7 +680,8 @@ void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock
         if( p_block->i_dts < p_sys->i_start_pts )
             p_block->i_flags |= BLOCK_FLAG_PREROLL;
 
-        send_Block( p_demux, &track, p_block, i_number_frames, i_duration );
+        send_Block( p_demux, &track, p_block,
+                    i_number_frames, i_duration, b_discardable_picture );
 
         /* use time stamp only for first block */
         i_pts = ( track.i_default_duration )?
diff --git a/modules/demux/mkv/util.cpp b/modules/demux/mkv/util.cpp
index 1740db6..72885a6 100644
--- a/modules/demux/mkv/util.cpp
+++ b/modules/demux/mkv/util.cpp
@@ -245,11 +245,24 @@ void handle_real_audio(demux_t * p_demux, mkv_track_t * p_tk, block_t * p_blk, m
     }
 }
 
-void send_Block( demux_t * p_demux, mkv_track_t * p_tk, block_t * p_block, unsigned int i_number_frames, mtime_t i_duration )
+void send_Block( demux_t * p_demux, mkv_track_t * p_tk, block_t * p_block,
+                 unsigned int i_number_frames, mtime_t i_duration, bool b_discardable )
 {
     demux_sys_t        *p_sys = p_demux->p_sys;
     matroska_segment_c *p_segment = p_sys->p_current_vsegment->CurrentSegment();
 
+    if( p_block->i_dts > VLC_TS_INVALID &&
+        ( p_tk->fmt.i_cat == VIDEO_ES || p_tk->fmt.i_cat == AUDIO_ES ) )
+    {
+        p_tk->i_last_dts = p_block->i_dts;
+    }
+
+    if( b_discardable && (p_block->i_flags & BLOCK_FLAG_PREROLL) )
+    {
+        block_Release(p_block);
+        return;
+    }
+
     if( p_tk->fmt.i_cat == AUDIO_ES && p_tk->i_chans_to_reorder )
     {
         aout_ChannelReorder( p_block->p_buffer, p_block->i_buffer,
@@ -257,12 +270,6 @@ void send_Block( demux_t * p_demux, mkv_track_t * p_tk, block_t * p_block, unsig
                              p_tk->pi_chan_table, p_tk->fmt.i_codec );
     }
 
-    if( p_block->i_dts > VLC_TS_INVALID &&
-        ( p_tk->fmt.i_cat == VIDEO_ES || p_tk->fmt.i_cat == AUDIO_ES ) )
-    {
-        p_tk->i_last_dts = p_block->i_dts;
-    }
-
     if( !p_tk->b_no_duration )
     {
         p_block->i_length = i_duration * p_tk->f_timecodescale *
diff --git a/modules/demux/mkv/util.hpp b/modules/demux/mkv/util.hpp
index 5867d1d..d83289c 100644
--- a/modules/demux/mkv/util.hpp
+++ b/modules/demux/mkv/util.hpp
@@ -32,7 +32,8 @@ block_t *block_zlib_decompress( vlc_object_t *p_this, block_t *p_in_block );
 
 block_t *MemToBlock( uint8_t *p_mem, size_t i_mem, size_t offset);
 void handle_real_audio(demux_t * p_demux, mkv_track_t * p_tk, block_t * p_blk, mtime_t i_pts);
-void send_Block( demux_t * p_demux, mkv_track_t * p_tk, block_t * p_block, unsigned int i_number_frames, mtime_t i_duration );
+void send_Block( demux_t * p_demux, mkv_track_t * p_tk, block_t * p_block,
+                 unsigned int i_number_frames, mtime_t i_duration, bool b_discard = false );
 
 
 struct real_audio_private
-- 
2.7.4



More information about the vlc-devel mailing list