FreeCalypso > hg > gsm-codec-lib
annotate amrconv/hex2ietf.c @ 589:e414d138c607
amrconv: new program amr-ietf2hexoa
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Thu, 06 Nov 2025 21:18:59 +0000 |
| parents | 4d6ccca0c687 |
| children |
| rev | line source |
|---|---|
|
23
baadb1cb744d
new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /* |
|
588
4d6ccca0c687
amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents:
524
diff
changeset
|
2 * This program converts an AMR speech recording from TW-TS-005 Annex C OA/OAX |
|
4d6ccca0c687
amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents:
524
diff
changeset
|
3 * hexadecimal format into the standard binary storage format of RFC 4867. |
|
23
baadb1cb744d
new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 */ |
|
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 #include <stdio.h> |
|
baadb1cb744d
new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 #include <stdint.h> |
|
baadb1cb744d
new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 #include <stdlib.h> |
|
471
b5f8ea41362b
gsmrec-dump: report DHF matches
Mychaela Falconia <falcon@freecalypso.org>
parents:
293
diff
changeset
|
9 #include <string.h> |
|
b5f8ea41362b
gsmrec-dump: report DHF matches
Mychaela Falconia <falcon@freecalypso.org>
parents:
293
diff
changeset
|
10 #include <strings.h> |
|
523
86d4ec69b36c
miscutil: new program tw5a-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
471
diff
changeset
|
11 #include "../libtest/tw5reader.h" |
|
588
4d6ccca0c687
amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents:
524
diff
changeset
|
12 #include "amr_defs.h" |
|
4d6ccca0c687
amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents:
524
diff
changeset
|
13 |
|
4d6ccca0c687
amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents:
524
diff
changeset
|
14 extern const char amr_file_hdr[IETF_HDR_LEN]; |
|
4d6ccca0c687
amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents:
524
diff
changeset
|
15 extern const uint8_t extra_bytes_per_ft[9]; |
|
523
86d4ec69b36c
miscutil: new program tw5a-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
471
diff
changeset
|
16 |
|
23
baadb1cb744d
new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 main(argc, argv) |
|
baadb1cb744d
new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 char **argv; |
|
baadb1cb744d
new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 { |
|
524
ddb2b00d582b
miscutil: new program tw5a-to-gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
523
diff
changeset
|
20 FILE *hexf, *outf; |
|
523
86d4ec69b36c
miscutil: new program tw5a-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
471
diff
changeset
|
21 unsigned lineno; |
|
86d4ec69b36c
miscutil: new program tw5a-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
471
diff
changeset
|
22 uint8_t frame[TWTS005_MAX_FRAME]; |
|
588
4d6ccca0c687
amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents:
524
diff
changeset
|
23 unsigned frame_len, cmr, ft, if1_len; |
|
523
86d4ec69b36c
miscutil: new program tw5a-dump
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 |
|
524
ddb2b00d582b
miscutil: new program tw5a-to-gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
523
diff
changeset
|
26 if (argc != 3) { |
|
588
4d6ccca0c687
amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents:
524
diff
changeset
|
27 fprintf(stderr, "usage: %s input.hex output.amr\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 } |
|
523
86d4ec69b36c
miscutil: new program tw5a-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
471
diff
changeset
|
30 hexf = fopen(argv[1], "r"); |
|
86d4ec69b36c
miscutil: new program tw5a-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
471
diff
changeset
|
31 if (!hexf) { |
|
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 } |
|
523
86d4ec69b36c
miscutil: new program tw5a-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
471
diff
changeset
|
35 lineno = 0; |
|
524
ddb2b00d582b
miscutil: new program tw5a-to-gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
523
diff
changeset
|
36 outf = fopen(argv[2], "w"); |
|
ddb2b00d582b
miscutil: new program tw5a-to-gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
523
diff
changeset
|
37 if (!outf) { |
|
ddb2b00d582b
miscutil: new program tw5a-to-gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
523
diff
changeset
|
38 perror(argv[2]); |
|
ddb2b00d582b
miscutil: new program tw5a-to-gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
523
diff
changeset
|
39 exit(1); |
|
ddb2b00d582b
miscutil: new program tw5a-to-gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents:
523
diff
changeset
|
40 } |
|
588
4d6ccca0c687
amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents:
524
diff
changeset
|
41 fwrite(amr_file_hdr, 1, IETF_HDR_LEN, outf); |
|
523
86d4ec69b36c
miscutil: new program tw5a-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
471
diff
changeset
|
42 for (;;) { |
|
86d4ec69b36c
miscutil: new program tw5a-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
471
diff
changeset
|
43 rc = twts005_read_frame(hexf, &lineno, frame, &frame_len); |
|
23
baadb1cb744d
new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 if (rc < 0) { |
|
523
86d4ec69b36c
miscutil: new program tw5a-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
471
diff
changeset
|
45 fprintf(stderr, "%s line %u: not valid TW-TS-005\n", |
|
86d4ec69b36c
miscutil: new program tw5a-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
471
diff
changeset
|
46 argv[1], lineno); |
|
23
baadb1cb744d
new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 exit(1); |
|
baadb1cb744d
new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 } |
|
baadb1cb744d
new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 if (!rc) |
|
baadb1cb744d
new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 break; |
|
588
4d6ccca0c687
amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents:
524
diff
changeset
|
51 if (frame_len == 0) { |
|
4d6ccca0c687
amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents:
524
diff
changeset
|
52 putc(0x7C, outf); |
|
4d6ccca0c687
amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents:
524
diff
changeset
|
53 continue; |
|
4d6ccca0c687
amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents:
524
diff
changeset
|
54 } |
|
4d6ccca0c687
amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents:
524
diff
changeset
|
55 if (frame_len < 2) { |
|
4d6ccca0c687
amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents:
524
diff
changeset
|
56 inv_payload: fprintf(stderr, |
|
4d6ccca0c687
amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents:
524
diff
changeset
|
57 "%s line %u: payload is not valid AMR OA\n", |
|
523
86d4ec69b36c
miscutil: new program tw5a-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
471
diff
changeset
|
58 argv[1], lineno); |
|
86d4ec69b36c
miscutil: new program tw5a-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
471
diff
changeset
|
59 exit(1); |
|
23
baadb1cb744d
new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 } |
|
588
4d6ccca0c687
amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents:
524
diff
changeset
|
61 cmr = frame[0] >> 4; |
|
4d6ccca0c687
amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents:
524
diff
changeset
|
62 if (cmr > MR122 && cmr != MODE_NO_DATA) |
|
4d6ccca0c687
amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents:
524
diff
changeset
|
63 goto inv_payload; |
|
4d6ccca0c687
amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents:
524
diff
changeset
|
64 if (frame[1] & 0x80) |
|
4d6ccca0c687
amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents:
524
diff
changeset
|
65 goto inv_payload; |
|
4d6ccca0c687
amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents:
524
diff
changeset
|
66 ft = (frame[1] & 0x78) >> 3; |
|
4d6ccca0c687
amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents:
524
diff
changeset
|
67 if (ft <= MRDTX) |
|
4d6ccca0c687
amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents:
524
diff
changeset
|
68 if1_len = extra_bytes_per_ft[ft]; |
|
4d6ccca0c687
amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents:
524
diff
changeset
|
69 else if (ft == MODE_NO_DATA) |
|
4d6ccca0c687
amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents:
524
diff
changeset
|
70 if1_len = 0; |
|
4d6ccca0c687
amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents:
524
diff
changeset
|
71 else |
|
4d6ccca0c687
amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents:
524
diff
changeset
|
72 goto inv_payload; |
|
4d6ccca0c687
amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents:
524
diff
changeset
|
73 if (frame_len < if1_len + 2) |
|
4d6ccca0c687
amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents:
524
diff
changeset
|
74 goto inv_payload; |
|
4d6ccca0c687
amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents:
524
diff
changeset
|
75 frame[1] &= 0xFC; |
|
4d6ccca0c687
amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents:
524
diff
changeset
|
76 fwrite(frame + 1, 1, if1_len + 1, outf); |
|
23
baadb1cb744d
new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 } |
|
baadb1cb744d
new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78 exit(0); |
|
baadb1cb744d
new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
79 } |
