annotate amrconv/bwe2oa.c @ 594:83d46a16db1b

libgsmhr1/sp_dec.[ch]: import original
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 04 Dec 2025 01:45:00 +0000
parents 2f1e91dd552b
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
591
2f1e91dd552b amrconv: new program amr-hex-bwe2oa
Mychaela Falconia <falcon@freecalypso.org>
parents: 590
diff changeset
3 * AMR in BWE format, converts it to OA format, and writes the output into
590
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) {
591
2f1e91dd552b amrconv: new program amr-hex-bwe2oa
Mychaela Falconia <falcon@freecalypso.org>
parents: 590
diff changeset
28 fprintf(stderr, "usage: %s amr-bwe.hex amr-oa.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,
591
2f1e91dd552b amrconv: new program amr-hex-bwe2oa
Mychaela Falconia <falcon@freecalypso.org>
parents: 590
diff changeset
57 "%s line %u: payload is not valid AMR BWE\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;
591
2f1e91dd552b amrconv: new program amr-hex-bwe2oa
Mychaela Falconia <falcon@freecalypso.org>
parents: 590
diff changeset
64 if (frm_in[0] & 0x08)
588
4d6ccca0c687 amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents: 524
diff changeset
65 goto inv_payload;
591
2f1e91dd552b amrconv: new program amr-hex-bwe2oa
Mychaela Falconia <falcon@freecalypso.org>
parents: 590
diff changeset
66 ft = ((frm_in[0] & 0x07) << 1) | ((frm_in[1] & 0x80) >> 7);
588
4d6ccca0c687 amrconv: new program amr-hexoa2ietf
Mychaela Falconia <falcon@freecalypso.org>
parents: 524
diff changeset
67 if (ft <= MRDTX)
591
2f1e91dd552b amrconv: new program amr-hex-bwe2oa
Mychaela Falconia <falcon@freecalypso.org>
parents: 590
diff changeset
68 expect_len = pl_total_bytes_bwe[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;
591
2f1e91dd552b amrconv: new program amr-hex-bwe2oa
Mychaela Falconia <falcon@freecalypso.org>
parents: 590
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;
591
2f1e91dd552b amrconv: new program amr-hex-bwe2oa
Mychaela Falconia <falcon@freecalypso.org>
parents: 590
diff changeset
75 /* With some frame types, the number of padding bits in OA
590
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
591
2f1e91dd552b amrconv: new program amr-hex-bwe2oa
Mychaela Falconia <falcon@freecalypso.org>
parents: 590
diff changeset
77 * BWE input. The easiest way to ensure zero fill in those bits
590
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)
591
2f1e91dd552b amrconv: new program amr-hex-bwe2oa
Mychaela Falconia <falcon@freecalypso.org>
parents: 590
diff changeset
84 out_len = pl_total_bytes_oa[ft];
590
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;
591
2f1e91dd552b amrconv: new program amr-hex-bwe2oa
Mychaela Falconia <falcon@freecalypso.org>
parents: 590
diff changeset
87 frm_out[0] = cmr << 4;
2f1e91dd552b amrconv: new program amr-hex-bwe2oa
Mychaela Falconia <falcon@freecalypso.org>
parents: 590
diff changeset
88 frm_out[1] = (ft << 3) | ((frm_in[1] & 0x40) >> 4);
590
6b2900fe20f4 amrconv: new program amr-hex-oa2bwe
Mychaela Falconia <falcon@freecalypso.org>
parents: 588
diff changeset
89 for (n = 2; n < out_len; n++)
591
2f1e91dd552b amrconv: new program amr-hex-bwe2oa
Mychaela Falconia <falcon@freecalypso.org>
parents: 590
diff changeset
90 frm_out[n] = (frm_in[n-1] << 2) | (frm_in[n] >> 6);
590
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 }