libosmo-netif  1.2.0.67-9ee4
Osmocom network interface library
All Data Structures Files Functions Variables Modules
Osmocom Jitter Buffer

Files

file  jibuf.h
 Osmocom Jitter Buffer helpers.
 
file  jibuf.c
 Osmocom Jitter Buffer helpers.
 

Data Structures

struct  osmo_jibuf
 A structure representing a single instance of a jitter buffer. More...
 
struct  osmo_jibuf_msgb_cb
 

Macros

#define SAMPLES_PER_PKT   160
 
#define SAMPLE_RATE   8000
 
#define JIBUF_DEFAULT_MIN_DELAY_MS   60
 
#define JIBUF_DEFAULT_MAX_DELAY_MS   200
 
#define JIBUF_REFERENCE_TS_FREQ   60
 
#define JIBUF_BUFFER_RECALC_FREQ   40
 
#define JIBUF_ALLOWED_PKT_DROP   3
 
#define JIBUF_ALLOWED_PKT_CONSECUTIVE_DROP   1
 
#define JIBUF_BUFFER_INC_STEP   20
 
#define JIBUF_BUFFER_DEC_STEP   5
 
#define JIBUF_SKEW_WEIGHT   ((double)1/32)
 
#define JIBUF_MSGB_CB(__msgb)   ((struct osmo_jibuf_msgb_cb *)&((__msgb)->cb[0]))
 

Typedefs

typedef void(* osmo_jibuf_dequeue_cb) (struct msgb *msg, void *data)
 

Functions

struct osmo_jibufosmo_jibuf_alloc (void *talloc_ctx)
 Allocate a new jitter buffer instance. More...
 
void osmo_jibuf_delete (struct osmo_jibuf *jb)
 Destroy a previously allocated jitter buffer instance. More...
 
int osmo_jibuf_enqueue (struct osmo_jibuf *jb, struct msgb *msg)
 Try to enqueue a packet into the jitter buffer. More...
 
bool osmo_jibuf_empty (struct osmo_jibuf *jb)
 Check whether the jitter buffer instance has packets queued or not. More...
 
void osmo_jibuf_set_min_delay (struct osmo_jibuf *jb, uint32_t min_delay)
 Set minimum buffer size for the jitter buffer. More...
 
void osmo_jibuf_set_max_delay (struct osmo_jibuf *jb, uint32_t max_delay)
 Set maximum buffer size for the jitter buffer. More...
 
void osmo_jibuf_enable_skew_compensation (struct osmo_jibuf *jb, bool enable)
 Toggle use of skew detection and compensation mechanism. More...
 
void osmo_jibuf_set_dequeue_cb (struct osmo_jibuf *jb, osmo_jibuf_dequeue_cb dequeue_cb, void *cb_data)
 Set dequeue callback for the jitter buffer. More...
 
static void ms2timeval (struct timeval *ts, uint32_t ms)
 
static uint32_t timeval2ms (const struct timeval *ts)
 
static int clock_gettime_timeval (clockid_t clk_id, struct timeval *tp)
 
static struct timeval * msgb_scheduled_ts (const struct msgb *msg)
 
static void llist_add_sorted (struct msgb *msg, struct llist_head *msg_list)
 
static void enqueue_pkt (struct osmo_jibuf *jb, struct msgb *msg, bool is_syncpoint)
 
static bool msg_get_marker (struct msgb *msg)
 
static uint16_t msg_get_sequence (struct msgb *msg)
 
static uint32_t msg_get_timestamp (struct msgb *msg)
 
static int32_t samples2ms (int32_t samples)
 
static int calc_pkt_rel_delay (struct osmo_jibuf *jb, struct msgb *msg)
 
static bool msg_is_in_sequence (struct osmo_jibuf *jb, struct msgb *msg)
 
static bool msg_is_syncpoint (struct osmo_jibuf *jb, struct msgb *msg)
 
static void msg_set_as_reference (struct osmo_jibuf *jb, struct msgb *msg)
 
static void dequeue_msg (struct osmo_jibuf *jb, struct msgb *msg)
 
static void timer_expired (void *data)
 
static void recalc_clock_skew (struct osmo_jibuf *jb, int32_t rel_delay)
 
static void recalc_threshold_delay (struct osmo_jibuf *jb)
 

Variables

struct osmo_jibuf __attribute__
 

Detailed Description

Function Documentation

◆ osmo_jibuf_alloc()

struct osmo_jibuf * osmo_jibuf_alloc ( void *  talloc_ctx)

Allocate a new jitter buffer instance.

Returns
the new allocated instance

◆ osmo_jibuf_delete()

void osmo_jibuf_delete ( struct osmo_jibuf jb)

Destroy a previously allocated jitter buffer instance.

Parameters
[in]jbPreviously allocated (non-null) jitter buffer instance

All the queued packets are dequeued before deleting the instance.

◆ osmo_jibuf_empty()

bool osmo_jibuf_empty ( struct osmo_jibuf jb)

Check whether the jitter buffer instance has packets queued or not.

Parameters
[in]jbjitter buffer instance
Returns
true if the queue is empty, false otherwise.

◆ osmo_jibuf_enable_skew_compensation()

void osmo_jibuf_enable_skew_compensation ( struct osmo_jibuf jb,
bool  enable 
)

Toggle use of skew detection and compensation mechanism.

Parameters
[in]jbjitter buffer instance
[in]enableWhether to enable or not (default) the skew estimation and compensation mechanism

When this function is called, the estimated skew is reset.

◆ osmo_jibuf_enqueue()

int osmo_jibuf_enqueue ( struct osmo_jibuf jb,
struct msgb *  msg 
)

Try to enqueue a packet into the jitter buffer.

Parameters
[in]jbjitter buffer instance
[in]msgmsgb to enqueue, containing an RTP packet
Returns
<0 if the packet was dropped, 0 otherwise

This function calculates the delay for the enqueued packet. If the delay is bigger than the current buffer size, the function returns -1 and the caller owns the packet again and can free it if required. If the packet is enqueued, 0 is returned and the exact same packet (ownership transfer, no copy is made) will be available again through the dequeue_cb() when the queue timer for this packet expires.

◆ osmo_jibuf_set_dequeue_cb()

void osmo_jibuf_set_dequeue_cb ( struct osmo_jibuf jb,
osmo_jibuf_dequeue_cb  dequeue_cb,
void *  cb_data 
)

Set dequeue callback for the jitter buffer.

Parameters
[in]jbjitter buffer instance
[in]dequeue_cbfunction pointer to call back when the dequeue timer for a given packet expires
[in]cb_datadata pointer to be passed to dequeue_cb together with the msgb.

◆ osmo_jibuf_set_max_delay()

void osmo_jibuf_set_max_delay ( struct osmo_jibuf jb,
uint32_t  max_delay 
)

Set maximum buffer size for the jitter buffer.

Parameters
[in]jbjitter buffer instance
[in]max_delayMaximum buffer size, as in maximum delay in milliseconds

◆ osmo_jibuf_set_min_delay()

void osmo_jibuf_set_min_delay ( struct osmo_jibuf jb,
uint32_t  min_delay 
)

Set minimum buffer size for the jitter buffer.

Parameters
[in]jbjitter buffer instance
[in]min_delayMinimum buffer size, as in minimum delay in milliseconds