changeset 546:b26df31124a4

frtest: new program gsmfr-tfo-xfrm
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 04 Oct 2024 19:07:52 +0000
parents b07dba7b8a4f
children f9535c1fbf70
files .hgignore frtest/Makefile frtest/tfo-xfrm.c
diffstat 3 files changed, 84 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/.hgignore	Thu Oct 03 09:26:04 2024 +0000
+++ b/.hgignore	Fri Oct 04 19:07:52 2024 +0000
@@ -73,6 +73,7 @@
 ^frtest/gsmfr-encode$
 ^frtest/gsmfr-encode-r$
 ^frtest/gsmfr-preproc$
+^frtest/gsmfr-tfo-xfrm$
 
 ^hrutil/gsmhr-cod-parse$
 ^hrutil/gsmhr-dec-craft$
--- a/frtest/Makefile	Thu Oct 03 09:26:04 2024 +0000
+++ b/frtest/Makefile	Fri Oct 04 19:07:52 2024 +0000
@@ -1,6 +1,7 @@
 PROGS=	gsmfr-cod2std gsmfr-decode gsmfr-decode-r gsmfr-decode-rb \
 	gsmfr-decode-tw5 gsmfr-decode-tw5-r gsmfr-dlcap-gsmx gsmfr-dlcap-parse \
-	gsmfr-dlcap-sync gsmfr-encode gsmfr-encode-r gsmfr-preproc
+	gsmfr-dlcap-sync gsmfr-encode gsmfr-encode-r gsmfr-preproc \
+	gsmfr-tfo-xfrm
 LIBFR2=	../libgsmfr2/libgsmfr2.a
 LIBTEST=../libtest/libtest.a
 
@@ -45,6 +46,9 @@
 gsmfr-preproc:	preproc.o ${LIBTEST} ${LIBFR2}
 	${CC} ${CFLAGS} -o $@ $^
 
+gsmfr-tfo-xfrm:	tfo-xfrm.o ${LIBTEST} ${LIBFR2}
+	${CC} ${CFLAGS} -o $@ $^
+
 install:
 	mkdir -p ${DESTDIR}${bindir}
 	install -c ${PROGS} ${DESTDIR}${bindir}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/frtest/tfo-xfrm.c	Fri Oct 04 19:07:52 2024 +0000
@@ -0,0 +1,78 @@
+/*
+ * This program exercises our ThemWi implementation of TFO transform for
+ * GSM-FR.  It reads a stream of radio leg A Rx frames from a TW-TS-005 Annex A
+ * hex file and writes the "pristine" stream intended for radio leg B Tx
+ * into another TW-TS-005 Annex A hex file.  The output is in basic RTP format.
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include "../libgsmfr2/tw_gsmfr.h"
+#include "../libtest/tw5reader.h"
+#include "../libtest/tw5writer.h"
+
+main(argc, argv)
+	char **argv;
+{
+	char *infname, *outfname;
+	FILE *inf, *outf;
+	unsigned lineno;
+	struct gsmfr_preproc_state *pp_state;
+	uint8_t frame_in[TWTS005_MAX_FRAME], frame_out[GSMFR_RTP_FRAME_LEN];
+	unsigned frame_in_len;
+	int dtxd, rc;
+
+	if (argc == 3 && argv[1][0] != '-') {
+		dtxd = 0;
+		infname = argv[1];
+		outfname = argv[2];
+	} else if (argc == 4 && !strcmp(argv[1], "-d")) {
+		dtxd = 1;
+		infname = argv[2];
+		outfname = argv[3];
+	} else {
+		fprintf(stderr, "usage: %s [-d] input.hex output.hex\n",
+			argv[0]);
+		exit(1);
+	}
+	inf = fopen(infname, "r");
+	if (!inf) {
+		perror(infname);
+		exit(1);
+	}
+	lineno = 0;
+	outf = fopen(outfname, "w");
+	if (!outf) {
+		perror(outfname);
+		exit(1);
+	}
+	pp_state = gsmfr_preproc_create();
+	if (!pp_state) {
+		fprintf(stderr, "gsmfr_preproc_create() failed!\n");
+		exit(1);
+	}
+	for (;;) {
+		rc = twts005_read_frame(inf, &lineno, frame_in, &frame_in_len);
+		if (rc < 0) {
+			fprintf(stderr, "%s line %u: not valid TW-TS-005\n",
+				argv[1], lineno);
+			exit(1);
+		}
+		if (!rc)
+			break;
+		rc = gsmfr_tfo_xfrm_main(pp_state, frame_in, frame_in_len,
+					 frame_out);
+		if (rc < 0) {
+			fprintf(stderr,
+				"%s line %u: not a valid GSM-FR frame\n",
+				argv[1], lineno);
+			exit(1);
+		}
+		if (dtxd)
+			gsmfr_tfo_xfrm_dtxd(pp_state, frame_out);
+		emit_hex_frame(outf, frame_out, GSMFR_RTP_FRAME_LEN);
+	}
+	fclose(outf);
+	exit(0);
+}