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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }