FreeCalypso > hg > gsm-codec-lib
annotate amrconv/ietf2hex.c @ 605:63f774192906
gsmhr_decoder_twts002_in(): set BFI=1 SID=1 for invalid SID
When a received TW-TS-002 RTP payload indicates invalid SID,
which of the 3 possible BFI/SID combinations should we pass to
our internal ETSI-based speech decoder or TFO engine?
Our original code passed BFI=0 SID=1, but upon further reflection,
BFI=1 SID=1 is a better choice. In the corner case where received
invalid SID is fed to a full decoder in homed state, setting BFI=1
allows that decoder to emit zeros on PCM and stay homed, instead of
launching into full decoding.
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Thu, 04 Dec 2025 21:01:46 +0000 |
| parents | e414d138c607 |
| children |
| rev | line source |
|---|---|
|
23
baadb1cb744d
new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /* |
|
589
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
2 * This program reads an AMR speech recording in RFC 4867 binary storage format, |
|
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
3 * converts each frame to an octet-aligned RTP payload (adds CMR octet), and |
|
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
4 * writes out these payloads as a TW-TS-005 Annex C hex file. |
|
23
baadb1cb744d
new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 */ |
|
baadb1cb744d
new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 |
|
baadb1cb744d
new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 #include <stdio.h> |
|
baadb1cb744d
new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 #include <stdint.h> |
|
baadb1cb744d
new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 #include <stdlib.h> |
|
471
b5f8ea41362b
gsmrec-dump: report DHF matches
Mychaela Falconia <falcon@freecalypso.org>
parents:
293
diff
changeset
|
10 #include <string.h> |
|
b5f8ea41362b
gsmrec-dump: report DHF matches
Mychaela Falconia <falcon@freecalypso.org>
parents:
293
diff
changeset
|
11 #include <strings.h> |
|
540
5595293e4f29
gsmx-to-tw5a utility: use emit_hex_frame() in libtest
Mychaela Falconia <falcon@freecalypso.org>
parents:
521
diff
changeset
|
12 #include "../libtest/tw5writer.h" |
|
589
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
13 #include "amr_defs.h" |
|
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
14 |
|
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
15 extern const char amr_file_hdr[IETF_HDR_LEN]; |
|
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
16 extern const uint8_t extra_bytes_per_ft[9]; |
|
520
785b302992f0
miscutil: new program gsmx-to-tw5a
Mychaela Falconia <falcon@freecalypso.org>
parents:
471
diff
changeset
|
17 |
|
23
baadb1cb744d
new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 main(argc, argv) |
|
baadb1cb744d
new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 char **argv; |
|
baadb1cb744d
new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 { |
|
589
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
21 FILE *inf, *outf; |
|
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
22 uint8_t frame[MAX_IF1_BYTES + 2]; |
|
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
23 unsigned frame_no, ft, frame_len; |
|
520
785b302992f0
miscutil: new program gsmx-to-tw5a
Mychaela Falconia <falcon@freecalypso.org>
parents:
471
diff
changeset
|
24 int rc; |
|
23
baadb1cb744d
new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 |
|
520
785b302992f0
miscutil: new program gsmx-to-tw5a
Mychaela Falconia <falcon@freecalypso.org>
parents:
471
diff
changeset
|
26 if (argc != 3) { |
|
589
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
27 fprintf(stderr, "usage: %s input.amr output.hex\n", argv[0]); |
|
23
baadb1cb744d
new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 exit(1); |
|
baadb1cb744d
new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 } |
|
589
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
30 inf = fopen(argv[1], "r"); |
|
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
31 if (!inf) { |
|
23
baadb1cb744d
new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 perror(argv[1]); |
|
baadb1cb744d
new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 exit(1); |
|
baadb1cb744d
new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 } |
|
589
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
35 if (fread(frame, 1, IETF_HDR_LEN, inf) != IETF_HDR_LEN || |
|
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
36 bcmp(frame, amr_file_hdr, IETF_HDR_LEN)) { |
|
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
37 fprintf(stderr, "error: %s is not in IETF AMR format\n", |
|
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
38 argv[1]); |
|
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
39 exit(1); |
|
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
40 } |
|
520
785b302992f0
miscutil: new program gsmx-to-tw5a
Mychaela Falconia <falcon@freecalypso.org>
parents:
471
diff
changeset
|
41 if (strcmp(argv[2], "-")) { |
|
785b302992f0
miscutil: new program gsmx-to-tw5a
Mychaela Falconia <falcon@freecalypso.org>
parents:
471
diff
changeset
|
42 outf = fopen(argv[2], "w"); |
|
785b302992f0
miscutil: new program gsmx-to-tw5a
Mychaela Falconia <falcon@freecalypso.org>
parents:
471
diff
changeset
|
43 if (!outf) { |
|
785b302992f0
miscutil: new program gsmx-to-tw5a
Mychaela Falconia <falcon@freecalypso.org>
parents:
471
diff
changeset
|
44 perror(argv[2]); |
|
785b302992f0
miscutil: new program gsmx-to-tw5a
Mychaela Falconia <falcon@freecalypso.org>
parents:
471
diff
changeset
|
45 exit(1); |
|
785b302992f0
miscutil: new program gsmx-to-tw5a
Mychaela Falconia <falcon@freecalypso.org>
parents:
471
diff
changeset
|
46 } |
|
785b302992f0
miscutil: new program gsmx-to-tw5a
Mychaela Falconia <falcon@freecalypso.org>
parents:
471
diff
changeset
|
47 } else |
|
785b302992f0
miscutil: new program gsmx-to-tw5a
Mychaela Falconia <falcon@freecalypso.org>
parents:
471
diff
changeset
|
48 outf = stdout; |
|
589
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
49 frame[0] = 0xF0; |
|
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
50 for (frame_no = 0; ; frame_no++) { |
|
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
51 rc = getc(inf); |
|
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
52 if (rc < 0) |
|
23
baadb1cb744d
new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53 break; |
|
589
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
54 frame[1] = rc & 0x7C; |
|
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
55 ft = frame[1] >> 3; |
|
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
56 frame_len = 2; |
|
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
57 if (ft != MODE_NO_DATA) { |
|
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
58 if (ft > MRDTX) { |
|
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
59 fprintf(stderr, |
|
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
60 "error in frame #%u: invalid FT=%u\n", |
|
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
61 frame_no, ft); |
|
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
62 exit(1); |
|
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
63 } |
|
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
64 rc = fread(frame + 2, 1, extra_bytes_per_ft[ft], inf); |
|
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
65 if (rc != extra_bytes_per_ft[ft]) { |
|
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
66 fprintf(stderr, |
|
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
67 "error: short read from %s on frame #%u\n", |
|
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
68 argv[1], frame_no); |
|
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
69 exit(1); |
|
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
70 } |
|
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
71 frame_len += extra_bytes_per_ft[ft]; |
|
23
baadb1cb744d
new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72 } |
|
589
e414d138c607
amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents:
540
diff
changeset
|
73 emit_hex_frame(outf, frame, frame_len); |
|
23
baadb1cb744d
new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74 } |
|
baadb1cb744d
new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
75 exit(0); |
|
baadb1cb744d
new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
76 } |
