[vlc-devel] [PATCH] MKV: factorize the es_out_Send() and es_out_Control() calls

Jean-Baptiste Kempf jb at videolan.org
Fri Mar 20 16:11:58 CET 2015


APplied.

On 19 Mar, Steve Lhomme wrote :
> ---
>  modules/demux/mkv/mkv.cpp  | 51 ++--------------------------------------
>  modules/demux/mkv/util.cpp | 58 +++++++++++++++++++++++++++++++++++++++++++++-
>  modules/demux/mkv/util.hpp |  1 +
>  3 files changed, 60 insertions(+), 50 deletions(-)
> 
> diff --git a/modules/demux/mkv/mkv.cpp b/modules/demux/mkv/mkv.cpp
> index df5c7f1..154aa75 100644
> --- a/modules/demux/mkv/mkv.cpp
> +++ b/modules/demux/mkv/mkv.cpp
> @@ -532,7 +532,7 @@ void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock
>  
>          msg_Dbg( p_demux, "sending header (%d bytes)", tk->i_data_init );
>          p_init = MemToBlock( tk->p_data_init, tk->i_data_init, 0 );
> -        if( p_init ) es_out_Send( p_demux->out, tk->p_es, p_init );
> +        if( p_init ) send_Block( p_demux, tk, p_init, 1, 0 );
>      }
>      tk->b_inited = true;
>  
> @@ -645,14 +645,6 @@ void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock
>                  block_Release( p_block );
>                  return;
>              }
> -            else if( tk->fmt.i_cat == AUDIO_ES )
> -            {
> -                if( tk->i_chans_to_reorder )
> -                    aout_ChannelReorder( p_block->p_buffer, p_block->i_buffer,
> -                                         tk->fmt.audio.i_channels,
> -                                         tk->pi_chan_table, tk->fmt.i_codec );
> -
> -            }
>              p_block->i_dts = p_block->i_pts = i_pts;
>          }
>          else
> @@ -680,47 +672,8 @@ void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock
>                      p_block->i_dts = min( i_pts, tk->i_last_dts + ( mtime_t )tk->i_default_duration );
>              }
>          }
> -        if( p_block->i_dts > VLC_TS_INVALID &&
> -            ( tk->fmt.i_cat == VIDEO_ES || tk->fmt.i_cat == AUDIO_ES ) )
> -        {
> -            tk->i_last_dts = p_block->i_dts;
> -        }
> -
> -#if 0
> -msg_Dbg( p_demux, "block (track=%d) i_dts: %"PRId64" / i_pts: %"PRId64, tk->i_number, p_block->i_dts, p_block->i_pts);
> -#endif
> -        if( !tk->b_no_duration )
> -        {
> -            p_block->i_length = i_duration * tk-> f_timecodescale *
> -                (double) p_segment->i_timescale / ( 1000.0 * i_number_frames );
> -        }
> -
> -        // find the latest DTS for an active track
> -        mtime_t i_ts_max = INT64_MIN;
> -        for( size_t i = 0; i < p_segment->tracks.size(); i++ )
> -        {
> -            mkv_track_t *tk = p_segment->tracks[i];
> -            if( tk->i_last_dts > VLC_TS_INVALID )
> -                i_ts_max = __MAX( i_ts_max, tk->i_last_dts );
> -        }
> -
> -        // find the earliest DTS less than 10 clock ticks away from the latest DTS
> -        mtime_t i_ts_min = INT64_MAX;
> -        for( size_t i = 0; i < p_segment->tracks.size(); i++ )
> -        {
> -            mkv_track_t *tk = p_segment->tracks[i];
> -            if( tk->i_last_dts > VLC_TS_INVALID && tk->i_last_dts + 10 * CLOCK_FREQ >= i_ts_max )
> -                i_ts_min = __MIN( i_ts_min, tk->i_last_dts );
> -        }
> -
> -        // the PCR is the earliest active DTS if we found one
> -        if( i_ts_min != INT64_MAX && ( i_ts_min > p_sys->i_pcr || p_sys->i_pcr == VLC_TS_INVALID ) )
> -        {
> -            p_sys->i_pcr = i_ts_min;
> -            es_out_Control( p_demux->out, ES_OUT_SET_PCR, i_ts_min );
> -        }
>  
> -        es_out_Send( p_demux->out, tk->p_es, p_block );
> +        send_Block( p_demux, tk, p_block, i_number_frames, i_duration );
>  
>          /* use time stamp only for first block */
>          i_pts = ( tk->i_default_duration )?
> diff --git a/modules/demux/mkv/util.cpp b/modules/demux/mkv/util.cpp
> index 7a0cfcd..8b0f80a 100644
> --- a/modules/demux/mkv/util.cpp
> +++ b/modules/demux/mkv/util.cpp
> @@ -236,13 +236,69 @@ void handle_real_audio(demux_t * p_demux, mkv_track_t * p_tk, block_t * p_blk, m
>      {
>          for( size_t i = 0; i < p_sys->i_subpackets; i++)
>          {
> -            es_out_Send( p_demux->out, p_tk->p_es,  p_sys->p_subpackets[i]);
> +            send_Block( p_demux, p_tk, p_sys->p_subpackets[i], 1, 0 );
>              p_sys->p_subpackets[i] = NULL;
>          }
>          p_sys->i_subpacket = 0;
>      }
>  }
>  
> +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 )
> +{
> +    demux_sys_t        *p_sys = p_demux->p_sys;
> +    matroska_segment_c *p_segment = p_sys->p_current_segment->CurrentSegment();
> +
> +    if( p_tk->fmt.i_cat == AUDIO_ES && p_tk->i_chans_to_reorder )
> +    {
> +        aout_ChannelReorder( p_block->p_buffer, p_block->i_buffer,
> +                             p_tk->fmt.audio.i_channels,
> +                             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 *
> +            (double) p_segment->i_timescale / ( 1000.0 * i_number_frames );
> +    }
> +
> +    // find the latest DTS for an active track
> +    mtime_t i_ts_max = INT64_MIN;
> +    for( size_t j = 0; j < p_segment->tracks.size(); j++ )
> +    {
> +        mkv_track_t *tk = p_segment->tracks[j];
> +        if( tk->i_last_dts > VLC_TS_INVALID )
> +            i_ts_max = __MAX( i_ts_max, tk->i_last_dts );
> +    }
> +
> +    // find the earliest DTS less than 10 clock ticks away from the latest DTS
> +    mtime_t i_ts_min = INT64_MAX;
> +    for( size_t j = 0; j < p_segment->tracks.size(); j++ )
> +    {
> +        mkv_track_t *tk = p_segment->tracks[j];
> +        if( tk->i_last_dts > VLC_TS_INVALID && tk->i_last_dts + 10 * CLOCK_FREQ >= i_ts_max )
> +            i_ts_min = __MIN( i_ts_min, tk->i_last_dts );
> +    }
> +
> +    // the PCR is the earliest active DTS if we found one
> +    if( i_ts_min != INT64_MAX && ( i_ts_min > p_sys->i_pcr || p_sys->i_pcr == VLC_TS_INVALID ) )
> +    {
> +        p_sys->i_pcr = i_ts_min;
> +        es_out_Control( p_demux->out, ES_OUT_SET_PCR, i_ts_min );
> +    }
> +
> +#if 0
> +msg_Dbg( p_demux, "block (track=%d) i_dts: %"PRId64" / i_pts: %"PRId64, p_tk->i_number, p_block->i_dts, p_block->i_pts);
> +#endif
> +
> +    es_out_Send( p_demux->out, p_tk->p_es, p_block);
> +}
> +
>  int32_t Cook_PrivateTrackData::Init()
>  {
>      i_subpackets = (size_t) i_sub_packet_h * (size_t) i_frame_size / (size_t) i_subpacket_size;
> diff --git a/modules/demux/mkv/util.hpp b/modules/demux/mkv/util.hpp
> index c181ad2..8c6cc6a 100644
> --- a/modules/demux/mkv/util.hpp
> +++ b/modules/demux/mkv/util.hpp
> @@ -32,6 +32,7 @@ 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 );
>  
>  
>  struct real_audio_private
> -- 
> 2.3.2
> 
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel

-- 
With my kindest regards,

-- 
Jean-Baptiste Kempf
http://www.jbkempf.com/ - +33 672 704 734
Sent from my Electronic Device



More information about the vlc-devel mailing list