changeset 438:1bf1bbcef763

amrefr: implement amrefr-encode-r utility
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 08 May 2024 23:43:26 +0000
parents 3eadaef8b28f
children 65d20172e92a
files .hgignore Makefile amrefr/Makefile amrefr/encode-r.c
diffstat 4 files changed, 64 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/.hgignore	Wed May 08 23:03:28 2024 +0000
+++ b/.hgignore	Wed May 08 23:43:26 2024 +0000
@@ -9,6 +9,7 @@
 ^amrconv/gsm-amr2efr$
 ^amrconv/gsm-efr2amr$
 
+^amrefr/amrefr-encode-r$
 ^amrefr/amrefr-tseq-dec$
 ^amrefr/amrefr-tseq-enc$
 
--- a/Makefile	Wed May 08 23:03:28 2024 +0000
+++ b/Makefile	Wed May 08 23:43:26 2024 +0000
@@ -10,7 +10,7 @@
 all:	${SUBDIR}
 
 amrconv:	libtest
-amrefr:		libgsmefr libtwamr
+amrefr:		libgsmefr libtest libtwamr
 amrtest:	libtwamr
 efrtest:	libgsmefr libtest
 frtest:		libgsmfr2 libtest
--- a/amrefr/Makefile	Wed May 08 23:03:28 2024 +0000
+++ b/amrefr/Makefile	Wed May 08 23:43:26 2024 +0000
@@ -1,13 +1,18 @@
 CC=	gcc
 CFLAGS=	-O2
-PROGS=	amrefr-tseq-dec amrefr-tseq-enc
+PROGS=	amrefr-encode-r amrefr-tseq-dec amrefr-tseq-enc
 LIBEFR=	../libgsmefr/libgsmefr.a
 LIBAMR=	../libtwamr/libtwamr.a
+LIBTEST=../libtest/libtest.a
 LIBS=	${LIBEFR} ${LIBAMR}
+LIBST=	${LIBEFR} ${LIBAMR} ${LIBTEST}
 INSTBIN=/opt/freecalypso/bin
 
 all:	${PROGS}
 
+amrefr-encode-r:	encode-r.o ${LIBST}
+	${CC} ${CFLAGS} -o $@ $^
+
 amrefr-tseq-dec:	tseq-dec.o tseq-bit-rd.o tseq-pcm-out.o ${LIBS}
 	${CC} ${CFLAGS} -o $@ $^
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/amrefr/encode-r.c	Wed May 08 23:43:26 2024 +0000
@@ -0,0 +1,56 @@
+/*
+ * amrefr-encode-r is a counterpart to gsmefr-encode-r, implementing
+ * "alternative EFR" by way of libtwamr.  Unlike standard gsmefr-encode-r,
+ * there is no -d option and no DTX support in this version.
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include "../libgsmefr/gsm_efr.h"
+#include "../libtwamr/tw_amr.h"
+#include "../libtest/roberead.h"
+
+main(argc, argv)
+	char **argv;
+{
+	FILE *inf, *binf;
+	struct amr_encoder_state *state;
+	int16_t pcm[160];
+	struct amr_param_frame amr_frame;
+	uint8_t efr_frame[EFR_RTP_FRAME_LEN];
+	int rc;
+
+	if (argc != 3) {
+		fprintf(stderr, "usage: %s input.robe output.gsmx\n", argv[0]);
+		exit(1);
+	}
+	inf = fopen(argv[1], "r");
+	if (!inf) {
+		perror(argv[1]);
+		exit(1);
+	}
+	binf = fopen(argv[2], "w");
+	if (!binf) {
+		perror(argv[2]);
+		exit(1);
+	}
+	state = amr_encoder_create(0, 0);
+	if (!state) {
+		perror("amr_encoder_create()");
+		exit(1);
+	}
+	for (;;) {
+		rc = robe_get_pcm_block(inf, pcm);
+		if (!rc)
+			break;
+		amr_encode_frame(state, MR122, pcm, &amr_frame);
+		amr_dhf_subst_efr(&amr_frame);
+		EFR_params2frame(amr_frame.param, efr_frame);
+		fwrite(efr_frame, 1, sizeof efr_frame, binf);
+	}
+	fclose(binf);
+	exit(0);
+}