Index: mencoder.c =================================================================== RCS file: /cvsroot/mplayer/main/mencoder.c,v retrieving revision 1.332 diff -u -r1.332 mencoder.c --- mencoder.c 26 Jan 2006 19:32:05 -0000 1.332 +++ mencoder.c 5 Feb 2006 22:56:22 -0000 @@ -1036,12 +1036,12 @@ else sscanf(seek_to_sec, "%f", &d); - demux_seek(demuxer, d, 1); + demux_seek(demuxer, d, audio_delay, 1); // there is 2 way to handle the -ss option in 3-pass mode: // > 1. do the first pass for the whole file, and use -ss for 2nd/3rd pases only // > 2. do all the 3 passes with the same -ss value // this line enables behaviour 1. (and kills 2. at the same time): -// if(demuxer2) demux_seek(demuxer2, d, 1); +// if(demuxer2) demux_seek(demuxer2, d, audio_delay, 1); } if (out_file_format == MUXER_TYPE_MPEG) @@ -1769,7 +1769,7 @@ if (sh_video->pts >= next_edl_record->stop_sec) return 1; // nothing to do... if (!edl_seek_type) { - if(demux_seek(demuxer, next_edl_record->stop_sec - sh_video->pts, 0)){ + if(demux_seek(demuxer, next_edl_record->stop_sec - sh_video->pts, audio_delay, 0)){ sh_video->pts = demuxer->video->pts; //if (vo_vobsub) vobsub_seek(vo_vobsub,sh_video->pts); resync_video_stream(sh_video); Index: mplayer.c =================================================================== RCS file: /cvsroot/mplayer/main/mplayer.c,v retrieving revision 1.904 diff -u -r1.904 mplayer.c --- mplayer.c 13 Jan 2006 20:06:59 -0000 1.904 +++ mplayer.c 5 Feb 2006 22:56:23 -0000 @@ -4185,7 +4185,7 @@ if(rel_seek_secs || abs_seek_pos){ current_module="seek"; - if(demux_seek(demuxer,rel_seek_secs,abs_seek_pos)){ + if(demux_seek(demuxer,rel_seek_secs,audio_delay,abs_seek_pos)){ // success: /* FIXME there should be real seeking for vobsub */ if(sh_video) sh_video->pts=d_video->pts; Index: libmpdemux/demux_asf.c =================================================================== RCS file: /cvsroot/mplayer/main/libmpdemux/demux_asf.c,v retrieving revision 1.40 diff -u -r1.40 demux_asf.c --- libmpdemux/demux_asf.c 12 Jan 2006 20:04:34 -0000 1.40 +++ libmpdemux/demux_asf.c 5 Feb 2006 22:56:24 -0000 @@ -369,7 +369,7 @@ extern void skip_audio_frame(sh_audio_t *sh_audio); -static void demux_seek_asf(demuxer_t *demuxer,float rel_seek_secs,int flags){ +static void demux_seek_asf(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags){ demux_stream_t *d_audio=demuxer->audio; demux_stream_t *d_video=demuxer->video; sh_audio_t *sh_audio=d_audio->sh; Index: libmpdemux/demux_avi.c =================================================================== RCS file: /cvsroot/mplayer/main/libmpdemux/demux_avi.c,v retrieving revision 1.70 diff -u -r1.70 demux_avi.c --- libmpdemux/demux_avi.c 12 Jan 2006 20:04:34 -0000 1.70 +++ libmpdemux/demux_avi.c 5 Feb 2006 22:56:24 -0000 @@ -618,7 +618,7 @@ //extern float initial_pts_delay; -void demux_seek_avi(demuxer_t *demuxer,float rel_seek_secs,int flags){ +void demux_seek_avi(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags){ avi_priv_t *priv=demuxer->priv; demux_stream_t *d_audio=demuxer->audio; demux_stream_t *d_video=demuxer->video; @@ -706,8 +706,8 @@ curr_audio_pos/=align; curr_audio_pos*=align; #else - curr_audio_pos=(priv->avi_video_pts)*(float)sh_audio->audio.dwRate/(float)sh_audio->audio.dwScale; - curr_audio_pos-=sh_audio->audio.dwStart; + /* immediate seeking to audio position, including when streams are delayed */ + curr_audio_pos=(priv->avi_video_pts + audio_delay)*(float)sh_audio->audio.dwRate/(float)sh_audio->audio.dwScale; curr_audio_pos*=sh_audio->audio.dwSampleSize; #endif @@ -733,7 +733,8 @@ } else { // VBR audio - int chunks=(priv->avi_video_pts)*(float)sh_audio->audio.dwRate/(float)sh_audio->audio.dwScale; + /* immediate seeking to audio position, including when streams are delayed */ + int chunks=(priv->avi_video_pts + audio_delay)*(float)sh_audio->audio.dwRate/(float)sh_audio->audio.dwScale; audio_chunk_pos=0; // find audio chunk pos: Index: libmpdemux/demux_avs.c =================================================================== RCS file: /cvsroot/mplayer/main/libmpdemux/demux_avs.c,v retrieving revision 1.6 diff -u -r1.6 demux_avs.c --- libmpdemux/demux_avs.c 2 Sep 2005 08:32:32 -0000 1.6 +++ libmpdemux/demux_avs.c 5 Feb 2006 22:56:24 -0000 @@ -375,7 +375,7 @@ } } -static void demux_seek_avs(demuxer_t *demuxer, float rel_seek_secs,int flags) +static void demux_seek_avs(demuxer_t *demuxer, float rel_seek_secs, float audio_delay, int flags) { demux_stream_t *d_video=demuxer->video; sh_video_t *sh_video=d_video->sh; Index: libmpdemux/demux_demuxers.c =================================================================== RCS file: /cvsroot/mplayer/main/libmpdemux/demux_demuxers.c,v retrieving revision 1.7 diff -u -r1.7 demux_demuxers.c --- libmpdemux/demux_demuxers.c 30 Oct 2005 09:13:32 -0000 1.7 +++ libmpdemux/demux_demuxers.c 5 Feb 2006 22:56:24 -0000 @@ -57,7 +57,7 @@ return 0; } -static void demux_demuxers_seek(demuxer_t *demuxer,float rel_seek_secs,int flags) { +static void demux_demuxers_seek(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags) { dd_priv_t* priv; float pos; priv=demuxer->priv; @@ -66,13 +66,13 @@ priv->sd->stream->eof = 0; // Seek video - demux_seek(priv->vd,rel_seek_secs,flags); + demux_seek(priv->vd,rel_seek_secs,audio_delay,flags); // Get the new pos pos = demuxer->video->pts; if(priv->ad != priv->vd) { sh_audio_t* sh = (sh_audio_t*)demuxer->audio->sh; - demux_seek(priv->ad,pos,1); + demux_seek(priv->ad,pos,audio_delay,1); // In case the demuxer don't set pts if(!demuxer->audio->pts) demuxer->audio->pts = pos-((ds_tell_pts(demuxer->audio)-sh->a_in_buffer_len)/(float)sh->i_bps); @@ -80,7 +80,7 @@ } if(priv->sd != priv->vd) - demux_seek(priv->sd,pos,1); + demux_seek(priv->sd,pos,audio_delay,1); } Index: libmpdemux/demux_film.c =================================================================== RCS file: /cvsroot/mplayer/main/libmpdemux/demux_film.c,v retrieving revision 1.14 diff -u -r1.14 demux_film.c --- libmpdemux/demux_film.c 12 Jan 2006 20:04:34 -0000 1.14 +++ libmpdemux/demux_film.c 5 Feb 2006 22:56:24 -0000 @@ -46,7 +46,7 @@ unsigned int film_version; } film_data_t; -static void demux_seek_film(demuxer_t *demuxer, float rel_seek_secs, int flags) +static void demux_seek_film(demuxer_t *demuxer, float rel_seek_secs, float audio_delay, int flags) { film_data_t *film_data = (film_data_t *)demuxer->priv; int new_current_chunk=(flags&1)?0:film_data->current_chunk; Index: libmpdemux/demux_fli.c =================================================================== RCS file: /cvsroot/mplayer/main/libmpdemux/demux_fli.c,v retrieving revision 1.11 diff -u -r1.11 demux_fli.c --- libmpdemux/demux_fli.c 5 Aug 2005 19:57:46 -0000 1.11 +++ libmpdemux/demux_fli.c 5 Feb 2006 22:56:24 -0000 @@ -22,7 +22,7 @@ unsigned int *frame_size; } fli_frames_t; -static void demux_seek_fli(demuxer_t *demuxer,float rel_seek_secs,int flags){ +static void demux_seek_fli(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags){ fli_frames_t *frames = (fli_frames_t *)demuxer->priv; sh_video_t *sh_video = demuxer->video->sh; int newpos=(flags&1)?0:frames->current_frame; Index: libmpdemux/demux_lavf.c =================================================================== RCS file: /cvsroot/mplayer/main/libmpdemux/demux_lavf.c,v retrieving revision 1.24 diff -u -r1.24 demux_lavf.c --- libmpdemux/demux_lavf.c 13 Jan 2006 00:23:31 -0000 1.24 +++ libmpdemux/demux_lavf.c 5 Feb 2006 22:56:24 -0000 @@ -389,9 +389,9 @@ return 1; } -static void demux_seek_lavf(demuxer_t *demuxer, float rel_seek_secs, int flags){ +static void demux_seek_lavf(demuxer_t *demuxer, float rel_seek_secs, float audio_delay, int flags){ lavf_priv_t *priv = demuxer->priv; - mp_msg(MSGT_DEMUX,MSGL_DBG2,"demux_seek_lavf(%p, %f, %d)\n", demuxer, rel_seek_secs, flags); + mp_msg(MSGT_DEMUX,MSGL_DBG2,"demux_seek_lavf(%p, %f, %f, %d)\n", demuxer, rel_seek_secs, audio_delay, flags); #if LIBAVFORMAT_BUILD < 4619 av_seek_frame(priv->avfc, -1, priv->last_pts + rel_seek_secs*AV_TIME_BASE); Index: libmpdemux/demux_mf.c =================================================================== RCS file: /cvsroot/mplayer/main/libmpdemux/demux_mf.c,v retrieving revision 1.14 diff -u -r1.14 demux_mf.c --- libmpdemux/demux_mf.c 5 Aug 2005 19:57:46 -0000 1.14 +++ libmpdemux/demux_mf.c 5 Feb 2006 22:56:24 -0000 @@ -15,7 +15,7 @@ #include "stheader.h" #include "mf.h" -static void demux_seek_mf(demuxer_t *demuxer,float rel_seek_secs,int flags){ +static void demux_seek_mf(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags){ mf_t * mf = (mf_t *)demuxer->priv; sh_video_t * sh_video = demuxer->video->sh; int newpos = (flags & 1)?0:mf->curr_frame; Index: libmpdemux/demux_mov.c =================================================================== RCS file: /cvsroot/mplayer/main/libmpdemux/demux_mov.c,v retrieving revision 1.136 diff -u -r1.136 demux_mov.c --- libmpdemux/demux_mov.c 12 Jan 2006 20:04:34 -0000 1.136 +++ libmpdemux/demux_mov.c 5 Feb 2006 22:56:25 -0000 @@ -2007,7 +2007,7 @@ return pts; } -static void demux_seek_mov(demuxer_t *demuxer,float pts,int flags){ +static void demux_seek_mov(demuxer_t *demuxer,float pts,float audio_delay,int flags){ mov_priv_t* priv=demuxer->priv; demux_stream_t* ds; mov_track_t* trak; Index: libmpdemux/demux_mpg.c =================================================================== RCS file: /cvsroot/mplayer/main/libmpdemux/demux_mpg.c,v retrieving revision 1.69 diff -u -r1.69 demux_mpg.c --- libmpdemux/demux_mpg.c 12 Jan 2006 20:04:34 -0000 1.69 +++ libmpdemux/demux_mpg.c 5 Feb 2006 22:56:25 -0000 @@ -676,7 +676,7 @@ extern void skip_audio_frame(sh_audio_t *sh_audio); -void demux_seek_mpg(demuxer_t *demuxer,float rel_seek_secs,int flags){ +void demux_seek_mpg(demuxer_t *demuxer,float rel_seek_secs,float audio_delay, int flags){ demux_stream_t *d_audio=demuxer->audio; demux_stream_t *d_video=demuxer->video; sh_audio_t *sh_audio=d_audio->sh; Index: libmpdemux/demux_nsv.c =================================================================== RCS file: /cvsroot/mplayer/main/libmpdemux/demux_nsv.c,v retrieving revision 1.12 diff -u -r1.12 demux_nsv.c --- libmpdemux/demux_nsv.c 30 Aug 2005 19:06:55 -0000 1.12 +++ libmpdemux/demux_nsv.c 5 Feb 2006 22:56:25 -0000 @@ -34,7 +34,7 @@ /** * Seeking still to be implemented */ -static void demux_seek_nsv ( demuxer_t *demuxer, float rel_seek_secs, int flags ) +static void demux_seek_nsv ( demuxer_t *demuxer, float rel_seek_secs, float audio_delay, int flags ) { // seeking is not yet implemented } Index: libmpdemux/demux_nuv.c =================================================================== RCS file: /cvsroot/mplayer/main/libmpdemux/demux_nuv.c,v retrieving revision 1.16 diff -u -r1.16 demux_nuv.c --- libmpdemux/demux_nuv.c 25 Oct 2005 20:01:09 -0000 1.16 +++ libmpdemux/demux_nuv.c 5 Feb 2006 22:56:25 -0000 @@ -63,7 +63,7 @@ /** * Seek to a position relative to the current position, indicated in time. */ -static void demux_seek_nuv ( demuxer_t *demuxer, float rel_seek_secs, int flags ) +static void demux_seek_nuv ( demuxer_t *demuxer, float rel_seek_secs, float audio_delay, int flags ) { #define MAX_TIME 1000000 nuv_priv_t* priv = demuxer->priv; Index: libmpdemux/demux_pva.c =================================================================== RCS file: /cvsroot/mplayer/main/libmpdemux/demux_pva.c,v retrieving revision 1.7 diff -u -r1.7 demux_pva.c --- libmpdemux/demux_pva.c 12 Jan 2006 20:04:34 -0000 1.7 +++ libmpdemux/demux_pva.c 5 Feb 2006 22:56:25 -0000 @@ -466,7 +466,7 @@ return 1; } -static void demux_seek_pva(demuxer_t * demuxer,float rel_seek_secs,int flags) +static void demux_seek_pva(demuxer_t * demuxer,float rel_seek_secs,float audio_delay,int flags) { int total_bitrate=0; off_t dest_offset; Index: libmpdemux/demux_rawdv.c =================================================================== RCS file: /cvsroot/mplayer/main/libmpdemux/demux_rawdv.c,v retrieving revision 1.12 diff -u -r1.12 demux_rawdv.c --- libmpdemux/demux_rawdv.c 12 Jan 2006 20:04:34 -0000 1.12 +++ libmpdemux/demux_rawdv.c 5 Feb 2006 22:56:25 -0000 @@ -36,7 +36,7 @@ dv_decoder_t *decoder; } rawdv_frames_t; -static void demux_seek_rawdv(demuxer_t *demuxer,float rel_seek_secs,int flags) +static void demux_seek_rawdv(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags) { rawdv_frames_t *frames = (rawdv_frames_t *)demuxer->priv; sh_video_t *sh_video = demuxer->video->sh; Index: libmpdemux/demux_real.c =================================================================== RCS file: /cvsroot/mplayer/main/libmpdemux/demux_real.c,v retrieving revision 1.86 diff -u -r1.86 demux_real.c --- libmpdemux/demux_real.c 15 Jan 2006 22:00:53 -0000 1.86 +++ libmpdemux/demux_real.c 5 Feb 2006 22:56:26 -0000 @@ -1825,7 +1825,7 @@ } /* please upload RV10 samples WITH INDEX CHUNK */ -static void demux_seek_real(demuxer_t *demuxer, float rel_seek_secs, int flags) +static void demux_seek_real(demuxer_t *demuxer, float rel_seek_secs, float audio_delay, int flags) { real_priv_t *priv = demuxer->priv; demux_stream_t *d_audio = demuxer->audio; Index: libmpdemux/demux_realaud.c =================================================================== RCS file: /cvsroot/mplayer/main/libmpdemux/demux_realaud.c,v retrieving revision 1.11 diff -u -r1.11 demux_realaud.c --- libmpdemux/demux_realaud.c 15 Jan 2006 21:58:10 -0000 1.11 +++ libmpdemux/demux_realaud.c 5 Feb 2006 22:56:26 -0000 @@ -341,7 +341,7 @@ #if 0 /* please upload RV10 samples WITH INDEX CHUNK */ -int demux_seek_ra(demuxer_t *demuxer, float rel_seek_secs, int flags) +int demux_seek_ra(demuxer_t *demuxer, float rel_seek_secs, float audio_delay, int flags) { real_priv_t *priv = demuxer->priv; demux_stream_t *d_audio = demuxer->audio; Index: libmpdemux/demux_ts.c =================================================================== RCS file: /cvsroot/mplayer/main/libmpdemux/demux_ts.c,v retrieving revision 1.42 diff -u -r1.42 demux_ts.c --- libmpdemux/demux_ts.c 27 Jan 2006 23:07:16 -0000 1.42 +++ libmpdemux/demux_ts.c 5 Feb 2006 22:56:26 -0000 @@ -3071,7 +3071,7 @@ extern int sync_video_packet(demux_stream_t *); extern int skip_video_packet(demux_stream_t *); -static void demux_seek_ts(demuxer_t *demuxer, float rel_seek_secs, int flags) +static void demux_seek_ts(demuxer_t *demuxer, float rel_seek_secs, float audio_delay, int flags) { demux_stream_t *d_audio=demuxer->audio; demux_stream_t *d_video=demuxer->video; Index: libmpdemux/demux_ty.c =================================================================== RCS file: /cvsroot/mplayer/main/libmpdemux/demux_ty.c,v retrieving revision 1.13 diff -u -r1.13 demux_ty.c --- libmpdemux/demux_ty.c 12 Jan 2006 20:04:34 -0000 1.13 +++ libmpdemux/demux_ty.c 5 Feb 2006 22:56:27 -0000 @@ -1237,7 +1237,7 @@ return( 1 ); } -static void demux_seek_ty( demuxer_t *demuxer, float rel_seek_secs, int flags ) +static void demux_seek_ty( demuxer_t *demuxer, float rel_seek_secs, float audio_delay, int flags ) { demux_stream_t *d_audio = demuxer->audio; demux_stream_t *d_video = demuxer->video; Index: libmpdemux/demux_vqf.c =================================================================== RCS file: /cvsroot/mplayer/main/libmpdemux/demux_vqf.c,v retrieving revision 1.6 diff -u -r1.6 demux_vqf.c --- libmpdemux/demux_vqf.c 18 Nov 2005 14:39:19 -0000 1.6 +++ libmpdemux/demux_vqf.c 5 Feb 2006 22:56:27 -0000 @@ -179,7 +179,7 @@ return 1; } -static void demux_seek_vqf(demuxer_t *demuxer,float rel_seek_secs,int flags){ +static void demux_seek_vqf(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags){ #if 0 stream_t* s = demuxer->stream; sh_audio_t* sh_audio = demuxer->audio->sh; Index: libmpdemux/demux_y4m.c =================================================================== RCS file: /cvsroot/mplayer/main/libmpdemux/demux_y4m.c,v retrieving revision 1.10 diff -u -r1.10 demux_y4m.c --- libmpdemux/demux_y4m.c 5 Aug 2005 19:57:47 -0000 1.10 +++ libmpdemux/demux_y4m.c 5 Feb 2006 22:56:27 -0000 @@ -231,7 +231,7 @@ return demuxer; } -static void demux_seek_y4m(demuxer_t *demuxer, float rel_seek_secs, int flags) { +static void demux_seek_y4m(demuxer_t *demuxer, float rel_seek_secs, float audio_delay, int flags) { sh_video_t* sh = demuxer->video->sh; y4m_priv_t* priv = demuxer->priv; int rel_seek_frames = sh->fps*rel_seek_secs; Index: libmpdemux/demuxer.c =================================================================== RCS file: /cvsroot/mplayer/main/libmpdemux/demuxer.c,v retrieving revision 1.214 diff -u -r1.214 demuxer.c --- libmpdemux/demuxer.c 17 Jan 2006 20:04:49 -0000 1.214 +++ libmpdemux/demuxer.c 5 Feb 2006 22:56:27 -0000 @@ -859,7 +859,7 @@ } -int demux_seek(demuxer_t *demuxer,float rel_seek_secs,int flags){ +int demux_seek(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags){ demux_stream_t *d_audio=demuxer->audio; demux_stream_t *d_video=demuxer->video; sh_audio_t *sh_audio=d_audio->sh; Index: libmpdemux/demuxer.h =================================================================== RCS file: /cvsroot/mplayer/main/libmpdemux/demuxer.h,v retrieving revision 1.85 diff -u -r1.85 demuxer.h --- libmpdemux/demuxer.h 17 Jan 2006 20:04:49 -0000 1.85 +++ libmpdemux/demuxer.h 5 Feb 2006 22:56:27 -0000 @@ -300,7 +300,7 @@ } demuxer_t* demux_open(stream_t *stream,int file_format,int aid,int vid,int sid,char* filename); -int demux_seek(demuxer_t *demuxer,float rel_seek_secs,int flags); +int demux_seek(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags); demuxer_t* new_demuxers_demuxer(demuxer_t* vd, demuxer_t* ad, demuxer_t* sd); // AVI demuxer params: