From: Wim Taymans Date: Thu, 1 Oct 2009 10:46:21 +0000 (+0200) Subject: jitterbuffer: flesh out buffering mode some more X-Git-Tag: 1.19.3~509^2~9132 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=aeacbfed3ef603d4931c5d37844a9710582b7ad7;p=platform%2Fupstream%2Fgstreamer.git jitterbuffer: flesh out buffering mode some more Add a buffering state to the jitterbuffer and wait until buffering ends before pushing out packets. --- diff --git a/gst/rtpmanager/gstrtpjitterbuffer.c b/gst/rtpmanager/gstrtpjitterbuffer.c index fc06b2d..15eb4cf 100644 --- a/gst/rtpmanager/gstrtpjitterbuffer.c +++ b/gst/rtpmanager/gstrtpjitterbuffer.c @@ -1438,6 +1438,9 @@ again: id = NULL; /* always wait if we are blocked */ if (G_LIKELY (!priv->blocked)) { + /* we're buffering, wait */ + if (rtp_jitter_buffer_is_buffering (priv->jbuf)) + goto do_wait; /* if we have a packet, we can exit the loop and grab it */ if (rtp_jitter_buffer_num_packets (priv->jbuf) > 0) break; @@ -1460,6 +1463,7 @@ again: GST_OBJECT_UNLOCK (jitterbuffer); } } + do_wait: /* now we wait */ GST_DEBUG_OBJECT (jitterbuffer, "waiting"); priv->waiting = TRUE; diff --git a/gst/rtpmanager/rtpjitterbuffer.c b/gst/rtpmanager/rtpjitterbuffer.c index c37f311..b15ab09 100644 --- a/gst/rtpmanager/rtpjitterbuffer.c +++ b/gst/rtpmanager/rtpjitterbuffer.c @@ -125,6 +125,12 @@ void rtp_jitter_buffer_set_mode (RTPJitterBuffer * jbuf, RTPJitterBufferMode mode) { jbuf->mode = mode; + + if (mode == RTP_JITTER_BUFFER_MODE_BUFFER) { + /* when we're in buffering mode, always set our state to buffering, we'll + * get out of it when we push the next buffer */ + jbuf->buffering = TRUE; + } } /** @@ -510,14 +516,19 @@ rtp_jitter_buffer_insert (RTPJitterBuffer * jbuf, GstBuffer * buf, time = 0; else time = -1; - time = calculate_skew (jbuf, rtptime, time, clock_rate, max_delay); break; case RTP_JITTER_BUFFER_MODE_SLAVE: time = calculate_skew (jbuf, rtptime, time, clock_rate, max_delay); break; case RTP_JITTER_BUFFER_MODE_BUFFER: - time = GST_BUFFER_TIMESTAMP (buf); + /* send -1 for all timestamps except the first one. This will make the + * timestamps increase according to the RTP timestamps. When in buffering + * mode we will adjust the outgoing timestamps relative with how long we + * buffered */ + if (jbuf->base_time != -1) + time = -1; + time = calculate_skew (jbuf, rtptime, time, clock_rate, max_delay); break; default: break; @@ -608,6 +619,21 @@ rtp_jitter_buffer_flush (RTPJitterBuffer * jbuf) } /** + * rtp_jitter_buffer_is_buffering: + * @jbuf: an #RTPJitterBuffer + * + * Check if @jbuf is buffering currently. Users of the jitterbuffer should not + * pop packets while in buffering mode. + * + * Returns: the buffering state of @jbuf + */ +gboolean +rtp_jitter_buffer_is_buffering (RTPJitterBuffer * jbuf) +{ + return jbuf->buffering; +} + +/** * rtp_jitter_buffer_num_packets: * @jbuf: an #RTPJitterBuffer * @@ -618,16 +644,9 @@ rtp_jitter_buffer_flush (RTPJitterBuffer * jbuf) guint rtp_jitter_buffer_num_packets (RTPJitterBuffer * jbuf) { - guint result; - g_return_val_if_fail (jbuf != NULL, 0); - if (!jbuf->buffering) - result = jbuf->packets->length; - else - result = 0; - - return result; + return jbuf->packets->length; } /** diff --git a/gst/rtpmanager/rtpjitterbuffer.h b/gst/rtpmanager/rtpjitterbuffer.h index 63da44b..5c84a09 100644 --- a/gst/rtpmanager/rtpjitterbuffer.h +++ b/gst/rtpmanager/rtpjitterbuffer.h @@ -120,6 +120,8 @@ GstBuffer * rtp_jitter_buffer_pop (RTPJitterBuffer *jbuf) void rtp_jitter_buffer_flush (RTPJitterBuffer *jbuf); +gboolean rtp_jitter_buffer_is_buffering (RTPJitterBuffer * jbuf); + guint rtp_jitter_buffer_num_packets (RTPJitterBuffer *jbuf); guint32 rtp_jitter_buffer_get_ts_diff (RTPJitterBuffer *jbuf);