Skip to content
Snippets Groups Projects
Commit 77b5459c authored by Mark Spencer's avatar Mark Spencer
Browse files

Minor translation performance improvement (bug #2987, not that patch though)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4393 65c4cc65-6c06-0410-ace0-fbb531ad65f3
parent dc074b70
No related branches found
No related tags found
No related merge requests found
......@@ -3,9 +3,9 @@
*
* Translate via the use of pseudo channels
*
* Copyright (C) 1999, Mark Spencer
* Copyright (C) 1999-2004, Digium, Inc.
*
* Mark Spencer <markster@linux-support.net>
* Mark Spencer <markster@digium.com>
*
* This program is free software, distributed under the terms of
* the GNU General Public License
......@@ -442,33 +442,40 @@ int ast_translator_best_choice(int *dst, int *srcs)
int bestdst=0;
int cur = 1;
int besttime=999999999;
ast_mutex_lock(&list_lock);
for (y=0;y<MAX_FORMAT;y++) {
if ((cur & *dst) && (cur & *srcs)) {
/* This is a common format to both. Pick it if we don't have one already */
besttime=0;
bestdst = cur;
best = cur;
break;
}
if (cur & *dst)
for (x=0;x<MAX_FORMAT;x++) {
if (tr_matrix[x][y].step && /* There's a step */
(tr_matrix[x][y].cost < besttime) && /* We're better than what exists now */
(*srcs & (1 << x))) /* x is a valid source format */
{
best = 1 << x;
bestdst = cur;
besttime = tr_matrix[x][y].cost;
}
if ((*dst) & (*srcs)) {
/* We have a format in common */
for (y=0;y<MAX_FORMAT;y++) {
if ((cur & *dst) && (cur & *srcs)) {
/* This is a common format to both. Pick it if we don't have one already */
besttime=0;
bestdst = cur;
best = cur;
}
cur = cur << 1;
cur = cur << 1;
}
} else {
/* We will need to translate */
ast_mutex_lock(&list_lock);
for (y=0;y<MAX_FORMAT;y++) {
if (cur & *dst)
for (x=0;x<MAX_FORMAT;x++) {
if (tr_matrix[x][y].step && /* There's a step */
(tr_matrix[x][y].cost < besttime) && /* We're better than what exists now */
(*srcs & (1 << x))) /* x is a valid source format */
{
best = 1 << x;
bestdst = cur;
besttime = tr_matrix[x][y].cost;
}
}
cur = cur << 1;
}
ast_mutex_unlock(&list_lock);
}
if (best > -1) {
*srcs = best;
*dst = bestdst;
best = 0;
}
ast_mutex_unlock(&list_lock);
return best;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment