summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--gst/rtpmanager/gstrtpjitterbuffer.c15
2 files changed, 22 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index c1e20e97..1609f72a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2007-08-27 Wim Taymans <wim.taymans@gmail.com>
+
+ * 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.
+
2007-08-27 Julien MOUTTE <julien@moutte.net>
* gst/flv/gstflvdemux.c: (gst_flv_demux_handle_seek_pull):
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,