changeset 47:89945a3b576e

gsmefr-rec2etsi test program added
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 25 Nov 2022 04:01:13 +0000
parents edd2e20e7090
children af4b075d0313
files .hgignore Makefile efrtest/Makefile efrtest/rec2etsi.c
diffstat 4 files changed, 107 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/.hgignore	Fri Nov 25 03:06:03 2022 +0000
+++ b/.hgignore	Fri Nov 25 04:01:13 2022 +0000
@@ -9,6 +9,8 @@
 ^dev/gsm0611-silence-fr$
 ^dev/gsm0611-silence-fr\.out$
 
+^efrtest/gsmefr-rec2etsi$
+
 ^frtest/gsmfr-cvt-dlcap$
 ^frtest/gsmfr-decode$
 ^frtest/gsmfr-encode$
--- a/Makefile	Fri Nov 25 03:06:03 2022 +0000
+++ b/Makefile	Fri Nov 25 04:01:13 2022 +0000
@@ -2,13 +2,14 @@
 CFLAGS=	-O2
 
 SUBDIR_LIBPROD=	libgsmefr libgsmfrp
-SUBDIR_UTILS=	frtest miscutil pcap
+SUBDIR_UTILS=	efrtest frtest miscutil pcap
 SUBDIR_INT=	dev libtest
 
 SUBDIR=	${SUBDIR_LIBPROD} ${SUBDIR_UTILS} ${SUBDIR_INT}
 
 all:	${SUBDIR}
 
+efrtest:	libgsmefr libtest
 frtest:		libgsmfrp libtest
 miscutil:	libgsmefr libtest
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/efrtest/Makefile	Fri Nov 25 04:01:13 2022 +0000
@@ -0,0 +1,18 @@
+CC=	gcc
+CFLAGS=	-O2
+PROGS=	gsmefr-rec2etsi
+LIBEFR=	../libgsmefr/libgsmefr.a
+LIBTEST=../libtest/libtest.a
+INSTBIN=/opt/freecalypso/bin
+
+all:	${PROGS}
+
+gsmefr-rec2etsi:	rec2etsi.o ${LIBTEST} ${LIBEFR}
+	${CC} ${CFLAGS} -o $@ rec2etsi.o ${LIBTEST} ${LIBEFR}
+
+install:
+	mkdir -p ${INSTBIN}
+	install -c ${PROGS} ${INSTBIN}
+
+clean:
+	rm -f *.o *.out ${PROGS}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/efrtest/rec2etsi.c	Fri Nov 25 04:01:13 2022 +0000
@@ -0,0 +1,85 @@
+/*
+ * This program reads in an EFR session recording in our binary format
+ * (presumably obtained by converting from an RTP capture on the network
+ * side or from a Calypso DSP readout on the mobile side) and converts
+ * it into ETSI *.dec format, to be fed to ETSI decoder test program.
+ *
+ * The output from this program is in the local machine's native byte order.
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include "../libgsmefr/gsm_efr.h"
+#include "../libtest/binreader.h"
+
+static void
+frame2bits(frame, bits)
+	uint8_t *frame;
+	uint16_t *bits;
+{
+	unsigned nb, byte, mask, bit;
+
+	for (nb = 0; nb < 31; nb++) {
+		byte = *frame++;
+		for (mask = 0x80; mask; mask >>= 1) {
+			if (byte & mask)
+				bit = 1;
+			else
+				bit = 0;
+			*bits++ = bit;
+		}
+	}
+}
+
+main(argc, argv)
+	char **argv;
+{
+	FILE *binf, *outf;
+	uint8_t frame[BINFILE_MAX_FRAME];
+	uint16_t bits[250];
+	int rc;
+
+	if (argc != 3) {
+		fprintf(stderr, "usage: %s input.rec output.dec\n", argv[0]);
+		exit(1);
+	}
+	binf = fopen(argv[1], "r");
+	if (!binf) {
+		perror(argv[1]);
+		exit(1);
+	}
+	outf = fopen(argv[2], "w");
+	if (!outf) {
+		perror(argv[2]);
+		exit(1);
+	}
+	for (;;) {
+		rc = binfile_read_frame(binf, frame);
+		if (rc < 0) {
+			fprintf(stderr, "error: garbage in %s\n", argv[1]);
+			exit(1);
+		}
+		if (!rc)
+			break;
+		if (frame[0] == 0xBF) {
+			bits[3] = 1;			/* BFI */
+			bzero(bits + 4, 245 * 2);
+			bits[249] = frame[1] & 1;	/* TAF */
+		} else if ((frame[0] & 0xF0) == 0xC0) {
+			frame2bits(frame, bits);
+			bits[248] = EFR_sid_classify(frame);
+			bits[249] = 0;			/* TAF */
+		} else {
+			fprintf(stderr,
+				"error: %s is not in EFR codec format\n",
+				argv[1]);
+			exit(1);
+		}
+		fwrite(bits + 3, 2, 247, outf);
+	}
+	fclose(outf);
+	exit(0);
+}