gst/rtpmanager/: Also keep track of the first buffer timestamp together with the...
authorWim Taymans <wim.taymans@gmail.com>
Fri, 25 Apr 2008 08:15:58 +0000 (08:15 +0000)
committerTim-Philipp Müller <tim.muller@collabora.co.uk>
Tue, 11 Aug 2009 01:30:34 +0000 (02:30 +0100)
Original commit message from CVS:
* gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_associate),
(gst_rtp_bin_sync_chain):
* gst/rtpmanager/rtpsession.c: (update_arrival_stats),
(rtp_session_process_sr), (rtp_session_on_timeout):
* gst/rtpmanager/rtpsource.c: (rtp_source_init),
(calculate_jitter):
* gst/rtpmanager/rtpsource.h:
* gst/rtpmanager/rtpstats.h:
Also keep track of the first buffer timestamp together with the first
RTP timestamp as they both are needed to construct the timing of
outgoing packets in the jitterbuffer and are therefore also needed to
manage lip-sync. This fixes lip-sync if the first RTP packets arrive
with a wildly different gap.

gst/rtpmanager/gstrtpbin.c
gst/rtpmanager/rtpsession.c
gst/rtpmanager/rtpsource.c
gst/rtpmanager/rtpsource.h
gst/rtpmanager/rtpstats.h

index 76b806b..8cfd63c 100644 (file)
@@ -306,6 +306,7 @@ struct _GstRtpBinStream
 
   /* for lip-sync */
   guint64 clock_base;
+  guint64 clock_base_time;
   gint clock_rate;
   gint64 ts_offset;
   gint64 prev_ts_offset;
@@ -785,6 +786,7 @@ gst_rtp_bin_associate (GstRtpBin * bin, GstRtpBinStream * stream, guint8 len,
   stream->local_unix =
       gst_util_uint64_scale_int (stream->local_rtp, GST_SECOND,
       stream->clock_rate);
+  stream->local_unix += stream->clock_base_time;
   /* calculate delta between server and receiver */
   stream->unix_delta = stream->last_unix - stream->local_unix;
 
@@ -942,6 +944,7 @@ gst_rtp_bin_sync_chain (GstPad * pad, GstBuffer * buffer)
 
             if (type == GST_RTCP_SDES_CNAME) {
               stream->clock_base = GST_BUFFER_OFFSET (buffer);
+              stream->clock_base_time = GST_BUFFER_OFFSET_END (buffer);
               /* associate the stream to CNAME */
               gst_rtp_bin_associate (bin, stream, len, data);
             }
index 0eaf3e6..7ddcfe4 100644 (file)
@@ -1233,6 +1233,7 @@ update_arrival_stats (RTPSession * sess, RTPArrivalStats * arrival,
   /* get time of arrival */
   g_get_current_time (&current);
   arrival->time = GST_TIMEVAL_TO_TIME (current);
+  arrival->timestamp = GST_BUFFER_TIMESTAMP (buffer);
   arrival->ntpnstime = ntpnstime;
 
   /* get packet size including header overhead */
@@ -1434,6 +1435,7 @@ rtp_session_process_sr (RTPSession * sess, GstRTCPPacket * packet,
     return;
 
   GST_BUFFER_OFFSET (packet->buffer) = source->clock_base;
+  GST_BUFFER_OFFSET_END (packet->buffer) = source->clock_base_time;
 
   prevsender = RTP_SOURCE_IS_SENDER (source);
 
index 938a1d5..36def46 100644 (file)
@@ -171,6 +171,7 @@ rtp_source_init (RTPSource * src)
   src->payload = 0;
   src->clock_rate = -1;
   src->clock_base = -1;
+  src->clock_base_time = -1;
   src->packets = g_queue_new ();
   src->seqnum_base = -1;
   src->last_rtptime = -1;
@@ -772,6 +773,7 @@ calculate_jitter (RTPSource * src, GstBuffer * buffer,
   if (src->clock_base == -1) {
     GST_DEBUG ("using clock-base of %" G_GUINT32_FORMAT, rtptime);
     src->clock_base = rtptime;
+    src->clock_base_time = arrival->timestamp;
   }
 
   /* convert arrival time to RTP timestamp units, truncate to 32 bits, we don't
index 1eae0c1..a2ba2d6 100644 (file)
@@ -134,6 +134,7 @@ struct _RTPSource {
   gint          clock_rate;
   gint32        seqnum_base;
   gint64        clock_base;
+  guint64       clock_base_time;
 
   GstClockTime  bye_time;
   GstClockTime  last_activity;
index c0d3a51..f82c958 100644 (file)
@@ -56,7 +56,8 @@ typedef struct {
 
 /**
  * RTPArrivalStats:
- * @time: arrival time of a packet
+ * @time: arrival time of a packet according to the system clock
+ * @timestamp: arrival time of a packet as buffer timestamp
  * @address: address of the sender of the packet
  * @bytes: bytes of the packet including lowlevel overhead
  * @payload_len: bytes of the RTP payload
@@ -65,6 +66,7 @@ typedef struct {
  */
 typedef struct {
   GstClockTime  time;
+  GstClockTime  timestamp;
   guint64       ntpnstime;
   gboolean      have_address;
   GstNetAddress address;