summaryrefslogtreecommitdiffstats
path: root/libmpdemux/demux_mkv.c
diff options
context:
space:
mode:
authormosu <mosu@b3059339-0415-0410-9bf9-f77b7e298cf2>2004-03-26 19:45:06 +0000
committermosu <mosu@b3059339-0415-0410-9bf9-f77b7e298cf2>2004-03-26 19:45:06 +0000
commit64667ec554620de1d24fa63e09398399e7d59f17 (patch)
treee94d9cfdd4e739acb0f79b3a7cf27d2d3c012046 /libmpdemux/demux_mkv.c
parent582f8307347b6902a7bfa17e4b14b953184daaf2 (diff)
downloadmpv-64667ec554620de1d24fa63e09398399e7d59f17.tar.bz2
mpv-64667ec554620de1d24fa63e09398399e7d59f17.tar.xz
Implemented "seek to position".
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@12074 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux/demux_mkv.c')
-rw-r--r--libmpdemux/demux_mkv.c46
1 files changed, 45 insertions, 1 deletions
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