annotate amrconv/oa2bwe.c @ 599:762cf36e2487

libgsmhr1/err_conc.[ch]: import original
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 04 Dec 2025 10:02:09 +0000
parents 6b2900fe20f4
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 /*
590
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
2 * This program reads a TW-TS-005 hexadecimal file, expects each record to be
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
3 * AMR in OA/OAX format, converts it to BWE format, and writes the output into
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
4 * a new TW-TS-005 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>
523
86d4ec69b36c miscutil: new program tw5a-dump
Mychaela Falconia <falcon@freecalypso.org>
parents: 471
diff changeset
12 #include "../libtest/tw5reader.h"
590
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
13 #include "../libtest/tw5writer.h"
588
4d6ccca0c687 amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents: 524
diff changeset
14 #include "amr_defs.h"
4d6ccca0c687 amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents: 524
diff changeset
15
590
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
16 extern const uint8_t pl_total_bytes_oa[9], pl_total_bytes_bwe[9];
523
86d4ec69b36c miscutil: new program tw5a-dump
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 {
590
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
21 FILE *inf, *outf;
523
86d4ec69b36c miscutil: new program tw5a-dump
Mychaela Falconia <falcon@freecalypso.org>
parents: 471
diff changeset
22 unsigned lineno;
590
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
23 uint8_t frm_in[TWTS005_MAX_FRAME], frm_out[MAX_IF1_BYTES + 2];
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
24 unsigned frm_in_len, cmr, ft, expect_len, out_len, n;
523
86d4ec69b36c miscutil: new program tw5a-dump
Mychaela Falconia <falcon@freecalypso.org>
parents: 471
diff changeset
25 int rc;
23
baadb1cb744d new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26
524
ddb2b00d582b miscutil: new program tw5a-to-gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents: 523
diff changeset
27 if (argc != 3) {
590
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
28 fprintf(stderr, "usage: %s amr-oa.hex amr-bwe.hex\n", argv[0]);
23
baadb1cb744d new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 exit(1);
baadb1cb744d new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 }
590
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
31 inf = fopen(argv[1], "r");
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
32 if (!inf) {
23
baadb1cb744d new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 perror(argv[1]);
baadb1cb744d new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 exit(1);
baadb1cb744d new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 }
523
86d4ec69b36c miscutil: new program tw5a-dump
Mychaela Falconia <falcon@freecalypso.org>
parents: 471
diff changeset
36 lineno = 0;
524
ddb2b00d582b miscutil: new program tw5a-to-gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents: 523
diff changeset
37 outf = fopen(argv[2], "w");
ddb2b00d582b miscutil: new program tw5a-to-gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents: 523
diff changeset
38 if (!outf) {
ddb2b00d582b miscutil: new program tw5a-to-gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents: 523
diff changeset
39 perror(argv[2]);
ddb2b00d582b miscutil: new program tw5a-to-gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents: 523
diff changeset
40 exit(1);
ddb2b00d582b miscutil: new program tw5a-to-gsmx
Mychaela Falconia <falcon@freecalypso.org>
parents: 523
diff changeset
41 }
523
86d4ec69b36c miscutil: new program tw5a-dump
Mychaela Falconia <falcon@freecalypso.org>
parents: 471
diff changeset
42 for (;;) {
590
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
43 rc = twts005_read_frame(inf, &lineno, frm_in, &frm_in_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;
590
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
51 if (frm_in_len == 0) {
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
52 fputs("NULL\n", outf);
588
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 }
590
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
55 if (frm_in_len < 2) {
588
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 }
590
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
61 cmr = frm_in[0] >> 4;
588
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;
590
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
64 if (frm_in[1] & 0x80)
588
4d6ccca0c687 amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents: 524
diff changeset
65 goto inv_payload;
590
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
66 ft = (frm_in[1] & 0x78) >> 3;
588
4d6ccca0c687 amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents: 524
diff changeset
67 if (ft <= MRDTX)
590
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
68 expect_len = pl_total_bytes_oa[ft];
588
4d6ccca0c687 amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents: 524
diff changeset
69 else if (ft == MODE_NO_DATA)
590
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
70 expect_len = 2;
588
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;
590
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
73 if (frm_in_len < expect_len)
588
4d6ccca0c687 amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents: 524
diff changeset
74 goto inv_payload;
590
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
75 /* With some frame types, the number of padding bits in BWE
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
76 * output will be greater than the number of padding bits in
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
77 * OA input. The easiest way to ensure zero fill in those bits
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
78 * is to zero the byte just past the input. Because our frm_in
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
79 * buffer is sized for TW-TS-005, we have room.
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
80 */
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
81 frm_in[expect_len] = 0;
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
82 /* proceed to output */
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
83 if (ft != MODE_NO_DATA)
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
84 out_len = pl_total_bytes_bwe[ft];
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
85 else
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
86 out_len = 2;
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
87 frm_out[0] = (cmr << 4) | (ft >> 1);
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
88 frm_out[1] = ((frm_in[1] & 0x0C) << 4) | (frm_in[2] >> 2);
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
89 for (n = 2; n < out_len; n++)
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
90 frm_out[n] = (frm_in[n] << 6) | (frm_in[n+1] >> 2);
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
91 emit_hex_frame(outf, frm_out, out_len);
23
baadb1cb744d new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
92 }
baadb1cb744d new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
93 exit(0);
baadb1cb744d new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
94 }