gst/rtpmanager/gstrtpbin.c: Fix cleanup crasher.
authorWim Taymans <wim.taymans@gmail.com>
Wed, 26 Sep 2007 20:08:28 +0000 (20:08 +0000)
committerTim-Philipp Müller <tim.muller@collabora.co.uk>
Tue, 11 Aug 2009 01:30:30 +0000 (02:30 +0100)
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
gst/rtpmanager/rtpjitterbuffer.c
gst/rtpmanager/rtpjitterbuffer.h

index a95a0ee..449d18f 100644 (file)
@@ -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);
 }
index 7260e9e..3285c87 100644 (file)
@@ -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;
 }
index b67e265..1db0705 100644 (file)
@@ -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;