From ecf6ed8fc1de440f1af78779e6338ed69e988b87 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Tue, 6 Oct 2009 13:33:15 +0200 Subject: [PATCH] jitterbuffer: keep track of offset Keep track of an outgoing offset that we add to each outgoing buffer to compensate for PAUSE when buffering. Adjust the offset when activating. --- gst/rtpmanager/gstrtpjitterbuffer.c | 24 ++++++++++++++++++------ gst/rtpmanager/gstrtpjitterbuffer.h | 2 +- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/gst/rtpmanager/gstrtpjitterbuffer.c b/gst/rtpmanager/gstrtpjitterbuffer.c index 69dbdc8b17..7fb1e73310 100644 --- a/gst/rtpmanager/gstrtpjitterbuffer.c +++ b/gst/rtpmanager/gstrtpjitterbuffer.c @@ -136,6 +136,7 @@ struct _GstRtpJitterBufferPrivate gboolean waiting; gboolean discont; gboolean active; + guint64 out_offset; /* properties */ guint latency_ms; @@ -648,17 +649,26 @@ gst_rtp_jitter_buffer_clear_pt_map (GstRtpJitterBuffer * jitterbuffer) static void gst_rtp_jitter_buffer_set_active (GstRtpJitterBuffer * jbuf, gboolean active, - guint64 base_time) + guint64 elapsed) { GstRtpJitterBufferPrivate *priv; priv = jbuf->priv; JBUF_LOCK (priv); - GST_DEBUG_OBJECT (jbuf, "setting active %d at time %" GST_TIME_FORMAT, active, - GST_TIME_ARGS (base_time)); - priv->active = active; - JBUF_SIGNAL (priv); + GST_DEBUG_OBJECT (jbuf, "setting active %d with elapsed %" GST_TIME_FORMAT, + active, GST_TIME_ARGS (elapsed)); + + if (active != priv->active) { + /* add the amount of time spent in paused to the output offset. All + * outgoing buffers will have this offset applied to their timestamps in + * order to make them arrive in time in the sink. */ + priv->out_offset += elapsed; + GST_DEBUG_OBJECT (jbuf, "out offset %" GST_TIME_FORMAT, + GST_TIME_ARGS (priv->out_offset)); + priv->active = active; + JBUF_SIGNAL (priv); + } JBUF_UNLOCK (priv); } @@ -1392,8 +1402,10 @@ apply_offset (GstRtpJitterBuffer * jitterbuffer, GstClockTime timestamp) if (timestamp == -1) return -1; - /* apply the timestamp offset */ + /* apply the timestamp offset, this is used for inter stream sync */ timestamp += priv->ts_offset; + /* add the offset, this is used when buffering */ + timestamp += priv->out_offset; return timestamp; } diff --git a/gst/rtpmanager/gstrtpjitterbuffer.h b/gst/rtpmanager/gstrtpjitterbuffer.h index 68604a2b68..b4f2330bf8 100644 --- a/gst/rtpmanager/gstrtpjitterbuffer.h +++ b/gst/rtpmanager/gstrtpjitterbuffer.h @@ -77,7 +77,7 @@ struct _GstRtpJitterBufferClass /* actions */ void (*clear_pt_map) (GstRtpJitterBuffer *buffer); - void (*set_active) (GstRtpJitterBuffer *buffer, gboolean active, guint64 base_time); + void (*set_active) (GstRtpJitterBuffer *buffer, gboolean active, guint64 elapsed); /*< private > */ gpointer _gst_reserved[GST_PADDING];