diff --git a/CHANGES b/CHANGES index 986c132e30..4f44c1412a 100644 --- a/CHANGES +++ b/CHANGES @@ -24,6 +24,13 @@ Chan_local changes * Added a manager event "LocalBridge" for local channel call bridges between the two pseudo-channels created. +Codec changes +------------- + * Codec lists may now be modified by the '!' character, to allow succinct + specification of a list of codecs allowed and disallowed, without the + requirement to use two different keywords. For example, to specify all + codecs except g729 and g723, one need only specify allow=all,!g729,!g723. + ------------------------------------------------------------------------------ --- Functionality changes from Asterisk 1.8 to Asterisk 10 ------------------- ------------------------------------------------------------------------------ diff --git a/configs/sip.conf.sample b/configs/sip.conf.sample index fb487dba66..7c04a4a0f5 100644 --- a/configs/sip.conf.sample +++ b/configs/sip.conf.sample @@ -1216,10 +1216,14 @@ srvlookup=yes ; Enable DNS SRV lookups on outbound calls allow=gsm allow=g723 allow=ulaw + ; Or, more simply: + ;allow=!all,ilbc,g729,gsm,g723,ulaw [ulaw-phone](!) ; and another one for ulaw-only disallow=all allow=ulaw + ; Again, more simply: + ;allow=!all,ulaw ; and finally instantiate a few phones ; diff --git a/contrib/realtime/mysql/iaxfriends.sql b/contrib/realtime/mysql/iaxfriends.sql index 3b3bbb3c79..f01fd73ffa 100644 --- a/contrib/realtime/mysql/iaxfriends.sql +++ b/contrib/realtime/mysql/iaxfriends.sql @@ -37,8 +37,7 @@ CREATE TABLE `iaxfriends` ( `transfer` varchar(10) NULL, -- mediaonly/yes/no `jitterbuffer` varchar(3) NULL, -- yes/no `forcejitterbuffer` varchar(3) NULL, -- yes/no - `disallow` varchar(40) NULL, -- all/{list-of-codecs} - `allow` varchar(40) NULL, -- all/{list-of-codecs} + `allow` varchar(200) NULL, -- all/{list-of-codecs} `codecpriority` varchar(40) NULL, `qualify` varchar(10) NULL, -- yes/no/{number of milliseconds} `qualifysmoothing` varchar(10) NULL, -- yes/no diff --git a/contrib/realtime/mysql/sipfriends.sql b/contrib/realtime/mysql/sipfriends.sql index 12047d399b..07cd8788aa 100644 --- a/contrib/realtime/mysql/sipfriends.sql +++ b/contrib/realtime/mysql/sipfriends.sql @@ -28,8 +28,7 @@ CREATE TABLE IF NOT EXISTS `sipfriends` ( `callgroup` varchar(40) DEFAULT NULL, `pickupgroup` varchar(40) DEFAULT NULL, `language` varchar(40) DEFAULT NULL, - `allow` varchar(40) DEFAULT NULL, - `disallow` varchar(40) DEFAULT NULL, + `allow` varchar(200) DEFAULT NULL, `insecure` varchar(40) DEFAULT NULL, `trustrpid` enum('yes','no') DEFAULT NULL, `progressinband` enum('yes','no','never') DEFAULT NULL, diff --git a/contrib/realtime/postgresql/realtime.sql b/contrib/realtime/postgresql/realtime.sql index 74b895738f..fb474ebbe2 100644 --- a/contrib/realtime/postgresql/realtime.sql +++ b/contrib/realtime/postgresql/realtime.sql @@ -61,8 +61,7 @@ rtpholdtimeout character varying(3), secret character varying(80), "type" character varying DEFAULT 'friend' NOT NULL, username character varying(80) DEFAULT '' NOT NULL, -disallow character varying(100) DEFAULT 'all', -allow character varying(100) DEFAULT 'g729;ilbc;gsm;ulaw;alaw', +allow character varying(200) DEFAULT '!all,g729,ilbc,gsm,ulaw,alaw', musiconhold character varying(100), regseconds bigint DEFAULT 0::bigint NOT NULL, ipaddr character varying(40) DEFAULT '' NOT NULL, diff --git a/main/frame.c b/main/frame.c index b664e2e849..4a91096949 100644 --- a/main/frame.c +++ b/main/frame.c @@ -730,13 +730,18 @@ void ast_frame_dump(const char *name, struct ast_frame *f, char *prefix) int ast_parse_allow_disallow(struct ast_codec_pref *pref, struct ast_format_cap *cap, const char *list, int allowing) { - int errors = 0, framems = 0, all = 0; + int errors = 0, framems = 0, all = 0, iter_allowing; char *parse = NULL, *this = NULL, *psize = NULL; struct ast_format format; parse = ast_strdupa(list); while ((this = strsep(&parse, ","))) { + iter_allowing = allowing; framems = 0; + if (*this == '!') { + this++; + iter_allowing = !allowing; + } if ((psize = strrchr(this, ':'))) { *psize++ = '\0'; ast_debug(1, "Packetization for codec: %s is %s\n", this, psize); @@ -750,13 +755,13 @@ int ast_parse_allow_disallow(struct ast_codec_pref *pref, struct ast_format_cap all = strcasecmp(this, "all") ? 0 : 1; if (!all && !ast_getformatbyname(this, &format)) { - ast_log(LOG_WARNING, "Cannot %s unknown format '%s'\n", allowing ? "allow" : "disallow", this); + ast_log(LOG_WARNING, "Cannot %s unknown format '%s'\n", iter_allowing ? "allow" : "disallow", this); errors++; continue; } if (cap) { - if (allowing) { + if (iter_allowing) { if (all) { ast_format_cap_add_all(cap); } else { @@ -773,13 +778,13 @@ int ast_parse_allow_disallow(struct ast_codec_pref *pref, struct ast_format_cap if (pref) { if (!all) { - if (allowing) { + if (iter_allowing) { ast_codec_pref_append(pref, &format); ast_codec_pref_setsize(pref, &format, framems); } else { ast_codec_pref_remove(pref, &format); } - } else if (!allowing) { + } else if (!iter_allowing) { memset(pref, 0, sizeof(*pref)); } }