summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTerry Wilson <twilson@digium.com>2011-01-17 16:38:21 +0000
committerTerry Wilson <twilson@digium.com>2011-01-17 16:38:21 +0000
commitae6b55e4a3dbd116e13bc4152c2c251edd7571cd (patch)
tree7c5c11565e862bc42ccd47515a6e4a48f83c4ae8
parent29cb03ebf2cb8671d064730f26cdb6e1d9959eaa (diff)
Merged revisions 293493 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.8 ........ r293493 | twilson | 2010-11-01 09:58:00 -0500 (Mon, 01 Nov 2010) | 14 lines Only offer codecs both sides support for directmedia When using directmedia, Asterisk needs to limit the codecs offered to just the ones that both sides recognize, otherwise they may end up sending audio that the other side doesn't understand. (closes issue #17403) Reported by: one47 Patches: sip_codecs_simplified4 uploaded by one47 (license 23) Tested by: one47, falves11 Review: https://reviewboard.asterisk.org/r/967/ ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@302048 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r--channels/chan_sip.c24
1 files changed, 17 insertions, 7 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 84dd41535..749f7a26b 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -10597,6 +10597,7 @@ static void get_crypto_attrib(struct sip_srtp *srtp, const char **a_crypto)
static enum sip_result add_sdp(struct sip_request *resp, struct sip_pvt *p, int oldsdp, int add_audio, int add_t38)
{
format_t alreadysent = 0;
+ int doing_directmedia = FALSE;
struct ast_sockaddr addr = { {0,} };
struct ast_sockaddr vaddr = { {0,} };
@@ -10661,6 +10662,7 @@ static enum sip_result add_sdp(struct sip_request *resp, struct sip_pvt *p, int
}
if (add_audio) {
+ doing_directmedia = (!ast_sockaddr_isnull(&p->redirip) && p->redircodecs) ? TRUE : FALSE;
/* Check if we need video in this call */
if ((p->jointcapability & AST_FORMAT_VIDEO_MASK) && !p->novideo) {
if (p->vrtp) {
@@ -10700,6 +10702,16 @@ static enum sip_result add_sdp(struct sip_request *resp, struct sip_pvt *p, int
ast_sockaddr_stringify_addr(&dest));
if (add_audio) {
+ if (ast_test_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD) == SIP_PAGE2_CALL_ONHOLD_ONEDIR) {
+ hold = "a=recvonly\r\n";
+ doing_directmedia = FALSE;
+ } else if (ast_test_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD) == SIP_PAGE2_CALL_ONHOLD_INACTIVE) {
+ hold = "a=inactive\r\n";
+ doing_directmedia = FALSE;
+ } else {
+ hold = "a=sendrecv\r\n";
+ }
+
capability = p->jointcapability;
/* XXX note, Video and Text are negated - 'true' means 'no' */
@@ -10707,6 +10719,11 @@ static enum sip_result add_sdp(struct sip_request *resp, struct sip_pvt *p, int
p->novideo ? "True" : "False", p->notext ? "True" : "False");
ast_debug(1, "** Our prefcodec: %s \n", ast_getformatname_multiple(codecbuf, sizeof(codecbuf), p->prefcodec));
+ if (doing_directmedia) {
+ capability &= p->redircodecs;
+ ast_debug(1, "** Our native-bridge filtered capablity: %s\n", ast_getformatname_multiple(codecbuf, sizeof(codecbuf), capability));
+ }
+
/* Check if we need audio */
if (capability & AST_FORMAT_AUDIO_MASK)
needaudio = TRUE;
@@ -10752,13 +10769,6 @@ static enum sip_result add_sdp(struct sip_request *resp, struct sip_pvt *p, int
ast_str_append(&m_audio, 0, "m=audio %d RTP/%s", ast_sockaddr_port(&dest),
a_crypto ? "SAVP" : "AVP");
- if (ast_test_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD) == SIP_PAGE2_CALL_ONHOLD_ONEDIR)
- hold = "a=recvonly\r\n";
- else if (ast_test_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD) == SIP_PAGE2_CALL_ONHOLD_INACTIVE)
- hold = "a=inactive\r\n";
- else
- hold = "a=sendrecv\r\n";
-
/* Now, start adding audio codecs. These are added in this order:
- First what was requested by the calling channel
- Then preferences in order from sip.conf device config for this peer/user