FreeCalypso > hg > gsm-codec-lib
diff efrtest/rec2etsi.c @ 47:89945a3b576e
gsmefr-rec2etsi test program added
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 25 Nov 2022 04:01:13 +0000 |
parents | |
children | bd832a456339 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/efrtest/rec2etsi.c Fri Nov 25 04:01:13 2022 +0000 @@ -0,0 +1,85 @@ +/* + * This program reads in an EFR session recording in our binary format + * (presumably obtained by converting from an RTP capture on the network + * side or from a Calypso DSP readout on the mobile side) and converts + * it into ETSI *.dec format, to be fed to ETSI decoder test program. + * + * The output from this program is in the local machine's native byte order. + */ + +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include <string.h> +#include <strings.h> +#include "../libgsmefr/gsm_efr.h" +#include "../libtest/binreader.h" + +static void +frame2bits(frame, bits) + uint8_t *frame; + uint16_t *bits; +{ + unsigned nb, byte, mask, bit; + + for (nb = 0; nb < 31; nb++) { + byte = *frame++; + for (mask = 0x80; mask; mask >>= 1) { + if (byte & mask) + bit = 1; + else + bit = 0; + *bits++ = bit; + } + } +} + +main(argc, argv) + char **argv; +{ + FILE *binf, *outf; + uint8_t frame[BINFILE_MAX_FRAME]; + uint16_t bits[250]; + int rc; + + if (argc != 3) { + fprintf(stderr, "usage: %s input.rec output.dec\n", argv[0]); + exit(1); + } + binf = fopen(argv[1], "r"); + if (!binf) { + perror(argv[1]); + exit(1); + } + outf = fopen(argv[2], "w"); + if (!outf) { + perror(argv[2]); + exit(1); + } + for (;;) { + rc = binfile_read_frame(binf, frame); + if (rc < 0) { + fprintf(stderr, "error: garbage in %s\n", argv[1]); + exit(1); + } + if (!rc) + break; + if (frame[0] == 0xBF) { + bits[3] = 1; /* BFI */ + bzero(bits + 4, 245 * 2); + bits[249] = frame[1] & 1; /* TAF */ + } else if ((frame[0] & 0xF0) == 0xC0) { + frame2bits(frame, bits); + bits[248] = EFR_sid_classify(frame); + bits[249] = 0; /* TAF */ + } else { + fprintf(stderr, + "error: %s is not in EFR codec format\n", + argv[1]); + exit(1); + } + fwrite(bits + 3, 2, 247, outf); + } + fclose(outf); + exit(0); +}