vlc/vlc-3.0 | branch: master | Steve Lhomme <rob...@ycbcr.xyz> | Thu Feb 1 16:52:50 2018 +0100| [8cf2364cd40d1c6f862ec76a940e1ce02eb713da] | committer: Jean-Baptiste Kempf
demux:mkv: do not filter old blocks in fast seeking And only set ES_OUT_SET_NEXT_DISPLAY_TIME once per seek. (cherry picked from commit b931935a4bad26fa1330860d2b17d2c688ca0547) Signed-off-by: Jean-Baptiste Kempf <j...@videolan.org> > http://git.videolan.org/gitweb.cgi/vlc/vlc-3.0.git/?a=commit;h=8cf2364cd40d1c6f862ec76a940e1ce02eb713da --- modules/demux/mkv/matroska_segment.cpp | 25 ++++++++++++++++++------- modules/demux/mkv/matroska_segment.hpp | 1 + 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/modules/demux/mkv/matroska_segment.cpp b/modules/demux/mkv/matroska_segment.cpp index b2c4d62f7f..75dfb3abd1 100644 --- a/modules/demux/mkv/matroska_segment.cpp +++ b/modules/demux/mkv/matroska_segment.cpp @@ -793,7 +793,7 @@ bool matroska_segment_c::LoadSeekHeadItem( const EbmlCallbacks & ClassInfos, int bool matroska_segment_c::FastSeek( demux_t &demuxer, mtime_t i_mk_date, mtime_t i_mk_time_offset ) { - if( Seek( demuxer, i_mk_date, i_mk_time_offset ) ) + if( InternalSeek( demuxer, i_mk_date, i_mk_time_offset, false ) ) { sys.i_start_pts = sys.i_pts; es_out_Control( sys.demuxer.out, ES_OUT_SET_NEXT_DISPLAY_TIME, sys.i_start_pts ); @@ -802,7 +802,17 @@ bool matroska_segment_c::FastSeek( demux_t &demuxer, mtime_t i_mk_date, mtime_t return false; } -bool matroska_segment_c::Seek( demux_t &demuxer, mtime_t i_absolute_mk_date, mtime_t i_mk_time_offset ) +bool matroska_segment_c::Seek( demux_t &demuxer, mtime_t i_mk_date, mtime_t i_mk_time_offset ) +{ + if( InternalSeek( demuxer, i_mk_date, i_mk_time_offset, true ) ) + { + es_out_Control( sys.demuxer.out, ES_OUT_SET_NEXT_DISPLAY_TIME, sys.i_start_pts ); + return true; + } + return false; +} + +bool matroska_segment_c::InternalSeek( demux_t &demuxer, mtime_t i_absolute_mk_date, mtime_t i_mk_time_offset, bool b_accurate ) { SegmentSeeker::tracks_seekpoint_t seekpoints; @@ -868,7 +878,10 @@ bool matroska_segment_c::Seek( demux_t &demuxer, mtime_t i_absolute_mk_date, mti i_mk_seek_time = it->second.pts; } - trackit->second->i_skip_until_fpos = it->second.fpos; + if ( b_accurate ) + trackit->second->i_skip_until_fpos = it->second.fpos; + else + trackit->second->i_skip_until_fpos = -1; trackit->second->i_last_dts = it->second.pts; msg_Dbg( &sys.demuxer, "seek: preroll{ track: %u, pts: %" PRId64 ", fpos: %" PRIu64 " } ", @@ -881,16 +894,14 @@ bool matroska_segment_c::Seek( demux_t &demuxer, mtime_t i_absolute_mk_date, mti sys.i_pts = VLC_TS_0 + i_mk_seek_time + i_mk_time_offset; sys.i_start_pts = VLC_TS_0 + i_absolute_mk_date; - es_out_Control( sys.demuxer.out, ES_OUT_SET_NEXT_DISPLAY_TIME, sys.i_start_pts ); - // make the jump // _seeker.mkv_jump_to( *this, i_seek_position ); // debug diagnostics // - msg_Dbg( &sys.demuxer, "seek: preroll{ start-pts: %" PRId64 ", start-fpos: %" PRIu64 "} ", - sys.i_pts, i_seek_position ); + msg_Dbg( &sys.demuxer, "seek: preroll{ req: %" PRId64 ", start-pts: %" PRId64 ", start-fpos: %" PRIu64 "} ", + sys.i_start_pts, sys.i_pts, i_seek_position ); return true; } diff --git a/modules/demux/mkv/matroska_segment.hpp b/modules/demux/mkv/matroska_segment.hpp index 637ef4eddf..c753644cc8 100644 --- a/modules/demux/mkv/matroska_segment.hpp +++ b/modules/demux/mkv/matroska_segment.hpp @@ -172,6 +172,7 @@ private: bool TrackInit( mkv_track_t * p_tk ); void ComputeTrackPriority(); void EnsureDuration(); + bool InternalSeek( demux_t &, mtime_t i_mk_date, mtime_t i_mk_time_offset, bool b_accurate ); SegmentSeeker _seeker; _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits