diff options
author | Tim-Philipp Müller <tim@centricular.com> | 2020-09-28 00:53:48 +0100 |
---|---|---|
committer | GStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org> | 2020-09-28 16:46:41 +0000 |
commit | b76a160ab9d412f080a45264e5f28d6d8c7be273 (patch) | |
tree | 18ab32e61dfd5569c5fb303000a8ffdfbe4603eb | |
parent | 56104b8499ed341278a021e4939d480bf68a82fb (diff) | |
download | gstreamer-plugins-good-b76a160ab9d412f080a45264e5f28d6d8c7be273.tar.gz |
rtpjitterbuffer: fix item freeing for 1.16 branch
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/739>
-rw-r--r-- | gst/rtpmanager/gstrtpjitterbuffer.c | 2 | ||||
-rw-r--r-- | gst/rtpmanager/rtpjitterbuffer.c | 14 | ||||
-rw-r--r-- | gst/rtpmanager/rtpjitterbuffer.h | 5 |
3 files changed, 20 insertions, 1 deletions
diff --git a/gst/rtpmanager/gstrtpjitterbuffer.c b/gst/rtpmanager/gstrtpjitterbuffer.c index e8b636f0d..4ce62dcb9 100644 --- a/gst/rtpmanager/gstrtpjitterbuffer.c +++ b/gst/rtpmanager/gstrtpjitterbuffer.c @@ -1153,6 +1153,8 @@ gst_rtp_jitter_buffer_finalize (GObject * object) g_cond_clear (&priv->jbuf_event); g_cond_clear (&priv->jbuf_query); + rtp_jitter_buffer_set_item_free_func (priv->jbuf, (GFunc) free_item); + rtp_jitter_buffer_flush (priv->jbuf, (GFunc) free_item, NULL); g_queue_foreach (&priv->gap_packets, (GFunc) gst_buffer_unref, NULL); g_queue_clear (&priv->gap_packets); diff --git a/gst/rtpmanager/rtpjitterbuffer.c b/gst/rtpmanager/rtpjitterbuffer.c index f694850d9..5f3b18cdb 100644 --- a/gst/rtpmanager/rtpjitterbuffer.c +++ b/gst/rtpmanager/rtpjitterbuffer.c @@ -115,7 +115,10 @@ rtp_jitter_buffer_finalize (GObject * object) /* We cannot use g_queue_clear() as it would pass the wrong size to * g_slice_free() which may lead to data corruption in the slice allocator. */ - rtp_jitter_buffer_flush (jbuf, NULL, NULL); + if (jbuf->item_free_func != NULL) + rtp_jitter_buffer_flush (jbuf, jbuf->item_free_func, NULL); + else if (jbuf->packets.head != NULL) + g_warning ("Leaking RTP jitterbuffer items!"); g_mutex_clear (&jbuf->clock_lock); @@ -139,6 +142,15 @@ rtp_jitter_buffer_new (void) return jbuf; } +void +rtp_jitter_buffer_set_item_free_func (RTPJitterBuffer * jbuf, GFunc free_func) +{ + g_return_if_fail (jbuf != NULL); + g_return_if_fail (free_func != NULL); + + jbuf->item_free_func = free_func; +} + /** * rtp_jitter_buffer_get_mode: * @jbuf: an #RTPJitterBuffer diff --git a/gst/rtpmanager/rtpjitterbuffer.h b/gst/rtpmanager/rtpjitterbuffer.h index 406e7a945..99684bf5a 100644 --- a/gst/rtpmanager/rtpjitterbuffer.h +++ b/gst/rtpmanager/rtpjitterbuffer.h @@ -74,6 +74,7 @@ struct _RTPJitterBuffer { GObject object; GQueue packets; + GFunc item_free_func; /* 1.16 only */ RTPJitterBufferMode mode; @@ -149,6 +150,10 @@ GType rtp_jitter_buffer_get_type (void); /* managing lifetime */ RTPJitterBuffer* rtp_jitter_buffer_new (void); +/* Temporary, 1.16 branch only */ +G_GNUC_INTERNAL +void rtp_jitter_buffer_set_item_free_func (RTPJitterBuffer *jbuf, GFunc free_func); + RTPJitterBufferMode rtp_jitter_buffer_get_mode (RTPJitterBuffer *jbuf); void rtp_jitter_buffer_set_mode (RTPJitterBuffer *jbuf, RTPJitterBufferMode mode); |