[vlc-devel] [PATCH 4/9] demux: mkv: fix DTS of outgoing blocks
Steve Lhomme
robux4 at ycbcr.xyz
Mon Jul 16 12:12:12 CEST 2018
On 2018-07-16 5:19, Filip Roséen wrote:
> The previous implementation would set the VLC block's DTS to
> VLC_TICK_INVALID for matroska-frames within a matroska block, which in
I don't see that in the code. I only see the DTS set to Invalid for
Cook/Atrac3. The rest of the time it's pts or last_dts + default_duration.
> turn would confuse the decoder as it would then have to assume that
> the block in question belonged to the most recently set PCR.
>
> This works fine in cases where the PCR is updated often enough to
> almost match the track's frames, but in cases where another track is
> preventing the PCR from updating frequently enough (video track with
> long blocks of many matroska-frames), the PCR would be too far in the
> past to base the outgoing block's DTS on. As a result, the decoder
> would think the outgoing blocks were coming in too early and employ
> counter meassures to prevent unwanted drift.
>
> By setting the DTS to the matroska-block's timestamp, we prevent the
> above from happening, resulting in smoother playback.
>
> Included in this patch is a rename of the former i_pts parameter to
> BlockDecode: "i_timecode" should make it more clear that we are
> dealing with the block's timestamp, which might or might not be the
> same as the outgoing frames' pts.
>
> fixes: #13757
> ---
> modules/demux/mkv/mkv.cpp | 13 +++++++++----
> modules/demux/mkv/mkv.hpp | 2 +-
> 2 files changed, 10 insertions(+), 5 deletions(-)
>
> diff --git a/modules/demux/mkv/mkv.cpp b/modules/demux/mkv/mkv.cpp
> index 220a061e57..23c1b39776 100644
> --- a/modules/demux/mkv/mkv.cpp
> +++ b/modules/demux/mkv/mkv.cpp
> @@ -511,7 +511,7 @@ static int Seek( demux_t *p_demux, vlc_tick_t i_mk_date, double f_percent, virtu
>
> /* Needed by matroska_segment::Seek() and Seek */
> void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock,
> - vlc_tick_t i_pts, vlc_tick_t i_duration, bool b_key_picture,
> + vlc_tick_t i_timecode, vlc_tick_t i_duration, bool b_key_picture,
> bool b_discardable_picture )
> {
> demux_sys_t *p_sys = (demux_sys_t *)p_demux->p_sys;
> @@ -538,8 +538,6 @@ void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock
> return;
> }
>
> - i_pts -= track.i_codec_delay;
> -
> if ( track.fmt.i_cat != DATA_ES )
> {
> bool b;
> @@ -557,6 +555,10 @@ void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock
> size_t block_size = internal_block.GetSize();
> const unsigned i_number_frames = internal_block.NumberFrames();
>
> + vlc_tick_t i_track_timecode = i_timecode - track.i_codec_delay;
> + vlc_tick_t i_dts = i_track_timecode;
> + vlc_tick_t i_pts = i_track_timecode;
> +
> for( unsigned int i_frame = 0; i_frame < i_number_frames; i_frame++ )
> {
> block_t *p_block;
> @@ -639,6 +641,9 @@ void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock
> break;
> }
>
> + p_block->i_dts = i_dts;
> + p_block->i_pts = i_pts;
> +
> if( track.fmt.i_cat != VIDEO_ES )
> {
> if ( track.fmt.i_cat == DATA_ES )
> @@ -648,7 +653,7 @@ void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock
> block_Release( p_block );
> return;
> }
> - p_block->i_dts = p_block->i_pts = i_pts;
> + p_block->i_pts = i_pts;
> }
> else
> {
> diff --git a/modules/demux/mkv/mkv.hpp b/modules/demux/mkv/mkv.hpp
> index 3e0ae211b9..17a3fd0e67 100644
> --- a/modules/demux/mkv/mkv.hpp
> +++ b/modules/demux/mkv/mkv.hpp
> @@ -120,7 +120,7 @@ enum
> using namespace LIBMATROSKA_NAMESPACE;
>
> void BlockDecode( demux_t *p_demux, KaxBlock *block, KaxSimpleBlock *simpleblock,
> - vlc_tick_t i_pts, vlc_tick_t i_duration, bool b_key_picture,
> + vlc_tick_t i_timecode, vlc_tick_t i_duration, bool b_key_picture,
> bool b_discardable_picture );
>
> class attachment_c
> --
> 2.18.0
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
More information about the vlc-devel
mailing list