Sat Apr 26 2014 22:02:54

Asterisk developer's documentation


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

Defines

configuration constants
#define JB_HISTORY_SZ   500
#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_TARGET_EXTRA   40
#define JB_ADJUST_DELAY   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
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.
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
jitterbufjb_new (void)
 new jitterbuf
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)
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
void jb_reset (jitterbuf *jb)
 reset jitterbuf
enum jb_return_code jb_setconf (jitterbuf *jb, jb_conf *conf)
 set jitterbuf conf
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.


Define Documentation

#define JB_ADJUST_DELAY   40

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

Definition at line 44 of file jitterbuf.h.

Referenced by _jb_get().

#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 36 of file jitterbuf.h.

Referenced by history_get().

#define JB_HISTORY_DROPPCT_MAX   4

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

Definition at line 38 of file jitterbuf.h.

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

Definition at line 40 of file jitterbuf.h.

Referenced by history_calc_maxbuf(), history_get(), and history_put().

#define JB_HISTORY_SZ   500

Number of historical timestamps to use in calculating jitter and drift

Definition at line 33 of file jitterbuf.h.

Referenced by history_calc_maxbuf(), history_get(), and history_put().

#define JB_TARGET_EXTRA   40

amount of additional jitterbuffer adjustment

Definition at line 42 of file jitterbuf.h.

Referenced by jb_reset(), and jb_setconf().


Typedef Documentation

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,...)

Definition at line 166 of file jitterbuf.h.

typedef struct jitterbuf jitterbuf

Enumeration Type Documentation

Enumerator:
JB_TYPE_CONTROL 

0

JB_TYPE_VOICE 

1

JB_TYPE_VIDEO 

2 - reserved

JB_TYPE_SILENCE 

3

Definition at line 57 of file jitterbuf.h.

                   {
   /* frame types */
   JB_TYPE_CONTROL,  /*!< 0            */
   JB_TYPE_VOICE,    /*!< 1            */
   JB_TYPE_VIDEO,    /*!< 2 - reserved */
   JB_TYPE_SILENCE   /*!< 3            */
};
Enumerator:
JB_OK 
JB_EMPTY 
JB_NOFRAME 
JB_INTERP 
JB_DROP 
JB_SCHED 

Definition at line 47 of file jitterbuf.h.

                    {
   /* return codes */
   JB_OK,            /* 0 */
   JB_EMPTY,         /* 1 */
   JB_NOFRAME,       /* 2 */
   JB_INTERP,        /* 3 */
   JB_DROP,          /* 4 */
   JB_SCHED          /* 5 */
};

Function Documentation

void jb_destroy ( jitterbuf jb)

destroy jitterbuf

Definition at line 101 of file jitterbuf.c.

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

Referenced by jb_destroy_adaptive(), and pvt_destructor().

{
   jb_frame *frame;
   jb_dbg2("jb_destroy(%x)\n", jb);

   /* free all the frames on the "free list" */
   frame = jb->free;
   while (frame != NULL) {
      jb_frame *next = frame->next;
      ast_free(frame);
      frame = next;
   }

   /* free ourselves! */
   ast_free(jb);
}
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 787 of file jitterbuf.c.

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(), and jb_get_adaptive().

{
   enum jb_return_code ret = _jb_get(jb, frameout, now, interpl);
#if 0
   static int lastts=0;
   int thists = ((ret == JB_OK) || (ret == JB_DROP)) ? frameout->ts : 0;
   jb_warn("jb_get(%x,%x,%ld) = %d (%d)\n", jb, frameout, now, ret, thists);
   if (thists && thists < lastts) jb_warn("XXXX timestamp roll-back!!!\n");
   lastts = thists;
#endif
   if (ret == JB_INTERP)
      frameout->ms = jb->info.last_voice_ms;

   return ret;
}
enum jb_return_code jb_getall ( jitterbuf jb,
jb_frame frameout 
)

unconditionally get frames from jitterbuf until empty

Definition at line 803 of file jitterbuf.c.

