rtpmp4gdepay: handle broken AU-Index in non-interleaved streams
authorMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Thu, 27 Aug 2009 13:46:15 +0000 (15:46 +0200)
committerMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Mon, 31 Aug 2009 14:50:01 +0000 (16:50 +0200)
In case of non-interleaved (= sequentially payloaded) streams,
the AU-Index serves little purpose (that is not already covered by
RTP fields).  (Broken) Payloaders might consider this field then
to be disregarded and have non spec compliant values, e.g. each
RTP packet having AU-Index 2 (rather than 0).  As such, ensure/force
simple sequential sending of non-interleaved streams.

gst/rtp/gstrtpmp4gdepay.c
gst/rtp/gstrtpmp4gdepay.h

index e12357a..a4c8a4b 100644 (file)
@@ -276,6 +276,8 @@ gst_rtp_mp4g_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps)
       gst_rtp_mp4g_depay_parse_int (structure, "constantsize", 0);
   rtpmp4gdepay->constantDuration =
       gst_rtp_mp4g_depay_parse_int (structure, "constantduration", 0);
+  rtpmp4gdepay->maxDisplacement =
+      gst_rtp_mp4g_depay_parse_int (structure, "maxdisplacement", 0);
 
 
   /* get config string */
@@ -547,6 +549,22 @@ gst_rtp_mp4g_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf)
             /* a new interleave group started, flush */
             gst_rtp_mp4g_depay_flush_queue (rtpmp4gdepay);
           }
+          if (G_UNLIKELY (!rtpmp4gdepay->maxDisplacement &&
+                  rtpmp4gdepay->max_AU_index != -1
+                  && rtpmp4gdepay->max_AU_index >= AU_index)) {
+            GstBuffer *outbuf;
+
+            /* some broken non-interleaved streams have AU-index jumping around
+             * all over the place, apparently assuming receiver disregards */
+            GST_DEBUG_OBJECT (rtpmp4gdepay, "non-interleaved broken AU indices;"
+                " forcing continuous flush");
+            /* reset AU to avoid repeated DISCONT in such case */
+            outbuf = g_queue_peek_head (rtpmp4gdepay->packets);
+            if (G_LIKELY (outbuf)) {
+              rtpmp4gdepay->next_AU_index = GST_BUFFER_OFFSET (outbuf);
+              gst_rtp_mp4g_depay_flush_queue (rtpmp4gdepay);
+            }
+          }
           rtpmp4gdepay->prev_rtptime = rtptime;
         } else {
           AU_index_delta =
index b87072c..9d534a5 100644 (file)
@@ -49,6 +49,7 @@ struct _GstRtpMP4GDepay
 
   gint constantSize;
   gint constantDuration;
+  gint maxDisplacement;
 
   gint sizelength;
   gint indexlength;