FreeCalypso > hg > gsm-codec-lib
comparison amrefr/tseq-dec.c @ 437:3eadaef8b28f
implement amrefr-tseq-dec test program
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Wed, 08 May 2024 23:03:28 +0000 |
parents | efrtest/etsi-dec.c@9f354d2aea13 |
children |
comparison
equal
deleted
inserted
replaced
436:e80632ccb745 | 437:3eadaef8b28f |
---|---|
1 /* | |
2 * amrefr-tseq-dec is a test program for our libtwamr-based "alternative EFR" | |
3 * decoder: it functions just like gsmefr-etsi-dec, but uses libtwamr as | |
4 * the decoder engine instead of libgsmefr. Libgsmefr functions are still | |
5 * used for frame unpacking, but not for actual decoding. Note that there is | |
6 * no DTX support in this version, and the *.dec test sequence being decoded | |
7 * must have SID=0 in every frame. As a simplification, we also require BFI=0: | |
8 * while it is possible to feed BFI=1 frames to libtwamr decoder (convert to | |
9 * RX_SPEECH_BAD), such support is not needed for decoding the test sequences | |
10 * in amr122_efr.zip, hence we've omitted it for simplicity. | |
11 * | |
12 * The byte order is LE by default or BE with -b option. | |
13 */ | |
14 | |
15 #include <stdio.h> | |
16 #include <stdint.h> | |
17 #include <stdlib.h> | |
18 #include <string.h> | |
19 #include <strings.h> | |
20 #include "../libgsmefr/gsm_efr.h" | |
21 #include "../libtwamr/tw_amr.h" | |
22 #include "../efrtest/etsi.h" | |
23 | |
24 main(argc, argv) | |
25 char **argv; | |
26 { | |
27 int big_endian; | |
28 char *infname, *outfname; | |
29 FILE *inf, *outf; | |
30 struct amr_decoder_state *state; | |
31 unsigned frame_no; | |
32 uint8_t input_bits[ETSI_DEC_NWORDS], efr_frame[EFR_RTP_FRAME_LEN]; | |
33 struct amr_param_frame amr_frame; | |
34 int16_t pcm[160]; | |
35 int rc; | |
36 | |
37 if (argc == 3 && argv[1][0] != '-') { | |
38 big_endian = 0; | |
39 infname = argv[1]; | |
40 outfname = argv[2]; | |
41 } else if (argc == 4 && !strcmp(argv[1], "-b")) { | |
42 big_endian = 1; | |
43 infname = argv[2]; | |
44 outfname = argv[3]; | |
45 } else { | |
46 fprintf(stderr, "usage: %s [-b] input.dec output.out\n", | |
47 argv[0]); | |
48 exit(1); | |
49 } | |
50 inf = fopen(infname, "r"); | |
51 if (!inf) { | |
52 perror(infname); | |
53 exit(1); | |
54 } | |
55 outf = fopen(outfname, "w"); | |
56 if (!outf) { | |
57 perror(outfname); | |
58 exit(1); | |
59 } | |
60 state = amr_decoder_create(); | |
61 if (!state) { | |
62 perror("amr_decoder_create()"); | |
63 exit(1); | |
64 } | |
65 amr_frame.type = RX_SPEECH_GOOD; | |
66 amr_frame.mode = 0x87; | |
67 for (frame_no = 0; ; frame_no++) { | |
68 rc = read_etsi_bits(inf, big_endian, input_bits, | |
69 ETSI_DEC_NWORDS, infname); | |
70 if (!rc) | |
71 break; | |
72 if (input_bits[0]) { | |
73 fprintf(stderr, | |
74 "error in %s frame #%u: BFI != 0 not supported\n", | |
75 infname, frame_no); | |
76 exit(1); | |
77 } | |
78 bits2frame(input_bits + 1, efr_frame, infname, frame_no); | |
79 if (input_bits[245]) { | |
80 fprintf(stderr, | |
81 "error in %s frame #%u: SID != 0 not supported\n", | |
82 infname, frame_no); | |
83 exit(1); | |
84 } | |
85 EFR_frame2params(efr_frame, amr_frame.param); | |
86 amr_decode_frame(state, &amr_frame, pcm); | |
87 if (big_endian) | |
88 write_pcm_be(outf, pcm); | |
89 else | |
90 write_pcm_le(outf, pcm); | |
91 } | |
92 fclose(outf); | |
93 exit(0); | |
94 } |