mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-23 14:36:24 +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)
|
rtp_jitter_buffer_init (RTPJitterBuffer * jbuf)
|
||||||
{
|
{
|
||||||
jbuf->packets = g_queue_new ();
|
jbuf->packets = g_queue_new ();
|
||||||
|
jbuf->mode = RTP_JITTER_BUFFER_MODE_SLAVE;
|
||||||
|
|
||||||
rtp_jitter_buffer_reset_skew (jbuf);
|
rtp_jitter_buffer_reset_skew (jbuf);
|
||||||
}
|
}
|
||||||
|
@ -99,6 +100,39 @@ rtp_jitter_buffer_new (void)
|
||||||
return jbuf;
|
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
|
void
|
||||||
rtp_jitter_buffer_reset_skew (RTPJitterBuffer * jbuf)
|
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
|
* receive time, this function will retimestamp @buf with the skew corrected
|
||||||
* running time. */
|
* running time. */
|
||||||
rtptime = gst_rtp_buffer_get_timestamp (buf);
|
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);
|
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;
|
GST_BUFFER_TIMESTAMP (buf) = time;
|
||||||
|
|
||||||
/* It's more likely that the packet was inserted in the front of the buffer */
|
/* 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
|
guint
|
||||||
rtp_jitter_buffer_num_packets (RTPJitterBuffer * jbuf)
|
rtp_jitter_buffer_num_packets (RTPJitterBuffer * jbuf)
|
||||||
{
|
{
|
||||||
|
guint result;
|
||||||
|
|
||||||
g_return_val_if_fail (jbuf != NULL, 0);
|
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_IS_JITTER_BUFFER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),RTP_TYPE_JITTER_BUFFER))
|
||||||
#define RTP_JITTER_BUFFER_CAST(src) ((RTPJitterBuffer *)(src))
|
#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:
|
* RTPTailChanged:
|
||||||
* @jbuf: an #RTPJitterBuffer
|
* @jbuf: an #RTPJitterBuffer
|
||||||
|
@ -53,6 +75,10 @@ struct _RTPJitterBuffer {
|
||||||
|
|
||||||
GQueue *packets;
|
GQueue *packets;
|
||||||
|
|
||||||
|
RTPJitterBufferMode mode;
|
||||||
|
|
||||||
|
gboolean buffering;
|
||||||
|
|
||||||
/* for calculating skew */
|
/* for calculating skew */
|
||||||
GstClockTime base_time;
|
GstClockTime base_time;
|
||||||
GstClockTime base_rtptime;
|
GstClockTime base_rtptime;
|
||||||
|
@ -79,6 +105,9 @@ GType rtp_jitter_buffer_get_type (void);
|
||||||
/* managing lifetime */
|
/* managing lifetime */
|
||||||
RTPJitterBuffer* rtp_jitter_buffer_new (void);
|
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);
|
void rtp_jitter_buffer_reset_skew (RTPJitterBuffer *jbuf);
|
||||||
|
|
||||||
gboolean rtp_jitter_buffer_insert (RTPJitterBuffer *jbuf, GstBuffer *buf,
|
gboolean rtp_jitter_buffer_insert (RTPJitterBuffer *jbuf, GstBuffer *buf,
|
||||||
|
|
Loading…
Reference in a new issue