annotate ater/out_frame.c @ 52:626180a15857 default tip

ater play-d144: emit E-data frames manually, osmo_trau_frame_encode() is currently broken for this frame type
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 25 Sep 2024 06:40:43 +0000
parents bacc590ec839
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 * Here we implement our TRAU-UL bit filling function.
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 *
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 * This code is based on trau_rtp_conv.c in libosmo-abis.
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 */
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 #include <stdint.h>
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 #include <stdbool.h>
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 #include <string.h>
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 #include <osmocom/core/bits.h>
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 #include <osmocom/core/crc8gen.h>
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 #include <osmocom/trau/trau_frame.h>
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 #include "out_frame.h"
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 /* this corresponds to the bit-lengths of the individual codec
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 * parameters as indicated in Table 1.1 of TS 46.010 */
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 static const uint8_t gsm_fr_map[] = {
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 6, 6, 5, 5, 4, 4, 3, 3,
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 7, 2, 2, 6, 3, 3, 3, 3,
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 3, 3, 3, 3, 3, 3, 3, 3,
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 3, 7, 2, 2, 6, 3, 3, 3,
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 3, 3, 3, 3, 3, 3, 3, 3,
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 3, 3, 7, 2, 2, 6, 3, 3,
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 3, 3, 3, 3, 3, 3, 3, 3,
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 3, 3, 3, 7, 2, 2, 6, 3,
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 3, 3, 3, 3, 3, 3, 3, 3,
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 3, 3, 3, 3
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 };
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 /*
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 * EFR TRAU parity
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 *
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 * g(x) = x^3 + x^1 + 1
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 */
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 static const struct osmo_crc8gen_code gsm0860_efr_crc3 = {
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 .bits = 3,
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 .poly = 0x3,
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 .init = 0x0,
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 .remainder = 0x7,
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 };
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44 /* re-combine EFR parity bits */
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 static inline void efr_parity_bits_1(ubit_t *check_bits, const ubit_t *d_bits)
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46 {
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 memcpy(check_bits + 0 , d_bits + 0, 22);
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 memcpy(check_bits + 22 , d_bits + 24, 3);
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 check_bits[25] = d_bits[28];
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50 }
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52 static inline void efr_parity_bits_2(ubit_t *check_bits, const ubit_t *d_bits)
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 {
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 memcpy(check_bits + 0 , d_bits + 42, 10);
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 memcpy(check_bits + 10 , d_bits + 90, 2);
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 }
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58 static inline void efr_parity_bits_3(ubit_t *check_bits, const ubit_t *d_bits)
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59 {
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60 memcpy(check_bits + 0 , d_bits + 98, 5);
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 check_bits[5] = d_bits[104];
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62 memcpy(check_bits + 6 , d_bits + 143, 2);
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63 }
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
64
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65 static inline void efr_parity_bits_4(ubit_t *check_bits, const ubit_t *d_bits)
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
66 {
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
67 memcpy(check_bits + 0 , d_bits + 151, 10);
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
68 memcpy(check_bits + 10 , d_bits + 199, 2);
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
69 }
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
71 static inline void efr_parity_bits_5(ubit_t *check_bits, const ubit_t *d_bits)
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
72 {
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
73 memcpy(check_bits + 0 , d_bits + 207, 5);
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
74 check_bits[5] = d_bits[213];
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75 memcpy(check_bits + 6 , d_bits + 252, 2);
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
76 }
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
77
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
78 static void fill_data_fr(const uint8_t *data, struct osmo_trau_frame *tf)
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
79 {
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
80 int i, j, k, l, o;
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
81
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
82 /* reassemble d-bits */
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
83 i = 0; /* counts bits */
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
84 j = 4; /* counts input bits */
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
85 k = gsm_fr_map[0]-1; /* current number bit in element */
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
86 l = 0; /* counts element bits */
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
87 o = 0; /* offset output bits */
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
88 while (i < 260) {
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
89 tf->d_bits[k+o] = (data[j/8] >> (7-(j%8))) & 1;
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
90 /* to avoid out-of-bounds access in gsm_fr_map[++l] */
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
91 if (i == 259)
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
92 break;
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
93 if (--k < 0) {
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
94 o += gsm_fr_map[l];
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
95 k = gsm_fr_map[++l]-1;
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
96 }
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
97 i++;
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
98 j++;
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
99 }
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
100 }
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
101
22
bacc590ec839 ater: implement EFR CRC inversion option
Mychaela Falconia <falcon@freecalypso.org>
parents: 21
diff changeset
102 static void invert_crc3(ubit_t *crc)
bacc590ec839 ater: implement EFR CRC inversion option
Mychaela Falconia <falcon@freecalypso.org>
parents: 21
diff changeset
103 {
bacc590ec839 ater: implement EFR CRC inversion option
Mychaela Falconia <falcon@freecalypso.org>
parents: 21
diff changeset
104 crc[0] = !crc[0];
bacc590ec839 ater: implement EFR CRC inversion option
Mychaela Falconia <falcon@freecalypso.org>
parents: 21
diff changeset
105 crc[1] = !crc[1];
bacc590ec839 ater: implement EFR CRC inversion option
Mychaela Falconia <falcon@freecalypso.org>
parents: 21
diff changeset
106 crc[2] = !crc[2];
bacc590ec839 ater: implement EFR CRC inversion option
Mychaela Falconia <falcon@freecalypso.org>
parents: 21
diff changeset
107 }
bacc590ec839 ater: implement EFR CRC inversion option
Mychaela Falconia <falcon@freecalypso.org>
parents: 21
diff changeset
108
21
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
109 static void fill_data_efr(const uint8_t *data, struct osmo_trau_frame *tf)
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
110 {
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
111 int i, j;
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
112 ubit_t check_bits[26];
22
bacc590ec839 ater: implement EFR CRC inversion option
Mychaela Falconia <falcon@freecalypso.org>
parents: 21
diff changeset
113 uint8_t crc_inv;
21
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
114
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
115 /* reassemble d-bits */
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
116 tf->d_bits[0] = 1;
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
117 for (i = 1, j = 4; i < 39; i++, j++)
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
118 tf->d_bits[i] = (data[j/8] >> (7-(j%8))) & 1;
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
119 efr_parity_bits_1(check_bits, tf->d_bits);
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
120 osmo_crc8gen_set_bits(&gsm0860_efr_crc3, check_bits, 26,
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
121 tf->d_bits + 39);
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
122 for (i = 42, j = 42; i < 95; i++, j++)
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
123 tf->d_bits[i] = (data[j/8] >> (7-(j%8))) & 1;
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
124 efr_parity_bits_2(check_bits, tf->d_bits);
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
125 osmo_crc8gen_set_bits(&gsm0860_efr_crc3, check_bits, 12,
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
126 tf->d_bits + 95);
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
127 for (i = 98, j = 95; i < 148; i++, j++)
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
128 tf->d_bits[i] = (data[j/8] >> (7-(j%8))) & 1;
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
129 efr_parity_bits_3(check_bits, tf->d_bits);
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
130 osmo_crc8gen_set_bits(&gsm0860_efr_crc3, check_bits, 8,
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
131 tf->d_bits + 148);
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
132 for (i = 151, j = 145; i < 204; i++, j++)
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
133 tf->d_bits[i] = (data[j/8] >> (7-(j%8))) & 1;
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
134 efr_parity_bits_4(check_bits, tf->d_bits);
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
135 osmo_crc8gen_set_bits(&gsm0860_efr_crc3, check_bits, 12,
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
136 tf->d_bits + 204);
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
137 for (i = 207, j = 198; i < 257; i++, j++)
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
138 tf->d_bits[i] = (data[j/8] >> (7-(j%8))) & 1;
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
139 efr_parity_bits_5(check_bits, tf->d_bits);
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
140 osmo_crc8gen_set_bits(&gsm0860_efr_crc3, check_bits, 8,
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
141 tf->d_bits + 257);
22
bacc590ec839 ater: implement EFR CRC inversion option
Mychaela Falconia <falcon@freecalypso.org>
parents: 21
diff changeset
142
bacc590ec839 ater: implement EFR CRC inversion option
Mychaela Falconia <falcon@freecalypso.org>
parents: 21
diff changeset
143 /* inverted CRC option */
bacc590ec839 ater: implement EFR CRC inversion option
Mychaela Falconia <falcon@freecalypso.org>
parents: 21
diff changeset
144 crc_inv = data[31];
bacc590ec839 ater: implement EFR CRC inversion option
Mychaela Falconia <falcon@freecalypso.org>
parents: 21
diff changeset
145 if (crc_inv & 0x80)
bacc590ec839 ater: implement EFR CRC inversion option
Mychaela Falconia <falcon@freecalypso.org>
parents: 21
diff changeset
146 invert_crc3(tf->d_bits + 39);
bacc590ec839 ater: implement EFR CRC inversion option
Mychaela Falconia <falcon@freecalypso.org>
parents: 21
diff changeset
147 if (crc_inv & 0x40)
bacc590ec839 ater: implement EFR CRC inversion option
Mychaela Falconia <falcon@freecalypso.org>
parents: 21
diff changeset
148 invert_crc3(tf->d_bits + 95);
bacc590ec839 ater: implement EFR CRC inversion option
Mychaela Falconia <falcon@freecalypso.org>
parents: 21
diff changeset
149 if (crc_inv & 0x20)
bacc590ec839 ater: implement EFR CRC inversion option
Mychaela Falconia <falcon@freecalypso.org>
parents: 21
diff changeset
150 invert_crc3(tf->d_bits + 148);
bacc590ec839 ater: implement EFR CRC inversion option
Mychaela Falconia <falcon@freecalypso.org>
parents: 21
diff changeset
151 if (crc_inv & 0x10)
bacc590ec839 ater: implement EFR CRC inversion option
Mychaela Falconia <falcon@freecalypso.org>
parents: 21
diff changeset
152 invert_crc3(tf->d_bits + 204);
bacc590ec839 ater: implement EFR CRC inversion option
Mychaela Falconia <falcon@freecalypso.org>
parents: 21
diff changeset
153 if (crc_inv & 0x08)
bacc590ec839 ater: implement EFR CRC inversion option
Mychaela Falconia <falcon@freecalypso.org>
parents: 21
diff changeset
154 invert_crc3(tf->d_bits + 257);
21
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
155 }
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
156
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
157 void trau_frame_from_record(const uint8_t *rec, bool is_efr,
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
158 struct osmo_trau_frame *tf)
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
159 {
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
160 if (is_efr)
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
161 fill_data_efr(rec, tf);
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
162 else
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
163 fill_data_fr(rec, tf);
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
164 /* set BFI and SID flags */
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
165 tf->c_bits[11] = (rec[33] & 0x80) >> 7;
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
166 tf->c_bits[12] = (rec[33] & 0x02) >> 1;
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
167 tf->c_bits[13] = (rec[33] & 0x01) >> 0;
2ee910aa03c3 ater: implement TRAU frame filling
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
168 }