--- asterisk-1.6.0-beta9/build_tools/embed_modules.xml 2007-12-17 09:25:35.000000000 +0200
+++ asterisk-1.6.0-beta9-AMR//build_tools/embed_modules.xml 2008-06-29 05:10:32.000000000 +0300
@@ -8,7 +8,7 @@
gnu_ld
-
+
gnu_ld
--- asterisk-1.6.0-beta9/include/asterisk/frame.h 2008-04-17 19:48:47.000000000 +0300
+++ asterisk-1.6.0-beta9-AMR//include/asterisk/frame.h 2008-06-29 05:12:10.000000000 +0300
@@ -255,6 +255,8 @@
#define AST_FORMAT_G726 (1 << 11)
/*! G.722 */
#define AST_FORMAT_G722 (1 << 12)
+/*! AMR-NB */
+#define AST_FORMAT_AMRNB (1 << 13)
/*! Raw 16-bit Signed Linear (16000 Hz) PCM */
#define AST_FORMAT_SLINEAR16 (1 << 15)
/*! Maximum audio mask */
--- asterisk-1.6.0-beta9/main/channel.c 2008-05-14 02:58:34.000000000 +0300
+++ asterisk-1.6.0-beta9-AMR//main/channel.c 2008-06-29 05:13:34.000000000 +0300
@@ -727,6 +727,8 @@
/*! Okay, we're down to vocoders now, so pick GSM because it's small and easier to
translate and sounds pretty good */
AST_FORMAT_GSM,
+ /*! AMR */
+ AST_FORMAT_AMRNB,
/*! iLBC is not too bad */
AST_FORMAT_ILBC,
/*! Speex is free, but computationally more expensive than GSM */
--- asterisk-1.6.0-beta9/main/translate.c 2008-03-18 17:58:50.000000000 +0200
+++ asterisk-1.6.0-beta9-AMR//main/translate.c 2008-06-29 05:14:41.000000000 +0300
@@ -510,7 +510,7 @@
static char *handle_cli_core_show_translation(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
-#define SHOW_TRANS 16
+#define SHOW_TRANS 17
int x, y, z;
int curlen = 0, longest = 0;
--- asterisk-1.6.0-beta9/main/rtp.c 2008-04-14 16:54:25.000000000 +0300
+++ asterisk-1.6.0-beta9-AMR//main/rtp.c 2008-06-29 05:16:15.000000000 +0300
@@ -1664,6 +1664,7 @@
{{1, AST_FORMAT_ILBC}, "audio", "iLBC"},
{{1, AST_FORMAT_G722}, "audio", "G722"},
{{1, AST_FORMAT_G726_AAL2}, "audio", "AAL2-G726-32"},
+ {{1, AST_FORMAT_AMRNB}, "audio", "AMR"},
{{0, AST_RTP_DTMF}, "audio", "telephone-event"},
{{0, AST_RTP_CISCO_DTMF}, "audio", "cisco-telephone-event"},
{{0, AST_RTP_CN}, "audio", "CN"},
@@ -1711,6 +1712,7 @@
[34] = {1, AST_FORMAT_H263},
[97] = {1, AST_FORMAT_ILBC},
[98] = {1, AST_FORMAT_H263_PLUS},
+ [96] = {1, AST_FORMAT_AMRNB},
[99] = {1, AST_FORMAT_H264},
[101] = {0, AST_RTP_DTMF},
[102] = {1, AST_FORMAT_T140}, /* Real time text chat */
--- asterisk-1.6.0-beta9/main/frame.c 2008-04-17 19:48:47.000000000 +0300
+++ asterisk-1.6.0-beta9-AMR//main/frame.c 2008-06-29 05:26:36.000000000 +0300
@@ -112,6 +112,7 @@
{ AST_FORMAT_ILBC, "ilbc", 8000, "iLBC", 50, 30, 30, 30, 30 }, /*!< codec_ilbc.c */ /* inc=30ms - workaround */
{ AST_FORMAT_G726_AAL2, "g726aal2", 8000, "G.726 AAL2", 40, 10, 300, 10, 20 }, /*!< codec_g726.c */
{ AST_FORMAT_G722, "g722", 16000, "G722", 80, 10, 150, 10, 20 }, /*!< codec_g722.c */
+ { AST_FORMAT_AMRNB, "amr", 8000, "AMR NB", 32, 20, 300, 0, 20 }, /*!< codec_amr.c */
{ AST_FORMAT_SLINEAR16, "slin16", 16000, "16 bit Signed Linear PCM (16kHz)", 320, 10, 70, 10, 20 }, /*!< Signed linear (16kHz) */
{ AST_FORMAT_JPEG, "jpeg", 0, "JPEG image"}, /*!< See format_jpeg.c */
{ AST_FORMAT_PNG, "png", 0, "PNG image"}, /*!< PNG Image format */
@@ -626,7 +627,7 @@
ast_cli(a->fd, "--------------------------------------------------------------------------------\n");
if ((a->argc == 3) || (!strcasecmp(a->argv[3],"audio"))) {
found = 1;
- for (i=0;i<13;i++) {
+ for (i=0;i<14;i++) {
snprintf(hex,25,"(0x%x)",1<fd, "%11u (1 << %2d) %10s audio %8s (%s)\n",1 << i,i,hex,ast_getformatname(1< 0) {
+ unsigned dec_mode = (data[0]>>3) & 0x000f;
+ unsigned psize = block_size[dec_mode];
+
+ if (psize)
+ samples += 160;
+
+ if ( !(data[0]>>7) ) {
+ /* this was the last ToC entry */
+ break;
+ }
+
+ data++; /* Skip over the block. */
+ datalen --;
+ /* ast_verbose("Got AMR frame size %d inside ast_frame\n", psize); */
+ }
+ /* todo: how can we signal an error while decoding the frame structure? */
+ return samples;
+}
+
+
int ast_codec_get_samples(struct ast_frame *f)
{
int samples=0;
@@ -1436,6 +1468,9 @@
case AST_FORMAT_G726_AAL2:
samples = f->datalen * 2;
break;
+ case AST_FORMAT_AMRNB:
+ samples = amr_samples(f->data, f->datalen);
+ break;
default:
ast_log(LOG_WARNING, "Unable to calculate samples for format %s\n", ast_getformatname(f->subclass));
}
--- asterisk-1.6.0-beta9/codecs/Makefile 2008-03-26 19:15:06.000000000 +0200
+++ asterisk-1.6.0-beta9-AMR//codecs/Makefile 2008-06-29 05:30:52.000000000 +0300
@@ -20,6 +20,7 @@
LIBILBC:=ilbc/libilbc.a
LIBLPC10:=lpc10/liblpc10.a
LIBG722:=g722/libg722.a
+LIBAMR:=amr/libamr.a
all: _all
@@ -35,6 +36,7 @@
$(MAKE) -C lpc10 clean
$(MAKE) -C ilbc clean
$(MAKE) -C g722 clean
+ $(MAKE) -C amr clean
gsm/lib/libgsm.a:
@mkdir -p gsm/lib
@@ -50,6 +52,12 @@
$(if $(filter codec_ilbc,$(EMBEDDED_MODS)),modules.link,codec_ilbc.so): $(LIBILBC)
+$(LIBAMR):
+ @$(MAKE) -C amr all
+
+$(if $(filter codec_amr,$(EMBEDDED_MODS)),modules.link,codec_amr.so): $(LIBAMR)
+
+
FORCE:
$(LIBG722): FORCE