From 4953243cb403109accd948d86533629cd4de24eb Mon Sep 17 00:00:00 2001 From: arpi Date: Wed, 8 Aug 2001 19:37:45 +0000 Subject: format-specific seeking code moved to demuxer_ stuff git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@1467 b3059339-0415-0410-9bf9-f77b7e298cf2 --- demux_asf.c | 56 ++++++++++++++ demux_avi.c | 142 ++++++++++++++++++++++++++++++++++ demux_mpg.c | 61 ++++++++++++++- mplayer.c | 14 ++-- seek.c | 249 ++++++------------------------------------------------------ 5 files changed, 289 insertions(+), 233 deletions(-) diff --git a/demux_asf.c b/demux_asf.c index 4b61e6c21f..9c5c84171d 100644 --- a/demux_asf.c +++ b/demux_asf.c @@ -312,3 +312,59 @@ int demux_asf_fill_buffer(demuxer_t *demux){ printf("%08X: UNKNOWN TYPE %02X %02X %02X %02X %02X...\n",demux->filepos,asf_packet[0],asf_packet[1],asf_packet[2],asf_packet[3],asf_packet[4]); return 0; } + + +#include "wine/mmreg.h" +#include "wine/avifmt.h" +#include "wine/vfw.h" + +#include "codec-cfg.h" +#include "stheader.h" + + +void demux_seek_asf(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; + + //FIXME: OFF_T - didn't test ASF case yet (don't have a large asf...) + //FIXME: reports good or bad to steve@daviesfam.org please + + //================= seek in ASF ========================== + float p_rate=10; // packets / sec + off_t rel_seek_packs=rel_seek_secs*p_rate; // FIXME: int may be enough? + off_t rel_seek_bytes=rel_seek_packs*asf_packetsize; + off_t newpos; + //printf("ASF: packs: %d duration: %d \n",(int)fileh.packets,*((int*)&fileh.duration)); +// printf("ASF_seek: %d secs -> %d packs -> %d bytes \n", +// rel_seek_secs,rel_seek_packs,rel_seek_bytes); + newpos=demuxer->filepos+rel_seek_bytes; + if(newpos<0 || newposmovi_start) newpos=demuxer->movi_start; +// printf("\r -- asf: newpos=%d -- \n",newpos); + stream_seek(demuxer->stream,newpos); + + ds_fill_buffer(d_video); + if(sh_audio){ + ds_fill_buffer(d_audio); + resync_audio_stream(sh_audio); + } + + while(1){ + if(sh_audio && !d_audio->eof){ + float a_pts=d_audio->pts; + a_pts+=(ds_tell_pts(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->i_bps; + // sync audio: + if (d_video->pts > a_pts){ + skip_audio_frame(sh_audio); +// if(!ds_fill_buffer(d_audio)) sh_audio=NULL; // skip audio. EOF? + continue; + } + } + if(d_video->flags&1) break; // found a keyframe! + if(!ds_fill_buffer(d_video)) break; // skip frame. EOF? + } + + +} + diff --git a/demux_avi.c b/demux_avi.c index 36adfeec82..5895ba5104 100644 --- a/demux_avi.c +++ b/demux_avi.c @@ -355,4 +355,146 @@ do{ return 1; } +extern float initial_pts_delay; + +void demux_seek_avi(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; + float skip_audio_secs=0; + + //FIXME: OFF_T - Didn't check AVI case yet (avi files can't be >2G anyway?) + //================= seek in AVI ========================== + int rel_seek_frames=rel_seek_secs*sh_video->fps; + int curr_audio_pos=0; + int audio_chunk_pos=-1; + int video_chunk_pos=d_video->pos; + int i; + + skip_video_frames=0; + avi_audio_pts=0; + + // find nearest video keyframe chunk pos: + if(rel_seek_frames>0){ + // seek forward + while(video_chunk_posidx_size){ + int id=((AVIINDEXENTRY *)demuxer->idx)[video_chunk_pos].ckid; + if(avi_stream_id(id)==d_video->id){ // video frame + if((--rel_seek_frames)<0 && ((AVIINDEXENTRY *)demuxer->idx)[video_chunk_pos].dwFlags&AVIIF_KEYFRAME) break; +// ++skip_audio_bytes; + } + ++video_chunk_pos; + } + } else { + // seek backward + while(video_chunk_pos>=0){ + int id=((AVIINDEXENTRY *)demuxer->idx)[video_chunk_pos].ckid; + if(avi_stream_id(id)==d_video->id){ // video frame + if((++rel_seek_frames)>0 && ((AVIINDEXENTRY *)demuxer->idx)[video_chunk_pos].dwFlags&AVIIF_KEYFRAME) break; +// --skip_audio_bytes; + } + --video_chunk_pos; + } + } + demuxer->idx_pos_a=demuxer->idx_pos_v=demuxer->idx_pos=video_chunk_pos; +// printf("%d frames skipped\n",skip_audio_bytes); + + // re-calc video pts: + d_video->pack_no=0; + for(i=0;iidx)[i].ckid; + if(avi_stream_id(id)==d_video->id) ++d_video->pack_no; + } + sh_video->num_frames=d_video->pack_no; + avi_video_pts=d_video->pack_no*(float)sh_video->video.dwScale/(float)sh_video->video.dwRate; + + if(sh_audio){ + int i; + int apos=0; + int last=0; + int len=0; + int skip_audio_bytes=0; + + // calc new audio position in audio stream: (using avg.bps value) + curr_audio_pos=(avi_video_pts) * sh_audio->wf->nAvgBytesPerSec; + if(curr_audio_pos<0)curr_audio_pos=0; +#if 1 + curr_audio_pos&=~15; // requires for PCM formats!!! +#else + curr_audio_pos/=sh_audio->wf->nBlockAlign; + curr_audio_pos*=sh_audio->wf->nBlockAlign; + demuxer->audio_seekable=1; +#endif + + // find audio chunk pos: + for(i=0;iidx)[i].ckid; + if(avi_stream_id(id)==d_audio->id){ + len=((AVIINDEXENTRY *)demuxer->idx)[i].dwChunkLength; + last=i; + if(apos<=curr_audio_pos && curr_audio_pos<(apos+len)){ + if(verbose)printf("break;\n"); + break; + } + apos+=len; + } + } + if(verbose)printf("XXX i=%d last=%d apos=%d curr_audio_pos=%d \n", + i,last,apos,curr_audio_pos); +// audio_chunk_pos=last; // maybe wrong (if not break; ) + audio_chunk_pos=i; // maybe wrong (if not break; ) + skip_audio_bytes=curr_audio_pos-apos; + + // update stream position: + d_audio->pos=audio_chunk_pos; + d_audio->dpos=apos; + d_audio->pts=initial_pts_delay+(float)apos/(float)sh_audio->wf->nAvgBytesPerSec; + demuxer->idx_pos_a=demuxer->idx_pos_v=demuxer->idx_pos=audio_chunk_pos; + + if(!(sh_audio->codec->flags&CODECS_FLAG_SEEKABLE)){ +#if 0 +// curr_audio_pos=apos; // selected audio codec can't seek in chunk + skip_audio_secs=(float)skip_audio_bytes/(float)sh_audio->wf->nAvgBytesPerSec; + //printf("Seek_AUDIO: %d bytes --> %5.3f secs\n",skip_audio_bytes,skip_audio_secs); + skip_audio_bytes=0; +#else + int d=skip_audio_bytes % sh_audio->wf->nBlockAlign; + skip_audio_bytes-=d; +// curr_audio_pos-=d; + skip_audio_secs=(float)d/(float)sh_audio->wf->nAvgBytesPerSec; + //printf("Seek_AUDIO: %d bytes --> %5.3f secs\n",d,skip_audio_secs); +#endif + } + // now: audio_chunk_pos=pos in index + // skip_audio_bytes=bytes to skip from that chunk + // skip_audio_secs=time to play audio before video (if can't skip) + + // calc skip_video_frames & adjust video pts counter: +// i=last; + for(i=demuxer->idx_pos;iidx)[i].ckid; + if(avi_stream_id(id)==d_video->id) ++skip_video_frames; + } + // requires for correct audio pts calculation (demuxer): + avi_video_pts-=skip_video_frames*(float)sh_video->video.dwScale/(float)sh_video->video.dwRate; + + if(verbose) printf("SEEK: idx=%d (a:%d v:%d) v.skip=%d a.skip=%d/%4.3f \n", + demuxer->idx_pos,audio_chunk_pos,video_chunk_pos, + skip_video_frames,skip_audio_bytes,skip_audio_secs); + + if(skip_audio_bytes){ + demux_read_data(d_audio,NULL,skip_audio_bytes); + //d_audio->pts=0; // PTS is outdated because of the raw data skipping + } + resync_audio_stream(sh_audio); + + sh_audio->timer=-skip_audio_secs; + + } + + +} + + 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(newposstream,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? + } + + +} + diff --git a/mplayer.c b/mplayer.c index 7674310ac0..88529f4f5d 100644 --- a/mplayer.c +++ b/mplayer.c @@ -1145,13 +1145,13 @@ if(file_format==DEMUXER_TYPE_AVI && sh_audio){ float x=(float)(sh_audio->audio.dwInitialFrames-sh_video->video.dwInitialFrames)*sh_video->frametime; // audio_delay-=x; if(verbose) printf("AVI Initial frame delay: %5.3f\n",x); + delay_corrected=0; // has to correct PTS diffs } if(verbose){ // printf("v: audio_delay=%5.3f buffer_delay=%5.3f a_pts=%5.3f sh_audio->timer=%5.3f\n", // audio_delay,audio_buffer_delay,a_pts,sh_audio->timer); printf("START: a_pts=%5.3f v_pts=%5.3f \n",d_audio->pts,d_video->pts); } - delay_corrected=0; // has to correct PTS diffs d_video->pts=0;d_audio->pts=0; // PTS is outdated now! } else { pts_from_bps=0; // it must be 0 for mpeg/asf ! @@ -1439,7 +1439,7 @@ if(1) // PTS = (audio position)/(bytes per sec) // a_pts=(ds_tell(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->i_bps; a_pts=(ds_tell(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->wf->nAvgBytesPerSec; - delay_corrected=1; // hack +// delay_corrected=1; // hack v_pts=d_video->pack_no*(float)sh_video->video.dwScale/(float)sh_video->video.dwRate; if(verbose)printf("%5.3f|",v_pts-d_video->pts); } else { @@ -1759,7 +1759,8 @@ if(auto_quality>0){ seek_to_sec = NULL; } - if(rel_seek_secs) +if(rel_seek_secs){ + current_module="seek"; if(demux_seek(demuxer,rel_seek_secs,0)){ // success: @@ -1776,9 +1777,8 @@ if(auto_quality>0){ fflush(stdout); if(sh_audio){ - current_module="audio_reset"; + current_module="seek_audio_reset"; audio_out->reset(); // stop audio, throwing away buffered data - current_module=NULL; } #ifdef USE_OSD @@ -1801,7 +1801,9 @@ if(auto_quality>0){ } rel_seek_secs=0; - + current_module=NULL; +} + //================= Update OSD ==================== #ifdef USE_OSD if(osd_level>=2){ diff --git a/seek.c b/seek.c index 009799faf1..63b6c7d973 100644 --- a/seek.c +++ b/seek.c @@ -2,7 +2,7 @@ #include #include -extern int verbose; // defined in mplayer.c +//extern int verbose; // defined in mplayer.c #include "config.h" @@ -17,266 +17,65 @@ extern int verbose; // defined in mplayer.c #include "codec-cfg.h" #include "stheader.h" -extern void resync_audio_stream(sh_audio_t *sh_audio); -extern void skip_audio_frame(sh_audio_t *sh_audio); +//extern void resync_audio_stream(sh_audio_t *sh_audio); +//extern void skip_audio_frame(sh_audio_t *sh_audio); -extern int asf_packetsize; // for seeking +//extern int asf_packetsize; // for seeking -extern float avi_audio_pts; -extern float avi_video_pts; +//extern float avi_audio_pts; +//extern float avi_video_pts; //extern float avi_video_ftime; -extern int skip_video_frames; -extern float initial_pts_delay; -extern int seek_to_byte; -extern char* current_module; // for debugging +//extern int skip_video_frames; +//extern int seek_to_byte; +//extern char* current_module; // for debugging // flags: // 0x1 - absolute/relative // 0x2 - keyframe/hard +int demux_seek_avi(demuxer_t *demuxer,float rel_seek_secs,int flags); +int demux_seek_asf(demuxer_t *demuxer,float rel_seek_secs,int flags); +int demux_seek_mpg(demuxer_t *demuxer,float rel_seek_secs,int flags); + int demux_seek(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; - float skip_audio_secs=0; +// float skip_audio_secs=0; if(demuxer->file_format==DEMUXER_TYPE_AVI && demuxer->idx_size<=0){ printf("Can't seek in raw .AVI streams! (index required, try with the -idx switch!) \n"); return 0; } - current_module="seek"; +// current_module="seek"; // clear demux buffers: if(sh_audio){ ds_free_packs(d_audio);sh_audio->a_buffer_len=0;} ds_free_packs(d_video); demuxer->stream->eof=0; // clear eof flag + + if(sh_audio) sh_audio->timer=0; + sh_video->timer=0; // !!!!!! // printf("sh_audio->a_buffer_len=%d \n",sh_audio->a_buffer_len); switch(demuxer->file_format){ - //FIXME: OFF_T - Didn't check AVI case yet (avi files can't be >2G anyway?) - case DEMUXER_TYPE_AVI: { - //================= seek in AVI ========================== - int rel_seek_frames=rel_seek_secs*sh_video->fps; - int curr_audio_pos=0; - int audio_chunk_pos=-1; - int video_chunk_pos=d_video->pos; - int i; - - skip_video_frames=0; - avi_audio_pts=0; - - // find nearest video keyframe chunk pos: - if(rel_seek_frames>0){ - // seek forward - while(video_chunk_posidx_size){ - int id=((AVIINDEXENTRY *)demuxer->idx)[video_chunk_pos].ckid; - if(avi_stream_id(id)==d_video->id){ // video frame - if((--rel_seek_frames)<0 && ((AVIINDEXENTRY *)demuxer->idx)[video_chunk_pos].dwFlags&AVIIF_KEYFRAME) break; -// ++skip_audio_bytes; - } - ++video_chunk_pos; - } - } else { - // seek backward - while(video_chunk_pos>=0){ - int id=((AVIINDEXENTRY *)demuxer->idx)[video_chunk_pos].ckid; - if(avi_stream_id(id)==d_video->id){ // video frame - if((++rel_seek_frames)>0 && ((AVIINDEXENTRY *)demuxer->idx)[video_chunk_pos].dwFlags&AVIIF_KEYFRAME) break; -// --skip_audio_bytes; - } - --video_chunk_pos; - } - } - demuxer->idx_pos_a=demuxer->idx_pos_v=demuxer->idx_pos=video_chunk_pos; -// printf("%d frames skipped\n",skip_audio_bytes); - - // re-calc video pts: - d_video->pack_no=0; - for(i=0;iidx)[i].ckid; - if(avi_stream_id(id)==d_video->id) ++d_video->pack_no; - } - sh_video->num_frames=d_video->pack_no; - avi_video_pts=d_video->pack_no*(float)sh_video->video.dwScale/(float)sh_video->video.dwRate; - - if(sh_audio){ - int i; - int apos=0; - int last=0; - int len=0; - int skip_audio_bytes=0; - - // calc new audio position in audio stream: (using avg.bps value) - curr_audio_pos=(avi_video_pts) * sh_audio->wf->nAvgBytesPerSec; - if(curr_audio_pos<0)curr_audio_pos=0; -#if 1 - curr_audio_pos&=~15; // requires for PCM formats!!! -#else - curr_audio_pos/=sh_audio->wf->nBlockAlign; - curr_audio_pos*=sh_audio->wf->nBlockAlign; - demuxer->audio_seekable=1; -#endif - - // find audio chunk pos: - for(i=0;iidx)[i].ckid; - if(avi_stream_id(id)==d_audio->id){ - len=((AVIINDEXENTRY *)demuxer->idx)[i].dwChunkLength; - last=i; - if(apos<=curr_audio_pos && curr_audio_pos<(apos+len)){ - if(verbose)printf("break;\n"); - break; - } - apos+=len; - } - } - if(verbose)printf("XXX i=%d last=%d apos=%d curr_audio_pos=%d \n", - i,last,apos,curr_audio_pos); -// audio_chunk_pos=last; // maybe wrong (if not break; ) - audio_chunk_pos=i; // maybe wrong (if not break; ) - skip_audio_bytes=curr_audio_pos-apos; - - // update stream position: - d_audio->pos=audio_chunk_pos; - d_audio->dpos=apos; - d_audio->pts=initial_pts_delay+(float)apos/(float)sh_audio->wf->nAvgBytesPerSec; - demuxer->idx_pos_a=demuxer->idx_pos_v=demuxer->idx_pos=audio_chunk_pos; - - if(!(sh_audio->codec->flags&CODECS_FLAG_SEEKABLE)){ -#if 0 -// curr_audio_pos=apos; // selected audio codec can't seek in chunk - skip_audio_secs=(float)skip_audio_bytes/(float)sh_audio->wf->nAvgBytesPerSec; - //printf("Seek_AUDIO: %d bytes --> %5.3f secs\n",skip_audio_bytes,skip_audio_secs); - skip_audio_bytes=0; -#else - int d=skip_audio_bytes % sh_audio->wf->nBlockAlign; - skip_audio_bytes-=d; -// curr_audio_pos-=d; - skip_audio_secs=(float)d/(float)sh_audio->wf->nAvgBytesPerSec; - //printf("Seek_AUDIO: %d bytes --> %5.3f secs\n",d,skip_audio_secs); -#endif - } - // now: audio_chunk_pos=pos in index - // skip_audio_bytes=bytes to skip from that chunk - // skip_audio_secs=time to play audio before video (if can't skip) - - // calc skip_video_frames & adjust video pts counter: -// i=last; - for(i=demuxer->idx_pos;iidx)[i].ckid; - if(avi_stream_id(id)==d_video->id) ++skip_video_frames; - } - // requires for correct audio pts calculation (demuxer): - avi_video_pts-=skip_video_frames*(float)sh_video->video.dwScale/(float)sh_video->video.dwRate; - - if(verbose) printf("SEEK: idx=%d (a:%d v:%d) v.skip=%d a.skip=%d/%4.3f \n", - demuxer->idx_pos,audio_chunk_pos,video_chunk_pos, - skip_video_frames,skip_audio_bytes,skip_audio_secs); + case DEMUXER_TYPE_AVI: + demux_seek_avi(demuxer,rel_seek_secs,flags); break; - if(skip_audio_bytes){ - demux_read_data(d_audio,NULL,skip_audio_bytes); - //d_audio->pts=0; // PTS is outdated because of the raw data skipping - } - resync_audio_stream(sh_audio); - } - - } - break; - - //FIXME: OFF_T - didn't test ASF case yet (don't have a large asf...) - //FIXME: reports good or bad to steve@daviesfam.org please - case DEMUXER_TYPE_ASF: { - //================= seek in ASF ========================== - float p_rate=10; // packets / sec - off_t rel_seek_packs=rel_seek_secs*p_rate; // FIXME: int may be enough? - off_t rel_seek_bytes=rel_seek_packs*asf_packetsize; - off_t newpos; - //printf("ASF: packs: %d duration: %d \n",(int)fileh.packets,*((int*)&fileh.duration)); -// printf("ASF_seek: %d secs -> %d packs -> %d bytes \n", -// rel_seek_secs,rel_seek_packs,rel_seek_bytes); - newpos=demuxer->filepos+rel_seek_bytes; - if(newpos<0 || newposmovi_start) newpos=demuxer->movi_start; -// printf("\r -- asf: newpos=%d -- \n",newpos); - stream_seek(demuxer->stream,newpos); - - ds_fill_buffer(d_video); - if(sh_audio){ - ds_fill_buffer(d_audio); - resync_audio_stream(sh_audio); - } - - while(1){ - if(sh_audio && !d_audio->eof){ - float a_pts=d_audio->pts; - a_pts+=(ds_tell_pts(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->i_bps; - // sync audio: - if (d_video->pts > a_pts){ - skip_audio_frame(sh_audio); -// if(!ds_fill_buffer(d_audio)) sh_audio=NULL; // skip audio. EOF? - continue; - } - } - if(d_video->flags&1) break; // found a keyframe! - if(!ds_fill_buffer(d_video)) break; // skip frame. EOF? - } - - } - break; + case DEMUXER_TYPE_ASF: + demux_seek_asf(demuxer,rel_seek_secs,flags); break; case DEMUXER_TYPE_MPEG_ES: - case DEMUXER_TYPE_MPEG_PS: { - //================= 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(newposstream,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? - } - - } - break; + case DEMUXER_TYPE_MPEG_PS: + demux_seek_mpg(demuxer,rel_seek_secs,flags); break; } // switch(demuxer->file_format) - if(sh_audio) sh_audio->timer=-skip_audio_secs; - sh_video->timer=0; // !!!!!! - return 1; } -- cgit v1.2.3