changeset 150:da17c7f02c6c

gsmefr-etsi-dec: add BE support
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 14 Dec 2022 22:04:39 +0000
parents 95d47a34070a
children a13b1605142b
files efrtest/etsi-dec.c
diffstat 1 files changed, 47 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/efrtest/etsi-dec.c	Wed Dec 14 18:12:55 2022 +0000
+++ b/efrtest/etsi-dec.c	Wed Dec 14 22:04:39 2022 +0000
@@ -4,8 +4,8 @@
  * as output, allowing our decoder to be tested with ETSI's official test
  * sequences.
  *
- * ETSI input and output files are read and written in LE byte order,
- * matching the official test sequences in ts_100725v050200p0.zip.
+ * ETSI input and output files are read and written in LE byte order
+ * by default, or in BE byte order if -b option is given.
  */
 
 #include <stdio.h>
@@ -17,6 +17,24 @@
 #include "etsi.h"
 
 static void
+write_pcm_be(outf, pcm)
+	FILE *outf;
+	int16_t *pcm;
+{
+	uint8_t bytes[320], *dp;
+	int16_t samp;
+	unsigned n;
+
+	dp = bytes;
+	for (n = 0; n < 160; n++) {
+		samp = pcm[n];
+		*dp++ = (samp >> 8) & 0xFF;
+		*dp++ = samp & 0xFF;
+	}
+	fwrite(bytes, 2, 160, outf);
+}
+
+static void
 write_pcm_le(outf, pcm)
 	FILE *outf;
 	int16_t *pcm;
@@ -37,6 +55,8 @@
 main(argc, argv)
 	char **argv;
 {
+	int big_endian;
+	char *infname, *outfname;
 	FILE *inf, *outf;
 	struct EFR_decoder_state *state;
 	unsigned frame_no;
@@ -44,18 +64,27 @@
 	int16_t pcm[160];
 	int rc;
 
-	if (argc != 3) {
-		fprintf(stderr, "usage: %s input.dec output.out\n", argv[0]);
+	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.dec output.out\n",
+			argv[0]);
 		exit(1);
 	}
-	inf = fopen(argv[1], "r");
+	inf = fopen(infname, "r");
 	if (!inf) {
-		perror(argv[1]);
+		perror(infname);
 		exit(1);
 	}
-	outf = fopen(argv[2], "w");
+	outf = fopen(outfname, "w");
 	if (!outf) {
-		perror(argv[2]);
+		perror(outfname);
 		exit(1);
 	}
 	state = EFR_decoder_create();
@@ -64,24 +93,24 @@
 		exit(1);
 	}
 	for (frame_no = 0; ; frame_no++) {
-		rc = read_etsi_bits(inf, 0, input_bits, ETSI_DEC_NWORDS,
-				    argv[1]);
+		rc = read_etsi_bits(inf, big_endian, input_bits,
+				    ETSI_DEC_NWORDS, infname);
 		if (!rc)
 			break;
 		if (input_bits[0] > 1) {
 			fprintf(stderr, "error in %s frame #%u: BFI > 1\n",
-				argv[1], frame_no);
+				infname, frame_no);
 			exit(1);
 		}
-		bits2frame(input_bits + 1, frame, argv[1], frame_no);
+		bits2frame(input_bits + 1, frame, infname, frame_no);
 		if (input_bits[245] > 2) {
 			fprintf(stderr, "error in %s frame #%u: SID > 2\n",
-				argv[1], frame_no);
+				infname, frame_no);
 			exit(1);
 		}
 		if (input_bits[246] > 1) {
 			fprintf(stderr, "error in %s frame #%u: TAF > 1\n",
-				argv[1], frame_no);
+				infname, frame_no);
 			exit(1);
 		}
 		rc = EFR_sid_classify(frame);
@@ -92,7 +121,10 @@
 		}
 		EFR_decode_frame(state, frame, input_bits[0], input_bits[246],
 				 pcm);
-		write_pcm_le(outf, pcm);
+		if (big_endian)
+			write_pcm_be(outf, pcm);
+		else
+			write_pcm_le(outf, pcm);
 	}
 	fclose(outf);
 	exit(0);