FreeCalypso > hg > gsm-codec-lib
annotate amrconv/bwe2oa.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 | 2f1e91dd552b |
| children |
| 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 } |
