From 64667ec554620de1d24fa63e09398399e7d59f17 Mon Sep 17 00:00:00 2001 From: mosu Date: Fri, 26 Mar 2004 19:45:06 +0000 Subject: Implemented "seek to position". git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@12074 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libmpdemux/demux_mkv.c | 46 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) (limited to 'libmpdemux/demux_mkv.c') diff --git a/libmpdemux/demux_mkv.c b/libmpdemux/demux_mkv.c index d6dc043d4e..c8ae23c346 100644 --- a/libmpdemux/demux_mkv.c +++ b/libmpdemux/demux_mkv.c @@ -2838,8 +2838,52 @@ demux_mkv_seek (demuxer_t *demuxer, float rel_seek_secs, int flags) if(demuxer->audio->sh != NULL) resync_audio_stream((sh_audio_t *) demuxer->audio->sh); } - else + else if ((demuxer->movi_end <= 0) || !(flags & 1)) mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] seek unsupported flags\n"); + else + { + void resync_audio_stream(sh_audio_t *sh_audio); + mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; + stream_t *s = demuxer->stream; + uint64_t target_filepos; + mkv_index_t *index = NULL; + int i; + + if (mkv_d->indexes == NULL) /* no index was found */ + { /* I'm lazy... */ + mp_msg (MSGT_DEMUX, MSGL_V, "[mkv] seek unsupported flags\n"); + return; + } + + target_filepos = (uint64_t)(demuxer->movi_end * rel_seek_secs); + for (i=0; i < mkv_d->num_indexes; i++) + if (mkv_d->indexes[i].tnum == demuxer->video->id) + if ((index == NULL) || + ((mkv_d->indexes[i].filepos >= target_filepos) && + ((index->filepos < target_filepos) || + (mkv_d->indexes[i].filepos < index->filepos)))) + index = &mkv_d->indexes[i]; + + if (!index) + return; + + mkv_d->cluster_size = mkv_d->blockgroup_size = 0; + stream_seek (s, index->filepos); + + if (demuxer->video->id >= 0) + mkv_d->v_skip_to_keyframe = 1; + mkv_d->skip_to_timecode = index->timecode; + mkv_d->a_skip_to_keyframe = 1; + + /* Clear subtitles. */ + if (index->timecode <= mkv_d->last_pts * 1000) + clear_subtitles(demuxer, 0, 1); + + demux_mkv_fill_buffer(demuxer); + + if(demuxer->audio->sh != NULL) + resync_audio_stream((sh_audio_t *) demuxer->audio->sh); + } } int -- cgit v1.2.3