From 23b5a346751df9a4bc4f8e3a4c8196f51ea052db Mon Sep 17 00:00:00 2001 From: Ramiro Polla Date: Wed, 15 Apr 2015 22:51:51 +0200 Subject: [PATCH] rtpmp4gdepay: fix timestamps for RTP packets with multiple AUs Use constantDuration to calculate the timestamp of non-first AU in the RTP packet. If constantDuration is not present in the MIME parameters, its value must be calculated based on the timing information from two consecutive RTP packets with AU-Index equal to 0. https://bugzilla.gnome.org/show_bug.cgi?id=747881 --- gst/rtp/gstrtpmp4gdepay.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/gst/rtp/gstrtpmp4gdepay.c b/gst/rtp/gstrtpmp4gdepay.c index 347fd49..c8c79c9 100644 --- a/gst/rtp/gstrtpmp4gdepay.c +++ b/gst/rtp/gstrtpmp4gdepay.c @@ -560,6 +560,15 @@ gst_rtp_mp4g_depay_process (GstRTPBaseDepayload * depayload, GstRTPBuffer * rtp) /* use number of packets and of previous frame */ cd = diff / rtpmp4gdepay->prev_AU_num; GST_DEBUG_OBJECT (depayload, "guessing constantDuration %d", cd); + if (!GST_BUFFER_IS_DISCONT (rtp->buffer)) { + /* rfc3640 - 3.2.3.2 + * if we see two consecutive packets with AU_index of 0 and + * there has been no discontinuity, we must conclude that this + * value of constantDuration is correct from now on. */ + GST_DEBUG_OBJECT (depayload, + "constantDuration of %d detected", cd); + rtpmp4gdepay->constantDuration = cd; + } } else { /* assume this frame has the same number of packets as the * previous one */ @@ -668,9 +677,16 @@ gst_rtp_mp4g_depay_process (GstRTPBaseDepayload * depayload, GstRTPBuffer * rtp) GST_BUFFER_PTS (outbuf) = timestamp; GST_BUFFER_OFFSET (outbuf) = AU_index; - /* make sure we don't use the timestamp again for other AUs in this - * RTP packet. */ - timestamp = -1; + if (rtpmp4gdepay->constantDuration != 0) { + /* if we have constantDuration, calculate timestamp for next AU + * in this RTP packet. */ + timestamp += (rtpmp4gdepay->constantDuration * GST_SECOND) / + depayload->clock_rate; + } else { + /* otherwise, make sure we don't use the timestamp again for other + * AUs. */ + timestamp = GST_CLOCK_TIME_NONE; + } GST_DEBUG_OBJECT (depayload, "pushing buffer of size %" G_GSIZE_FORMAT, -- 2.7.4