[asterisk-commits] russell: trunk r99006 - in /trunk: ./ channels/ include/asterisk/ main/
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Thu Jan 17 16:50:14 CST 2008
Author: russell
Date: Thu Jan 17 16:50:13 2008
New Revision: 99006
URL: http://svn.digium.com/view/asterisk?view=rev&rev=99006
Log:
Merged revisions 99004 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4
........
r99004 | russell | 2008-01-17 16:37:22 -0600 (Thu, 17 Jan 2008) | 10 lines
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
........
Modified:
trunk/ (props changed)
trunk/channels/chan_iax2.c
trunk/include/asterisk/frame.h
trunk/main/frame.c
Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-1.4-merged' - no diff available.
Modified: trunk/channels/chan_iax2.c
URL: http://svn.digium.com/view/asterisk/trunk/channels/chan_iax2.c?view=diff&rev=99006&r1=99005&r2=99006
==============================================================================
--- trunk/channels/chan_iax2.c (original)
+++ trunk/channels/chan_iax2.c Thu Jan 17 16:50:13 2008
@@ -3162,10 +3162,11 @@
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 iax2_peer *peer;
int res = -1;
+ struct ast_codec_pref ourprefs;
ast_clear_flag(cai, IAX_SENDANI | IAX_TRUNK);
cai->sockfd = defaultsockfd;
@@ -3180,7 +3181,11 @@
}
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;
}
@@ -3200,7 +3205,13 @@
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));
@@ -3378,7 +3389,7 @@
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;
}
@@ -9289,7 +9300,7 @@
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 */
@@ -9525,7 +9536,7 @@
/* 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;
}
@@ -10895,7 +10906,7 @@
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;
ast_debug(1, "peer: %s, username: %s, password: %s, context: %s\n",
Modified: trunk/include/asterisk/frame.h
URL: http://svn.digium.com/view/asterisk/trunk/include/asterisk/frame.h?view=diff&rev=99006&r1=99005&r2=99006
==============================================================================
--- trunk/include/asterisk/frame.h (original)
+++ trunk/include/asterisk/frame.h Thu Jan 17 16:50:13 2008
@@ -531,6 +531,10 @@
*/
int ast_codec_pref_append(struct ast_codec_pref *pref, int format);
+/*! \brief Prepend an audio codec to a preference list, removing it first if it was already there
+*/
+void ast_codec_pref_prepend(struct ast_codec_pref *pref, int format, int only_if_existing);
+
/*! \brief Select the best audio format according to preference list from supplied options.
If "find_best" is non-zero then if nothing is found, the "Best" format of
the format list is selected, otherwise 0 is returned. */
Modified: trunk/main/frame.c
URL: http://svn.digium.com/view/asterisk/trunk/main/frame.c?view=diff&rev=99006&r1=99005&r2=99006
==============================================================================
--- trunk/main/frame.c (original)
+++ trunk/main/frame.c Thu Jan 17 16:50:13 2008
@@ -1025,7 +1025,7 @@
/*! \brief Append codec to list */
int ast_codec_pref_append(struct ast_codec_pref *pref, int format)
{
- int x, newindex = -1;
+ int x, newindex = 0;
ast_codec_pref_remove(pref, format);
@@ -1048,6 +1048,42 @@
return x;
}
+/*! \brief Prepend codec to list */
+void ast_codec_pref_prepend(struct ast_codec_pref *pref, int format, int only_if_existing)
+{
+ int x, newindex = 0;
+
+ /* First step is to get the codecs "index number" */
+ for (x = 0; x < ARRAY_LEN(AST_FORMAT_LIST); x++) {
+ if (AST_FORMAT_LIST[x].bits == format) {
+ newindex = x + 1;
+ break;
+ }
+ }
+ /* Done if its unknown */
+ if (!newindex)
+ return;
+
+ /* Now find any existing occurrence, or the end */
+ for (x = 0; x < 32; x++) {
+ if (!pref->order[x] || pref->order[x] == newindex)
+ break;
+ }
+
+ if (only_if_existing && !pref->order[x])
+ return;
+
+ /* Move down to make space to insert - either all the way to the end,
+ or as far as the existing location (which will be overwritten) */
+ for (; x > 0; x--) {
+ pref->order[x] = pref->order[x - 1];
+ pref->framing[x] = pref->framing[x - 1];
+ }
+
+ /* And insert the new entry */
+ pref->order[0] = newindex;
+ pref->framing[0] = 0; /* ? */
+}
/*! \brief Set packet size for codec */
int ast_codec_pref_setsize(struct ast_codec_pref *pref, int format, int framems)
More information about the asterisk-commits
mailing list