rtpjitterbuffer: fix crash when do-retransmission=true and a lot of buffers are lost
authorGeorge Kiagiadakis <george.kiagiadakis@collabora.com>
Tue, 5 Nov 2013 08:48:33 +0000 (10:48 +0200)
committerWim Taymans <wim.taymans@gmail.com>
Mon, 11 Nov 2013 10:51:45 +0000 (11:51 +0100)
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

index 553924415d62766224146927444e09a6acfcdadc..0f63945a79bfeb3cd1b8cddf3baec6d46c48810f 100644 (file)
@@ -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;
 }