As per bug 7978, this version introduces the jittertargetextra option in config files
authorSteve Murphy <murf@digium.com>
Thu, 21 Dec 2006 00:24:08 +0000 (00:24 +0000)
committerSteve Murphy <murf@digium.com>
Thu, 21 Dec 2006 00:24:08 +0000 (00:24 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@48663 65c4cc65-6c06-0410-ace0-fbb531ad65f3

CHANGES
channels/chan_iax2.c
configs/iax.conf.sample
include/jitterbuf.h
main/jitterbuf.c

diff --git a/CHANGES b/CHANGES
index b940c15..70d8188 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -63,3 +63,5 @@ Changes since Asterisk 1.4-beta was branched:
      does not count paused queue members as unavailable.
   * Added maxfiles option to options section of asterisk.conf which allows you to specify
      what Asterisk should set as the maximum number of open files when it loads.
+  * Added the jittertargetextra configuration option.
+
index 865319d..1ada3a2 100644 (file)
@@ -163,6 +163,7 @@ static int maxnontrunkcall = 1;
 static int maxjitterbuffer=1000;
 static int resyncthreshold=1000;
 static int maxjitterinterps=10;
+static int jittertargetextra = 40; /* number of milliseconds the new jitter buffer adds on to its size */
 static int trunkfreq = 20;
 static int authdebug = 1;
 static int autokill = 0;
@@ -1125,6 +1126,7 @@ static struct chan_iax2_pvt *new_iax(struct sockaddr_in *sin, int lockpeer, cons
        jbconf.max_jitterbuf = maxjitterbuffer;
        jbconf.resync_threshold = resyncthreshold;
        jbconf.max_contig_interp = maxjitterinterps;
+       jbconf.target_extra = jittertargetextra;
        jb_setconf(tmp->jb,&jbconf);
 
        AST_LIST_HEAD_INIT_NOLOCK(&tmp->dpentries);
@@ -8958,6 +8960,8 @@ static int set_config(char *config_file, int reload)
                        resyncthreshold = atoi(v->value);
                else if (!strcasecmp(v->name, "maxjitterinterps")) 
                        maxjitterinterps = atoi(v->value);
+               else if (!strcasecmp(v->name, "jittertargetextra"))
+                       jittertargetextra = atoi(v->value);
                else if (!strcasecmp(v->name, "lagrqtime")) 
                        lagrq_time = atoi(v->value);
                else if (!strcasecmp(v->name, "maxregexpire")) 
index 6ab3332..afe2553 100644 (file)
@@ -129,6 +129,13 @@ disallow=lpc10                     ; Icky sound quality...  Mr. Roboto.
 ; returning this many interpolations. This prevents interpolating throughout
 ; a long silence.
 ;
+;
+; jittertargetextra: number of milliseconds by which the new jitter buffer
+; will pad its size. the default is 40, so without modification, the new
+; jitter buffer will set its size to the jitter value plus 40 milliseconds.
+; increasing this value may help if your network normally has low jitter,
+; but occasionally has spikes.
+;
 
 jitterbuffer=no
 forcejitterbuffer=no
@@ -139,6 +146,7 @@ forcejitterbuffer=no
 ;maxexcessbuffer=80
 ;minexcessbuffer=10
 ;jittershrinkrate=1
+;jittertargetextra=40
 
 ;trunkfreq=20                  ; How frequently to send trunk msgs (in ms)
 
index 3213534..4809346 100644 (file)
@@ -58,6 +58,7 @@ typedef struct jb_conf {
        long max_jitterbuf;     /* defines a hard clamp to use in setting the jitter buffer delay */
        long resync_threshold;  /* the jb will resync when delay increases to (2 * jitter) + this param */
        long max_contig_interp; /* the max interp frames to return in a row */
+       long target_extra ;      /* amount of additional jitterbuffer adjustment, overrides JB_TARGET_EXTRA */
 } jb_conf;
 
 typedef struct jb_info {
index a541d67..c418b79 100644 (file)
@@ -79,8 +79,8 @@ void jb_reset(jitterbuf *jb)
        memset(jb, 0, sizeof(*jb));
        jb->info.conf = s;
 
-       /* initialize length */
-       jb->info.current = jb->info.target = JB_TARGET_EXTRA; 
+       /* 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; 
 }
 
@@ -547,7 +547,7 @@ static enum jb_return_code _jb_get(jitterbuf *jb, jb_frame *frameout, long now,
        dbg_cnt++;
 
        /* target */
-       jb->info.target = jb->info.jitter + jb->info.min + JB_TARGET_EXTRA; 
+       jb->info.target = jb->info.jitter + jb->info.min + jb->info.conf.target_extra; 
 
        /* if a hard clamp was requested, use it */
        if ((jb->info.conf.max_jitterbuf) && ((jb->info.target - jb->info.min) > jb->info.conf.max_jitterbuf)) {
@@ -633,7 +633,7 @@ static enum jb_return_code _jb_get(jitterbuf *jb, jb_frame *frameout, long now,
                /* unless we don't have a frame, then shrink 1 frame */
                /* every 80ms (though perhaps we can shrink even faster */
                /* in this case) */
-               if (diff < -JB_TARGET_EXTRA && 
+               if (diff < -jb->info.conf.target_extra && 
                        ((!frame && jb->info.last_adjustment + 80 < now) || 
                        (jb->info.last_adjustment + 500 < now))) {
 
@@ -711,7 +711,7 @@ static enum jb_return_code _jb_get(jitterbuf *jb, jb_frame *frameout, long now,
                /* jb->info.silence_begin_ts = 0; */
 
                /* shrink interpl len every 10ms during silence */
-               if (diff < -JB_TARGET_EXTRA &&
+               if (diff < -jb->info.conf.target_extra &&
                        jb->info.last_adjustment + 10 <= now) {
                        jb->info.current -= interpl;
                        jb->info.last_adjustment = now;
@@ -760,7 +760,7 @@ long jb_next(jitterbuf *jb)
                if (next > 0) { 
                        history_get(jb);
                        /* shrink during silence */
-                       if (jb->info.target - jb->info.current < -JB_TARGET_EXTRA)
+                       if (jb->info.target - jb->info.current < -jb->info.conf.target_extra)
                                return jb->info.last_adjustment + 10;
                        return next + jb->info.target;
                }
@@ -819,6 +819,16 @@ enum jb_return_code jb_setconf(jitterbuf *jb, jb_conf *conf)
        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;
 }