diff frtest/tfo-xfrm.c @ 546:b26df31124a4

frtest: new program gsmfr-tfo-xfrm
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 04 Oct 2024 19:07:52 +0000
parents
children
line wrap: on
line diff
--- /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);
+}