changeset 245:6de564ef70d3

frtest: new program gsmfr-cod2std
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 09 May 2023 22:32:48 +0000
parents fcc0887ff0d0
children a55fcc8b6daf
files .hgignore frtest/Makefile frtest/cod2std.c
diffstat 3 files changed, 94 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/.hgignore	Tue May 09 17:28:19 2023 +0000
+++ b/.hgignore	Tue May 09 22:32:48 2023 +0000
@@ -43,6 +43,7 @@
 ^efrtest/gsmefr-etsi-enc$
 ^efrtest/gsmefr-rec2etsi$
 
+^frtest/gsmfr-cod2std$
 ^frtest/gsmfr-decode$
 ^frtest/gsmfr-decode-r$
 ^frtest/gsmfr-dlcap-gsmx$
--- a/frtest/Makefile	Tue May 09 17:28:19 2023 +0000
+++ b/frtest/Makefile	Tue May 09 22:32:48 2023 +0000
@@ -1,7 +1,8 @@
 CC=	gcc
 CFLAGS=	-O2
-PROGS=	gsmfr-decode gsmfr-decode-r gsmfr-dlcap-gsmx gsmfr-dlcap-parse \
-	gsmfr-encode gsmfr-encode-r gsmfr-hand-test gsmfr-max-out gsmfr-preproc
+PROGS=	gsmfr-cod2std gsmfr-decode gsmfr-decode-r gsmfr-dlcap-gsmx \
+	gsmfr-dlcap-parse gsmfr-encode gsmfr-encode-r gsmfr-hand-test \
+	gsmfr-max-out gsmfr-preproc
 LIBPP=	../libgsmfrp/libgsmfrp.a
 LIBTEST=../libtest/libtest.a
 LIBDEC=	${LIBTEST} ${LIBPP}
@@ -9,6 +10,9 @@
 
 all:	${PROGS}
 
+gsmfr-cod2std:	cod2std.o
+	${CC} ${CFLAGS} -o $@ cod2std.o -lgsm
+
 gsmfr-decode:	decode.o ${LIBDEC}
 	${CC} ${CFLAGS} -o $@ decode.o ${LIBDEC} -lgsm
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frtest/cod2std.c	Tue May 09 22:32:48 2023 +0000
@@ -0,0 +1,87 @@
+/*
+ * This program reads an FR codec parameters file in ETSI *.cod test sequence
+ * format and converts it into classic libgsm format.
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <gsm.h>
+
+static void
+bytes_to_params(bytes, params, big_endian)
+	uint8_t *bytes;
+	gsm_signal *params;
+{
+	uint8_t *sp;
+	unsigned n;
+	uint16_t val;
+
+	sp = bytes;
+	for (n = 0; n < 76; n++) {
+		if (big_endian)
+			val = ((uint16_t) sp[0] << 8) | ((uint16_t) sp[1]);
+		else
+			val = ((uint16_t) sp[1] << 8) | ((uint16_t) sp[0]);
+		params[n] = val;
+		sp += 2;
+	}
+}
+
+main(argc, argv)
+	char **argv;
+{
+	char *infname, *outfname;
+	FILE *inf, *outf;
+	gsm dummy_state;
+	int big_endian;
+	unsigned frame_no;
+	uint8_t input_bytes[76*2], frame[33];
+	gsm_signal params[76];
+	int cc;
+
+	if (argc == 3 && argv[1][0] != '-') {
+		big_endian = 0;
+		infname = argv[1];
+		outfname = argv[2];
+	} else if (argc == 4 && !strcmp(argv[1], "-b")) {
+		big_endian = 1;
+		infname = argv[2];
+		outfname = argv[3];
+	} else {
+		fprintf(stderr, "usage: %s [-b] input.cod output.gsm\n",
+			argv[0]);
+		exit(1);
+	}
+	inf = fopen(infname, "r");
+	if (!inf) {
+		perror(infname);
+		exit(1);
+	}
+	outf = fopen(outfname, "w");
+	if (!outf) {
+		perror(outfname);
+		exit(1);
+	}
+	dummy_state = gsm_create();
+	if (!dummy_state) {
+		fprintf(stderr, "gsm_create() failed!\n");
+		exit(1);
+	}
+	for (frame_no = 0; ; frame_no++) {
+		cc = fread(input_bytes, 2, 76, inf);
+		if (cc == 0)
+			break;
+		if (cc != 76) {
+			fprintf(stderr, "error: short read from %s\n", infname);
+			exit(1);
+		}
+		bytes_to_params(input_bytes, params, big_endian);
+		gsm_implode(dummy_state, params, frame);
+		fwrite(frame, 1, sizeof frame, outf);
+	}
+	fclose(outf);
+	exit(0);
+}