aboutsummaryrefslogtreecommitdiffstats
path: root/channels
diff options
context:
space:
mode:
authorrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2008-01-17 22:37:22 +0000
committerrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2008-01-17 22:37:22 +0000
commit37d625d3a31eeff735c2f1d983dc38d8d438f8e4 (patch)
tree276f918e8a4600b6170a2d6cd02cae91c27b8232 /channels
parentdedde188e696656e16d157fa2ed2f5c04e2ce5f7 (diff)
Have IAX2 optimize the codec translation path just like chan_sip does it. If
the caller's codec is in our codec list, move it to the top to avoid transcoding. (closes issue #10500) Reported by: stevedavies Patches: iax-prefer-current-codec.patch uploaded by stevedavies (license 184) iax-prefer-current-codec.1.4.patch uploaded by stevedavies (license 184) Tested by: stevedavies, pj, sheldonh git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@99004 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_iax2.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index a2ce4c972..66af3ead0 100644
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -2896,12 +2896,13 @@ struct create_addr_info {
char mohsuggest[MAX_MUSICCLASS];
};
-static int create_addr(const char *peername, struct sockaddr_in *sin, struct create_addr_info *cai)
+static int create_addr(const char *peername, struct ast_channel *c, struct sockaddr_in *sin, struct create_addr_info *cai)
{
struct ast_hostent ahp;
struct hostent *hp;
struct iax2_peer *peer;
int res = -1;
+ struct ast_codec_pref ourprefs;
ast_clear_flag(cai, IAX_SENDANI | IAX_TRUNK);
cai->sockfd = defaultsockfd;
@@ -2916,7 +2917,11 @@ static int create_addr(const char *peername, struct sockaddr_in *sin, struct cre
memcpy(&sin->sin_addr, hp->h_addr, sizeof(sin->sin_addr));
sin->sin_port = htons(IAX_DEFAULT_PORTNO);
/* use global iax prefs for unknown peer/user */
- ast_codec_pref_convert(&prefs, cai->prefs, sizeof(cai->prefs), 1);
+ /* But move the calling channel's native codec to the top of the preference list */
+ memcpy(&ourprefs, &prefs, sizeof(ourprefs));
+ if (c)
+ ast_codec_pref_prepend(&ourprefs, c->nativeformats, 1);
+ ast_codec_pref_convert(&ourprefs, cai->prefs, sizeof(cai->prefs), 1);
return 0;
} else {
ast_log(LOG_WARNING, "No such host: %s\n", peername);
@@ -2940,7 +2945,13 @@ static int create_addr(const char *peername, struct sockaddr_in *sin, struct cre
cai->encmethods = peer->encmethods;
cai->sockfd = peer->sockfd;
cai->adsi = peer->adsi;
- ast_codec_pref_convert(&peer->prefs, cai->prefs, sizeof(cai->prefs), 1);
+ memcpy(&ourprefs, &peer->prefs, sizeof(ourprefs));
+ /* Move the calling channel's native codec to the top of the preference list */
+ if (c) {
+ ast_log(LOG_DEBUG, "prepending %x to prefs\n", c->nativeformats);
+ ast_codec_pref_prepend(&ourprefs, c->nativeformats, 1);
+ }
+ ast_codec_pref_convert(&ourprefs, cai->prefs, sizeof(cai->prefs), 1);
ast_copy_string(cai->context, peer->context, sizeof(cai->context));
ast_copy_string(cai->peercontext, peer->peercontext, sizeof(cai->peercontext));
ast_copy_string(cai->username, peer->username, sizeof(cai->username));
@@ -3115,7 +3126,7 @@ static int iax2_call(struct ast_channel *c, char *dest, int timeout)
if (!pds.exten)
pds.exten = defaultrdest;
- if (create_addr(pds.peer, &sin, &cai)) {
+ if (create_addr(pds.peer, c, &sin, &cai)) {
ast_log(LOG_WARNING, "No address associated with '%s'\n", pds.peer);
return -1;
}
@@ -8499,7 +8510,7 @@ static int iax2_provision(struct sockaddr_in *end, int sockfd, char *dest, const
if (end) {
memcpy(&sin, end, sizeof(sin));
cai.sockfd = sockfd;
- } else if (create_addr(dest, &sin, &cai))
+ } else if (create_addr(dest, NULL, &sin, &cai))
return -1;
/* Build the rest of the message */
@@ -8722,7 +8733,7 @@ static struct ast_channel *iax2_request(const char *type, int format, void *data
/* Populate our address from the given */
- if (create_addr(pds.peer, &sin, &cai)) {
+ if (create_addr(pds.peer, NULL, &sin, &cai)) {
*cause = AST_CAUSE_UNREGISTERED;
return NULL;
}
@@ -10037,7 +10048,7 @@ static int cache_get_callno_locked(const char *data)
parse_dial_string(tmpstr, &pds);
/* Populate our address from the given */
- if (create_addr(pds.peer, &sin, &cai))
+ if (create_addr(pds.peer, NULL, &sin, &cai))
return -1;
if (option_debug)