summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim-Philipp Müller <tim@centricular.com>2020-09-28 00:53:48 +0100
committerGStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org>2020-09-28 16:46:41 +0000
commitb76a160ab9d412f080a45264e5f28d6d8c7be273 (patch)
tree18ab32e61dfd5569c5fb303000a8ffdfbe4603eb
parent56104b8499ed341278a021e4939d480bf68a82fb (diff)
downloadgstreamer-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.c2
-rw-r--r--gst/rtpmanager/rtpjitterbuffer.c14
-rw-r--r--gst/rtpmanager/rtpjitterbuffer.h5
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);