jitterbuffer: add buffering mode options

Add getters and setters for different buffering modes that the jitterbuffer will
support. Default to the current slave mode.
This commit is contained in:
Wim Taymans 2009-10-01 11:20:08 +02:00
parent 114ba3dc6e
commit be4517a6b8
2 changed files with 85 additions and 2 deletions

View file

@ -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);
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;
}
/**

View file

@ -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,