FreeCalypso > hg > gsm-codec-lib
comparison efrtest/etsi-dec.c @ 150:da17c7f02c6c
gsmefr-etsi-dec: add BE support
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Wed, 14 Dec 2022 22:04:39 +0000 |
parents | 8ed838709897 |
children | 9f354d2aea13 |
comparison
equal
deleted
inserted
replaced
149:95d47a34070a | 150:da17c7f02c6c |
---|---|
2 * gsmefr-etsi-dec is a test program for our EFR decoder: it reads ETSI's | 2 * gsmefr-etsi-dec is a test program for our EFR decoder: it reads ETSI's |
3 * .dec format as input and writes raw 16-bit PCM (same as ETSI's *.out) | 3 * .dec format as input and writes raw 16-bit PCM (same as ETSI's *.out) |
4 * as output, allowing our decoder to be tested with ETSI's official test | 4 * as output, allowing our decoder to be tested with ETSI's official test |
5 * sequences. | 5 * sequences. |
6 * | 6 * |
7 * ETSI input and output files are read and written in LE byte order, | 7 * ETSI input and output files are read and written in LE byte order |
8 * matching the official test sequences in ts_100725v050200p0.zip. | 8 * by default, or in BE byte order if -b option is given. |
9 */ | 9 */ |
10 | 10 |
11 #include <stdio.h> | 11 #include <stdio.h> |
12 #include <stdint.h> | 12 #include <stdint.h> |
13 #include <stdlib.h> | 13 #include <stdlib.h> |
14 #include <string.h> | 14 #include <string.h> |
15 #include <strings.h> | 15 #include <strings.h> |
16 #include "../libgsmefr/gsm_efr.h" | 16 #include "../libgsmefr/gsm_efr.h" |
17 #include "etsi.h" | 17 #include "etsi.h" |
18 | |
19 static void | |
20 write_pcm_be(outf, pcm) | |
21 FILE *outf; | |
22 int16_t *pcm; | |
23 { | |
24 uint8_t bytes[320], *dp; | |
25 int16_t samp; | |
26 unsigned n; | |
27 | |
28 dp = bytes; | |
29 for (n = 0; n < 160; n++) { | |
30 samp = pcm[n]; | |
31 *dp++ = (samp >> 8) & 0xFF; | |
32 *dp++ = samp & 0xFF; | |
33 } | |
34 fwrite(bytes, 2, 160, outf); | |
35 } | |
18 | 36 |
19 static void | 37 static void |
20 write_pcm_le(outf, pcm) | 38 write_pcm_le(outf, pcm) |
21 FILE *outf; | 39 FILE *outf; |
22 int16_t *pcm; | 40 int16_t *pcm; |
35 } | 53 } |
36 | 54 |
37 main(argc, argv) | 55 main(argc, argv) |
38 char **argv; | 56 char **argv; |
39 { | 57 { |
58 int big_endian; | |
59 char *infname, *outfname; | |
40 FILE *inf, *outf; | 60 FILE *inf, *outf; |
41 struct EFR_decoder_state *state; | 61 struct EFR_decoder_state *state; |
42 unsigned frame_no; | 62 unsigned frame_no; |
43 uint8_t input_bits[ETSI_DEC_NWORDS], frame[EFR_RTP_FRAME_LEN]; | 63 uint8_t input_bits[ETSI_DEC_NWORDS], frame[EFR_RTP_FRAME_LEN]; |
44 int16_t pcm[160]; | 64 int16_t pcm[160]; |
45 int rc; | 65 int rc; |
46 | 66 |
47 if (argc != 3) { | 67 if (argc == 3 && argv[1][0] != '-') { |
48 fprintf(stderr, "usage: %s input.dec output.out\n", argv[0]); | 68 big_endian = 0; |
69 infname = argv[1]; | |
70 outfname = argv[2]; | |
71 } else if (argc == 4 && !strcmp(argv[1], "-b")) { | |
72 big_endian = 1; | |
73 infname = argv[2]; | |
74 outfname = argv[3]; | |
75 } else { | |
76 fprintf(stderr, "usage: %s [-b] input.dec output.out\n", | |
77 argv[0]); | |
49 exit(1); | 78 exit(1); |
50 } | 79 } |
51 inf = fopen(argv[1], "r"); | 80 inf = fopen(infname, "r"); |
52 if (!inf) { | 81 if (!inf) { |
53 perror(argv[1]); | 82 perror(infname); |
54 exit(1); | 83 exit(1); |
55 } | 84 } |
56 outf = fopen(argv[2], "w"); | 85 outf = fopen(outfname, "w"); |
57 if (!outf) { | 86 if (!outf) { |
58 perror(argv[2]); | 87 perror(outfname); |
59 exit(1); | 88 exit(1); |
60 } | 89 } |
61 state = EFR_decoder_create(); | 90 state = EFR_decoder_create(); |
62 if (!state) { | 91 if (!state) { |
63 perror("EFR_decoder_create()"); | 92 perror("EFR_decoder_create()"); |
64 exit(1); | 93 exit(1); |
65 } | 94 } |
66 for (frame_no = 0; ; frame_no++) { | 95 for (frame_no = 0; ; frame_no++) { |
67 rc = read_etsi_bits(inf, 0, input_bits, ETSI_DEC_NWORDS, | 96 rc = read_etsi_bits(inf, big_endian, input_bits, |
68 argv[1]); | 97 ETSI_DEC_NWORDS, infname); |
69 if (!rc) | 98 if (!rc) |
70 break; | 99 break; |
71 if (input_bits[0] > 1) { | 100 if (input_bits[0] > 1) { |
72 fprintf(stderr, "error in %s frame #%u: BFI > 1\n", | 101 fprintf(stderr, "error in %s frame #%u: BFI > 1\n", |
73 argv[1], frame_no); | 102 infname, frame_no); |
74 exit(1); | 103 exit(1); |
75 } | 104 } |
76 bits2frame(input_bits + 1, frame, argv[1], frame_no); | 105 bits2frame(input_bits + 1, frame, infname, frame_no); |
77 if (input_bits[245] > 2) { | 106 if (input_bits[245] > 2) { |
78 fprintf(stderr, "error in %s frame #%u: SID > 2\n", | 107 fprintf(stderr, "error in %s frame #%u: SID > 2\n", |
79 argv[1], frame_no); | 108 infname, frame_no); |
80 exit(1); | 109 exit(1); |
81 } | 110 } |
82 if (input_bits[246] > 1) { | 111 if (input_bits[246] > 1) { |
83 fprintf(stderr, "error in %s frame #%u: TAF > 1\n", | 112 fprintf(stderr, "error in %s frame #%u: TAF > 1\n", |
84 argv[1], frame_no); | 113 infname, frame_no); |
85 exit(1); | 114 exit(1); |
86 } | 115 } |
87 rc = EFR_sid_classify(frame); | 116 rc = EFR_sid_classify(frame); |
88 if (input_bits[245] != rc) { | 117 if (input_bits[245] != rc) { |
89 fprintf(stderr, | 118 fprintf(stderr, |
90 "warning: frame #%u has mismatching SID (file says %u, analysis yields %d)\n", | 119 "warning: frame #%u has mismatching SID (file says %u, analysis yields %d)\n", |
91 frame_no, input_bits[245], rc); | 120 frame_no, input_bits[245], rc); |
92 } | 121 } |
93 EFR_decode_frame(state, frame, input_bits[0], input_bits[246], | 122 EFR_decode_frame(state, frame, input_bits[0], input_bits[246], |
94 pcm); | 123 pcm); |
95 write_pcm_le(outf, pcm); | 124 if (big_endian) |
125 write_pcm_be(outf, pcm); | |
126 else | |
127 write_pcm_le(outf, pcm); | |
96 } | 128 } |
97 fclose(outf); | 129 fclose(outf); |
98 exit(0); | 130 exit(0); |
99 } | 131 } |