diff options
author | arpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2001-08-08 19:37:45 +0000 |
---|---|---|
committer | arpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2001-08-08 19:37:45 +0000 |
commit | 4953243cb403109accd948d86533629cd4de24eb (patch) | |
tree | 0bfed078e197733e71e5e06a81f7563c9bb2d709 /demux_mpg.c | |
parent | 9872ba238bd692b7ea89654e0acd66d9fe1eae94 (diff) | |
download | mpv-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.c | 61 |
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? + } + + +} + |