summaryrefslogtreecommitdiffstats
path: root/libmpdemux/demuxer.c
diff options
context:
space:
mode:
authornicodvb <nicodvb@b3059339-0415-0410-9bf9-f77b7e298cf2>2006-11-07 22:54:28 +0000
committernicodvb <nicodvb@b3059339-0415-0410-9bf9-f77b7e298cf2>2006-11-07 22:54:28 +0000
commit0fa1a3e4c67e7b0783cf359e65911e67d4ea7728 (patch)
tree5a23846ad2a69cdbf49c9547f758e7096622d0ca /libmpdemux/demuxer.c
parenta46e8bb058abf912e307463d89cb973e091f5ed5 (diff)
downloadmpv-0fa1a3e4c67e7b0783cf359e65911e67d4ea7728.tar.bz2
mpv-0fa1a3e4c67e7b0783cf359e65911e67d4ea7728.tar.xz
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
Diffstat (limited to 'libmpdemux/demuxer.c')
-rw-r--r--libmpdemux/demuxer.c23
1 files changed, 23 insertions, 0 deletions
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);