annotate efrtest/rec2etsi.c @ 122:b33f2168fdec

doc/EFR-rationale article written
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 10 Dec 2022 08:51:01 +0000
parents bd832a456339
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
47
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 * This program reads in an EFR session recording in our binary format
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 * (presumably obtained by converting from an RTP capture on the network
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 * side or from a Calypso DSP readout on the mobile side) and converts
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 * it into ETSI *.dec format, to be fed to ETSI decoder test program.
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 *
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 * The output from this program is in the local machine's native byte order.
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 */
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 #include <stdio.h>
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 #include <stdint.h>
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 #include <stdlib.h>
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 #include <string.h>
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 #include <strings.h>
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 #include "../libgsmefr/gsm_efr.h"
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16 #include "../libtest/binreader.h"
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 static void
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 frame2bits(frame, bits)
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 uint8_t *frame;
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 uint16_t *bits;
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 {
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 unsigned nb, byte, mask, bit;
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 for (nb = 0; nb < 31; nb++) {
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 byte = *frame++;
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 for (mask = 0x80; mask; mask >>= 1) {
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 if (byte & mask)
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 bit = 1;
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 else
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 bit = 0;
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 *bits++ = bit;
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 }
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 }
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 }
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 main(argc, argv)
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 char **argv;
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 {
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 FILE *binf, *outf;
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 uint8_t frame[BINFILE_MAX_FRAME];
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 uint16_t bits[250];
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 int rc;
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 if (argc != 3) {
120
bd832a456339 gsmefr-rec2etsi usage msg: call it input.gsmx instead of input.rec
Mychaela Falconia <falcon@freecalypso.org>
parents: 47
diff changeset
46 fprintf(stderr, "usage: %s input.gsmx output.dec\n", argv[0]);
47
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 exit(1);
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 }
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 binf = fopen(argv[1], "r");
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50 if (!binf) {
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51 perror(argv[1]);
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52 exit(1);
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 }
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 outf = fopen(argv[2], "w");
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 if (!outf) {
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 perror(argv[2]);
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57 exit(1);
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58 }
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59 for (;;) {
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60 rc = binfile_read_frame(binf, frame);
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 if (rc < 0) {
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62 fprintf(stderr, "error: garbage in %s\n", argv[1]);
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63 exit(1);
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
64 }
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65 if (!rc)
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
66 break;
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
67 if (frame[0] == 0xBF) {
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
68 bits[3] = 1; /* BFI */
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
69 bzero(bits + 4, 245 * 2);
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70 bits[249] = frame[1] & 1; /* TAF */
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
71 } else if ((frame[0] & 0xF0) == 0xC0) {
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
72 frame2bits(frame, bits);
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
73 bits[248] = EFR_sid_classify(frame);
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
74 bits[249] = 0; /* TAF */
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75 } else {
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
76 fprintf(stderr,
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
77 "error: %s is not in EFR codec format\n",
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
78 argv[1]);
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
79 exit(1);
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
80 }
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
81 fwrite(bits + 3, 2, 247, outf);
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
82 }
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
83 fclose(outf);
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
84 exit(0);
89945a3b576e gsmefr-rec2etsi test program added
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
85 }