From 71dcc053fe61841201abe1034a86eae863197c48 Mon Sep 17 00:00:00 2001 From: reimar Date: Sun, 24 Jan 2010 15:16:39 +0000 Subject: Move the resync-related code into more consistent places instead of having it scattered all over the place with half of it forgotten in some places. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@30420 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libmpcodecs/dec_audio.c | 2 ++ libmpcodecs/dec_video.c | 4 ++++ libmpdemux/demuxer.c | 57 +++++++++++++++++++------------------------------ mencoder.c | 1 - mplayer.c | 6 ------ 5 files changed, 28 insertions(+), 42 deletions(-) diff --git a/libmpcodecs/dec_audio.c b/libmpcodecs/dec_audio.c index d73b381906..26681737e3 100644 --- a/libmpcodecs/dec_audio.c +++ b/libmpcodecs/dec_audio.c @@ -455,6 +455,8 @@ int decode_audio(sh_audio_t *sh_audio, int minlen) void resync_audio_stream(sh_audio_t *sh_audio) { + sh_audio->a_buffer_len = 0; + sh_audio->a_out_buffer_len = 0; sh_audio->a_in_buffer_len = 0; // clear audio input buffer if (!sh_audio->initialized) return; diff --git a/libmpcodecs/dec_video.c b/libmpcodecs/dec_video.c index 6d9eb97074..6cc2ddd55e 100644 --- a/libmpcodecs/dec_video.c +++ b/libmpcodecs/dec_video.c @@ -133,6 +133,10 @@ int set_rectangle(sh_video_t *sh_video,int param,int value) void resync_video_stream(sh_video_t *sh_video) { + sh_video->timer = 0; + sh_video->next_frame_time = 0; + sh_video->num_buffered_pts = 0; + sh_video->last_pts = MP_NOPTS_VALUE; if(mpvdec) mpvdec->control(sh_video, VDCTRL_RESYNC_STREAM, NULL); } diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c index 216323a2a1..45bc418e31 100644 --- a/libmpdemux/demuxer.c +++ b/libmpdemux/demuxer.c @@ -1183,6 +1183,20 @@ demuxer_t *demux_open(stream_t *vs, int file_format, int audio_id, return res; } +static void demux_resync(demuxer_t *demuxer) +{ + sh_video_t *sh_video = demuxer->video->sh; + sh_audio_t *sh_audio = demuxer->audio->sh; + demux_control(demuxer, DEMUXER_CTRL_RESYNC, NULL); + if (sh_video) { + ds_fill_buffer(demuxer->video); + resync_video_stream(sh_video); + } + if (sh_audio) { + ds_fill_buffer(demuxer->audio); + resync_audio_stream(sh_audio); + } +} void demux_flush(demuxer_t *demuxer) { @@ -1196,8 +1210,6 @@ int demux_seek(demuxer_t *demuxer, float rel_seek_secs, float audio_delay, { 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; double tmp = 0; double pts; @@ -1214,17 +1226,11 @@ int demux_seek(demuxer_t *demuxer, float rel_seek_secs, float audio_delay, } demux_flush(demuxer); - // clear demux buffers: - if (sh_audio) - sh_audio->a_buffer_len = 0; demuxer->stream->eof = 0; demuxer->video->eof = 0; demuxer->audio->eof = 0; - if (sh_video) - sh_video->timer = 0; // !!!!!! - if (flags & SEEK_ABSOLUTE) pts = 0.0f; else { @@ -1243,7 +1249,7 @@ int demux_seek(demuxer_t *demuxer, float rel_seek_secs, float audio_delay, if (stream_control(demuxer->stream, STREAM_CTRL_SEEK_TO_TIME, &pts) != STREAM_UNSUPPORTED) { - demux_control(demuxer, DEMUXER_CTRL_RESYNC, NULL); + demux_resync(demuxer); return 1; } @@ -1251,8 +1257,7 @@ int demux_seek(demuxer_t *demuxer, float rel_seek_secs, float audio_delay, if (demuxer->desc->seek) demuxer->desc->seek(demuxer, rel_seek_secs, audio_delay, flags); - if (sh_audio) - resync_audio_stream(sh_audio); + demux_resync(demuxer); return 1; } @@ -1475,8 +1480,6 @@ int demuxer_seek_chapter(demuxer_t *demuxer, int chapter, int mode, { int ris; int current, total; - sh_video_t *sh_video = demuxer->video->sh; - sh_audio_t *sh_audio = demuxer->audio->sh; if (!demuxer->num_chapters || !demuxer->chapters) { if (!mode) { @@ -1491,17 +1494,9 @@ int demuxer_seek_chapter(demuxer_t *demuxer, int chapter, int mode, ris = stream_control(demuxer->stream, STREAM_CTRL_SEEK_TO_CHAPTER, &chapter); - if (ris != STREAM_UNSUPPORTED) - demux_control(demuxer, DEMUXER_CTRL_RESYNC, NULL); - if (sh_video) { - ds_fill_buffer(demuxer->video); - resync_video_stream(sh_video); - } - if (sh_audio) { - ds_fill_buffer(demuxer->audio); - resync_audio_stream(sh_audio); - } + demux_resync(demuxer); + // exit status may be ok, but main() doesn't have to seek itself // (because e.g. dvds depend on sectors, not on pts) *seek_pts = -1.0; @@ -1525,6 +1520,9 @@ int demuxer_seek_chapter(demuxer_t *demuxer, int chapter, int mode, return ris != STREAM_UNSUPPORTED ? chapter : -1; } else { // chapters structure is set in the demuxer + sh_video_t *sh_video = demuxer->video->sh; + sh_audio_t *sh_audio = demuxer->audio->sh; + total = demuxer->num_chapters; if (mode == 1) //absolute seeking @@ -1659,8 +1657,6 @@ int demuxer_get_current_angle(demuxer_t *demuxer) int demuxer_set_angle(demuxer_t *demuxer, int angle) { int ris, angles = -1; - sh_video_t *sh_video = demuxer->video->sh; - sh_audio_t *sh_audio = demuxer->audio->sh; angles = demuxer_angles_count(demuxer); if ((angles < 1) || (angle > angles)) @@ -1672,16 +1668,7 @@ int demuxer_set_angle(demuxer_t *demuxer, int angle) if (ris == STREAM_UNSUPPORTED) return -1; - demux_control(demuxer, DEMUXER_CTRL_RESYNC, NULL); - if (sh_video) { - ds_fill_buffer(demuxer->video); - resync_video_stream(sh_video); - } - - if (sh_audio) { - ds_fill_buffer(demuxer->audio); - resync_audio_stream(sh_audio); - } + demux_resync(demuxer); return angle; } diff --git a/mencoder.c b/mencoder.c index 6ff49a5350..7e7f4334fa 100644 --- a/mencoder.c +++ b/mencoder.c @@ -1708,7 +1708,6 @@ static int edl_seek(edl_record_ptr next_edl_record, demuxer_t* demuxer, demux_st 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); //if(vo_spudec) spudec_reset(vo_spudec); if (audio_delay != 0.0) fixdelay(demuxer->video, d_audio, mux_a, frame_data, framecopy); return 1; diff --git a/mplayer.c b/mplayer.c index 1eacaaf085..1344fecda5 100644 --- a/mplayer.c +++ b/mplayer.c @@ -2543,12 +2543,8 @@ static int seek(MPContext *mpctx, double amount, int style) mpctx->startup_decode_retry = DEFAULT_STARTUP_DECODE_RETRY; 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->next_frame_time = 0; - mpctx->sh_video->num_buffered_pts = 0; - mpctx->sh_video->last_pts = MP_NOPTS_VALUE; mpctx->num_buffered_frames = 0; mpctx->delay = 0; mpctx->time_frame = 0; @@ -2563,8 +2559,6 @@ static int seek(MPContext *mpctx, double amount, int style) 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 (!mpctx->sh_video) update_subtitles(NULL, mpctx->sh_audio->pts, mpctx->d_sub, 1); } -- cgit v1.2.3