From 4814d899c27df764e2e9ad15a0765235d59abc22 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Mon, 31 Aug 2009 12:57:32 +0200 Subject: jitterbuffer: reset skew when timestamps change Refactor the jitterbuffer resync code. Reset the skew correction when we detect a big timestamp discont. See #593354 --- gst/rtpmanager/rtpjitterbuffer.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) (limited to 'gst/rtpmanager') diff --git a/gst/rtpmanager/rtpjitterbuffer.c b/gst/rtpmanager/rtpjitterbuffer.c index 18b7d07c..55e084f3 100644 --- a/gst/rtpmanager/rtpjitterbuffer.c +++ b/gst/rtpmanager/rtpjitterbuffer.c @@ -117,6 +117,24 @@ rtp_jitter_buffer_reset_skew (RTPJitterBuffer * jbuf) GST_DEBUG ("reset skew correction"); } +static void +rtp_jitter_buffer_resync (RTPJitterBuffer * jbuf, GstClockTime time, + GstClockTime gstrtptime, guint64 ext_rtptime, gboolean reset_skew) +{ + jbuf->base_time = time; + jbuf->base_rtptime = gstrtptime; + jbuf->base_extrtp = ext_rtptime; + jbuf->prev_out_time = -1; + jbuf->prev_send_diff = -1; + if (reset_skew) { + jbuf->window_filling = TRUE; + jbuf->window_pos = 0; + jbuf->window_min = 0; + jbuf->window_size = 0; + jbuf->skew = 0; + } +} + /* For the clock skew we use a windowed low point averaging algorithm as can be * found in http://www.grame.fr/pub/TR-050601.pdf. The idea is that the jitter is * composed of: @@ -223,11 +241,7 @@ calculate_skew (RTPJitterBuffer * jbuf, guint32 rtptime, GstClockTime time, /* elapsed time at sender, timestamps can go backwards and thus be smaller * than our base time, take a new base time in that case. */ GST_WARNING ("backward timestamps at server, taking new base time"); - jbuf->base_time = time; - jbuf->base_rtptime = gstrtptime; - jbuf->base_extrtp = ext_rtptime; - jbuf->prev_out_time = -1; - jbuf->prev_send_diff = -1; + rtp_jitter_buffer_resync (jbuf, time, gstrtptime, ext_rtptime, FALSE); send_diff = 0; } @@ -257,11 +271,7 @@ calculate_skew (RTPJitterBuffer * jbuf, guint32 rtptime, GstClockTime time, if (ABS (delta - jbuf->skew) > GST_SECOND) { GST_WARNING ("delta %" GST_TIME_FORMAT " too big, reset skew", GST_TIME_ARGS (delta - jbuf->skew)); - jbuf->base_time = time; - jbuf->base_rtptime = gstrtptime; - jbuf->base_extrtp = ext_rtptime; - jbuf->prev_out_time = -1; - jbuf->prev_send_diff = -1; + rtp_jitter_buffer_resync (jbuf, time, gstrtptime, ext_rtptime, TRUE); send_diff = 0; delta = 0; } -- cgit