[vlc-commits] mkv: reimplemented matroska_segment_c::Seek
Filip Roséen
git at videolan.org
Mon May 23 16:22:02 CEST 2016
vlc | branch: master | Filip Roséen <filip at videolabs.io> | Sat May 21 02:18:01 2016 +0200| [76f671c46866dbdb7c988892371b39e348bfe8fe] | committer: Jean-Baptiste Kempf
mkv: reimplemented matroska_segment_c::Seek
Signed-off-by: Jean-Baptiste Kempf <jb at videolan.org>
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=76f671c46866dbdb7c988892371b39e348bfe8fe
---
modules/demux/mkv/matroska_segment.cpp | 64 ++++++++++++++++++++++++++++++--
1 file changed, 61 insertions(+), 3 deletions(-)
diff --git a/modules/demux/mkv/matroska_segment.cpp b/modules/demux/mkv/matroska_segment.cpp
index 6a33138..abe03fe 100644
--- a/modules/demux/mkv/matroska_segment.cpp
+++ b/modules/demux/mkv/matroska_segment.cpp
@@ -803,10 +803,68 @@ void matroska_segment_c::FastSeek( mtime_t i_mk_date, mtime_t i_mk_time_offset )
void matroska_segment_c::Seek( mtime_t i_absolute_mk_date, mtime_t i_mk_time_offset )
{
- VLC_UNUSED( i_absolute_mk_date );
- VLC_UNUSED( i_mk_time_offset );
+ SegmentSeeker::tracks_seekpoint_t seekpoints;
+
+ uint64_t i_seek_position = -1;
+ mtime_t i_mk_seek_time = -1;
+ mtime_t i_mk_date = i_absolute_mk_date - i_mk_time_offset;
+
+ // reset information for all tracks //
+
+ for( tracks_map_t::iterator it = tracks.begin(); it != tracks.end(); ++it )
+ {
+ mkv_track_t& track = it->second;
+
+ track.i_skip_until_fpos = -1;
+ track.i_last_dts = VLC_TS_INVALID;
+ }
+
+ // find appropriate seekpoints //
+
+ try {
+ seekpoints = _seeker.get_seekpoints( *this, i_mk_date, priority_tracks );
+ }
+ catch( std::exception const& e )
+ {
+ msg_Err( &sys.demuxer, "error during seek: \"%s\", aborting!", e.what() );
+ return;
+ }
+
+ // initialize seek information in order to set up playback //
+
+ for( SegmentSeeker::tracks_seekpoint_t::iterator it = seekpoints.begin(); it != seekpoints.end(); ++it )
+ {
+ mkv_track_t& track = tracks[ it->first ];
+
+ if( i_seek_position > it->second.fpos )
+ {
+ i_seek_position = it->second.fpos;
+ i_mk_seek_time = it->second.pts;
+ }
+
+ track.i_skip_until_fpos = it->second.fpos;
+ track.i_last_dts = it->second.pts;
+
+ msg_Dbg( &sys.demuxer, "seek: preroll{ track: %u, pts: %" PRId64 ", fpos: %" PRIu64 " } ",
+ it->first, it->second.pts, it->second.fpos );
+ }
+
+ // propogate seek information //
+
+ sys.i_pcr = VLC_TS_INVALID;
+ 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 //
- // TODO: reimplement
+ msg_Dbg( &sys.demuxer, "seek: preroll{ start-pts: %" PRId64 ", start-fpos: %" PRIu64 "} ",
+ sys.i_pts, i_seek_position );
}
More information about the vlc-commits
mailing list