|
|
|
@ -55,7 +55,8 @@ static struct ast_translator *list = NULL;
|
|
|
|
|
|
|
|
|
|
struct ast_translator_dir {
|
|
|
|
|
struct ast_translator *step; /*!< Next step translator */
|
|
|
|
|
int cost; /*!< Complete cost to destination */
|
|
|
|
|
unsigned int cost; /*!< Complete cost to destination */
|
|
|
|
|
unsigned int multistep; /*!< Multiple conversions required for this translation */
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct ast_frame_delivery {
|
|
|
|
@ -271,14 +272,15 @@ static void rebuild_matrix(int samples)
|
|
|
|
|
{
|
|
|
|
|
struct ast_translator *t;
|
|
|
|
|
int changed;
|
|
|
|
|
int x,y,z;
|
|
|
|
|
int x, y, z;
|
|
|
|
|
|
|
|
|
|
if (option_debug)
|
|
|
|
|
ast_log(LOG_DEBUG, "Resetting translation matrix\n");
|
|
|
|
|
|
|
|
|
|
bzero(tr_matrix, sizeof(tr_matrix));
|
|
|
|
|
t = list;
|
|
|
|
|
while(t) {
|
|
|
|
|
if(samples)
|
|
|
|
|
|
|
|
|
|
for (t = list; t; t = t->next) {
|
|
|
|
|
if (samples)
|
|
|
|
|
calc_cost(t, samples);
|
|
|
|
|
|
|
|
|
|
if (!tr_matrix[t->srcfmt][t->dstfmt].step ||
|
|
|
|
@ -286,16 +288,21 @@ static void rebuild_matrix(int samples)
|
|
|
|
|
tr_matrix[t->srcfmt][t->dstfmt].step = t;
|
|
|
|
|
tr_matrix[t->srcfmt][t->dstfmt].cost = t->cost;
|
|
|
|
|
}
|
|
|
|
|
t = t->next;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
do {
|
|
|
|
|
changed = 0;
|
|
|
|
|
|
|
|
|
|
/* Don't you just love O(N^3) operations? */
|
|
|
|
|
for (x=0; x< MAX_FORMAT; x++) /* For each source format */
|
|
|
|
|
for (y=0; y < MAX_FORMAT; y++) /* And each destination format */
|
|
|
|
|
if (x != y) /* Except ourselves, of course */
|
|
|
|
|
for (z=0; z < MAX_FORMAT; z++) /* And each format it might convert to */
|
|
|
|
|
if ((x!=z) && (y!=z)) /* Don't ever convert back to us */
|
|
|
|
|
for (x = 0; x< MAX_FORMAT; x++) { /* For each source format */
|
|
|
|
|
for (y = 0; y < MAX_FORMAT; y++) { /* And each destination format */
|
|
|
|
|
if (x == y) /* Except ourselves, of course */
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
for (z=0; z < MAX_FORMAT; z++) { /* And each format it might convert to */
|
|
|
|
|
if ((x == z) || (y == z)) /* Don't ever convert back to us */
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
if (tr_matrix[x][y].step && /* We can convert from x to y */
|
|
|
|
|
tr_matrix[y][z].step && /* And from y to z and... */
|
|
|
|
|
(!tr_matrix[x][z].step || /* Either there isn't an x->z conversion */
|
|
|
|
@ -310,18 +317,18 @@ static void rebuild_matrix(int samples)
|
|
|
|
|
tr_matrix[x][z].step = tr_matrix[x][y].step;
|
|
|
|
|
tr_matrix[x][z].cost = tr_matrix[x][y].cost +
|
|
|
|
|
tr_matrix[y][z].cost;
|
|
|
|
|
tr_matrix[x][z].multistep = 1;
|
|
|
|
|
if (option_debug)
|
|
|
|
|
ast_log(LOG_DEBUG, "Discovered %d cost path from %s to %s, via %d\n", tr_matrix[x][z].cost, ast_getformatname(x), ast_getformatname(z), y);
|
|
|
|
|
changed++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} while (changed);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*! \brief CLI "show translation" command handler */
|
|
|
|
|
static int show_translation(int fd, int argc, char *argv[])
|
|
|
|
|
{
|
|
|
|
|