diff demux_mpg.c @ 1466:7845f6d7c4ba

format-specific seeking code moved to demuxer_ stuff
author arpi
date Wed, 08 Aug 2001 19:37:45 +0000
parents 1728d249c783
children ad4d402b3d29
line wrap: on
line diff
--- a/demux_mpg.c	Wed Aug 08 19:36:54 2001 +0000
+++ b/demux_mpg.c	Wed Aug 08 19:37:45 2001 +0000
@@ -10,6 +10,7 @@
 #include "dvdauth.h"
 #include "stream.h"
 #include "demuxer.h"
+#include "parse_es.h"
 
 //#define MAX_PS_PACKETSIZE 2048
 #define MAX_PS_PACKETSIZE (224*1024)
@@ -32,8 +33,14 @@
 
 //static unsigned int packet_start_pos=0;
 
-extern void *new_sh_audio(demuxer_t *demux,int id);
-extern void *new_sh_video(demuxer_t *demux,int id);
+//extern void *new_sh_audio(demuxer_t *demux,int id);
+//extern void *new_sh_video(demuxer_t *demux,int id);
+#include "wine/mmreg.h"
+#include "wine/avifmt.h"
+#include "wine/vfw.h"
+
+#include "codec-cfg.h"
+#include "stheader.h"
 
 static int demux_mpg_read_packet(demuxer_t *demux,int id){
   int d;
@@ -334,3 +341,53 @@
   return 1;
 }
 
+extern off_t seek_to_byte;
+
+void demux_seek_mpg(demuxer_t *demuxer,float rel_seek_secs,int flags){
+    demux_stream_t *d_audio=demuxer->audio;
+    demux_stream_t *d_video=demuxer->video;
+    sh_audio_t *sh_audio=d_audio->sh;
+    sh_video_t *sh_video=d_video->sh;
+
+  //================= seek in MPEG ==========================
+        off_t newpos;
+        if(!sh_video->i_bps) // unspecified?
+          newpos=demuxer->filepos+2324*75*rel_seek_secs; // 174.3 kbyte/sec
+        else
+          newpos=demuxer->filepos+(sh_video->i_bps)*rel_seek_secs;
+
+        if(newpos<seek_to_byte) newpos=seek_to_byte; // for VCD
+#ifdef _LARGEFILE_SOURCE
+        newpos&=~((long long)STREAM_BUFFER_SIZE-1);  /* sector boundary */
+#else
+        newpos&=~(STREAM_BUFFER_SIZE-1);  /* sector boundary */
+#endif
+        stream_seek(demuxer->stream,newpos);
+
+        // re-sync video:
+        videobuf_code_len=0; // reset ES stream buffer
+
+	ds_fill_buffer(d_video);
+	if(sh_audio){
+	  ds_fill_buffer(d_audio);
+	  resync_audio_stream(sh_audio);
+	}
+
+	while(1){
+	  int i;
+          if(sh_audio && !d_audio->eof && d_video->pts && d_audio->pts){
+	    float a_pts=d_audio->pts;
+            a_pts+=(ds_tell_pts(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->i_bps;
+	    if(d_video->pts>a_pts){
+	      skip_audio_frame(sh_audio);  // sync audio
+	      continue;
+	    }
+          }
+          i=sync_video_packet(d_video);
+          if(i==0x1B3 || i==0x1B8) break; // found it!
+          if(!i || !skip_video_packet(d_video)) break; // EOF?
+        }
+
+
+}
+