diff --git a/gst/rtpmanager/rtpjitterbuffer.c b/gst/rtpmanager/rtpjitterbuffer.c index 6837bd4791..fd00fbbd97 100644 --- a/gst/rtpmanager/rtpjitterbuffer.c +++ b/gst/rtpmanager/rtpjitterbuffer.c @@ -65,6 +65,7 @@ static void rtp_jitter_buffer_init (RTPJitterBuffer * jbuf) { jbuf->packets = g_queue_new (); + jbuf->mode = RTP_JITTER_BUFFER_MODE_SLAVE; rtp_jitter_buffer_reset_skew (jbuf); } @@ -99,6 +100,39 @@ rtp_jitter_buffer_new (void) return jbuf; } +/** + * rtp_jitter_buffer_get_mode: + * @jbuf: an #RTPJitterBuffer + * + * Get the current jitterbuffer mode. + * + * Returns: the current jitterbuffer mode. + */ +RTPJitterBufferMode +rtp_jitter_buffer_get_mode (RTPJitterBuffer * jbuf) +{ + return jbuf->mode; +} + +/** + * rtp_jitter_buffer_set_mode: + * @jbuf: an #RTPJitterBuffer + * @mode: a #RTPJitterBufferMode + * + * Set the buffering and clock slaving algorithm used in the @jbuf. + */ +void +rtp_jitter_buffer_set_mode (RTPJitterBuffer * jbuf, RTPJitterBufferMode mode) +{ + jbuf->mode = mode; +} + +/** + * rtp_jitter_buffer_reset_skew: + * @jbuf: an #RTPJitterBuffer + * + * Reset the skew calculations in @jbuf. + */ void rtp_jitter_buffer_reset_skew (RTPJitterBuffer * jbuf) { @@ -468,7 +502,20 @@ rtp_jitter_buffer_insert (RTPJitterBuffer * jbuf, GstBuffer * buf, * receive time, this function will retimestamp @buf with the skew corrected * running time. */ rtptime = gst_rtp_buffer_get_timestamp (buf); - time = calculate_skew (jbuf, rtptime, time, clock_rate, max_delay); + switch (jbuf->mode) { + case RTP_JITTER_BUFFER_MODE_NONE: + time = GST_BUFFER_TIMESTAMP (buf); + 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); + break; + default: + break; + } + GST_BUFFER_TIMESTAMP (buf) = time; /* It's more likely that the packet was inserted in the front of the buffer */ @@ -564,9 +611,16 @@ rtp_jitter_buffer_flush (RTPJitterBuffer * jbuf) guint rtp_jitter_buffer_num_packets (RTPJitterBuffer * jbuf) { + guint result; + g_return_val_if_fail (jbuf != NULL, 0); - return jbuf->packets->length; + if (!jbuf->buffering) + result = jbuf->packets->length; + else + result = 0; + + return result; } /** diff --git a/gst/rtpmanager/rtpjitterbuffer.h b/gst/rtpmanager/rtpjitterbuffer.h index 9a7232c057..63da44b385 100644 --- a/gst/rtpmanager/rtpjitterbuffer.h +++ b/gst/rtpmanager/rtpjitterbuffer.h @@ -33,6 +33,28 @@ typedef struct _RTPJitterBufferClass RTPJitterBufferClass; #define RTP_IS_JITTER_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),RTP_TYPE_JITTER_BUFFER)) #define RTP_JITTER_BUFFER_CAST(src) ((RTPJitterBuffer *)(src)) +/** + * RTPJitterBufferMode: + * + * RTP_JITTER_BUFFER_MODE_NONE: don't do any skew correction, outgoing + * timestamps are calculated directly from the RTP timestamps. This mode is + * good for recording but not for real-time applications. + * RTP_JITTER_BUFFER_MODE_SLAVE: calculate the skew between sender and receiver + * and produce smoothed adjusted outgoing timestamps. This mode is good for + * low latency communications. + * RTP_JITTER_BUFFER_MODE_BUFFER: buffer packets between low/high watermarks. + * This mode is good for streaming communication. + * RTP_JITTER_BUFFER_MODE_LAST: last buffer mode. + * + * The different buffer modes for a jitterbuffer. + */ +typedef enum { + RTP_JITTER_BUFFER_MODE_NONE = 0, + RTP_JITTER_BUFFER_MODE_SLAVE = 1, + RTP_JITTER_BUFFER_MODE_BUFFER = 2, + RTP_JITTER_BUFFER_MODE_LAST +} RTPJitterBufferMode; + /** * RTPTailChanged: * @jbuf: an #RTPJitterBuffer @@ -53,6 +75,10 @@ struct _RTPJitterBuffer { GQueue *packets; + RTPJitterBufferMode mode; + + gboolean buffering; + /* for calculating skew */ GstClockTime base_time; GstClockTime base_rtptime; @@ -79,6 +105,9 @@ GType rtp_jitter_buffer_get_type (void); /* managing lifetime */ RTPJitterBuffer* rtp_jitter_buffer_new (void); +RTPJitterBufferMode rtp_jitter_buffer_get_mode (RTPJitterBuffer *jbuf); +void rtp_jitter_buffer_set_mode (RTPJitterBuffer *jbuf, RTPJitterBufferMode mode); + void rtp_jitter_buffer_reset_skew (RTPJitterBuffer *jbuf); gboolean rtp_jitter_buffer_insert (RTPJitterBuffer *jbuf, GstBuffer *buf,