summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
authorAlexander Traud <pabstraud@compuserve.com>2017-11-26 18:47:17 +0100
committerAlexander Traud <pabstraud@compuserve.com>2017-11-26 11:48:34 -0600
commitc46cab49a32f488cec0196ec8e2e4c4f8e7386b8 (patch)
treea3107205389aa1f4c05b2d4aa920635ab762d70e /main
parentee3562619c97035a3c30ad04c63db92520e53f49 (diff)
translate: Transcode siren14, speex32, silk24, and silk12 via slin16.
When a format has no pre-recorded sound files, Asterisk has to transcode between formats. For this, Asterisk has a fixed translation table. If the pre-recorded sound files are not available in the same sample rate, Asterisk has not only to transcode but also to resample. Asterisk has pre-recorded files for SLN (8000 kHz) and SLN16 (16000 kHz). However before this change, Asterisk did not take the sample rate into account, because the translation paths to SLN and SLN16 got the same score/weight in the table. Consequently, you might have got narrow-band audio with siren14, speex32, silk24, and silk12 although those are (ultra) wide-band audio codecs. With this change, the distance in sample-rates is taken into account. Now on the Command-Line interface (CLI) 'core show channels', you should see: (slin@16000)->(slin@32000)->(speex@32000). ASTERISK-23735 Reported by: Richard Kenner Change-Id: I9448295c1978be26f8633b6066395e7bbbe2e213
Diffstat (limited to 'main')
-rw-r--r--main/translate.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/main/translate.c b/main/translate.c
index e1a7d9f41..d12090949 100644
--- a/main/translate.c
+++ b/main/translate.c
@@ -34,6 +34,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include <sys/time.h>
#include <sys/resource.h>
#include <math.h>
+#include <stdlib.h>
#include "asterisk/lock.h"
#include "asterisk/channel.h"
@@ -1381,6 +1382,20 @@ int ast_translator_best_choice(struct ast_format_cap *dst_cap,
ao2_replace(bestdst, dst);
besttablecost = matrix_get(x, y)->table_cost;
beststeps = matrix_get(x, y)->multistep;
+ } else if (matrix_get(x, y)->table_cost == besttablecost
+ && matrix_get(x, y)->multistep == beststeps) {
+ int gap_selected = abs(ast_format_get_sample_rate(best)
+ - ast_format_get_sample_rate(bestdst));
+ int gap_current = abs(ast_format_get_sample_rate(src)
+ - ast_format_get_sample_rate(dst));
+
+ if (gap_current < gap_selected) {
+ /* better than what we have so far */
+ ao2_replace(best, src);
+ ao2_replace(bestdst, dst);
+ besttablecost = matrix_get(x, y)->table_cost;
+ beststeps = matrix_get(x, y)->multistep;
+ }
}
}
}