diff options
author | Wim Taymans <wim.taymans@gmail.com> | 2007-09-26 20:08:28 +0000 |
---|---|---|
committer | Wim Taymans <wim.taymans@gmail.com> | 2007-09-26 20:08:28 +0000 |
commit | ef4ea4876c436e4080950a7db9f6a2678535e600 (patch) | |
tree | dd272388d4caadfbccc4a86e6ee7901c6baca634 | |
parent | ccfbe1569dbd19fecd4bcfae298cbee9c9345d29 (diff) | |
download | gst-plugins-bad-ef4ea4876c436e4080950a7db9f6a2678535e600.tar.gz gst-plugins-bad-ef4ea4876c436e4080950a7db9f6a2678535e600.tar.bz2 gst-plugins-bad-ef4ea4876c436e4080950a7db9f6a2678535e600.zip |
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.
-rw-r--r-- | ChangeLog | 12 | ||||
-rw-r--r-- | gst/rtpmanager/gstrtpbin.c | 5 | ||||
-rw-r--r-- | gst/rtpmanager/rtpjitterbuffer.c | 16 | ||||
-rw-r--r-- | gst/rtpmanager/rtpjitterbuffer.h | 1 |
4 files changed, 27 insertions, 7 deletions
@@ -1,3 +1,15 @@ +2007-09-26 Wim Taymans <wim.taymans@gmail.com> + + * 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. + 2007-09-26 Thijs Vermeir <thijsvermeir@gmail.com> * gst/librfb/gstrfbsrc.c: 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; |