FreeCalypso > hg > gsm-codec-lib
view efrtest/dec-parse.c @ 131:615f144b52c6
gsmefr-dec-parse utility written
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 11 Dec 2022 04:31:17 +0000 |
parents | efrtest/cod-parse.c@a5ffec18e4cd |
children | 0fa0cd251a31 |
line wrap: on
line source
/* * This program reads an EFR *.dec file in ETSI test sequence format * (test input to the decoder) and converts it into human-readable format, * similar to what one would get from our gsmrec-dump utility. */ #include <stdio.h> #include <stdint.h> #include <stdlib.h> #include <string.h> #include <strings.h> #include "../libgsmefr/gsm_efr.h" #define ETSI_DEC_NWORDS 247 static int read_input(inf, bitvec, filename_for_errs) FILE *inf; uint8_t *bitvec; char *filename_for_errs; { uint8_t file_bytes[ETSI_DEC_NWORDS * 2], *sp; int cc; unsigned n; cc = fread(file_bytes, 2, ETSI_DEC_NWORDS, inf); if (cc == 0) return 0; if (cc != ETSI_DEC_NWORDS) { fprintf(stderr, "error: short read from %s\n", filename_for_errs); exit(1); } sp = file_bytes; for (n = 0; n < ETSI_DEC_NWORDS; n++) { if (sp[1]) { fprintf(stderr, "error in %s: non-zero in what should be LE upper byte\n", filename_for_errs); exit(1); } bitvec[n] = sp[0]; sp += 2; } return 1; } static void bits2frame(input_bits, frame, filename_for_errs, frame_no) uint8_t *input_bits, *frame; char *filename_for_errs; unsigned frame_no; { uint8_t bits[248], *sp, *dp; unsigned nb, byte, mask; bits[0] = 1; bits[1] = 1; bits[2] = 0; bits[3] = 0; bcopy(input_bits, bits + 4, 244); sp = bits; dp = frame; for (nb = 0; nb < EFR_RTP_FRAME_LEN; nb++) { byte = 0; for (mask = 0x80; mask; mask >>= 1) { if (*sp > 1) { fprintf(stderr, "error in %s frame #%u: data bit > 1\n", filename_for_errs, frame_no); exit(1); } if (*sp) byte |= mask; sp++; } *dp++ = byte; } } main(argc, argv) char **argv; { FILE *inf; unsigned frame_no; uint8_t input_bits[ETSI_DEC_NWORDS], frame[EFR_RTP_FRAME_LEN]; int16_t params[EFR_NUM_PARAMS]; int rc, i, j, n; if (argc != 2) { fprintf(stderr, "usage: %s file.dec\n", argv[0]); exit(1); } inf = fopen(argv[1], "r"); if (!inf) { perror(argv[1]); exit(1); } for (frame_no = 0; ; frame_no++) { rc = read_input(inf, input_bits, argv[1]); if (!rc) break; bits2frame(input_bits + 1, frame, argv[1], frame_no); printf("#%u: BFI=%u SID=%u TAF=%u LPC", frame_no, input_bits[0], input_bits[245], input_bits[246]); EFR_frame2params(frame, params); n = 0; for (i = 0; i < 5; i++) printf(" %d", params[n++]); putchar('\n'); for (i = 0; i < 4; i++) { putchar(' '); for (j = 0; j < 13; j++) printf(" %d", params[n++]); putchar('\n'); } } }