rtpjitterbuffer: If we get a gap with a buffer without DTS, error out
authorSebastian Dröge <sebastian@centricular.com>
Wed, 7 Jan 2015 17:05:18 +0000 (18:05 +0100)
committerSebastian Dröge <sebastian@centricular.com>
Wed, 7 Jan 2015 17:05:18 +0000 (18:05 +0100)
We (currently?) can't really handle gaps between RTP packets if they're not
properly timestamped. The current code would go into calculations with
GST_CLOCK_TIME_NONE and then cause assertions everywhere. It's probably
better to error out cleanly instead.

gst/rtpmanager/gstrtpjitterbuffer.c

index fee6b60..dfaea37 100644 (file)
@@ -2222,7 +2222,12 @@ gst_rtp_jitter_buffer_chain (GstPad * pad, GstObject * parent,
     } else {
       gboolean reset = FALSE;
 
-      if (gap < 0) {
+      if (!GST_CLOCK_TIME_IS_VALID (dts)) {
+        /* We would run into calculations with GST_CLOCK_TIME_NONE below
+         * and can't compensate for anything without DTS on RTP packets
+         */
+        goto gap_but_no_dts;
+      } else if (gap < 0) {
         /* we received an old packet */
         if (G_UNLIKELY (gap < -RTP_MAX_MISORDER)) {
           /* too old packet, reset */
@@ -2405,6 +2410,14 @@ duplicate:
     free_item (item);
     goto finished;
   }
+gap_but_no_dts:
+  {
+    /* this is fatal as we can't compensate for gaps without DTS */
+    GST_ELEMENT_ERROR (jitterbuffer, STREAM, DECODE, (NULL),
+        ("Received packet without DTS after a gap"));
+    gst_buffer_unref (buffer);
+    return GST_FLOW_ERROR;
+  }
 }
 
 static GstClockTime