From ef4ea4876c436e4080950a7db9f6a2678535e600 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 26 Sep 2007 20:08:28 +0000 Subject: gst/rtpmanager/gstrtpbin.c: Fix cleanup crasher. Original commit message from CVS: * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_dispose), (gst_rtp_bin_finalize): Fix cleanup crasher. * gst/rtpmanager/rtpjitterbuffer.c: (rtp_jitter_buffer_init), (calculate_skew): * gst/rtpmanager/rtpjitterbuffer.h: Dynamically adjust the skew calculation window so that we calculate it over a period of around 2 seconds. --- gst/rtpmanager/gstrtpbin.c | 5 +++-- gst/rtpmanager/rtpjitterbuffer.c | 16 +++++++++++----- gst/rtpmanager/rtpjitterbuffer.h | 1 + 3 files changed, 15 insertions(+), 7 deletions(-) (limited to 'gst') diff --git a/gst/rtpmanager/gstrtpbin.c b/gst/rtpmanager/gstrtpbin.c index a95a0eec..449d18f2 100644 --- a/gst/rtpmanager/gstrtpbin.c +++ b/gst/rtpmanager/gstrtpbin.c @@ -1175,9 +1175,11 @@ gst_rtp_bin_dispose (GObject * object) rtpbin = GST_RTP_BIN (object); g_slist_foreach (rtpbin->sessions, (GFunc) free_session, NULL); - g_slist_foreach (rtpbin->clients, (GFunc) free_client, NULL); g_slist_free (rtpbin->sessions); rtpbin->sessions = NULL; + g_slist_foreach (rtpbin->clients, (GFunc) free_client, NULL); + g_slist_free (rtpbin->clients); + rtpbin->clients = NULL; G_OBJECT_CLASS (parent_class)->dispose (object); } @@ -1191,7 +1193,6 @@ gst_rtp_bin_finalize (GObject * object) g_mutex_free (rtpbin->priv->bin_lock); gst_object_unref (rtpbin->provided_clock); - g_slist_free (rtpbin->sessions); G_OBJECT_CLASS (parent_class)->finalize (object); } diff --git a/gst/rtpmanager/rtpjitterbuffer.c b/gst/rtpmanager/rtpjitterbuffer.c index 7260e9ee..3285c879 100644 --- a/gst/rtpmanager/rtpjitterbuffer.c +++ b/gst/rtpmanager/rtpjitterbuffer.c @@ -72,6 +72,7 @@ rtp_jitter_buffer_init (RTPJitterBuffer * jbuf) jbuf->window[i] = 0; } jbuf->window_pos = 0; + jbuf->window_size = 100; jbuf->window_filling = TRUE; jbuf->window_min = 0; jbuf->skew = 0; @@ -217,21 +218,26 @@ calculate_skew (RTPJitterBuffer * jbuf, guint32 rtptime, GstClockTime time) if (jbuf->window_filling) { /* we are filling the window */ - GST_DEBUG ("filling %d %" G_GINT64_FORMAT, pos, delta); + GST_DEBUG ("filling %d %" G_GINT64_FORMAT ", diff %" G_GUINT64_FORMAT, pos, + delta, send_diff); jbuf->window[pos++] = delta; /* calc the min delta we observed */ if (pos == 1 || delta < jbuf->window_min) jbuf->window_min = delta; - if (pos >= 100) { + if (send_diff >= 2 * GST_SECOND || pos >= 100) { + jbuf->window_size = pos; + /* window filled, fill window with min */ GST_DEBUG ("min %" G_GINT64_FORMAT, jbuf->window_min); - for (i = 0; i < 100; i++) + for (i = 0; i < jbuf->window_size; i++) jbuf->window[i] = jbuf->window_min; /* the skew is initially the min */ jbuf->skew = jbuf->window_min; jbuf->window_filling = FALSE; + } else { + jbuf->window_size = pos + 1; } } else { /* pick old value and store new value. We keep the previous value in order @@ -247,7 +253,7 @@ calculate_skew (RTPJitterBuffer * jbuf, guint32 rtptime, GstClockTime time) gint64 min = G_MAXINT64; /* if we removed the old min, we have to find a new min */ - for (i = 0; i < 100; i++) { + for (i = 0; i < jbuf->window_size; i++) { /* we found another value equal to the old min, we can stop searching now */ if (jbuf->window[i] == old) { min = old; @@ -264,7 +270,7 @@ calculate_skew (RTPJitterBuffer * jbuf, guint32 rtptime, GstClockTime time) jbuf->window_min, jbuf->skew); } /* wrap around in the window */ - if (pos >= 100) + if (pos >= jbuf->window_size) pos = 0; jbuf->window_pos = pos; } diff --git a/gst/rtpmanager/rtpjitterbuffer.h b/gst/rtpmanager/rtpjitterbuffer.h index b67e265f..1db07059 100644 --- a/gst/rtpmanager/rtpjitterbuffer.h +++ b/gst/rtpmanager/rtpjitterbuffer.h @@ -61,6 +61,7 @@ struct _RTPJitterBuffer { guint64 ext_rtptime; gint64 window[100]; guint window_pos; + guint window_size; gboolean window_filling; gint64 window_min; gint64 skew; -- cgit v1.2.1