diff options
author | Guenter Bartsch <guenter@users.sourceforge.net> | 2001-09-12 22:18:47 +0000 |
---|---|---|
committer | Guenter Bartsch <guenter@users.sourceforge.net> | 2001-09-12 22:18:47 +0000 |
commit | 7d6fb6c905dbd842eead370f2412a55eda31cecb (patch) | |
tree | 45d81b00889662bf46f3ce4c15f1b898566f1b9f /src/xine-engine/metronom.c | |
parent | 436000020930b0ce16be4a34fae8ff5df28450a5 (diff) | |
download | xine-lib-7d6fb6c905dbd842eead370f2412a55eda31cecb.tar.gz xine-lib-7d6fb6c905dbd842eead370f2412a55eda31cecb.tar.bz2 |
further tweaks and patches for menu support: new buftypes (BUF_CONTROL_DISCONTINUITY,BUF_CONTROL_NOP,BUF_CONTROL_AUDIO_CHANNEL,BUF_CONTROL_SPU_CHANNEL) so input plugins can enhance their communication with the xine engine (regarding pts continuities for example) - not all is implemented yet, but what is implemented is working pretty well - at least for me ;))
CVS patchset: 627
CVS date: 2001/09/12 22:18:47
Diffstat (limited to 'src/xine-engine/metronom.c')
-rw-r--r-- | src/xine-engine/metronom.c | 98 |
1 files changed, 75 insertions, 23 deletions
diff --git a/src/xine-engine/metronom.c b/src/xine-engine/metronom.c index 48644548a..8069552ea 100644 --- a/src/xine-engine/metronom.c +++ b/src/xine-engine/metronom.c @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * - * $Id: metronom.c,v 1.25 2001/09/10 21:52:59 guenter Exp $ + * $Id: metronom.c,v 1.26 2001/09/12 22:18:47 guenter Exp $ */ #ifdef HAVE_CONFIG_H @@ -398,6 +398,20 @@ static uint32_t metronom_got_spu_packet (metronom_t *this, uint32_t pts,uint32_t return pts + this->video_wrap_offset; } +static void metronom_expect_audio_discontinuity (metronom_t *this) { + + printf ("metronom: expecting audio discontinuity\n"); + + this->audio_discontinuity = 1; +} + +static void metronom_expect_video_discontinuity (metronom_t *this) { + + printf ("metronom: expecting video discontinuity\n"); + + this->video_discontinuity = 1; +} + static uint32_t metronom_got_video_frame (metronom_t *this, uint32_t pts) { uint32_t vpts; @@ -430,8 +444,10 @@ static uint32_t metronom_got_video_frame (metronom_t *this, uint32_t pts) { */ if ( ( (pts + WRAP_TRESHOLD) <this->last_video_pts) - && (pts<WRAP_START_TIME) ) { + && (this->video_discontinuity || (pts<WRAP_START_TIME)) ) { + this->video_discontinuity = 0; + this->video_wrap_offset += this->last_video_pts - pts + this->num_video_vpts_guessed *(this->pts_per_frame + this->video_pts_delta); @@ -467,6 +483,22 @@ static uint32_t metronom_got_video_frame (metronom_t *this, uint32_t pts) { vpts = pts + this->video_wrap_offset; /* + * jump into the future? + */ + if (this->video_discontinuity + && (vpts > (this->video_vpts + 10000))) { + + printf ("metronom: video jump into the future\n"); + + this->video_discontinuity = 0; + + this->video_wrap_offset += this->last_video_pts - pts + + this->num_video_vpts_guessed *(this->pts_per_frame + this->video_pts_delta); + + vpts = pts + this->video_wrap_offset; + } + + /* * calc delta to compensate wrong framerates */ @@ -531,7 +563,9 @@ static uint32_t metronom_got_audio_samples (metronom_t *this, uint32_t pts, uint * did a wrap-around occur? */ if ( ( (pts + WRAP_TRESHOLD) < this->last_audio_pts ) - && (pts<WRAP_START_TIME) ) { + && (this->audio_discontinuity || (pts<WRAP_START_TIME)) ) { + + this->audio_discontinuity = 0; this->audio_wrap_offset += this->last_audio_pts - pts + this->num_audio_samples_guessed *(this->audio_pts_delta + this->pts_per_smpls) / AUDIO_SAMPLE_NUM ; @@ -568,6 +602,22 @@ static uint32_t metronom_got_audio_samples (metronom_t *this, uint32_t pts, uint vpts = pts + this->audio_wrap_offset; /* + * jump into the future? + */ + if (this->audio_discontinuity + && (vpts > (this->audio_vpts + 10000))) { + + printf ("metronom: video jump into the future\n"); + + this->audio_discontinuity = 0; + + this->audio_wrap_offset += this->last_audio_pts - pts + + this->num_audio_samples_guessed *(this->audio_pts_delta + this->pts_per_smpls) / AUDIO_SAMPLE_NUM ; + + vpts = pts + this->audio_wrap_offset; + } + + /* * calc delta to compensate wrong samplerates */ @@ -681,26 +731,28 @@ metronom_t * metronom_init (int have_audio) { metronom_t *this = xmalloc (sizeof (metronom_t)); - this->audio_stream_start= metronom_audio_stream_start; - this->audio_stream_end = metronom_audio_stream_end ; - this->video_stream_start= metronom_video_stream_start; - this->video_stream_end = metronom_video_stream_end ; - this->set_video_rate = metronom_set_video_rate; - this->get_video_rate = metronom_get_video_rate; - this->set_audio_rate = metronom_set_audio_rate; - this->got_video_frame = metronom_got_video_frame; - this->got_audio_samples = metronom_got_audio_samples; - this->got_spu_packet = metronom_got_spu_packet; - this->set_av_offset = metronom_set_av_offset; - this->get_av_offset = metronom_get_av_offset; - this->start_clock = metronom_start_clock; - this->stop_clock = metronom_stop_clock; - this->resume_clock = metronom_resume_clock; - this->get_current_time = metronom_get_current_time; - this->adjust_clock = metronom_adjust_clock; - this->register_scr = metronom_register_scr; - this->unregister_scr = metronom_unregister_scr; - this->set_speed = metronom_set_speed; + this->audio_stream_start = metronom_audio_stream_start; + this->audio_stream_end = metronom_audio_stream_end ; + this->video_stream_start = metronom_video_stream_start; + this->video_stream_end = metronom_video_stream_end ; + this->set_video_rate = metronom_set_video_rate; + this->get_video_rate = metronom_get_video_rate; + this->set_audio_rate = metronom_set_audio_rate; + this->got_video_frame = metronom_got_video_frame; + this->got_audio_samples = metronom_got_audio_samples; + this->got_spu_packet = metronom_got_spu_packet; + this->set_av_offset = metronom_set_av_offset; + this->get_av_offset = metronom_get_av_offset; + this->expect_video_discontinuity = metronom_expect_video_discontinuity; + this->expect_audio_discontinuity = metronom_expect_audio_discontinuity; + this->start_clock = metronom_start_clock; + this->stop_clock = metronom_stop_clock; + this->resume_clock = metronom_resume_clock; + this->get_current_time = metronom_get_current_time; + this->adjust_clock = metronom_adjust_clock; + this->register_scr = metronom_register_scr; + this->unregister_scr = metronom_unregister_scr; + this->set_speed = metronom_set_speed; this->scr_list = calloc(MAX_SCR_PROVIDERS, sizeof(void*)); this->register_scr(this, unixscr_init()); |