jitterbuffer: improve timeout management
authorWim Taymans <wim.taymans@collabora.co.uk>
Thu, 1 Aug 2013 13:40:52 +0000 (15:40 +0200)
committerWim Taymans <wim.taymans@collabora.co.uk>
Thu, 1 Aug 2013 13:40:52 +0000 (15:40 +0200)
If we change the seqnum of an existing timer and we were waiting for
that timer, unschedule it. If we change the timeout of an existing timer and we
were waiting on it, only unschedule when the new time is smaller.

gst/rtpmanager/gstrtpjitterbuffer.c

index e1f8580..fc34c36 100644 (file)
@@ -184,6 +184,7 @@ struct _GstRtpJitterBufferPrivate
   GstSegment segment;
   GstClockID clock_id;
   GstClockTime timer_timeout;
+  guint16 timer_seqnum;
   gboolean unscheduled;
   /* the latency of the upstream peer, we have to take this into account when
    * synchronizing the buffers. */
@@ -1345,9 +1346,18 @@ static void
 reschedule_timer (GstRtpJitterBuffer * jitterbuffer, TimerData * timer,
     guint16 seqnum, GstClockTime timeout)
 {
-  if (timer->seqnum == seqnum && timer->timeout == timeout)
+  GstRtpJitterBufferPrivate *priv = jitterbuffer->priv;
+  gboolean seqchange, timechange;
+  guint16 oldseq;
+
+  seqchange = timer->seqnum != seqnum;
+  timechange = timer->timeout != timeout;
+
+  if (!seqchange && timechange)
     return;
 
+  oldseq = timer->seqnum;
+
   GST_DEBUG_OBJECT (jitterbuffer,
       "replace timer for seqnum %d->%d to %" GST_TIME_FORMAT,
       timer->seqnum, seqnum, GST_TIME_ARGS (timeout));
@@ -1355,7 +1365,12 @@ reschedule_timer (GstRtpJitterBuffer * jitterbuffer, TimerData * timer,
   timer->timeout = timeout;
   timer->seqnum = seqnum;
 
-  recalculate_timer (jitterbuffer, timer);
+  if (priv->clock_id) {
+    if (seqchange && priv->timer_seqnum == oldseq)
+      unschedule_current_timer (jitterbuffer);
+    else if (timechange)
+      recalculate_timer (jitterbuffer, timer);
+  }
 }
 
 static TimerData *
@@ -2122,6 +2137,7 @@ wait_next_timeout (GstRtpJitterBuffer * jitterbuffer)
     id = priv->clock_id = gst_clock_new_single_shot_id (clock, sync_time);
     priv->unscheduled = FALSE;
     priv->timer_timeout = timer_timeout;
+    priv->timer_seqnum = timer->seqnum;
     timer_idx = timer->idx;
     GST_OBJECT_UNLOCK (jitterbuffer);