40#define DEFAULT_MAX_JITTERBUFFER 1000 
   41#define DEFAULT_RESYNCH_THRESHOLD 1000 
   42#define DEFAULT_MAX_CONTIG_INTERP 10 
   43#define DEFAULT_TARGET_EXTRA -1 
   44#define DEFAULT_CODEC_INTERP_LEN 20 
   50#define JB_NUMERIC_TEST(attribute, expected) do { \ 
   51    if ((attribute) != (expected)) { \ 
   52        ast_test_status_update(test, #attribute ": expected [%ld]; actual [%ld]\n", (long int)(expected), (attribute)); \ 
 
   60#define JB_INFO_PRINT_FRAME_DEBUG(jbinfo) do { \ 
   61    ast_debug(1, "JitterBuffer Frame Info:\n" \ 
   62        "\tFrames In: %ld\n\tFrames Out: %ld\n" \ 
   63        "\tDropped Frames: %ld\n\tLate Frames: %ld\n" \ 
   64        "\tLost Frames: %ld\n\tOut of Order Frames: %ld\n" \ 
   65        "\tCurrent Frame: %ld\n", jbinfo.frames_in, jbinfo.frames_out, \ 
   66        jbinfo.frames_dropped, jbinfo.frames_late, jbinfo.frames_lost, \ 
   67        jbinfo.frames_ooo, jbinfo.frames_cur); \ 
 
   76#define JB_TEST_BEGIN(test_name) do { \ 
   77    jb_setoutput(test_jb_error_output, test_jb_warn_output, test_jb_debug_output); \ 
   78    ast_debug(1, "Starting %s\n", test_name); \ 
 
   84#define JB_TEST_END do { \ 
   85    jb_setoutput(NULL, NULL, NULL); \ 
 
  169    for (i = 0; i < 40; i++) {
 
 
  191        info->name = 
"jitterbuffer_nominal_voice_frames";
 
  192        info->category = 
"/main/jitterbuf/";
 
  193        info->summary = 
"Nominal operation of jitter buffer with audio data";
 
  195            "Tests the nominal case of putting audio data into a jitter buffer, " 
  196            "retrieving the frames, and querying for the next frame";
 
  219    for (i = 0; i < 40; i++) {
 
  224                "Unexpected jitter buffer return code [%s] when retrieving frame %d\n",
 
 
  271        info->name = 
"jitterbuffer_nominal_control_frames";
 
  272        info->category = 
"/main/jitterbuf/";
 
  273        info->summary = 
"Nominal operation of jitter buffer with control frames";
 
  275            "Tests the nominal case of putting control frames into a jitter buffer, " 
  276            "retrieving the frames, and querying for the next frame";
 
  299    for (i = 0; i < 40; i++) {
 
  304                "Unexpected jitter buffer return code [%s] when retrieving frame %d\n",
 
 
  347    for (i = 0; i < 40; i++) {
 
 
  385        info->name = 
"jitterbuffer_out_of_order_voice";
 
  386        info->category = 
"/main/jitterbuf/";
 
  387        info->summary = 
"Tests sending out of order audio frames to a jitter buffer";
 
  389            "Every 5th frame sent to a jitter buffer is reversed with the previous " 
  390            "frame.  The expected result is to have a jitter buffer with the frames " 
  391            "in order, while a total of 10 frames should be recorded as having been " 
  392            "received out of order.";
 
  415    for (i = 0; i < 40; i++) {
 
  420                "Unexpected jitter buffer return code [%s] when retrieving frame %d\n",
 
 
  466        info->name = 
"jitterbuffer_out_of_order_voice";
 
  467        info->category = 
"/main/jitterbuf/";
 
  468        info->summary = 
"Tests sending out of order audio frames to a jitter buffer";
 
  470            "Every 5th frame sent to a jitter buffer is reversed with the previous " 
  471            "frame.  The expected result is to have a jitter buffer with the frames " 
  472            "in order, while a total of 10 frames should be recorded as having been " 
  473            "received out of order.";
 
  496    for (i = 0; i < 40; i++) {
 
  501                "Unexpected jitter buffer return code [%s] when retrieving frame %d\n",
 
 
  544    for (i = 0; i < 40; i++) {
 
 
  569        info->name = 
"jitterbuffer_lost_voice";
 
  570        info->category = 
"/main/jitterbuf/";
 
  571        info->summary = 
"Tests missing frames in the jitterbuffer";
 
  573            "Every 5th frame that would be sent to a jitter buffer is instead" 
  574            "dropped.  When reading data from the jitter buffer, the jitter buffer" 
  575            "should interpolate the voice frame.";
 
  598    for (i = 0; i < 40; i++) {
 
  604                    "Unexpected jitter buffer return code [%s] when retrieving frame %d\n",
 
 
  655        info->name = 
"jitterbuffer_lost_control";
 
  656        info->category = 
"/main/jitterbuf/";
 
  657        info->summary = 
"Tests missing frames in the jitterbuffer";
 
  659            "Every 5th frame that would be sent to a jitter buffer is instead" 
  660            "dropped.  When reading data from the jitter buffer, the jitter buffer" 
  661            "simply reports that no frame exists for that time slot";
 
  684    for (i = 0; i < 40; i++) {
 
  690                    "Unexpected jitter buffer return code [%s] when retrieving frame %d\n",
 
 
  738    for (i = 0; i < 40; i++) {
 
 
  769        info->name = 
"jitterbuffer_late_voice";
 
  770        info->category = 
"/main/jitterbuf/";
 
  771        info->summary = 
"Tests sending frames to a jitter buffer that arrive late";
 
  773            "Every 5th frame sent to a jitter buffer arrives late, but still in " 
  774            "order with respect to the previous and next packet";
 
  797    for (i = 0; i < 40; i++) {
 
  802                "Unexpected jitter buffer return code [%s] when retrieving frame %d\n",
 
 
  848        info->name = 
"jitterbuffer_late_control";
 
  849        info->category = 
"/main/jitterbuf/";
 
  850        info->summary = 
"Tests sending frames to a jitter buffer that arrive late";
 
  852            "Every 5th frame sent to a jitter buffer arrives late, but still in " 
  853            "order with respect to the previous and next packet";
 
  876    for (i = 0; i < 40; i++) {
 
  881                "Unexpected jitter buffer return code [%s] when retrieving frame %d\n",
 
 
  924    for (i = 0; i < 100; i++) {
 
 
  940        info->name = 
"jitterbuffer_overflow_voice";
 
  941        info->category = 
"/main/jitterbuf/";
 
  942        info->summary = 
"Tests overfilling a jitter buffer with voice frames";
 
  943        info->description = 
"Tests overfilling a jitter buffer with voice frames";
 
 
 1010        info->name = 
"jitterbuffer_overflow_control";
 
 1011        info->category = 
"/main/jitterbuf/";
 
 1012        info->summary = 
"Tests overfilling a jitter buffer with control frames";
 
 1013        info->description = 
"Tests overfilling a jitter buffer with control frames";
 
 
 1076    for (i = 0; i < 20; i++) {
 
 1080    for (i = 20; i < 40; i++) {
 
 
 1092    int interpolated_frames = 0;
 
 1097        info->name = 
"jitterbuffer_resynch_control";
 
 1098        info->category = 
"/main/jitterbuf/";
 
 1099        info->summary = 
"Tests sending control frames that force a resynch";
 
 1100        info->description = 
"Control frames are sent to a jitter buffer.  After some " 
 1101            "number of frames, the source timestamps jump, forcing a resync of " 
 1102            "the jitter buffer.  Since the frames are control, the resync happens " 
 1125    for (i = 0; i <= 40; i++) {
 
 1127            ++interpolated_frames;
 
 
 1167    int interpolated_frames = 0;
 
 1172        info->name = 
"jitterbuffer_resynch_voice";
 
 1173        info->category = 
"/main/jitterbuf/";
 
 1174        info->summary = 
"Tests sending voice frames that force a resynch";
 
 1175        info->description = 
"Voice frames are sent to a jitter buffer.  After some " 
 1176            "number of frames, the source timestamps jump, forcing a resync of " 
 1177            "the jitter buffer.  Since the frames are voice, the resync happens " 
 1178            "after observing three packets that break the resync threshold.";
 
 1200    for (i = 0; i <= 40; i++) {
 
 1202            ++interpolated_frames;
 
 
Asterisk main include file. File version handling, generic pbx functions.
#define ast_debug(level,...)
Log a DEBUG message.
jitterbuf: an application-independent jitterbuffer jitterbuf.c
void jb_destroy(jitterbuf *jb)
destroy jitterbuf
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!...
jitterbuf * jb_new(void)
new jitterbuf
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
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 adde...
enum jb_return_code jb_setconf(jitterbuf *jb, jb_conf *conf)
set jitterbuf conf
enum jb_return_code jb_getall(jitterbuf *jb, jb_frame *frameout)
unconditionally get frames from jitterbuf until empty
enum jb_return_code jb_getinfo(jitterbuf *jb, jb_info *stats)
get jitterbuf info: only "statistics" may be valid
Asterisk module definitions.
#define AST_MODULE_INFO_STANDARD(keystr, desc)
#define ASTERISK_GPL_KEY
The text the key() function should return.
@ AST_MODULE_LOAD_SUCCESS
static void cleanup(void)
Clean up any old apps that we don't need any more.
#define AST_TEST_REGISTER(cb)
#define ast_test_status_update(a, b, c...)
#define AST_TEST_UNREGISTER(cb)
#define AST_TEST_DEFINE(hdr)
#define JB_TEST_BEGIN(test_name)
static void test_jb_warn_output(const char *fmt,...)
static void test_jb_resynch_frame_insertion(struct jitterbuf *jb, enum jb_frame_type frame_type)
static void test_jb_populate_config(struct jb_conf *jbconf)
static int test_jb_lost_frame_insertion(struct ast_test *test, struct jitterbuf *jb, enum jb_frame_type frame_type)
static const char * jitter_buffer_return_codes[]
#define DEFAULT_MAX_CONTIG_INTERP
static void test_jb_error_output(const char *fmt,...)
#define JB_INFO_PRINT_FRAME_DEBUG(jbinfo)
#define DEFAULT_RESYNCH_THRESHOLD
static int test_jb_nominal_frame_insertion(struct ast_test *test, struct jitterbuf *jb, enum jb_frame_type frame_type)
#define DEFAULT_MAX_JITTERBUFFER
#define DEFAULT_CODEC_INTERP_LEN
static int load_module(void)
static int test_jb_late_frame_insertion(struct ast_test *test, struct jitterbuf *jb, enum jb_frame_type frame_type)
static int unload_module(void)
static int test_jb_out_of_order_frame_insertion(struct ast_test *test, struct jitterbuf *jb, enum jb_frame_type frame_type)
static void test_jb_debug_output(const char *fmt,...)
static void test_jb_overflow_frame_insertion(struct jitterbuf *jb, enum jb_frame_type frame_type)
#define JB_NUMERIC_TEST(attribute, expected)