Asterisk - The Open Source Telephony Project GIT-master-2de1a68
Data Structures | Typedefs | Enumerations | Functions
jitterbuf.h File Reference

jitterbuf: an application-independent jitterbuffer jitterbuf.c More...

This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  jb_conf
 
struct  jb_frame
 
struct  jb_info
 
struct  jitterbuf
 

Macros

configuration constants
#define JB_ADJUST_DELAY   40
 
#define JB_HISTORY_DROPPCT   3
 
#define JB_HISTORY_DROPPCT_MAX   4
 
#define JB_HISTORY_MAXBUF_SZ   JB_HISTORY_SZ * JB_HISTORY_DROPPCT_MAX / 100
 
#define JB_HISTORY_SZ   500
 
#define JB_TARGET_EXTRA   40
 

Typedefs

typedef struct jb_conf jb_conf
 
typedef struct jb_frame jb_frame
 
typedef struct jb_info jb_info
 
typedef void(* jb_output_function_t) (const char *fmt,...)
 
typedef struct jitterbuf jitterbuf
 

Enumerations

enum  jb_frame_type { JB_TYPE_CONTROL , JB_TYPE_VOICE , JB_TYPE_VIDEO , JB_TYPE_SILENCE }
 
enum  jb_return_code {
  JB_OK , JB_EMPTY , JB_NOFRAME , JB_INTERP ,
  JB_DROP , JB_SCHED
}
 

Functions

void jb_destroy (jitterbuf *jb)
 destroy jitterbuf More...
 
