diff options
author | uau <uau@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2007-02-23 01:49:51 +0000 |
---|---|---|
committer | uau <uau@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2007-02-23 01:49:51 +0000 |
commit | 19e430af9ac835b7ab83c8ab6c355ca5a80f0a17 (patch) | |
tree | fc3643c1d49062e09254ba4362abd973ab58a64c /mplayer.c | |
parent | 894ea071bfffd57683cd9d62bff3957556fbd58b (diff) | |
download | mpv-19e430af9ac835b7ab83c8ab6c355ca5a80f0a17.tar.bz2 mpv-19e430af9ac835b7ab83c8ab6c355ca5a80f0a17.tar.xz |
Separate function for seeking
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@22318 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'mplayer.c')
-rw-r--r-- | mplayer.c | 85 |
1 files changed, 49 insertions, 36 deletions
@@ -2225,6 +2225,53 @@ static void edl_update(MPContext *mpctx) } +// style & 1 == 0 means seek relative to current position, == 1 means relative +// style & 2 == 0 means amount in seconds, == 2 means fraction of file length +// return -1 if seek failed (non-seekable stream?), 0 otherwise +static int seek(MPContext *mpctx, double amount, int style) +{ + current_module = "seek"; + if (demux_seek(mpctx->demuxer, amount, audio_delay, style) == 0) + return -1; + + if (mpctx->sh_video) { + current_module = "seek_video_reset"; + resync_video_stream(mpctx->sh_video); + if (vo_config_count) + mpctx->video_out->control(VOCTRL_RESET, NULL); + mpctx->sh_video->num_buffered_pts = 0; + mpctx->sh_video->last_pts = MP_NOPTS_VALUE; + mpctx->num_buffered_frames = 0; + // Not all demuxers set d_video->pts during seek, so this value + // (which is used by at least vobsub and edl code below) may + // be completely wrong (probably 0). + mpctx->sh_video->pts = mpctx->d_video->pts; + update_subtitles(mpctx->sh_video, mpctx->d_sub, 1); + } + + if (mpctx->sh_audio) { + current_module = "seek_audio_reset"; + mpctx->audio_out->reset(); // stop audio, throwing away buffered data + mpctx->sh_audio->a_buffer_len = 0; + mpctx->sh_audio->a_out_buffer_len = 0; + } + + if (vo_vobsub) { + current_module = "seek_vobsub_reset"; + vobsub_seek(vo_vobsub, mpctx->sh_video->pts); + } + + edl_seek_reset(mpctx); + + c_total = 0; + max_pts_correction = 0.1; + audio_time_usage = 0; video_time_usage = 0; vout_time_usage = 0; + drop_frame_cnt = 0; + + current_module = NULL; + return 0; +} + int main(int argc,char* argv[]){ @@ -3527,52 +3574,18 @@ if(step_sec>0) { } if(rel_seek_secs || abs_seek_pos){ - current_module="seek"; - if(demux_seek(mpctx->demuxer,rel_seek_secs,audio_delay,abs_seek_pos)){ - // success: - /* FIXME there should be real seeking for vobsub */ - if(mpctx->sh_video) mpctx->sh_video->pts=mpctx->d_video->pts; - if (vo_vobsub) - //vobsub_reset(vo_vobsub); - vobsub_seek(vo_vobsub,mpctx->sh_video->pts); - - if(mpctx->sh_video){ - current_module="seek_video_reset"; - resync_video_stream(mpctx->sh_video); - if(vo_config_count) mpctx->video_out->control(VOCTRL_RESET,NULL); - mpctx->sh_video->num_buffered_pts = 0; - mpctx->sh_video->last_pts = MP_NOPTS_VALUE; - } - - if(mpctx->sh_audio){ - current_module="seek_audio_reset"; - mpctx->audio_out->reset(); // stop audio, throwing away buffered data - mpctx->sh_audio->a_buffer_len = 0; - mpctx->sh_audio->a_out_buffer_len = 0; - } + if (seek(mpctx, rel_seek_secs, abs_seek_pos) >= 0) { // Set OSD: if(!loop_seek){ if( !edl_decision ) set_osd_bar(0,"Position",0,100,demuxer_get_percent_pos(mpctx->demuxer)); } - - if(mpctx->sh_video) { - c_total=0; - max_pts_correction=0.1; + // osd_function has been set (or not) by the code triggering the seek osd_visible=(GetTimerMS() + 1000) | 1; // to revert to PLAY pointer after 1 sec - audio_time_usage=0; video_time_usage=0; vout_time_usage=0; - drop_frame_cnt=0; - - update_subtitles(mpctx->sh_video, mpctx->d_sub, 1); - } } - edl_seek_reset(mpctx); - rel_seek_secs=0; abs_seek_pos=0; - mpctx->num_buffered_frames = 0; - current_module=NULL; loop_seek=0; } |