rtpjitterbuffer: Fix expected_dts calc in calculate_expected
authorMiguel París Díaz <mparisdiaz@gmail.com>
Tue, 4 Nov 2014 14:00:52 +0000 (15:00 +0100)
committerSebastian Dröge <sebastian@centricular.com>
Mon, 13 Apr 2015 07:06:33 +0000 (09:06 +0200)
Right above we consider lost_packet packets, each of them having duration,
as lost and triggered their timers immediately. Below we use expected_dts
to schedule retransmission or schedule lost timers for the packets that
come after expected_dts.

As we just triggered lost_packets packets as lost, there's no point in
scheduling new timers for them and we can just skip over all lost packets.

https://bugzilla.gnome.org/show_bug.cgi?id=739868

gst/rtpmanager/gstrtpjitterbuffer.c

index 6c3c9b8..937d50e 100644 (file)
@@ -2004,6 +2004,7 @@ calculate_expected (GstRtpJitterBuffer * jitterbuffer, guint32 expected,
   GstRtpJitterBufferPrivate *priv = jitterbuffer->priv;
   GstClockTime total_duration, duration, expected_dts;
   TimerType type;
+  guint lost_packets = 0;
 
   GST_DEBUG_OBJECT (jitterbuffer,
       "dts %" GST_TIME_FORMAT ", last %" GST_TIME_FORMAT,
@@ -2025,7 +2026,6 @@ calculate_expected (GstRtpJitterBuffer * jitterbuffer, guint32 expected,
 
   if (total_duration > priv->latency_ns) {
     GstClockTime gap_time;
-    guint lost_packets;
 
     gap_time = total_duration - priv->latency_ns;
 
@@ -2052,7 +2052,7 @@ calculate_expected (GstRtpJitterBuffer * jitterbuffer, guint32 expected,
     priv->last_in_dts += gap_time;
   }
 
-  expected_dts = priv->last_in_dts + duration;
+  expected_dts = priv->last_in_dts + (lost_packets + 1) * duration;
 
   if (priv->do_retransmission) {
     TimerData *timer;