FreeCalypso > hg > gsm-codec-lib
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);