From: Wim Taymans Date: Thu, 1 Aug 2013 21:29:23 +0000 (+0200) Subject: jitterbuffer: refactor timer update X-Git-Tag: 1.19.3~509^2~5495 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=70695466ed3e8e0d3d1a78d3d15ab3cefa94e127;p=platform%2Fupstream%2Fgstreamer.git jitterbuffer: refactor timer update --- diff --git a/gst/rtpmanager/gstrtpjitterbuffer.c b/gst/rtpmanager/gstrtpjitterbuffer.c index a465aa9..6c0cc7f 100644 --- a/gst/rtpmanager/gstrtpjitterbuffer.c +++ b/gst/rtpmanager/gstrtpjitterbuffer.c @@ -1421,6 +1421,37 @@ remove_all_timers (GstRtpJitterBuffer * jitterbuffer) unschedule_current_timer (jitterbuffer); } +/* we just received a packet with seqnum and dts. + * + * If we have a valid packet spacing estimate we can set a timer for when we + * should receive the next packet. + * If we don't have a valid estimate, we remove any timer we might have + * had for this packet. + */ +static void +update_timers (GstRtpJitterBuffer * jitterbuffer, guint16 seqnum, + GstClockTime dts) +{ + GstRtpJitterBufferPrivate *priv = jitterbuffer->priv; + TimerData *timer; + + /* find the timer for the current seqnum. */ + timer = find_timer (jitterbuffer, TIMER_TYPE_EXPECTED, seqnum); + if (priv->packet_spacing > 0) { + GstClockTime expected; + + /* calculate expected arrival time of the next seqnum */ + expected = dts + priv->packet_spacing + 20 * GST_MSECOND; + /* and update/install timer for next seqnum */ + if (timer) + reschedule_timer (jitterbuffer, timer, priv->next_in_seqnum, expected); + else + timer = add_timer (jitterbuffer, TIMER_TYPE_EXPECTED, + priv->next_in_seqnum, expected); + } else { + remove_timer (jitterbuffer, timer); + } +} static GstFlowReturn gst_rtp_jitter_buffer_chain (GstPad * pad, GstObject * parent, @@ -1437,7 +1468,6 @@ gst_rtp_jitter_buffer_chain (GstPad * pad, GstObject * parent, gint percent = -1; guint8 pt; GstRTPBuffer rtp = GST_RTP_BUFFER_INIT; - TimerData *timer; jitterbuffer = GST_RTP_JITTER_BUFFER (parent); @@ -1557,23 +1587,6 @@ gst_rtp_jitter_buffer_chain (GstPad * pad, GstObject * parent, } priv->next_in_seqnum = (seqnum + 1) & 0xffff; - /* find the timer for the current seqnum. */ - timer = find_timer (jitterbuffer, TIMER_TYPE_EXPECTED, seqnum); - if (priv->packet_spacing > 0) { - GstClockTime expected; - - /* calculate expected arrival time of the next seqnum */ - expected = dts + priv->packet_spacing + 20 * GST_MSECOND; - /* and update/install timer for next seqnum */ - if (timer) - reschedule_timer (jitterbuffer, timer, priv->next_in_seqnum, expected); - else - timer = add_timer (jitterbuffer, TIMER_TYPE_EXPECTED, - priv->next_in_seqnum, expected); - } else { - remove_timer (jitterbuffer, timer); - } - /* let's check if this buffer is too late, we can only accept packets with * bigger seqnum than the one we last pushed. */ if (G_LIKELY (priv->last_popped_seqnum != -1)) { @@ -1586,6 +1599,9 @@ gst_rtp_jitter_buffer_chain (GstPad * pad, GstObject * parent, goto too_late; } + /* update timers */ + update_timers (jitterbuffer, seqnum, dts); + /* let's drop oldest packet if the queue is already full and drop-on-latency * is set. We can only do this when there actually is a latency. When no * latency is set, we just pump it in the queue and let the other end push it