diff options
author | kpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-07-13 20:35:41 +0000 |
---|---|---|
committer | kpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-07-13 20:35:41 +0000 |
commit | 86a49ee8618a11a78f51e2dead2562336b7175f0 (patch) | |
tree | acfdd948485b75c0990b15467a523bf5142efb92 | |
parent | 3d8e4cb4ba32de52aca12ecddb816d1ab327e331 (diff) |
actually make the non-standard G726-32 behavior available for SIP clients
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@37564 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r-- | UPGRADE.txt | 13 | ||||
-rw-r--r-- | channels/chan_sip.c | 17 | ||||
-rw-r--r-- | configs/sip.conf.sample | 7 |
3 files changed, 32 insertions, 5 deletions
diff --git a/UPGRADE.txt b/UPGRADE.txt index e938e722e..32444aef7 100644 --- a/UPGRADE.txt +++ b/UPGRADE.txt @@ -285,6 +285,19 @@ The Zap channel: * Support for MFC/R2 has been removed, as it has not been functional for some time and it has no maintainer. +The G726-32 codec: + +* It has been determined that previous versions of Asterisk used the wrong codeword + packing order for G726-32 data. This version supports both available packing orders, + and can transcode between them. It also now selects the proper order when + negotiating with a SIP peer based on the codec name supplied in the SDP. However, + there are existing devices that improperly request one order and then use another; + Sipura and Grandstream ATAs are known to do this, and there may be others. To + be able to continue to use these devices with this version of Asterisk and the + G726-32 codec, a configuration parameter called 'g726nonstandard' has been added + to sip.conf, so that Asterisk can use the packing order expected by the device (even + though it requested a different order). + Installation: * On BSD systems, the installation directories have changed to more "FreeBSDish" diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 29b21a36c..2db0dcc33 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -705,10 +705,11 @@ struct sip_auth { #define SIP_CALL_LIMIT (1 << 28) /*!< Call limit enforced for this call */ #define SIP_SENDRPID (1 << 29) /*!< Remote Party-ID Support */ #define SIP_INC_COUNT (1 << 30) /*!< Did this connection increment the counter of in-use calls? */ +#define SIP_G726_NONSTANDARD (1 << 31) /*!< Use non-standard packing for G726-32 data */ #define SIP_FLAGS_TO_COPY \ (SIP_PROMISCREDIR | SIP_TRUSTRPID | SIP_SENDRPID | SIP_DTMF | SIP_REINVITE | \ - SIP_PROG_INBAND | SIP_USECLIENTCODE | SIP_NAT | \ + SIP_PROG_INBAND | SIP_USECLIENTCODE | SIP_NAT | SIP_G726_NONSTANDARD | \ SIP_USEREQPHONE | SIP_INSECURE_PORT | SIP_INSECURE_INVITE) /* a new page of flags */ @@ -778,7 +779,7 @@ static int global_t38_capability = T38FAX_VERSION_0 | T38FAX_RATE_2400 | T38FAX_ #define sipdebug_config ast_test_flag(&global_flags[1], SIP_PAGE2_DEBUG_CONFIG) #define sipdebug_console ast_test_flag(&global_flags[1], SIP_PAGE2_DEBUG_CONSOLE) -/*! \brief T38 Sates for a call */ +/*! \brief T38 States for a call */ enum t38state { T38_DISABLED = 0, /*! Not enabled */ T38_LOCAL_DIRECT, /*! Offered from local */ @@ -4719,7 +4720,8 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req) ast_verbose("Found description format %s for ID %d\n", mimeSubtype, codec); /* Note: should really look at the 'freq' and '#chans' params too */ - ast_rtp_set_rtpmap_type(newaudiortp, codec, "audio", mimeSubtype, 0); + ast_rtp_set_rtpmap_type(newaudiortp, codec, "audio", mimeSubtype, + ast_test_flag(&p->flags[0], SIP_G726_NONSTANDARD) ? AST_RTP_OPT_G726_NONSTANDARD : 0); if (p->vrtp) ast_rtp_set_rtpmap_type(newvideortp, codec, "video", mimeSubtype, 0); } @@ -5571,7 +5573,8 @@ static void add_codec_to_sdp(const struct sip_pvt *p, int codec, int sample_rate ast_build_string(m_buf, m_size, " %d", rtp_code); ast_build_string(a_buf, a_size, "a=rtpmap:%d %s/%d\r\n", rtp_code, - ast_rtp_lookup_mime_subtype(1, codec, 0), + ast_rtp_lookup_mime_subtype(1, codec, + ast_test_flag(&p->flags[0], SIP_G726_NONSTANDARD) ? AST_RTP_OPT_G726_NONSTANDARD : 0), sample_rate); if (codec == AST_FORMAT_G729A) { /* Indicate that we don't support VAD (G.729 annex B) */ @@ -5583,7 +5586,7 @@ static void add_codec_to_sdp(const struct sip_pvt *p, int codec, int sample_rate } } -/*! \brief Get Max T.38 Transmision rate from T38 capabilities */ +/*! \brief Get Max T.38 Transmission rate from T38 capabilities */ static int t38_get_rate(int t38cap) { int maxrate = (t38cap & (T38FAX_RATE_14400 | T38FAX_RATE_12000 | T38FAX_RATE_9600 | T38FAX_RATE_7200 | T38FAX_RATE_4800 | T38FAX_RATE_2400)); @@ -14716,6 +14719,10 @@ static int handle_common_options(struct ast_flags *flags, struct ast_flags *mask ast_set_flag(&mask[0], SIP_SENDRPID); ast_set2_flag(&flags[0], ast_true(v->value), SIP_SENDRPID); res = 1; + } else if (!strcasecmp(v->name, "g726nonstandard")) { + ast_set_flag(&mask[0], SIP_G726_NONSTANDARD); + ast_set2_flag(&flags[0], ast_true(v->value), SIP_G726_NONSTANDARD); + res = 1; } else if (!strcasecmp(v->name, "useclientcode")) { ast_set_flag(&mask[0], SIP_USECLIENTCODE); ast_set2_flag(&flags[0], ast_true(v->value), SIP_USECLIENTCODE); diff --git a/configs/sip.conf.sample b/configs/sip.conf.sample index d9bd8d721..2409f6ef3 100644 --- a/configs/sip.conf.sample +++ b/configs/sip.conf.sample @@ -111,6 +111,13 @@ srvlookup=yes ; Enable DNS SRV lookups on outbound calls ; for any reason, always reject with '401 Unauthorized' ; instead of letting the requester know whether there was ; a matching user or peer for their request + +;g726nonstandard = yes ; If the peer negotiates G726-32 audio, use AAL2 packing + ; order instead of RFC3551 packing order (this is required + ; for Sipura and Grandstream ATAs, among others). This is + ; contrary to the RFC3551 specification, the peer _should_ + ; be negotiating AAL2-G726-32 instead :-( + ; ; If regcontext is specified, Asterisk will dynamically create and destroy a ; NoOp priority 1 extension for a given peer who registers or unregisters with |