annotate amrconv/ietf2hex.c @ 598:5809165fb140

libgsmhr1: integrate DTX functions for speech decoder
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 04 Dec 2025 09:51:11 +0000
parents e414d138c607
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 /*
589
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
2 * This program reads an AMR speech recording in RFC 4867 binary storage format,
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
3 * converts each frame to an octet-aligned RTP payload (adds CMR octet), and
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
4 * writes out these payloads as a TW-TS-005 Annex C 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>
540
5595293e4f29 gsmx-to-tw5a utility: use emit_hex_frame() in libtest
Mychaela Falconia <falcon@freecalypso.org>
parents: 521
diff changeset
12 #include "../libtest/tw5writer.h"
589
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
13 #include "amr_defs.h"
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
14
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
15 extern const char amr_file_hdr[IETF_HDR_LEN];
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
16 extern const uint8_t extra_bytes_per_ft[9];
520
785b302992f0 miscutil: new program gsmx-to-tw5a
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 {
589
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
21 FILE *inf, *outf;
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
22 uint8_t frame[MAX_IF1_BYTES + 2];
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
23 unsigned frame_no, ft, frame_len;
520
785b302992f0 miscutil: new program gsmx-to-tw5a
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
520
785b302992f0 miscutil: new program gsmx-to-tw5a
Mychaela Falconia <falcon@freecalypso.org>
parents: 471
diff changeset
26 if (argc != 3) {
589
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
27 fprintf(stderr, "usage: %s input.amr output.hex\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 }
589
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
30 inf = fopen(argv[1], "r");
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
31 if (!inf) {
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 }
589
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
35 if (fread(frame, 1, IETF_HDR_LEN, inf) != IETF_HDR_LEN ||
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
36 bcmp(frame, amr_file_hdr, IETF_HDR_LEN)) {
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
37 fprintf(stderr, "error: %s is not in IETF AMR format\n",
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
38 argv[1]);
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
39 exit(1);
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
40 }
520
785b302992f0 miscutil: new program gsmx-to-tw5a
Mychaela Falconia <falcon@freecalypso.org>
parents: 471
diff changeset
41 if (strcmp(argv[2], "-")) {
785b302992f0 miscutil: new program gsmx-to-tw5a
Mychaela Falconia <falcon@freecalypso.org>
parents: 471
diff changeset
42 outf = fopen(argv[2], "w");
785b302992f0 miscutil: new program gsmx-to-tw5a
Mychaela Falconia <falcon@freecalypso.org>
parents: 471
diff changeset
43 if (!outf) {
785b302992f0 miscutil: new program gsmx-to-tw5a
Mychaela Falconia <falcon@freecalypso.org>
parents: 471
diff changeset
44 perror(argv[2]);
785b302992f0 miscutil: new program gsmx-to-tw5a
Mychaela Falconia <falcon@freecalypso.org>
parents: 471
diff changeset
45 exit(1);
785b302992f0 miscutil: new program gsmx-to-tw5a
Mychaela Falconia <falcon@freecalypso.org>
parents: 471
diff changeset
46 }
785b302992f0 miscutil: new program gsmx-to-tw5a
Mychaela Falconia <falcon@freecalypso.org>
parents: 471
diff changeset
47 } else
785b302992f0 miscutil: new program gsmx-to-tw5a
Mychaela Falconia <falcon@freecalypso.org>
parents: 471
diff changeset
48 outf = stdout;
589
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
49 frame[0] = 0xF0;
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
50 for (frame_no = 0; ; frame_no++) {
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
51 rc = getc(inf);
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
52 if (rc < 0)
23
baadb1cb744d new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 break;
589
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
54 frame[1] = rc & 0x7C;
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
55 ft = frame[1] >> 3;
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
56 frame_len = 2;
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
57 if (ft != MODE_NO_DATA) {
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
58 if (ft > MRDTX) {
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
59 fprintf(stderr,
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
60 "error in frame #%u: invalid FT=%u\n",
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
61 frame_no, ft);
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
62 exit(1);
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
63 }
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
64 rc = fread(frame + 2, 1, extra_bytes_per_ft[ft], inf);
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
65 if (rc != extra_bytes_per_ft[ft]) {
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
66 fprintf(stderr,
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
67 "error: short read from %s on frame #%u\n",
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
68 argv[1], frame_no);
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
69 exit(1);
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
70 }
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
71 frame_len += extra_bytes_per_ft[ft];
23
baadb1cb744d new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
72 }
589
e414d138c607 amrconv: new program amr-ietf2hexoa
Mychaela Falconia <falcon@freecalypso.org>
parents: 540
diff changeset
73 emit_hex_frame(outf, frame, frame_len);
23
baadb1cb744d new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
74 }
baadb1cb744d new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75 exit(0);
baadb1cb744d new debug utility gsmrec-dump
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
76 }