summaryrefslogtreecommitdiffstats
path: root/demux_mpg.c
diff options
context:
space:
mode:
authorarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-08-08 19:37:45 +0000
committerarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-08-08 19:37:45 +0000
commit4953243cb403109accd948d86533629cd4de24eb (patch)
tree0bfed078e197733e71e5e06a81f7563c9bb2d709 /demux_mpg.c
parent9872ba238bd692b7ea89654e0acd66d9fe1eae94 (diff)
downloadmpv-4953243cb403109accd948d86533629cd4de24eb.tar.bz2
mpv-4953243cb403109accd948d86533629cd4de24eb.tar.xz
format-specific seeking code moved to demuxer_ stuff
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@1467 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'demux_mpg.c')
-rw-r--r--demux_mpg.c61
1 files changed, 59 insertions, 2 deletions
diff --git a/demux_mpg.c b/demux_mpg.c
index e23ca06a9e..3a9f58aaf9 100644
--- a/demux_mpg.c
+++ b/demux_mpg.c
@@ -10,6 +10,7 @@ extern int verbose; // defined in mplayer.c
#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 read_mpeg_timestamp(stream_t *s,int c){
//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 @@ do{
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?
+ }
+
+
+}
+