[vlc-devel] [PATCH 2/4] demux: mkv: truncate length on preskip, don't set negative pts

Steve Lhomme robux4 at ycbcr.xyz
Thu Oct 1 08:10:20 CEST 2020


On 2020-09-30 17:44, Francois Cartegnie wrote:
> Same as other demuxers do with preskip
> 
> refs #25129
> ---
>   modules/demux/mkv/mkv.cpp | 20 ++++++++++++++++++--
>   1 file changed, 18 insertions(+), 2 deletions(-)
> 
> diff --git a/modules/demux/mkv/mkv.cpp b/modules/demux/mkv/mkv.cpp
> index 82f464a74a..2af7d5c87b 100644
> --- a/modules/demux/mkv/mkv.cpp
> +++ b/modules/demux/mkv/mkv.cpp
> @@ -547,8 +547,6 @@ void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock
>           return;
>       }
>   
> -    i_pts -= track.i_codec_delay;

The PTS delay should be applied no matter what.

> -
>       if ( track.fmt.i_cat != DATA_ES )
>       {
>           bool b;
> @@ -695,6 +693,24 @@ void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock
>           }
>           else
>           {
> +            if( track.i_codec_delay ) /* Handle pre-skip */
> +            {
> +                if( i_pts > track.i_codec_delay )
> +                {
> +                    p_block->i_length -= track.i_codec_delay;

That looks suspicious. The delay should influence the PTS/DTS, not the 
duration of a block. If you wanted to skip a part at the beginning of a 
block you would also need to specify the offset to skip.

> +                }
> +                else
> +                {
> +                    vlc_tick_t skipped = i_pts - track.i_codec_delay;

Here i_pts <= track.i_codec_delay. So this value is negative.

> +                    if( p_block->i_length <= skipped )

So this is always false.

> +                    {
> +                        p_block->i_length = 0;
> +                        p_block->i_flags |= BLOCK_FLAG_PREROLL;
> +                    }
> +                    else p_block->i_length -= skipped;

The block length is always expanded.

> +                }
> +            }
> +
>               // correct timestamping when B frames are used
>               if( track.b_dts_only )
>               {

Also I did not receive patches [3/4] and [4/4].


More information about the vlc-devel mailing list