rtpjitterbuffer: send lost event before signaling next buffer
authorWim Taymans <wim.taymans@collabora.co.uk>
Fri, 20 Sep 2013 14:58:38 +0000 (16:58 +0200)
committerWim Taymans <wim.taymans@collabora.co.uk>
Mon, 23 Sep 2013 12:45:25 +0000 (14:45 +0200)
First send the lost event, then update the next_seqnum counter and then
send the signal to the pushing thread that it can retry to push a buffer. This
avoids pushing out buffers before the lost event is pushed.

gst/rtpmanager/gstrtpjitterbuffer.c

index c6f3d7d..4448cf5 100644 (file)
@@ -1702,12 +1702,6 @@ send_lost_event (GstRtpJitterBuffer * jitterbuffer, guint seqnum,
   priv->num_late += lost_packets;
   priv->discont = TRUE;
 
-  /* update our expected next packet but make sure the seqnum increases */
-  if (seqnum + lost_packets > priv->next_seqnum) {
-    priv->next_seqnum = (seqnum + lost_packets) & 0xffff;
-    priv->last_popped_seqnum = seqnum;
-    priv->last_out_time = timestamp;
-  }
   if (priv->do_lost) {
     GstEvent *event;
 
@@ -1722,6 +1716,12 @@ send_lost_event (GstRtpJitterBuffer * jitterbuffer, guint seqnum,
     gst_pad_push_event (priv->srcpad, event);
     JBUF_LOCK (priv);
   }
+  /* update our expected next packet but make sure the seqnum increases */
+  if (seqnum + lost_packets > priv->next_seqnum) {
+    priv->next_seqnum = (seqnum + lost_packets) & 0xffff;
+    priv->last_popped_seqnum = seqnum;
+    priv->last_out_time = timestamp;
+  }
 }
 
 static void
@@ -2369,10 +2369,13 @@ do_lost_timeout (GstRtpJitterBuffer * jitterbuffer, TimerData * timer,
 
   /* remove timer now */
   remove_timer (jitterbuffer, timer);
-  JBUF_SIGNAL_EVENT (priv);
 
+  /* this releases the lock */
   send_lost_event (jitterbuffer, seqnum, num, timestamp, duration, late);
 
+  /* now we can let the pushing thread try again */
+  JBUF_SIGNAL_EVENT (priv);
+
   return TRUE;
 }