changeset 22300:83375f3a276b

Separate function for seeking
author uau
date Fri, 23 Feb 2007 01:49:51 +0000
parents 073bd05d00a6
children e4950f7dc165
files mplayer.c
diffstat 1 files changed, 49 insertions(+), 36 deletions(-) [+]
line wrap: on
line diff
--- a/mplayer.c	Thu Feb 22 23:44:43 2007 +0000
+++ b/mplayer.c	Fri Feb 23 01:49:51 2007 +0000
@@ -2225,6 +2225,53 @@
 }
 
 
+// style & 1 == 0 means seek relative to current position, == 1 means relative
+// style & 2 == 0 means amount in seconds, == 2 means fraction of file length
+// return -1 if seek failed (non-seekable stream?), 0 otherwise
+static int seek(MPContext *mpctx, double amount, int style)
+{
+    current_module = "seek";
+    if (demux_seek(mpctx->demuxer, amount, audio_delay, style) == 0)
+	return -1;
+
+    if (mpctx->sh_video) {
+	current_module = "seek_video_reset";
+	resync_video_stream(mpctx->sh_video);
+	if (vo_config_count)
+	    mpctx->video_out->control(VOCTRL_RESET, NULL);
+	mpctx->sh_video->num_buffered_pts = 0;
+	mpctx->sh_video->last_pts = MP_NOPTS_VALUE;
+	mpctx->num_buffered_frames = 0;
+	// Not all demuxers set d_video->pts during seek, so this value
+	// (which is used by at least vobsub and edl code below) may
+	// be completely wrong (probably 0).
+	mpctx->sh_video->pts = mpctx->d_video->pts;
+	update_subtitles(mpctx->sh_video, mpctx->d_sub, 1);
+    }
+      
+    if (mpctx->sh_audio) {
+	current_module = "seek_audio_reset";
+	mpctx->audio_out->reset(); // stop audio, throwing away buffered data
+	mpctx->sh_audio->a_buffer_len = 0;
+	mpctx->sh_audio->a_out_buffer_len = 0;
+    }
+
+    if (vo_vobsub) {
+	current_module = "seek_vobsub_reset";
+	vobsub_seek(vo_vobsub, mpctx->sh_video->pts);
+    }
+
+    edl_seek_reset(mpctx);
+
+    c_total = 0;
+    max_pts_correction = 0.1;
+    audio_time_usage = 0; video_time_usage = 0; vout_time_usage = 0;
+    drop_frame_cnt = 0;
+
+    current_module = NULL;
+    return 0;
+}
+
 int main(int argc,char* argv[]){
 
 
@@ -3527,52 +3574,18 @@
   }
 
 if(rel_seek_secs || abs_seek_pos){
-  current_module="seek";
-  if(demux_seek(mpctx->demuxer,rel_seek_secs,audio_delay,abs_seek_pos)){
-      // success:
-      /* FIXME there should be real seeking for vobsub */
-      if(mpctx->sh_video) mpctx->sh_video->pts=mpctx->d_video->pts;
-      if (vo_vobsub)
-	//vobsub_reset(vo_vobsub);
-	vobsub_seek(vo_vobsub,mpctx->sh_video->pts);
-
-      if(mpctx->sh_video){
-	 current_module="seek_video_reset";
-         resync_video_stream(mpctx->sh_video);
-         if(vo_config_count) mpctx->video_out->control(VOCTRL_RESET,NULL);
-	 mpctx->sh_video->num_buffered_pts = 0;
-	 mpctx->sh_video->last_pts = MP_NOPTS_VALUE;
-      }
-      
-      if(mpctx->sh_audio){
-        current_module="seek_audio_reset";
-        mpctx->audio_out->reset(); // stop audio, throwing away buffered data
-        mpctx->sh_audio->a_buffer_len = 0;
-        mpctx->sh_audio->a_out_buffer_len = 0;
-      }
+  if (seek(mpctx, rel_seek_secs, abs_seek_pos) >= 0) {
         // Set OSD:
       if(!loop_seek){
 	if( !edl_decision )
           set_osd_bar(0,"Position",0,100,demuxer_get_percent_pos(mpctx->demuxer));
       }
-
-      if(mpctx->sh_video) {
-	c_total=0;
-	max_pts_correction=0.1;
+      // osd_function has been set (or not) by the code triggering the seek
 	osd_visible=(GetTimerMS() + 1000) | 1; // to revert to PLAY pointer after 1 sec
-	audio_time_usage=0; video_time_usage=0; vout_time_usage=0;
-	drop_frame_cnt=0;
-
-        update_subtitles(mpctx->sh_video, mpctx->d_sub, 1);
-      }
   }
 
-  edl_seek_reset(mpctx);
-
   rel_seek_secs=0;
   abs_seek_pos=0;
-  mpctx->num_buffered_frames = 0;
-  current_module=NULL;
   loop_seek=0;
 }