summaryrefslogtreecommitdiff
path: root/src/xine-engine/metronom.c
diff options
context:
space:
mode:
authorGuenter Bartsch <guenter@users.sourceforge.net>2001-09-12 22:18:47 +0000
committerGuenter Bartsch <guenter@users.sourceforge.net>2001-09-12 22:18:47 +0000
commit7d6fb6c905dbd842eead370f2412a55eda31cecb (patch)
tree45d81b00889662bf46f3ce4c15f1b898566f1b9f /src/xine-engine/metronom.c
parent436000020930b0ce16be4a34fae8ff5df28450a5 (diff)
downloadxine-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.c98
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());