Add jitterbuffer support to chan_unistim.
authorRussell Bryant <russell@russellbryant.com>
Tue, 6 Nov 2007 14:11:34 +0000 (14:11 +0000)
committerRussell Bryant <russell@russellbryant.com>
Tue, 6 Nov 2007 14:11:34 +0000 (14:11 +0000)
(closes issue #11168)
Reported by: IgorG
Patches:
      unistimjb-88863-1.patch uploaded by IgorG (license 20)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@88935 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_unistim.c
configs/unistim.conf.sample

index b3d5ca4..039da45 100644 (file)
@@ -202,6 +202,17 @@ static void dummy(char *dummy, ...)
        return;
 }
 
        return;
 }
 
+/*! \brief Global jitterbuffer configuration - by default, jb is disabled */
+static struct ast_jb_conf default_jbconf =
+{
+        .flags = 0,
+       .max_size = -1,
+       .resync_threshold = -1,
+       .impl = ""
+};
+static struct ast_jb_conf global_jbconf;
+                               
+
 /* #define DUMP_PACKET 1 */
 /* #define DEBUG_TIMER ast_verbose */
 
 /* #define DUMP_PACKET 1 */
 /* #define DEBUG_TIMER ast_verbose */
 
@@ -697,7 +708,7 @@ static const struct ast_channel_tech unistim_tech = {
        .type = type,
        .description = tdesc,
        .capabilities = CAPABILITY,
        .type = type,
        .description = tdesc,
        .capabilities = CAPABILITY,
-       .properties = AST_CHAN_TP_WANTSJITTER,
+       .properties = AST_CHAN_TP_WANTSJITTER | AST_CHAN_TP_CREATESJITTER,
        .requester = unistim_request,
        .call = unistim_call,
        .hangup = unistim_hangup,
        .requester = unistim_request,
        .call = unistim_call,
        .hangup = unistim_hangup,
@@ -4509,6 +4520,9 @@ static struct ast_channel *unistim_new(struct unistim_subchannel *sub, int state
                tmp->fds[0] = ast_rtp_fd(sub->rtp);
                tmp->fds[1] = ast_rtcp_fd(sub->rtp);
        }
                tmp->fds[0] = ast_rtp_fd(sub->rtp);
                tmp->fds[1] = ast_rtcp_fd(sub->rtp);
        }
+       if (sub->rtp)
+               ast_jb_configure(tmp, &global_jbconf);
+               
 /*      tmp->type = type; */
        ast_setstate(tmp, state);
        if (state == AST_STATE_RING)
 /*      tmp->type = type; */
        ast_setstate(tmp, state);
        if (state == AST_STATE_RING)
@@ -5353,11 +5367,18 @@ static int reload_config(void)
                ast_log(LOG_ERROR, "Unable to load config %s\n", config);
                return -1;
        }
                ast_log(LOG_ERROR, "Unable to load config %s\n", config);
                return -1;
        }
+       
+       /* Copy the default jb config over global_jbconf */
+       memcpy(&global_jbconf, &default_jbconf, sizeof(struct ast_jb_conf));
 
        unistim_keepalive = 120;
        unistim_port = 0;
        v = ast_variable_browse(cfg, "general");
        while (v) {
 
        unistim_keepalive = 120;
        unistim_port = 0;
        v = ast_variable_browse(cfg, "general");
        while (v) {
+               /* handle jb conf */
+               if (!ast_jb_read_conf(&global_jbconf, v->name, v->value))
+                       continue;       
+       
                if (!strcasecmp(v->name, "keepalive"))
                        unistim_keepalive = atoi(v->value);
                else if (!strcasecmp(v->name, "port"))
                if (!strcasecmp(v->name, "keepalive"))
                        unistim_keepalive = atoi(v->value);
                else if (!strcasecmp(v->name, "port"))
index 91dab9e..4a6c61a 100644 (file)
@@ -8,6 +8,32 @@ port=5000                    ; UDP port
 ;public_ip=                  ; if asterisk is behind a nat, specify your public IP
 ;autoprovisioning=no         ; Allow undeclared phones to register an extension. See README for important
                              ; informations. no (default), yes, tn.
 ;public_ip=                  ; if asterisk is behind a nat, specify your public IP
 ;autoprovisioning=no         ; Allow undeclared phones to register an extension. See README for important
                              ; informations. no (default), yes, tn.
+;------------------------------ JITTER BUFFER CONFIGURATION --------------------------
+; jbenable = yes              ; Enables the use of a jitterbuffer on the receiving side of a
+                              ; SIP channel. Defaults to "no". An enabled jitterbuffer will
+                              ; be used only if the sending side can create and the receiving
+                              ; side can not accept jitter. The SIP channel can accept jitter,
+                              ; thus a jitterbuffer on the receive SIP side will be used only
+                              ; if it is forced and enabled.
+
+; jbforce = no                ; Forces the use of a jitterbuffer on the receive side of a SIP
+                              ; channel. Defaults to "no".
+
+; jbmaxsize = 200             ; Max length of the jitterbuffer in milliseconds.
+
+; jbresyncthreshold = 1000    ; Jump in the frame timestamps over which the jitterbuffer is
+                              ; resynchronized. Useful to improve the quality of the voice, with
+                              ; big jumps in/broken timestamps, usually sent from exotic devices
+                              ; and programs. Defaults to 1000.
+
+; jbimpl = fixed              ; Jitterbuffer implementation, used on the receiving side of a SIP
+                              ; channel. Two implementations are currently available - "fixed"
+                              ; (with size always equals to jbmaxsize) and "adaptive" (with
+                              ; variable size, actually the new jb of IAX2). Defaults to fixed.
+
+; jblog = no                  ; Enables jitterbuffer frame logging. Defaults to "no".
+;-----------------------------------------------------------------------------------
+
 
 ;[black]                     ; name of the device
 ;device=000ae4012345         ; mac address of the phone
 
 ;[black]                     ; name of the device
 ;device=000ae4012345         ; mac address of the phone