FreeCalypso > hg > gsm-codec-lib
view amrefr/tseq-dec.c @ 467:ad032051166a
doc: AMR-EFR-hybrid-emu new article
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 12 May 2024 23:54:43 +0000 |
parents | 3eadaef8b28f |
children |
line wrap: on
line source
/* * amrefr-tseq-dec is a test program for our libtwamr-based "alternative EFR" * decoder: it functions just like gsmefr-etsi-dec, but uses libtwamr as * the decoder engine instead of libgsmefr. Libgsmefr functions are still * used for frame unpacking, but not for actual decoding. Note that there is * no DTX support in this version, and the *.dec test sequence being decoded * must have SID=0 in every frame. As a simplification, we also require BFI=0: * while it is possible to feed BFI=1 frames to libtwamr decoder (convert to * RX_SPEECH_BAD), such support is not needed for decoding the test sequences * in amr122_efr.zip, hence we've omitted it for simplicity. * * The byte order is LE by default or BE with -b option. */ #include <stdio.h> #include <stdint.h> #include <stdlib.h> #include <string.h> #include <strings.h> #include "../libgsmefr/gsm_efr.h" #include "../libtwamr/tw_amr.h" #include "../efrtest/etsi.h" main(argc, argv) char **argv; { int big_endian; char *infname, *outfname; FILE *inf, *outf; struct amr_decoder_state *state; unsigned frame_no; uint8_t input_bits[ETSI_DEC_NWORDS], efr_frame[EFR_RTP_FRAME_LEN]; struct amr_param_frame amr_frame; int16_t pcm[160]; int rc; 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(infname, "r"); if (!inf) { perror(infname); exit(1); } outf = fopen(outfname, "w"); if (!outf) { perror(outfname); exit(1); } state = amr_decoder_create(); if (!state) { perror("amr_decoder_create()"); exit(1); } amr_frame.type = RX_SPEECH_GOOD; amr_frame.mode = 0x87; for (frame_no = 0; ; frame_no++) { rc = read_etsi_bits(inf, big_endian, input_bits, ETSI_DEC_NWORDS, infname); if (!rc) break; if (input_bits[0]) { fprintf(stderr, "error in %s frame #%u: BFI != 0 not supported\n", infname, frame_no); exit(1); } bits2frame(input_bits + 1, efr_frame, infname, frame_no); if (input_bits[245]) { fprintf(stderr, "error in %s frame #%u: SID != 0 not supported\n", infname, frame_no); exit(1); } EFR_frame2params(efr_frame, amr_frame.param); amr_decode_frame(state, &amr_frame, pcm); if (big_endian) write_pcm_be(outf, pcm); else write_pcm_le(outf, pcm); } fclose(outf); exit(0); }