Mercurial > mplayer.hg
diff seek.c @ 1405:8ecf18884ad8
seeking code moved out from mplayer.c -> seek.c
author | arpi |
---|---|
date | Sat, 28 Jul 2001 21:57:21 +0000 |
parents | fe133b029041 |
children | 71ad3e1ba014 |
line wrap: on
line diff
--- a/seek.c Sat Jul 28 21:35:55 2001 +0000 +++ b/seek.c Sat Jul 28 21:57:21 2001 +0000 @@ -1,10 +1,53 @@ +#include <stdio.h> +#include <stdlib.h> - if(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"); - } else { +extern int verbose; // defined in mplayer.c + +#include "config.h" + +#include "stream.h" +#include "demuxer.h" +#include "parse_es.h" + +#include "wine/mmreg.h" +#include "wine/avifmt.h" +#include "wine/vfw.h" + +#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 int asf_packetsize; // for seeking + +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 + +// flags: +// 0x1 - absolute/relative +// 0x2 - keyframe/hard + +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; int skip_audio_bytes=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"; + // clear demux buffers: if(sh_audio){ ds_free_packs(d_audio);sh_audio->a_buffer_len=0;} ds_free_packs(d_video); @@ -12,7 +55,7 @@ // printf("sh_audio->a_buffer_len=%d \n",sh_audio->a_buffer_len); -switch(file_format){ +switch(demuxer->file_format){ case DEMUXER_TYPE_AVI: { //================= seek in AVI ========================== @@ -20,6 +63,7 @@ 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; @@ -185,12 +229,12 @@ while(1){ int i=sync_video_packet(d_video); if(i==0x1B3 || i==0x1B8) break; // found it! - if(!i || !skip_video_packet(d_video)){ eof=1; break;} // EOF + if(!i || !skip_video_packet(d_video)) break; // EOF? } } break; -} // switch(file_format) +} // switch(demuxer->file_format) //====================== re-sync audio: ===================== if(sh_audio){ @@ -204,7 +248,7 @@ resync_audio_stream(sh_audio); // re-sync PTS (MPEG-PS only!!!) - if(file_format==DEMUXER_TYPE_MPEG_PS) + if(demuxer->file_format==DEMUXER_TYPE_MPEG_PS) if(d_video->pts && d_audio->pts){ if (d_video->pts < d_audio->pts){ @@ -215,34 +259,14 @@ } } - current_module="audio_reset"; - audio_out->reset(); // stop audio, throwing away buffered data - current_module=NULL; - - c_total=0; // kell ez? - printf("A:%6.1f V:%6.1f A-V:%7.3f",d_audio->pts,d_video->pts,0.0f); - printf(" ct:%7.3f \r",c_total);fflush(stdout); + printf("A:%6.1f V:%6.1f A-V:%7.3f ct: ? \r",d_audio->pts,d_video->pts,0.0f); } else { - printf("A: --- V:%6.1f \r",d_video->pts);fflush(stdout); + printf("A: --- V:%6.1f \r",d_video->pts); } + fflush(stdout); - // Set OSD: - if(osd_level){ - int len=((demuxer->movi_end-demuxer->movi_start)>>8); - if(len>0){ - osd_visible=sh_video->fps; // 1 sec - vo_osd_progbar_type=0; - vo_osd_progbar_value=(demuxer->filepos-demuxer->movi_start)/len; - } - } - - max_pts_correction=0.1; - frame_corr_num=0; // -5 - frame_correction=0; - force_redraw=5; if(sh_audio) sh_audio->timer=-skip_audio_secs; sh_video->timer=0; // !!!!!! - audio_time_usage=0; video_time_usage=0; vout_time_usage=0; - } - rel_seek_secs=0; +return 1; +}