References JB_NOFRAME, JB_OK, and queue_getall().

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

{
   jb_frame *frame;
   frame = queue_getall(jb);

   if (!frame) {
      return JB_NOFRAME;
   }

   *frameout = *frame;
   return JB_OK;
}
enum jb_return_code jb_getinfo ( jitterbuf jb,
jb_info stats 
)

get jitterbuf info: only "statistics" may be valid

Definition at line 817 of file jitterbuf.c.

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

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

{

   history_get(jb);

   *stats = jb->info;

   return JB_OK;
}
jitterbuf* jb_new ( void  )

new jitterbuf

Definition at line 88 of file jitterbuf.c.

References ast_calloc, jb_dbg2, and jb_reset().

Referenced by jb_create_adaptive(), and new_iax().

{
   jitterbuf *jb;

   if (!(jb = ast_calloc(1, sizeof(*jb))))
      return NULL;

   jb_reset(jb);

   jb_dbg2("jb_new() = %x\n", jb);
   return jb;
}
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 769 of file jitterbuf.c.

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(), jb_next_adaptive(), and update_jbsched().

{
   if (jb->info.silence_begin_ts) {
      if (jb->frames) {
         long next = queue_next(jb);
         history_get(jb);
         /* shrink during silence */
         if (jb->info.target - jb->info.current < -jb->info.conf.target_extra)
            return jb->info.last_adjustment + 10;
         return next + jb->info.target;
      }
      else
         return JB_LONGMAX;
   } else {
      return jb->info.next_voice_ts;
   }
}
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 527 of file jitterbuf.c.

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

Referenced by jb_put_adaptive(), and schedule_delivery().

{
   long delay = now - (ts - jb->info.resync_offset);
   jb_dbg2("jb_put(%x,%x,%ld,%ld,%ld)\n", jb, data, ms, ts, now);

   if (check_resync(jb, ts, now, ms, type, &delay)) {
      return JB_DROP;
   }

   if (type == JB_TYPE_VOICE) {
      /* presently, I'm only adding VOICE frames to history and drift calculations; mostly because with the
       * IAX integrations, I'm sending retransmitted control frames with their awkward timestamps through */
      history_put(jb, ts, now, ms, delay);
   }

   jb->info.frames_in++;

   /* if put into head of queue, caller needs to reschedule */
   if (queue_put(jb,data,type,ms,ts)) {
      return JB_SCHED;
   }
   return JB_OK;
}
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 74 of file jitterbuf.c.

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(), jb_new(), and schedule_delivery().

{
   /* only save settings and free list */
   jb_conf s = jb->info.conf;
   jb_frame *fr = jb->free;
   memset(jb, 0, sizeof(*jb));
   jb->info.conf = s;
   jb->free = fr;

   /* initialize length, using the default value */
   jb->info.current = jb->info.target = jb->info.conf.target_extra = JB_TARGET_EXTRA;
   jb->info.silence_begin_ts = -1;
}
enum jb_return_code jb_setconf ( jitterbuf jb,
jb_conf conf 
)

set jitterbuf conf

Definition at line 827 of file jitterbuf.c.

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 jb_create_adaptive(), and new_iax().

{
   /* take selected settings from the struct */

   jb->info.conf.max_jitterbuf = conf->max_jitterbuf;
   jb->info.conf.resync_threshold = conf->resync_threshold;
   jb->info.conf.max_contig_interp = conf->max_contig_interp;

   /* -1 indicates use of the default JB_TARGET_EXTRA value */
   jb->info.conf.target_extra = ( conf->target_extra == -1 )
      ? JB_TARGET_EXTRA
      : conf->target_extra
      ;

   /* update these to match new target_extra setting */
   jb->info.current = jb->info.conf.target_extra;
   jb->info.target = jb->info.conf.target_extra;

   return JB_OK;
}

Definition at line 57 of file jitterbuf.c.

Referenced by handle_cli_iax2_set_debug_jb(), and load_module().

{
   errf = err;
   warnf = warn;
   dbgf = dbg;
}