FreeCalypso > hg > gsm-codec-lib
view efrtest/rec2etsi.c @ 128:a5ffec18e4cd
test programs: use printf %d format for codec parameters
Even though all codec params (both FR and EFR) are small unsigned integers,
we use signed int16_t data type for both, for interface reasons: in the
case of FR it's the gsm_signal type of libgsm, and in the case of EFR
it's the Word16 type of ETSI codec guts. Therefore, the correct printf
format is %d, not %u, when the objective is to see what's in the variables
(what the compiler sees) and catch any bugs.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 11 Dec 2022 04:00:13 +0000 |
parents | bd832a456339 |
children |
line wrap: on
line source
/* * 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.gsmx 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); }