enum jb_return_code jb_get (jitterbuf *jb, jb_frame *frame, long now, long interpl)
 get a frame for time now (receiver's time) return value is one of JB_OK: You've got frame! JB_DROP: Here's an audio frame you should just drop. Ask me again for this time.. JB_NOFRAME: There's no frame scheduled for this time. JB_INTERP: Please interpolate an interpl-length frame for this time (either we need to grow, or there was a lost frame) JB_EMPTY: The jb is empty. More...
 
enum jb_return_code jb_getall (jitterbuf *jb, jb_frame *frameout)
 unconditionally get frames from jitterbuf until empty More...
 
enum jb_return_code jb_getinfo (jitterbuf *jb, jb_info *stats)
 get jitterbuf info: only "statistics" may be valid More...
 
int jb_is_late (jitterbuf *jb, long ts)
 Checks if the given time stamp is late. More...
 
jitterbufjb_new (void)
 new jitterbuf More...
 
long jb_next (jitterbuf *jb)
 when is the next frame due out, in receiver's time (0=EMPTY) This value may change as frames are added (esp non-audio frames) More...
 
enum jb_return_code jb_put (jitterbuf *jb, void *data, const enum jb_frame_type type, long ms, long ts, long now)
 queue a frame More...
 
void jb_reset (jitterbuf *jb)
 reset jitterbuf More...
 
enum jb_return_code jb_setconf (jitterbuf *jb, jb_conf *conf)
 set jitterbuf conf More...
 
void jb_setoutput (jb_output_function_t err, jb_output_function_t warn, jb_output_function_t dbg)
 

Detailed Description

jitterbuf: an application-independent jitterbuffer jitterbuf.c

Definition in file jitterbuf.h.

Macro Definition Documentation

◆ JB_ADJUST_DELAY

#define JB_ADJUST_DELAY   40

ms between growing and shrinking; may not be honored if jitterbuffer runs out of space

Definition at line 45 of file jitterbuf.h.

◆ JB_HISTORY_DROPPCT

#define JB_HISTORY_DROPPCT   3

what percentage of timestamps should we drop from the history when we examine it; this might eventually be something made configurable

Definition at line 37 of file jitterbuf.h.

◆ JB_HISTORY_DROPPCT_MAX

#define JB_HISTORY_DROPPCT_MAX   4

the maximum droppct we can handle (say it was configurable).

Definition at line 39 of file jitterbuf.h.

◆ JB_HISTORY_MAXBUF_SZ

#define JB_HISTORY_MAXBUF_SZ   JB_HISTORY_SZ * JB_HISTORY_DROPPCT_MAX / 100

the size of the buffer we use to keep the top and botton timestamps for dropping

Definition at line 41 of file jitterbuf.h.

◆ JB_HISTORY_SZ

#define JB_HISTORY_SZ   500

Number of historical timestamps to use in calculating jitter and drift

Definition at line 34 of file jitterbuf.h.

◆ JB_TARGET_EXTRA

#define JB_TARGET_EXTRA   40

amount of additional jitterbuffer adjustment

Definition at line 43 of file jitterbuf.h.

Typedef Documentation

◆ jb_conf

typedef struct jb_conf jb_conf

◆ jb_frame

typedef struct jb_frame jb_frame

◆ jb_info

typedef struct jb_info jb_info

◆ jb_output_function_t

typedef void(* jb_output_function_t) (const char *fmt,...)

Definition at line 168 of file jitterbuf.h.

◆ jitterbuf

typedef struct jitterbuf jitterbuf

Enumeration Type Documentation

◆ jb_frame_type

Enumerator
JB_TYPE_CONTROL 

0

JB_TYPE_VOICE 

1

JB_TYPE_VIDEO 

2 - reserved

JB_TYPE_SILENCE 

3

Definition at line 59 of file jitterbuf.h.

59 {
60 /* frame types */
61 JB_TYPE_CONTROL, /*!< 0 */
62 JB_TYPE_VOICE, /*!< 1 */
63 JB_TYPE_VIDEO, /*!< 2 - reserved */
64 JB_TYPE_SILENCE /*!< 3 */
65};
@ JB_TYPE_VIDEO
Definition: jitterbuf.h:63
@ JB_TYPE_CONTROL
Definition: jitterbuf.h:61
@ JB_TYPE_SILENCE
Definition: jitterbuf.h:64
@ JB_TYPE_VOICE
Definition: jitterbuf.h:62

◆ jb_return_code

Enumerator
JB_OK 
JB_EMPTY 
JB_NOFRAME 
JB_INTERP 
JB_DROP 
JB_SCHED 

Definition at line 49 of file jitterbuf.h.

49 {
50 /* return codes */
51 JB_OK, /* 0 */
52 JB_EMPTY, /* 1 */
53 JB_NOFRAME, /* 2 */
54 JB_INTERP, /* 3 */
55 JB_DROP, /* 4 */
56 JB_SCHED /* 5 */
57};
@ JB_EMPTY
Definition: jitterbuf.h:52
@ JB_SCHED
Definition: jitterbuf.h:56
@ JB_DROP
Definition: jitterbuf.h:55
@ JB_NOFRAME
Definition: jitterbuf.h:53
@ JB_INTERP
Definition: jitterbuf.h:54
@ JB_OK
Definition: jitterbuf.h:51

Function Documentation

◆ jb_destroy()

void jb_destroy ( jitterbuf jb)

destroy jitterbuf

Definition at line 99 of file jitterbuf.c.

100{
101 jb_frame *frame;
102 jb_dbg2("jb_destroy(%x)\n", jb);
103
104 /* free all the frames on the "free list" */
105 frame = jb->free;
106 while (frame != NULL) {
107 jb_frame *next = frame->next;
108 ast_free(frame);
109 frame = next;
110 }
111
112 /* free ourselves! */
113 ast_free(jb);
114}
#define ast_free(a)
Definition: astmm.h:180
#define jb_dbg2(...)
Definition: jitterbuf.c:50
#define NULL
Definition: resample.c:96
struct jb_frame * next
Definition: jitterbuf.h:106
jb_frame * free
Definition: jitterbuf.h:121

References ast_free, jitterbuf::free, jb_dbg2, jb_frame::next, and NULL.

Referenced by AST_TEST_DEFINE(), jb_destroy_adaptive(), and pvt_destructor().

◆ jb_get()

enum jb_return_code jb_get ( jitterbuf jb,
jb_frame frame,
long  now,
long  interpl 
)

get a frame for time now (receiver's time) return value is one of JB_OK: You've got frame! JB_DROP: Here's an audio frame you should just drop. Ask me again for this time.. JB_NOFRAME: There's no frame scheduled for this time. JB_INTERP: Please interpolate an interpl-length frame for this time (either we need to grow, or there was a lost frame) JB_EMPTY: The jb is empty.

Definition at line 785 of file jitterbuf.c.

786{
787 enum jb_return_code ret = _jb_get(jb, frameout, now, interpl);
788#if 0
789 static int lastts=0;
790 int thists = ((ret == JB_OK) || (ret == JB_DROP)) ? frameout->ts : 0;
791 jb_warn("jb_get(%x,%x,%ld) = %d (%d)\n", jb, frameout, now, ret, thists);
792 if (thists && thists < lastts) jb_warn("XXXX timestamp roll-back!!!\n");
793 lastts = thists;
794#endif
795 if (ret == JB_INTERP)
796 frameout->ms = jb->info.last_voice_ms;
797
798 return ret;
799}
#define jb_warn(...)
Definition: jitterbuf.c:43
static enum jb_return_code _jb_get(jitterbuf *jb, jb_frame *frameout, long now, long interpl)
Definition: jitterbuf.c:550
jb_return_code
Definition: jitterbuf.h:49
long last_voice_ms
Definition: jitterbuf.h:92
jb_info info
Definition: jitterbuf.h:110

References _jb_get(), jitterbuf::info, JB_DROP, JB_INTERP, JB_OK, jb_warn, jb_info::last_voice_ms, jb_frame::ms, and jb_frame::ts.

Referenced by __get_from_jb(), AST_TEST_DEFINE(), and jb_get_adaptive().

◆ jb_getall()

enum jb_return_code jb_getall ( jitterbuf jb,
jb_frame frameout 
)

unconditionally get frames from jitterbuf until empty

Definition at line 801 of file jitterbuf.c.

802{
803 jb_frame *frame;
804 frame = queue_getall(jb);
805
806 if (!frame) {
807 return JB_NOFRAME;
808 }
809
810 *frameout = *frame;
811 return JB_OK;
812}
static jb_frame * queue_getall(jitterbuf *jb)
Definition: jitterbuf.c:454

References JB_NOFRAME, JB_OK, and queue_getall().

Referenced by AST_TEST_DEFINE(), complete_transfer(), jb_empty_and_reset_adaptive(), jb_remove_adaptive(), and pvt_destructor().

◆ jb_getinfo()

enum jb_return_code jb_getinfo ( jitterbuf jb,
jb_info stats 
)

get jitterbuf info: only "statistics" may be valid

Definition at line 815 of file jitterbuf.c.

816{
817
818 history_get(jb);
819
820 *stats = jb->info;
821
822 return JB_OK;
823}
static void history_get(jitterbuf *jb)
Definition: jitterbuf.c:295

References history_get(), jitterbuf::info, and JB_OK.

Referenced by ast_cli_netstats(), AST_TEST_DEFINE(), construct_rr(), handle_cli_iax2_show_channels(), and log_jitterstats().

◆ jb_is_late()

int jb_is_late ( jitterbuf jb,
long  ts 
)

Checks if the given time stamp is late.

Definition at line 846 of file jitterbuf.c.

847{
848 return ts + jb->info.current < jb->info.next_voice_ts;
849}
long current
Definition: jitterbuf.h:88
long next_voice_ts
Definition: jitterbuf.h:91

References jb_info::current, jitterbuf::info, and jb_info::next_voice_ts.

Referenced by jb_is_late_adaptive().

◆ jb_new()

jitterbuf * jb_new ( void  )

new jitterbuf

Definition at line 86 of file jitterbuf.c.

87{
88 jitterbuf *jb;
89
90 if (!(jb = ast_calloc(1, sizeof(*jb))))
91 return NULL;
92
93 jb_reset(jb);
94
95 jb_dbg2("jb_new() = %x\n", jb);
96 return jb;
97}
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:202
void jb_reset(jitterbuf *jb)
reset jitterbuf
Definition: jitterbuf.c:72

References ast_calloc, jb_dbg2, jb_reset(), and NULL.

Referenced by AST_TEST_DEFINE(), jb_create_adaptive(), and new_iax().

◆ jb_next()

long jb_next ( jitterbuf jb)

when is the next frame due out, in receiver's time (0=EMPTY) This value may change as frames are added (esp non-audio frames)

Definition at line 767 of file jitterbuf.c.

768{
769 if (jb->info.silence_begin_ts) {
770 if (jb->frames) {
771 long next = queue_next(jb);
772 history_get(jb);
773 /* shrink during silence */
774 if (jb->info.target - jb->info.current < -jb->info.conf.target_extra)
775 return jb->info.last_adjustment + 10;
776 return next + jb->info.target;
777 }
778 else
779 return JB_LONGMAX;
780 } else {
781 return jb->info.next_voice_ts;
782 }
783}
#define JB_LONGMAX
Definition: jitterbuf.c:40
static long queue_next(jitterbuf *jb)
Definition: jitterbuf.c:398
long target_extra
Definition: jitterbuf.h:72
long target
Definition: jitterbuf.h:89
long silence_begin_ts
Definition: jitterbuf.h:93
jb_conf conf
Definition: jitterbuf.h:76
long last_adjustment
Definition: jitterbuf.h:94
jb_frame * frames
Definition: jitterbuf.h:120

References jb_info::conf, jb_info::current, jitterbuf::frames, history_get(), jitterbuf::info, JB_LONGMAX, jb_info::last_adjustment, jb_info::next_voice_ts, queue_next(), jb_info::silence_begin_ts, jb_info::target, and jb_conf::target_extra.

Referenced by __get_from_jb(), AST_TEST_DEFINE(), jb_next_adaptive(), and update_jbsched().

◆ jb_put()

enum jb_return_code jb_put ( jitterbuf jb,
void *  data,
const enum jb_frame_type  type,
long  ms,
long  ts,
long  now 
)

queue a frame

data=frame data, timings (in ms): ms=length of frame (for voice), ts=ts (sender's time) now=now (in receiver's time) return value is one of JB_OK: Frame added. Last call to jb_next() still valid JB_DROP: Drop this frame immediately JB_SCHED: Frame added. Call jb_next() to get a new time for the next frame

Definition at line 525 of file jitterbuf.c.

526{
527 long delay = now - (ts - jb->info.resync_offset);
528 jb_dbg2("jb_put(%x,%x,%ld,%ld,%ld)\n", jb, data, ms, ts, now);
529
530 if (check_resync(jb, ts, now, ms, type, &delay)) {
531 return JB_DROP;
532 }
533
534 if (type == JB_TYPE_VOICE) {
535 /* presently, I'm only adding VOICE frames to history and drift calculations; mostly because with the
536 * IAX integrations, I'm sending retransmitted control frames with their awkward timestamps through */
537 history_put(jb, ts, now, ms, delay);
538 }
539
540 jb->info.frames_in++;
541
542 /* if put into head of queue, caller needs to reschedule */
543 if (queue_put(jb,data,type,ms,ts)) {
544 return JB_SCHED;
545 }
546 return JB_OK;
547}
static const char type[]
Definition: chan_ooh323.c:109
static int history_put(jitterbuf *jb, long ts, long now, long ms, long delay)
Definition: jitterbuf.c:163
static int check_resync(jitterbuf *jb, long ts, long now, long ms, const enum jb_frame_type type, long *delay)
Definition: jitterbuf.c:116
static int queue_put(jitterbuf *jb, void *data, const enum jb_frame_type type, long ms, long ts)
Definition: jitterbuf.c:337
long resync_offset
Definition: jitterbuf.h:97
long frames_in
Definition: jitterbuf.h:79

References check_resync(), jb_info::frames_in, history_put(), jitterbuf::info, jb_dbg2, JB_DROP, JB_OK, JB_SCHED, JB_TYPE_VOICE, queue_put(), jb_info::resync_offset, and type.

Referenced by jb_put_adaptive(), schedule_delivery(), test_jb_late_frame_insertion(), test_jb_lost_frame_insertion(), test_jb_nominal_frame_insertion(), test_jb_out_of_order_frame_insertion(), test_jb_overflow_frame_insertion(), and test_jb_resynch_frame_insertion().

◆ jb_reset()

void jb_reset ( jitterbuf jb)

reset jitterbuf

Note
The jitterbuffer should be empty before you call this, otherwise you will leak queued frames, and some internal structures

Definition at line 72 of file jitterbuf.c.

73{
74 /* only save settings and free list */
75 jb_conf s = jb->info.conf;
76 jb_frame *fr = jb->free;
77 memset(jb, 0, sizeof(*jb));
78 jb->info.conf = s;
79 jb->free = fr;
80
81 /* initialize length, using the default value */
83 jb->info.silence_begin_ts = -1;
84}
#define JB_TARGET_EXTRA
Definition: jitterbuf.h:43

References jb_info::conf, jb_info::current, jitterbuf::free, jitterbuf::info, JB_TARGET_EXTRA, jb_info::silence_begin_ts, jb_info::target, and jb_conf::target_extra.

Referenced by complete_transfer(), jb_empty_and_reset_adaptive(), and jb_new().

◆ jb_setconf()

enum jb_return_code jb_setconf ( jitterbuf jb,
jb_conf conf 
)

set jitterbuf conf

Definition at line 825 of file jitterbuf.c.

826{
827 /* take selected settings from the struct */
828
829 jb->info.conf.max_jitterbuf = conf->max_jitterbuf;
830 jb->info.conf.resync_threshold = conf->resync_threshold;
831 jb->info.conf.max_contig_interp = conf->max_contig_interp;
832
833 /* -1 indicates use of the default JB_TARGET_EXTRA value */
834 jb->info.conf.target_extra = ( conf->target_extra == -1 )
836 : conf->target_extra
837 ;
838
839 /* update these to match new target_extra setting */
841 jb->info.target = jb->info.conf.target_extra;
842
843 return JB_OK;
844}
All configuration options for http media cache.
long max_jitterbuf
Definition: jitterbuf.h:69
long resync_threshold
Definition: jitterbuf.h:70
long max_contig_interp
Definition: jitterbuf.h:71

References jb_info::conf, jb_info::current, jitterbuf::info, JB_OK, JB_TARGET_EXTRA, jb_conf::max_contig_interp, jb_conf::max_jitterbuf, jb_conf::resync_threshold, jb_info::target, and jb_conf::target_extra.

Referenced by AST_TEST_DEFINE(), jb_create_adaptive(), and new_iax().

◆ jb_setoutput()

void jb_setoutput ( jb_output_function_t  err,
jb_output_function_t  warn,
jb_output_function_t  dbg 
)

Definition at line 55 of file jitterbuf.c.

56{
57 errf = err;
58 warnf = warn;
59 dbgf = dbg;
60}
static jb_output_function_t dbgf
Definition: jitterbuf.c:53
static jb_output_function_t errf
Definition: jitterbuf.c:53
static jb_output_function_t warnf
Definition: jitterbuf.c:53

References dbgf, errf, and warnf.

Referenced by handle_cli_iax2_set_debug_jb(), and load_module().