From 9119e56b22600b416598dbb48b110b2a6d866a4f Mon Sep 17 00:00:00 2001 From: kpfleming Date: Sat, 25 Feb 2006 05:08:46 +0000 Subject: factor the number of translation steps required into translation path decisions, so that equal cost paths that require fewer translations are preferred git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.2@11089 f38db490-d61c-443f-a65b-d21fe96a405b --- translate.c | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) (limited to 'translate.c') diff --git a/translate.c b/translate.c index d87aec5e7..306774d78 100644 --- a/translate.c +++ b/translate.c @@ -454,14 +454,14 @@ int ast_translator_best_choice(int *dst, int *srcs) int bestdst = 0; int cur = 1; int besttime = INT_MAX; + int beststeps = INT_MAX; int common; if ((common = (*dst) & (*srcs))) { /* We have a format in common */ - for (y=0; y < MAX_FORMAT; y++) { + for (y = 0; y < MAX_FORMAT; y++) { if (cur & common) { /* This is a common format to both. Pick it if we don't have one already */ - besttime = 0; bestdst = cur; best = cur; } @@ -470,25 +470,38 @@ int ast_translator_best_choice(int *dst, int *srcs) } 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 ((*srcs & (1 << x)) && /* x is a valid source format */ - tr_matrix[x][y].step && /* There's a step */ - (tr_matrix[x][y].cost < besttime)) { /* It's better than what we have so far */ - best = 1 << x; - bestdst = cur; - besttime = tr_matrix[x][y].cost; - } + for (y = 0; y < MAX_FORMAT; y++) { + if (!(cur & *dst)) + continue; + + for (x = 0; x < MAX_FORMAT; x++) { + if ((*srcs & (1 << x)) && /* x is a valid source format */ + tr_matrix[x][y].step) { /* There's a step */ + if (tr_matrix[x][y].cost > besttime) + continue; /* It's more expensive, skip it */ + + if (tr_matrix[x][y].cost == besttime && + tr_matrix[x][y].multistep >= beststeps) + continue; /* It requires the same (or more) steps, + skip it */ + + /* It's better than what we have so far */ + best = 1 << x; + bestdst = cur; + besttime = tr_matrix[x][y].cost; + beststeps = tr_matrix[x][y].multistep; } + } cur = cur << 1; } ast_mutex_unlock(&list_lock); } + if (best > -1) { *srcs = best; *dst = bestdst; best = 0; } + return best; } -- cgit v1.2.3