From 9ba5fcd6a1b4330a443239c0ef4fb5ac21009e60 Mon Sep 17 00:00:00 2001 From: Thibaut Mattern Date: Thu, 10 Jan 2008 00:01:27 +0100 Subject: Fixed buggy discontinuity handling when playing short streams and using the gapless switch. The current time should not be used here. --- src/xine-engine/metronom.c | 35 ++++++++--------------------------- 1 file changed, 8 insertions(+), 27 deletions(-) (limited to 'src/xine-engine') diff --git a/src/xine-engine/metronom.c b/src/xine-engine/metronom.c index 5d3e0a12d..5bf6495a2 100644 --- a/src/xine-engine/metronom.c +++ b/src/xine-engine/metronom.c @@ -305,6 +305,8 @@ static void metronom_handle_discontinuity (metronom_t *this, int type, /* video_vpts and audio_vpts adjustements */ cur_time = this->xine->clock->get_current_time(this->xine->clock); + xprintf(this->xine, XINE_VERBOSITY_DEBUG, + "current time : %" PRId64 "\n", cur_time); switch (type) { case DISC_STREAMSTART: @@ -321,33 +323,12 @@ static void metronom_handle_discontinuity (metronom_t *this, int type, case DISC_ABSOLUTE: case DISC_RELATIVE: - if (this->video_vpts < cur_time) { - /* still frame */ - if (this->audio_vpts > cur_time) { - /* still frame with audio */ - this->video_vpts = this->audio_vpts; - xprintf(this->xine, XINE_VERBOSITY_DEBUG, "video vpts adjusted to audio vpts %" PRId64 "\n", this->video_vpts); - } else { - /* still frame, no audio */ - this->video_vpts = this->prebuffer + cur_time; - this->audio_vpts = this->video_vpts; - this->audio_vpts_rmndr = 0; - this->force_video_jump = 1; - this->force_audio_jump = 1; - this->video_drift = 0; - xprintf(this->xine, XINE_VERBOSITY_DEBUG, "vpts adjusted with prebuffer to %" PRId64 "\n", - this->video_vpts); - } + if (this->video_vpts < this->audio_vpts) { + this->video_vpts = this->audio_vpts; + xprintf(this->xine, XINE_VERBOSITY_DEBUG, "video vpts adjusted to audio vpts %" PRId64 "\n", this->video_vpts); } else { - /* video */ - if (this->audio_vpts < cur_time) { - /* video, no sound */ - this->audio_vpts = this->video_vpts; - this->audio_vpts_rmndr = 0; - xprintf(this->xine, XINE_VERBOSITY_DEBUG, "audio vpts adjusted to video vpts %" PRId64 "\n", this->video_vpts); - } else { - /* video + audio */ - } + this->audio_vpts = this->video_vpts; + xprintf(this->xine, XINE_VERBOSITY_DEBUG, "audio vpts adjusted to video vpts %" PRId64 "\n", this->video_vpts); } break; } @@ -373,7 +354,7 @@ static void metronom_handle_discontinuity (metronom_t *this, int type, this->vpts_offset = this->video_vpts - disc_off; break; } - + this->last_video_pts = 0; this->last_audio_pts = 0; } -- cgit v1.2.3 From 52e850144c2764c73ffdc10fc46bae1a921fc445 Mon Sep 17 00:00:00 2001 From: Thibaut Mattern Date: Thu, 10 Jan 2008 00:03:00 +0100 Subject: Added new buffer flag for audio padding. --- src/xine-engine/buffer.h | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'src/xine-engine') diff --git a/src/xine-engine/buffer.h b/src/xine-engine/buffer.h index 35ab1e620..b8ae1afc3 100644 --- a/src/xine-engine/buffer.h +++ b/src/xine-engine/buffer.h @@ -372,6 +372,13 @@ struct buf_element_s { * decoder_info[2] carries denominator for display aspect ratio */ #define BUF_FLAG_ASPECT 0x0800 +/* Amount of audio padding added by encoder (mp3, aac). These empty + * audio frames are causing a gap when switching between mp3 files. + * decoder_info[1] carries amount of audio frames padded at the + * beginning of the buffer + * decoder_info[2] carries amount of audio frames padded at the end of + * the buffer */ +#define BUF_FLAG_AUDIO_PADDING 0x1000 /* Special buffer types: * Sometimes there is a need to relay special information from a demuxer -- cgit v1.2.3