[asterisk-bugs] [JIRA] (ASTERISK-21976) Set more than one codec in dialplan execution using SIP_CODEC (adapted chan_sip:try_suggested_codec)

Dennis Guse (JIRA) noreply at issues.asterisk.org
Fri Jun 28 08:05:06 CDT 2013


Dennis Guse created ASTERISK-21976:
--------------------------------------

             Summary: Set more than one codec in dialplan execution using SIP_CODEC (adapted chan_sip:try_suggested_codec)
                 Key: ASTERISK-21976
                 URL: https://issues.asterisk.org/jira/browse/ASTERISK-21976
             Project: Asterisk
          Issue Type: Improvement
      Security Level: None
          Components: Channels/chan_sip/CodecHandling
    Affects Versions: 11.4.0
         Environment: FreeBSD (AMD64) 9.1 using Asterisk provided via ports (at the moment 11.4)
            Reporter: Dennis Guse
            Severity: Minor


For video calls, we would like to set the codecs in the dialplan using SIP_CODEC. However, if SIP_CODEC is set, all codecs except the ONE set are disallowed and thus either audio or video is available.

Attached is a patch for 11.4 that allows SIP_CODEC to contain a list of codecs , e.g. "gsm,h264".

Here is the code (chan_sip.c):

 static void try_suggested_sip_codec(struct sip_pvt *p)
 {
 	struct ast_format fmt;
	const char *codecList;
	char *codecListCopy;
	struct ast_format_cap *jointcapsCopy;
	char *codec;
	int firstCodec = 1;

	char *strtok_ptr;
 
 	ast_format_clear(&fmt);
 
 	if (p->outgoing_call) {
		codecList = pbx_builtin_getvar_helper(p->owner, "SIP_CODEC_OUTBOUND");
	} else if (!(codecList = pbx_builtin_getvar_helper(p->owner, "SIP_CODEC_INBOUND"))) {
		codecList = pbx_builtin_getvar_helper(p->owner, "SIP_CODEC");	
 	}
 
	if (!codecList) 
 		return;
	
	codecListCopy = ast_strdupa(codecList);
	jointcapsCopy = ast_format_cap_dup(p->jointcaps);
	for (codec = strtok_r(codecListCopy, ",", &strtok_ptr); codec; codec = strtok_r(NULL, ",", &strtok_ptr)) {
		ast_getformatbyname(ast_strip(codec), &fmt);
		if (fmt.id) {
			if (ast_format_cap_iscompatible(jointcapsCopy, &fmt)) {
				if (firstCodec) {
					ast_log(LOG_NOTICE, "Set codec to '%s' for this call because of ${SIP_CODEC} variable\n", codec);
					ast_format_cap_set(p->jointcaps, &fmt);
					ast_format_cap_set(p->caps, &fmt);
					firstCodec = 0;
				} else {
					ast_log(LOG_NOTICE, "Add codec to '%s' for this call because of ${SIP_CODEC} variable\n", codec);
					ast_format_cap_add(p->jointcaps, &fmt);
					ast_format_cap_add(p->caps, &fmt);
				}
			} else 
				ast_log(LOG_NOTICE, "Ignoring ${SIP_CODEC} variable because it is not shared by both ends: %s\n", codec);
 		} else
			ast_log(LOG_NOTICE, "Ignoring ${SIP_CODEC} variable because of unrecognized/not configured codec (check allow/disallow in sip.conf): %s\n", codec);
	}
	ast_format_cap_destroy(jointcapsCopy);
 	return;
 } 

Do you have any feedback?

Authors: Dennis Guse (dennis.guse at qu.tu-berlin.de) und Frank Haase (fra.haase at googlemail.com).

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.asterisk.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira



More information about the asterisk-bugs mailing list