summaryrefslogtreecommitdiffstats
path: root/gst/rtpmanager/gstrtpjitterbuffer.c
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@gmail.com>2007-08-27 21:17:21 +0000
committerWim Taymans <wim.taymans@gmail.com>2007-08-27 21:17:21 +0000
commite966504766a3b41f89dc85379f4e247cda615389 (patch)
treec8458f4d7f3187ef0f42c218456c19c6fc8528a4 /gst/rtpmanager/gstrtpjitterbuffer.c
parent3b7aec9e9e16f1d29349603d07e006d3a7c678fb (diff)
downloadgst-plugins-bad-e966504766a3b41f89dc85379f4e247cda615389.tar.gz
gst-plugins-bad-e966504766a3b41f89dc85379f4e247cda615389.tar.bz2
gst-plugins-bad-e966504766a3b41f89dc85379f4e247cda615389.zip
gst/rtpmanager/gstrtpjitterbuffer.c: When synchronizing buffers, take peer latency into account.
Original commit message from CVS: * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_change_state), (gst_rtp_jitter_buffer_loop), (gst_rtp_jitter_buffer_query): When synchronizing buffers, take peer latency into account. Don't try to add our latency to invalid peer max latency values.
Diffstat (limited to 'gst/rtpmanager/gstrtpjitterbuffer.c')
-rw-r--r--gst/rtpmanager/gstrtpjitterbuffer.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/gst/rtpmanager/gstrtpjitterbuffer.c b/gst/rtpmanager/gstrtpjitterbuffer.c
index 02a8af98..2e44425a 100644
--- a/gst/rtpmanager/gstrtpjitterbuffer.c
+++ b/gst/rtpmanager/gstrtpjitterbuffer.c
@@ -158,6 +158,9 @@ struct _GstRtpJitterBufferPrivate
GstSegment segment;
GstClockID clock_id;
guint32 waiting_seqnum;
+ /* the latency of the upstream peer, we have to take this into account when
+ * synchronizing the buffers. */
+ GstClockTime peer_latency;
/* some accounting */
guint64 num_late;
@@ -581,6 +584,7 @@ gst_rtp_jitter_buffer_change_state (GstElement * element,
/* reset negotiated values */
priv->clock_rate = -1;
priv->clock_base = -1;
+ priv->peer_latency = 0;
/* block until we go to PLAYING */
priv->blocked = TRUE;
JBUF_UNLOCK (priv);
@@ -1011,6 +1015,7 @@ again:
/* add latency */
running_time += (priv->latency_ms * GST_MSECOND);
+ running_time += priv->peer_latency;
GST_DEBUG_OBJECT (jitterbuffer, "sync to running_time %" GST_TIME_FORMAT,
GST_TIME_ARGS (running_time));
@@ -1152,8 +1157,16 @@ gst_rtp_jitter_buffer_query (GstPad * pad, GstQuery * query)
GST_TIME_FORMAT " max %" GST_TIME_FORMAT,
GST_TIME_ARGS (min_latency), GST_TIME_ARGS (max_latency));
+ /* store this so that we can safely sync on the peer buffers. */
+ JBUF_LOCK (priv);
+ priv->peer_latency = min_latency;
+ JBUF_UNLOCK (priv);
+
min_latency += priv->latency_ms * GST_MSECOND;
- max_latency += priv->latency_ms * GST_MSECOND;
+ /* max_latency can be -1, meaning there is no upper limit for the
+ * latency. */
+ if (max_latency != -1)
+ max_latency += priv->latency_ms * GST_MSECOND;
GST_DEBUG_OBJECT (jitterbuffer, "Calculated total latency : min %"
GST_TIME_FORMAT " max %" GST_TIME_FORMAT,