Minor translation performance improvement (bug #2987, not that patch though)
authorMark Spencer <markster@digium.com>
Mon, 6 Dec 2004 21:53:57 +0000 (21:53 +0000)
committerMark Spencer <markster@digium.com>
Mon, 6 Dec 2004 21:53:57 +0000 (21:53 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4393 65c4cc65-6c06-0410-ace0-fbb531ad65f3

translate.c

index 2bbda14..0fd8f09 100755 (executable)
@@ -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;
 }