[asterisk-commits] dvossel: branch dvossel/fixtheworld_phase1_step2 r299398 - /team/dvossel/fixt...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Tue Dec 21 21:04:08 UTC 2010
Author: dvossel
Date: Tue Dec 21 15:04:04 2010
New Revision: 299398
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=299398
Log:
Translator matix index values are decoupled from bitfield conversion
Modified:
team/dvossel/fixtheworld_phase1_step2/main/translate.c
Modified: team/dvossel/fixtheworld_phase1_step2/main/translate.c
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/fixtheworld_phase1_step2/main/translate.c?view=diff&rev=299398&r1=299397&r2=299398
==============================================================================
--- team/dvossel/fixtheworld_phase1_step2/main/translate.c (original)
+++ team/dvossel/fixtheworld_phase1_step2/main/translate.c Tue Dec 21 15:04:04 2010
@@ -42,6 +42,11 @@
#define MAX_RECALC 1000 /* max sample recalc */
+/*! This value is used to define how large the tr_matrix and tr_index2format arrays
+ * are defined to be in memory by default. Once Asterisk can represent more formats
+ * than this number represents with translation, increase it. */
+#define DEFAULT_INDEX 256
+
/*! \brief the list of translators */
static AST_RWLIST_HEAD_STATIC(translators, ast_translator);
@@ -61,7 +66,11 @@
* Note: the lock in the 'translators' list is also used to protect
* this structure.
*/
-static struct translator_path tr_matrix[MAX_FORMAT][MAX_FORMAT];
+static struct translator_path tr_matrix[DEFAULT_INDEX][DEFAULT_INDEX];
+/*! table for converting index to format id values. */
+static format_t tr_index2format[DEFAULT_INDEX];
+/*! the current largest index used by the tr_matrix and tr_index2format tables */
+static int cur_max_index = 0;
/*! \todo
* TODO: sample frames for each supported input format.
@@ -73,24 +82,32 @@
* \internal
* \brief converts format id to index value.
*/
-static force_inline int format2index(format_t d)
-{
- int x = ffsll(d);
-
- if (x)
- return x - 1;
-
- ast_log(LOG_WARNING, "No bits set? %llu\n", (unsigned long long) d);
-
- return -1;
-}
+static force_inline int format2index(format_t id)
+{
+ int x;
+ for (x = 0; x < cur_max_index; x++) {
+ if (tr_index2format[x] == id) {
+ /* format already exists in index2format table */
+ return x;
+ }
+ }
+
+ if (cur_max_index == ARRAY_LEN(tr_index2format)) {
+ return -1; /* hit max length. */
+ }
+ tr_index2format[cur_max_index] = id;
+ cur_max_index++;
+
+ return cur_max_index - 1;
+}
+
/*!
* \internal
* \brief converts index value back to format id
*/
static force_inline format_t index2format(int index)
{
- return 1LL << index;
+ return tr_index2format[index];
}
/*
@@ -149,7 +166,7 @@
{
int ret;
int samples = pvt->samples; /* initial value */
-
+
/* Copy the last in jb timing info to the pvt */
ast_copy_flags(&pvt->f, f, AST_FRFLAG_HAS_TIMING_INFO);
pvt->f.ts = f->ts;
@@ -236,7 +253,7 @@
struct ast_trans_pvt *ast_translator_build_path(format_t dest, format_t source)
{
struct ast_trans_pvt *head = NULL, *tail = NULL;
-
+
source = format2index(source);
dest = format2index(dest);
@@ -335,7 +352,7 @@
/* Use next predicted outgoing timestamp */
out->delivery = path->nextout;
-
+
/* Predict next outgoing timestamp from samples in this
frame. */
path->nextout = ast_tvadd(path->nextout, ast_samp2tv(out->samples, ast_format_rate(out->subclass.codec)));
@@ -537,11 +554,11 @@
*/
for (;;) {
int changed = 0;
- for (x = 0; x < MAX_FORMAT; x++) { /* source format */
- for (y = 0; y < MAX_FORMAT; y++) { /* intermediate format */
+ for (x = 0; x < cur_max_index; x++) { /* source format */
+ for (y = 0; y < cur_max_index; y++) { /* intermediate format */
if (x == y) /* skip ourselves */
continue;
- for (z = 0; z < MAX_FORMAT; z++) { /* dst format */
+ for (z = 0; z < cur_max_index; z++) { /* dst format */
if (z == x || z == y) /* skip null conversions */
continue;
if (!tr_matrix[x][y].step) /* no path from x to y */
@@ -810,13 +827,13 @@
ast_log(LOG_WARNING, "Invalid translator path: (%s codec is not valid)\n", t->srcfmt == -1 ? "starting" : "ending");
return -1;
}
- if (t->srcfmt >= MAX_FORMAT) {
- ast_log(LOG_WARNING, "Source format %s is larger than MAX_FORMAT\n", ast_getformatname(t->srcfmt));
+ if (t->srcfmt >= cur_max_index) {
+ ast_log(LOG_WARNING, "Source format %s is larger than cur_max_index\n", ast_getformatname(t->srcfmt));
return -1;
}
- if (t->dstfmt >= MAX_FORMAT) {
- ast_log(LOG_WARNING, "Destination format %s is larger than MAX_FORMAT\n", ast_getformatname(t->dstfmt));
+ if (t->dstfmt >= cur_max_index) {
+ ast_log(LOG_WARNING, "Destination format %s is larger than cur_max_index\n", ast_getformatname(t->dstfmt));
return -1;
}
@@ -833,7 +850,7 @@
if (t->frameout == NULL)
t->frameout = default_frameout;
-
+
generate_computational_cost(t, 1);
ast_verb(2, "Registered translator '%s' from format %s to %s, cost %d\n",
@@ -999,7 +1016,8 @@
format_t ast_translate_available_formats(format_t dest, format_t src)
{
format_t res = dest;
- format_t x;
+ format_t tmp_fmt;
+ int index;
format_t src_audio = src & AST_FORMAT_AUDIO_MASK;
format_t src_video = src & AST_FORMAT_VIDEO_MASK;
@@ -1022,60 +1040,62 @@
known audio formats to determine whether there exists
a translation path from the source format to the
destination format. */
- for (x = 1LL; src_audio && x > 0; x <<= 1) {
- if (!(x & AST_FORMAT_AUDIO_MASK)) {
+ for (index = 0; src_audio && index < cur_max_index; index++) {
+ tmp_fmt = index2format(index);
+ if (!(tmp_fmt & AST_FORMAT_AUDIO_MASK)) {
continue;
}
/* if this is not a desired format, nothing to do */
- if (!(dest & x))
+ if (!(dest & tmp_fmt))
continue;
/* if the source is supplying this format, then
we can leave it in the result */
- if (src & x)
+ if (src & tmp_fmt)
continue;
/* if we don't have a translation path from the src
to this format, remove it from the result */
- if (!tr_matrix[src_audio][format2index(x)].step) {
- res &= ~x;
+ if (!tr_matrix[src_audio][index].step) {
+ res &= ~tmp_fmt;
continue;
}
/* now check the opposite direction */
- if (!tr_matrix[format2index(x)][src_audio].step)
- res &= ~x;
+ if (!tr_matrix[index][src_audio].step)
+ res &= tmp_fmt;
}
/* For a given source video format, traverse the list of
known video formats to determine whether there exists
a translation path from the source format to the
destination format. */
- for (x = 1LL; src_video && x > 0; x <<= 1) {
- if (!(x & AST_FORMAT_VIDEO_MASK)) {
+ for (index = 0; src_video && index > cur_max_index; index++) {
+ tmp_fmt = index2format(index);
+ if (!(tmp_fmt & AST_FORMAT_VIDEO_MASK)) {
continue;
}
/* if this is not a desired format, nothing to do */
- if (!(dest & x))
+ if (!(dest & tmp_fmt))
continue;
/* if the source is supplying this format, then
we can leave it in the result */
- if (src & x)
+ if (src & tmp_fmt)
continue;
/* if we don't have a translation path from the src
to this format, remove it from the result */
- if (!tr_matrix[src_video][format2index(x)].step) {
- res &= ~x;
+ if (!tr_matrix[src_video][index].step) {
+ res &= ~tmp_fmt;
continue;
}
/* now check the opposite direction */
- if (!tr_matrix[format2index(x)][src_video].step)
- res &= ~x;
+ if (!tr_matrix[index][src_video].step)
+ res &= ~tmp_fmt;
}
AST_RWLIST_UNLOCK(&translators);
More information about the asterisk-commits
mailing list