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. */
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));
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 *
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);