From f3c658cbe61d5f2553107c1aaab51722365a4d04 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Thu, 1 Aug 2013 15:40:52 +0200 Subject: [PATCH] jitterbuffer: improve timeout management 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 | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/gst/rtpmanager/gstrtpjitterbuffer.c b/gst/rtpmanager/gstrtpjitterbuffer.c index e1f8580248..fc34c36b8b 100644 --- a/gst/rtpmanager/gstrtpjitterbuffer.c +++ b/gst/rtpmanager/gstrtpjitterbuffer.c @@ -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);