diff frtest/cod2std.c @ 245:6de564ef70d3

frtest: new program gsmfr-cod2std
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 09 May 2023 22:32:48 +0000
parents
children 25649b3a83e9
line wrap: on
line diff
--- /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);
+}