From 0fa1a3e4c67e7b0783cf359e65911e67d4ea7728 Mon Sep 17 00:00:00 2001 From: nicodvb Date: Tue, 7 Nov 2006 22:54:28 +0000 Subject: now demux_seek() tries to seek aided by the stream layer, if possible git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@20764 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libmpdemux/demuxer.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'libmpdemux/demuxer.c') diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c index e9c90112ce..ce8e96eead 100644 --- a/libmpdemux/demuxer.c +++ b/libmpdemux/demuxer.c @@ -881,6 +881,8 @@ int demux_seek(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flag demux_stream_t *d_video=demuxer->video; sh_audio_t *sh_audio=d_audio->sh; sh_video_t *sh_video=d_video->sh; + unsigned int tmp = 0; + double pts; if(!demuxer->seekable){ if(demuxer->file_format==DEMUXER_TYPE_AVI) @@ -909,6 +911,27 @@ if(!demuxer->seekable){ if(sh_video) sh_video->timer=0; // !!!!!! #endif + if(flags & 1) // absolute seek + pts = 0.0f; + else { + if(stream_control(demuxer->stream, STREAM_CTRL_GET_CURRENT_TIME, &tmp) == STREAM_UNSUPORTED) + goto dmx_seek; + pts = (double)tmp / 1000.0f; + } + + if(flags & 2) { // percent seek + if(stream_control(demuxer->stream, STREAM_CTRL_GET_TIME_LENGTH, &tmp) == STREAM_UNSUPORTED) + goto dmx_seek; + pts += (double)tmp / 1000.0f * rel_seek_secs; + } else + pts += rel_seek_secs; + + if(stream_control(demuxer->stream, STREAM_CTRL_SEEK_TO_TIME, &pts) != STREAM_UNSUPORTED) { + demux_control(demuxer, DEMUXER_CTRL_RESYNC, NULL); + return 1; + } + +dmx_seek: if (demuxer->desc->seek) demuxer->desc->seek(demuxer,rel_seek_secs,audio_delay,flags); -- cgit v1.2.3