mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-25 01:30:38 +00:00
rtpjitterbuffer: fix flush
Pass function to flush to properly free the queue items.
This commit is contained in:
parent
0cc887eb98
commit
479c7642fd
3 changed files with 34 additions and 27 deletions
|
@ -654,19 +654,36 @@ gst_rtp_jitter_buffer_init (GstRtpJitterBuffer * jitterbuffer)
|
||||||
GST_OBJECT_FLAG_SET (jitterbuffer, GST_ELEMENT_FLAG_PROVIDE_CLOCK);
|
GST_OBJECT_FLAG_SET (jitterbuffer, GST_ELEMENT_FLAG_PROVIDE_CLOCK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static RTPJitterBufferItem *
|
||||||
|
alloc_item (void)
|
||||||
|
{
|
||||||
|
return g_slice_new (RTPJitterBufferItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
free_item (RTPJitterBufferItem * item)
|
||||||
|
{
|
||||||
|
if (item->data)
|
||||||
|
gst_mini_object_unref (item->data);
|
||||||
|
g_slice_free (RTPJitterBufferItem, item);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_rtp_jitter_buffer_finalize (GObject * object)
|
gst_rtp_jitter_buffer_finalize (GObject * object)
|
||||||
{
|
{
|
||||||
GstRtpJitterBuffer *jitterbuffer;
|
GstRtpJitterBuffer *jitterbuffer;
|
||||||
|
GstRtpJitterBufferPrivate *priv;
|
||||||
|
|
||||||
jitterbuffer = GST_RTP_JITTER_BUFFER (object);
|
jitterbuffer = GST_RTP_JITTER_BUFFER (object);
|
||||||
|
priv = jitterbuffer->priv;
|
||||||
|
|
||||||
g_array_free (jitterbuffer->priv->timers, TRUE);
|
g_array_free (priv->timers, TRUE);
|
||||||
g_mutex_clear (&jitterbuffer->priv->jbuf_lock);
|
g_mutex_clear (&priv->jbuf_lock);
|
||||||
g_cond_clear (&jitterbuffer->priv->jbuf_timer);
|
g_cond_clear (&priv->jbuf_timer);
|
||||||
g_cond_clear (&jitterbuffer->priv->jbuf_event);
|
g_cond_clear (&priv->jbuf_event);
|
||||||
|
|
||||||
g_object_unref (jitterbuffer->priv->jbuf);
|
rtp_jitter_buffer_flush (priv->jbuf, (GFunc) free_item, NULL);
|
||||||
|
g_object_unref (priv->jbuf);
|
||||||
|
|
||||||
G_OBJECT_CLASS (parent_class)->finalize (object);
|
G_OBJECT_CLASS (parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
|
@ -1034,7 +1051,7 @@ gst_rtp_jitter_buffer_flush_stop (GstRtpJitterBuffer * jitterbuffer)
|
||||||
priv->last_elapsed = 0;
|
priv->last_elapsed = 0;
|
||||||
priv->ext_timestamp = -1;
|
priv->ext_timestamp = -1;
|
||||||
GST_DEBUG_OBJECT (jitterbuffer, "flush and reset jitterbuffer");
|
GST_DEBUG_OBJECT (jitterbuffer, "flush and reset jitterbuffer");
|
||||||
rtp_jitter_buffer_flush (priv->jbuf);
|
rtp_jitter_buffer_flush (priv->jbuf, (GFunc) free_item, NULL);
|
||||||
rtp_jitter_buffer_reset_skew (priv->jbuf);
|
rtp_jitter_buffer_reset_skew (priv->jbuf);
|
||||||
remove_all_timers (jitterbuffer);
|
remove_all_timers (jitterbuffer);
|
||||||
JBUF_UNLOCK (priv);
|
JBUF_UNLOCK (priv);
|
||||||
|
@ -1809,20 +1826,6 @@ calculate_expected (GstRtpJitterBuffer * jitterbuffer, guint32 expected,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static RTPJitterBufferItem *
|
|
||||||
alloc_item (void)
|
|
||||||
{
|
|
||||||
return g_slice_new (RTPJitterBufferItem);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
free_item (RTPJitterBufferItem * item)
|
|
||||||
{
|
|
||||||
if (item->data)
|
|
||||||
gst_mini_object_unref (item->data);
|
|
||||||
g_slice_free (RTPJitterBufferItem, item);
|
|
||||||
}
|
|
||||||
|
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
gst_rtp_jitter_buffer_chain (GstPad * pad, GstObject * parent,
|
gst_rtp_jitter_buffer_chain (GstPad * pad, GstObject * parent,
|
||||||
GstBuffer * buffer)
|
GstBuffer * buffer)
|
||||||
|
@ -1952,7 +1955,7 @@ gst_rtp_jitter_buffer_chain (GstPad * pad, GstObject * parent,
|
||||||
}
|
}
|
||||||
if (G_UNLIKELY (reset)) {
|
if (G_UNLIKELY (reset)) {
|
||||||
GST_DEBUG_OBJECT (jitterbuffer, "flush and reset jitterbuffer");
|
GST_DEBUG_OBJECT (jitterbuffer, "flush and reset jitterbuffer");
|
||||||
rtp_jitter_buffer_flush (priv->jbuf);
|
rtp_jitter_buffer_flush (priv->jbuf, (GFunc) free_item, NULL);
|
||||||
rtp_jitter_buffer_reset_skew (priv->jbuf);
|
rtp_jitter_buffer_reset_skew (priv->jbuf);
|
||||||
remove_all_timers (jitterbuffer);
|
remove_all_timers (jitterbuffer);
|
||||||
priv->last_popped_seqnum = -1;
|
priv->last_popped_seqnum = -1;
|
||||||
|
|
|
@ -96,7 +96,6 @@ rtp_jitter_buffer_finalize (GObject * object)
|
||||||
|
|
||||||
jbuf = RTP_JITTER_BUFFER_CAST (object);
|
jbuf = RTP_JITTER_BUFFER_CAST (object);
|
||||||
|
|
||||||
rtp_jitter_buffer_flush (jbuf);
|
|
||||||
g_queue_free (jbuf->packets);
|
g_queue_free (jbuf->packets);
|
||||||
|
|
||||||
G_OBJECT_CLASS (rtp_jitter_buffer_parent_class)->finalize (object);
|
G_OBJECT_CLASS (rtp_jitter_buffer_parent_class)->finalize (object);
|
||||||
|
@ -819,18 +818,22 @@ rtp_jitter_buffer_peek (RTPJitterBuffer * jbuf)
|
||||||
/**
|
/**
|
||||||
* rtp_jitter_buffer_flush:
|
* rtp_jitter_buffer_flush:
|
||||||
* @jbuf: an #RTPJitterBuffer
|
* @jbuf: an #RTPJitterBuffer
|
||||||
|
* @free_func: function to free each item
|
||||||
|
* @user_data: user data passed to @free_func
|
||||||
*
|
*
|
||||||
* Flush all packets from the jitterbuffer.
|
* Flush all packets from the jitterbuffer.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
rtp_jitter_buffer_flush (RTPJitterBuffer * jbuf)
|
rtp_jitter_buffer_flush (RTPJitterBuffer * jbuf, GFunc free_func,
|
||||||
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
GstBuffer *buffer;
|
GList *item;
|
||||||
|
|
||||||
g_return_if_fail (jbuf != NULL);
|
g_return_if_fail (jbuf != NULL);
|
||||||
|
g_return_if_fail (free_func != NULL);
|
||||||
|
|
||||||
while ((buffer = g_queue_pop_head (jbuf->packets)))
|
while ((item = g_queue_pop_head_link (jbuf->packets)))
|
||||||
gst_buffer_unref (buffer);
|
free_func ((RTPJitterBufferItem *) item, user_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -144,7 +144,8 @@ gboolean rtp_jitter_buffer_insert (RTPJitterBuffer *jbuf,
|
||||||
RTPJitterBufferItem * rtp_jitter_buffer_peek (RTPJitterBuffer *jbuf);
|
RTPJitterBufferItem * rtp_jitter_buffer_peek (RTPJitterBuffer *jbuf);
|
||||||
RTPJitterBufferItem * rtp_jitter_buffer_pop (RTPJitterBuffer *jbuf, gint *percent);
|
RTPJitterBufferItem * rtp_jitter_buffer_pop (RTPJitterBuffer *jbuf, gint *percent);
|
||||||
|
|
||||||
void rtp_jitter_buffer_flush (RTPJitterBuffer *jbuf);
|
void rtp_jitter_buffer_flush (RTPJitterBuffer *jbuf,
|
||||||
|
GFunc free_func, gpointer user_data);
|
||||||
|
|
||||||
gboolean rtp_jitter_buffer_is_buffering (RTPJitterBuffer * jbuf);
|
gboolean rtp_jitter_buffer_is_buffering (RTPJitterBuffer * jbuf);
|
||||||
void rtp_jitter_buffer_set_buffering (RTPJitterBuffer * jbuf, gboolean buffering);
|
void rtp_jitter_buffer_set_buffering (RTPJitterBuffer * jbuf, gboolean buffering);
|
||||||
|
|
Loading…
Reference in a new issue