mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-23 06:26:23 +00:00
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:
parent
114ba3dc6e
commit
be4517a6b8
2 changed files with 85 additions and 2 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in a new issue