From b81b2efa3e4905f11136930da5191b1ac033825e Mon Sep 17 00:00:00 2001 From: George Kiagiadakis Date: Tue, 5 Nov 2013 10:48:33 +0200 Subject: [PATCH] rtpjitterbuffer: fix crash when do-retransmission=true and a lot of buffers are lost The problem here was that the jitterbuffer lock was unlocked to push the event, but that caused another thread to remove the timer currently being processed, probably because the amount of rtx events (and therefore timers) was getting too high. The solution is to unlock and push the event only after timer processing has finished. fixes https://bugzilla.gnome.org/show_bug.cgi?id=711131 --- gst/rtpmanager/gstrtpjitterbuffer.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/gst/rtpmanager/gstrtpjitterbuffer.c b/gst/rtpmanager/gstrtpjitterbuffer.c index 5539244..0f63945 100644 --- a/gst/rtpmanager/gstrtpjitterbuffer.c +++ b/gst/rtpmanager/gstrtpjitterbuffer.c @@ -2453,9 +2453,6 @@ do_expected_timeout (GstRtpJitterBuffer * jitterbuffer, TimerData * timer, priv->num_rtx_requests++; timer->num_rtx_retry++; timer->rtx_last = now; - JBUF_UNLOCK (priv); - gst_pad_push_event (priv->sinkpad, event); - JBUF_LOCK (priv); /* calculate the timeout for the next retransmission attempt */ timer->rtx_retry += (priv->rtx_retry_timeout * GST_MSECOND); @@ -2476,6 +2473,10 @@ do_expected_timeout (GstRtpJitterBuffer * jitterbuffer, TimerData * timer, reschedule_timer (jitterbuffer, timer, timer->seqnum, timer->rtx_base + timer->rtx_retry, timer->rtx_delay, FALSE); + JBUF_UNLOCK (priv); + gst_pad_push_event (priv->sinkpad, event); + JBUF_LOCK (priv); + return FALSE; } -- 2.7.4