mp4gdepay: improve constantDuration guessing
authorWim Taymans <wim.taymans@collabora.co.uk>
Wed, 17 Mar 2010 15:23:24 +0000 (16:23 +0100)
committerWim Taymans <wim.taymans@collabora.co.uk>
Wed, 17 Mar 2010 15:27:13 +0000 (16:27 +0100)
When no constantDuration has been given in the caps, try to derive one from the
timestamp difference between packets. Also keep doing this for each packet
because some broken streams might simply provide wrong timestamps.

gst/rtp/gstrtpmp4gdepay.c

index 939e3f1a8eb6bc22f147b7aec95ee15f5e3d6fc5..8a3b5486f85f6964f018706bae9d4f6c19eccc55 100644 (file)
@@ -441,6 +441,8 @@ gst_rtp_mp4g_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf)
     payload_len = gst_rtp_buffer_get_payload_len (buf);
     payload = gst_rtp_buffer_get_payload (buf);
 
+    GST_DEBUG_OBJECT (rtpmp4gdepay, "received payload of %d", payload_len);
+
     rtptime = gst_rtp_buffer_get_timestamp (buf);
     M = gst_rtp_buffer_get_marker (buf);
 
@@ -526,8 +528,11 @@ gst_rtp_mp4g_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf)
         if (i == 0) {
           AU_index = gst_bs_parse_read (&bs, rtpmp4gdepay->indexlength);
 
+          GST_DEBUG_OBJECT (rtpmp4gdepay, "AU index %u", AU_index);
+
           if (AU_index == 0 && rtpmp4gdepay->prev_AU_index == 0) {
             gint diff;
+            gint cd;
 
             /* if we see two consecutive packets with AU_index of 0, we can
              * assume we have constantDuration packets. Since we don't have
@@ -540,15 +545,17 @@ gst_rtp_mp4g_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf)
               diff = -(rtpmp4gdepay->prev_rtptime - rtptime);
 
             /* if no constantDuration was given, make one */
-            if (rtpmp4gdepay->constantDuration == 0) {
-              rtpmp4gdepay->constantDuration = diff / num_AU_headers;
-              GST_DEBUG_OBJECT (depayload, "guessing constantDuration %d",
-                  rtpmp4gdepay->constantDuration);
+            if (rtpmp4gdepay->constantDuration != 0) {
+              cd = rtpmp4gdepay->constantDuration;
+              GST_DEBUG_OBJECT (depayload, "using constantDuration %d", cd);
+            } else {
+              cd = diff / num_AU_headers;
+              GST_DEBUG_OBJECT (depayload, "guessing constantDuration %d", cd);
             }
 
-            if (rtpmp4gdepay->constantDuration > 0) {
+            if (cd > 0) {
               /* get the number of packets by dividing with the duration */
-              diff /= rtpmp4gdepay->constantDuration;
+              diff /= cd;
             } else {
               diff = 0;
             }
@@ -558,6 +565,8 @@ gst_rtp_mp4g_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf)
 
             AU_index = rtpmp4gdepay->last_AU_index;
 
+            GST_DEBUG_OBJECT (rtpmp4gdepay, "diff %d, AU index %u", diff,
+                AU_index);
           } else {
             rtpmp4gdepay->prev_AU_index = AU_index;
             rtpmp4gdepay->last_AU_index = AU_index;