From 1ab575101ab9e2e250d782b4e104fcca1c1c66b0 Mon Sep 17 00:00:00 2001 From: corey Date: Fri, 17 Feb 2006 01:57:41 +0000 Subject: Second-try commit of this patch. 1. Include audio_delay as an argument to demux_seek. 2. Modify demux_seek_avi to adjust the audio/video stream positions so that mplayer/mencoder will instantly be in sync even when -delay is specified. I've quadruple checked this time; hopefully I haven't missed anything. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@17637 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libmpdemux/demux_aac.c | 2 +- libmpdemux/demux_asf.c | 2 +- libmpdemux/demux_audio.c | 2 +- libmpdemux/demux_avi.c | 9 +++++---- libmpdemux/demux_avs.c | 2 +- libmpdemux/demux_demuxers.c | 8 ++++---- libmpdemux/demux_film.c | 2 +- libmpdemux/demux_fli.c | 2 +- libmpdemux/demux_lavf.c | 4 ++-- libmpdemux/demux_mf.c | 2 +- libmpdemux/demux_mov.c | 2 +- libmpdemux/demux_mpc.c | 2 +- libmpdemux/demux_mpg.c | 2 +- libmpdemux/demux_nsv.c | 2 +- libmpdemux/demux_nuv.c | 2 +- libmpdemux/demux_ogg.c | 2 +- libmpdemux/demux_pva.c | 2 +- libmpdemux/demux_rawaudio.c | 2 +- libmpdemux/demux_rawdv.c | 2 +- libmpdemux/demux_rawvideo.c | 2 +- libmpdemux/demux_real.c | 2 +- libmpdemux/demux_realaud.c | 2 +- libmpdemux/demux_ts.c | 2 +- libmpdemux/demux_ty.c | 2 +- libmpdemux/demux_vqf.c | 2 +- libmpdemux/demux_xmms.c | 2 +- libmpdemux/demux_y4m.c | 2 +- libmpdemux/demuxer.c | 4 ++-- libmpdemux/demuxer.h | 4 ++-- mencoder.c | 6 +++--- mplayer.c | 2 +- 31 files changed, 43 insertions(+), 42 deletions(-) diff --git a/libmpdemux/demux_aac.c b/libmpdemux/demux_aac.c index 840ce866a0..eb0d853933 100644 --- a/libmpdemux/demux_aac.c +++ b/libmpdemux/demux_aac.c @@ -207,7 +207,7 @@ static int demux_aac_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds) //This is an almost verbatim copy of high_res_mp3_seek(), from demux_audio.c -static void demux_aac_seek(demuxer_t *demuxer, float rel_seek_secs, int flags) +static void demux_aac_seek(demuxer_t *demuxer, float rel_seek_secs, float audio_delay, int flags) { aac_priv_t *priv = (aac_priv_t *) demuxer->priv; demux_stream_t *d_audio=demuxer->audio; diff --git a/libmpdemux/demux_asf.c b/libmpdemux/demux_asf.c index 4a177b70a3..c21ed166f6 100644 --- a/libmpdemux/demux_asf.c +++ b/libmpdemux/demux_asf.c @@ -369,7 +369,7 @@ static int demux_asf_fill_buffer(demuxer_t *demux, demux_stream_t *ds){ 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; diff --git a/libmpdemux/demux_audio.c b/libmpdemux/demux_audio.c index 35bd6a274f..452850f6ca 100644 --- a/libmpdemux/demux_audio.c +++ b/libmpdemux/demux_audio.c @@ -476,7 +476,7 @@ static void high_res_mp3_seek(demuxer_t *demuxer,float time) { } } -static void demux_audio_seek(demuxer_t *demuxer,float rel_seek_secs,int flags){ +static void demux_audio_seek(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags){ sh_audio_t* sh_audio; stream_t* s; int base,pos; diff --git a/libmpdemux/demux_avi.c b/libmpdemux/demux_avi.c index 6febdd160c..21ab48dc6c 100644 --- a/libmpdemux/demux_avi.c +++ b/libmpdemux/demux_avi.c @@ -618,7 +618,7 @@ static demuxer_t* demux_open_avi(demuxer_t* demuxer){ //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 @@ void demux_seek_avi(demuxer_t *demuxer,float rel_seek_secs,int flags){ 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 @@ void demux_seek_avi(demuxer_t *demuxer,float rel_seek_secs,int flags){ } 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: diff --git a/libmpdemux/demux_avs.c b/libmpdemux/demux_avs.c index bc3829da4d..7c8de70225 100644 --- a/libmpdemux/demux_avs.c +++ b/libmpdemux/demux_avs.c @@ -375,7 +375,7 @@ static void demux_close_avs(demuxer_t* demuxer) } } -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; diff --git a/libmpdemux/demux_demuxers.c b/libmpdemux/demux_demuxers.c index a3e294a04c..092be8d505 100644 --- a/libmpdemux/demux_demuxers.c +++ b/libmpdemux/demux_demuxers.c @@ -57,7 +57,7 @@ static int demux_demuxers_fill_buffer(demuxer_t *demux,demux_stream_t *ds) { 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 @@ static void demux_demuxers_seek(demuxer_t *demuxer,float rel_seek_secs,int flags 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 @@ static void demux_demuxers_seek(demuxer_t *demuxer,float rel_seek_secs,int flags } if(priv->sd != priv->vd) - demux_seek(priv->sd,pos,1); + demux_seek(priv->sd,pos,audio_delay,1); } diff --git a/libmpdemux/demux_film.c b/libmpdemux/demux_film.c index a15a252e84..04e5b95481 100644 --- a/libmpdemux/demux_film.c +++ b/libmpdemux/demux_film.c @@ -46,7 +46,7 @@ typedef struct _film_data_t 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; diff --git a/libmpdemux/demux_fli.c b/libmpdemux/demux_fli.c index 2b23835c52..6750a256b4 100644 --- a/libmpdemux/demux_fli.c +++ b/libmpdemux/demux_fli.c @@ -22,7 +22,7 @@ typedef struct _fli_frames_t { 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; diff --git a/libmpdemux/demux_lavf.c b/libmpdemux/demux_lavf.c index 2ee83e7708..e2aaa64de7 100644 --- a/libmpdemux/demux_lavf.c +++ b/libmpdemux/demux_lavf.c @@ -389,9 +389,9 @@ static int demux_lavf_fill_buffer(demuxer_t *demux, demux_stream_t *dsds){ 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); diff --git a/libmpdemux/demux_mf.c b/libmpdemux/demux_mf.c index 415ff0a68b..a676d3ba34 100644 --- a/libmpdemux/demux_mf.c +++ b/libmpdemux/demux_mf.c @@ -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; diff --git a/libmpdemux/demux_mov.c b/libmpdemux/demux_mov.c index ae2b06abe5..3537ce39ce 100644 --- a/libmpdemux/demux_mov.c +++ b/libmpdemux/demux_mov.c @@ -2007,7 +2007,7 @@ if(trak->samplesize){ 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; diff --git a/libmpdemux/demux_mpc.c b/libmpdemux/demux_mpc.c index 139e96c604..0f7b18da2f 100644 --- a/libmpdemux/demux_mpc.c +++ b/libmpdemux/demux_mpc.c @@ -153,7 +153,7 @@ static int demux_mpc_fill_buffer(demuxer_t *demux, demux_stream_t *ds) { return 1; } -static void demux_mpc_seek(demuxer_t *demuxer,float rel_seek_secs,int flags){ +static void demux_mpc_seek(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags){ sh_audio_t* sh_audio = demuxer->audio->sh; da_priv_t* priv = demuxer->priv; stream_t* s = demuxer->stream; diff --git a/libmpdemux/demux_mpg.c b/libmpdemux/demux_mpg.c index 9b11dc88a1..647ece7e83 100644 --- a/libmpdemux/demux_mpg.c +++ b/libmpdemux/demux_mpg.c @@ -676,7 +676,7 @@ do{ 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; diff --git a/libmpdemux/demux_nsv.c b/libmpdemux/demux_nsv.c index 92942599e5..94a0e3f68f 100644 --- a/libmpdemux/demux_nsv.c +++ b/libmpdemux/demux_nsv.c @@ -34,7 +34,7 @@ typedef struct { /** * 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 } diff --git a/libmpdemux/demux_nuv.c b/libmpdemux/demux_nuv.c index a09ad71d7a..4263c0ef25 100644 --- a/libmpdemux/demux_nuv.c +++ b/libmpdemux/demux_nuv.c @@ -63,7 +63,7 @@ static int nearestBitrate(int bitrate) { /** * 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; diff --git a/libmpdemux/demux_ogg.c b/libmpdemux/demux_ogg.c index f2424c4dff..aa91b5bee7 100644 --- a/libmpdemux/demux_ogg.c +++ b/libmpdemux/demux_ogg.c @@ -1422,7 +1422,7 @@ demuxer_t* init_avi_with_ogg(demuxer_t* demuxer) { } -static void demux_ogg_seek(demuxer_t *demuxer,float rel_seek_secs,int flags) { +static void demux_ogg_seek(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags) { ogg_demuxer_t* ogg_d = demuxer->priv; ogg_sync_state* sync = &ogg_d->sync; ogg_page* page= &ogg_d->page; diff --git a/libmpdemux/demux_pva.c b/libmpdemux/demux_pva.c index 0ad8faf87a..419536d3dc 100644 --- a/libmpdemux/demux_pva.c +++ b/libmpdemux/demux_pva.c @@ -466,7 +466,7 @@ int pva_get_payload(demuxer_t * d,pva_payload_t * payload) 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; diff --git a/libmpdemux/demux_rawaudio.c b/libmpdemux/demux_rawaudio.c index 2da02ce955..a816de6654 100644 --- a/libmpdemux/demux_rawaudio.c +++ b/libmpdemux/demux_rawaudio.c @@ -79,7 +79,7 @@ static int demux_rawaudio_fill_buffer(demuxer_t* demuxer, demux_stream_t *ds) { return 1; } -static void demux_rawaudio_seek(demuxer_t *demuxer,float rel_seek_secs,int flags){ +static void demux_rawaudio_seek(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags){ stream_t* s = demuxer->stream; sh_audio_t* sh_audio = demuxer->audio->sh; off_t base,pos; diff --git a/libmpdemux/demux_rawdv.c b/libmpdemux/demux_rawdv.c index 1d4886ff98..8163a34fc0 100644 --- a/libmpdemux/demux_rawdv.c +++ b/libmpdemux/demux_rawdv.c @@ -36,7 +36,7 @@ typedef struct 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; diff --git a/libmpdemux/demux_rawvideo.c b/libmpdemux/demux_rawvideo.c index 4e0f42caec..d493792cbd 100644 --- a/libmpdemux/demux_rawvideo.c +++ b/libmpdemux/demux_rawvideo.c @@ -118,7 +118,7 @@ static int demux_rawvideo_fill_buffer(demuxer_t* demuxer, demux_stream_t *ds) { return 1; } -static void demux_rawvideo_seek(demuxer_t *demuxer,float rel_seek_secs,int flags){ +static void demux_rawvideo_seek(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags){ stream_t* s = demuxer->stream; sh_video_t* sh_video = demuxer->video->sh; off_t pos; diff --git a/libmpdemux/demux_real.c b/libmpdemux/demux_real.c index a4acc6fe4f..2f7e9bc574 100644 --- a/libmpdemux/demux_real.c +++ b/libmpdemux/demux_real.c @@ -1825,7 +1825,7 @@ static void demux_close_real(demuxer_t *demuxer) } /* 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; diff --git a/libmpdemux/demux_realaud.c b/libmpdemux/demux_realaud.c index 2d4a1672e9..1346e34bc2 100644 --- a/libmpdemux/demux_realaud.c +++ b/libmpdemux/demux_realaud.c @@ -341,7 +341,7 @@ static void demux_close_ra(demuxer_t *demuxer) #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; diff --git a/libmpdemux/demux_ts.c b/libmpdemux/demux_ts.c index 9e73c01408..be3adfcafb 100644 --- a/libmpdemux/demux_ts.c +++ b/libmpdemux/demux_ts.c @@ -3071,7 +3071,7 @@ extern int videobuf_code_len; 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; diff --git a/libmpdemux/demux_ty.c b/libmpdemux/demux_ty.c index 385ccbb909..d5a07386ba 100644 --- a/libmpdemux/demux_ty.c +++ b/libmpdemux/demux_ty.c @@ -1237,7 +1237,7 @@ static int demux_ty_fill_buffer( demuxer_t *demux, demux_stream_t *dsds ) 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; diff --git a/libmpdemux/demux_vqf.c b/libmpdemux/demux_vqf.c index 092b0d6cd9..6ce7082a24 100644 --- a/libmpdemux/demux_vqf.c +++ b/libmpdemux/demux_vqf.c @@ -179,7 +179,7 @@ static int demux_vqf_fill_buffer(demuxer_t* demuxer, demux_stream_t *ds) { 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; diff --git a/libmpdemux/demux_xmms.c b/libmpdemux/demux_xmms.c index bda2d6a0b8..fbaaf840ff 100644 --- a/libmpdemux/demux_xmms.c +++ b/libmpdemux/demux_xmms.c @@ -297,7 +297,7 @@ static int demux_xmms_fill_buffer(demuxer_t* demuxer, demux_stream_t *ds) { return 1; } -static void demux_xmms_seek(demuxer_t *demuxer,float rel_seek_secs,int flags){ +static void demux_xmms_seek(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags){ stream_t* s = demuxer->stream; sh_audio_t* sh_audio = demuxer->audio->sh; xmms_priv_t *priv=demuxer->priv; diff --git a/libmpdemux/demux_y4m.c b/libmpdemux/demux_y4m.c index 2fe784b4a7..58a8afcb9a 100644 --- a/libmpdemux/demux_y4m.c +++ b/libmpdemux/demux_y4m.c @@ -231,7 +231,7 @@ static demuxer_t* demux_open_y4m(demuxer_t* demuxer){ 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; diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c index 8ff2fc747f..b8b0a14ae9 100644 --- a/libmpdemux/demuxer.c +++ b/libmpdemux/demuxer.c @@ -859,7 +859,7 @@ demuxer_t* demux_open(stream_t *vs,int file_format,int audio_id,int video_id,int } -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; @@ -893,7 +893,7 @@ if(!demuxer->seekable){ #endif if (demuxer->desc->seek) - demuxer->desc->seek(demuxer,rel_seek_secs,flags); + demuxer->desc->seek(demuxer,rel_seek_secs,audio_delay,flags); if (sh_audio) resync_audio_stream(sh_audio); diff --git a/libmpdemux/demuxer.h b/libmpdemux/demuxer.h index bf17d79bb6..9eeff6e067 100644 --- a/libmpdemux/demuxer.h +++ b/libmpdemux/demuxer.h @@ -151,7 +151,7 @@ typedef struct demuxers_desc_st { /// Close the demuxer void (*close)(struct demuxer_st *demuxer); ///< Optional // Seek - void (*seek)(struct demuxer_st *demuxer, float rel_seek_secs, int flags); ///< Optional + void (*seek)(struct demuxer_st *demuxer, float rel_seek_secs, float audio_delay, int flags); ///< Optional // Control int (*control)(struct demuxer_st *demuxer, int cmd, void *arg); ///< Optional } demuxer_desc_t; @@ -306,7 +306,7 @@ static inline int avi_stream_id(unsigned int id){ } 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: diff --git a/mencoder.c b/mencoder.c index 8463dcc11d..d06acc1ebf 100644 --- a/mencoder.c +++ b/mencoder.c @@ -1037,12 +1037,12 @@ if (seek_to_sec) { 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) @@ -1770,7 +1770,7 @@ static int edl_seek(edl_record_ptr next_edl_record, demuxer_t* demuxer, demux_st 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); diff --git a/mplayer.c b/mplayer.c index 77129c0949..a0ecc2f0e6 100644 --- a/mplayer.c +++ b/mplayer.c @@ -4185,7 +4185,7 @@ if (stream->type==STREAMTYPE_DVDNAV && dvd_nav_still) 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; -- cgit v1.2.3