blob: 165484dfad982544274bd127d23c57ef0f79f5bf [file] [log] [blame]
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +02001/* GSM 06.10 - GSM FR codec */
2
3/*
4 * (C) 2010 Sylvain Munaut <tnt@246tNt.com>
5 *
6 * All Rights Reserved
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License along
19 * with this program; if not, write to the Free Software Foundation, Inc.,
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 *
22 */
23
24#include <stdint.h>
Maxec8f1922016-05-31 14:50:21 +020025#include <stdbool.h>
26
27#include <osmocom/core/bitvec.h>
28#include <osmocom/core/utils.h>
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +020029
30/* GSM FR - subjective importance bit ordering */
31 /* This array encodes GSM 05.03 Table 2.
32 * It's also GSM 06.10 Table A.2.1a
33 *
34 * It converts between serial parameter output by the encoder and the
35 * order needed before channel encoding.
36 */
Diego Elio Pettenò23431c72012-06-29 13:01:27 -070037const uint16_t gsm610_bitorder[260] = {
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +020038 0, /* LARc0:5 */
39 47, /* Xmaxc0:5 */
40 103, /* Xmaxc1:5 */
41 159, /* Xmaxc2:5 */
42 215, /* Xmaxc3:5 */
43 1, /* LARc0:4 */
44 6, /* LARc1:5 */
45 12, /* LARc2:4 */
46 2, /* LARc0:3 */
47 7, /* LARc1:4 */
48 13, /* LARc2:3 */
49 17, /* LARc3:4 */
50 36, /* Nc0:6 */
51 92, /* Nc1:6 */
52 148, /* Nc2:6 */
53 204, /* Nc3:6 */
54 48, /* Xmaxc0:4 */
55 104, /* Xmaxc1:4 */
56 160, /* Xmaxc2:4 */
57 216, /* Xmaxc3:4 */
58 8, /* LARc1:3 */
59 22, /* LARc4:3 */
60 26, /* LARc5:3 */
61 37, /* Nc0:5 */
62 93, /* Nc1:5 */
63 149, /* Nc2:5 */
64 205, /* Nc3:5 */
65 38, /* Nc0:4 */
66 94, /* Nc1:4 */
67 150, /* Nc2:4 */
68 206, /* Nc3:4 */
69 39, /* Nc0:3 */
70 95, /* Nc1:3 */
71 151, /* Nc2:3 */
72 207, /* Nc3:3 */
73 40, /* Nc0:2 */
74 96, /* Nc1:2 */
75 152, /* Nc2:2 */
76 208, /* Nc3:2 */
77 49, /* Xmaxc0:3 */
78 105, /* Xmaxc1:3 */
79 161, /* Xmaxc2:3 */
80 217, /* Xmaxc3:3 */
81 3, /* LARc0:2 */
82 18, /* LARc3:3 */
83 30, /* LARc6:2 */
84 41, /* Nc0:1 */
85 97, /* Nc1:1 */
86 153, /* Nc2:1 */
87 209, /* Nc3:1 */
88 23, /* LARc4:2 */
89 27, /* LARc5:2 */
90 43, /* bc0:1 */
91 99, /* bc1:1 */
92 155, /* bc2:1 */
93 211, /* bc3:1 */
94 42, /* Nc0:0 */
95 98, /* Nc1:0 */
96 154, /* Nc2:0 */
97 210, /* Nc3:0 */
98 45, /* Mc0:1 */
99 101, /* Mc1:1 */
100 157, /* Mc2:1 */
101 213, /* Mc3:1 */
102 4, /* LARc0:1 */
103 9, /* LARc1:2 */
104 14, /* LARc2:2 */
105 33, /* LARc7:2 */
106 19, /* LARc3:2 */
107 24, /* LARc4:1 */
108 31, /* LARc6:1 */
109 44, /* bc0:0 */
110 100, /* bc1:0 */
111 156, /* bc2:0 */
112 212, /* bc3:0 */
113 50, /* Xmaxc0:2 */
114 106, /* Xmaxc1:2 */
115 162, /* Xmaxc2:2 */
116 218, /* Xmaxc3:2 */
117 53, /* xmc0_0:2 */
118 56, /* xmc0_1:2 */
119 59, /* xmc0_2:2 */
120 62, /* xmc0_3:2 */
121 65, /* xmc0_4:2 */
122 68, /* xmc0_5:2 */
123 71, /* xmc0_6:2 */
124 74, /* xmc0_7:2 */
125 77, /* xmc0_8:2 */
126 80, /* xmc0_9:2 */
127 83, /* xmc0_10:2 */
128 86, /* xmc0_11:2 */
129 89, /* xmc0_12:2 */
130 109, /* xmc1_0:2 */
131 112, /* xmc1_1:2 */
132 115, /* xmc1_2:2 */
133 118, /* xmc1_3:2 */
134 121, /* xmc1_4:2 */
135 124, /* xmc1_5:2 */
136 127, /* xmc1_6:2 */
137 130, /* xmc1_7:2 */
138 133, /* xmc1_8:2 */
139 136, /* xmc1_9:2 */
140 139, /* xmc1_10:2 */
141 142, /* xmc1_11:2 */
142 145, /* xmc1_12:2 */
143 165, /* xmc2_0:2 */
144 168, /* xmc2_1:2 */
145 171, /* xmc2_2:2 */
146 174, /* xmc2_3:2 */
147 177, /* xmc2_4:2 */
148 180, /* xmc2_5:2 */
149 183, /* xmc2_6:2 */
150 186, /* xmc2_7:2 */
151 189, /* xmc2_8:2 */
152 192, /* xmc2_9:2 */
153 195, /* xmc2_10:2 */
154 198, /* xmc2_11:2 */
155 201, /* xmc2_12:2 */
156 221, /* xmc3_0:2 */
157 224, /* xmc3_1:2 */
158 227, /* xmc3_2:2 */
159 230, /* xmc3_3:2 */
160 233, /* xmc3_4:2 */
161 236, /* xmc3_5:2 */
162 239, /* xmc3_6:2 */
163 242, /* xmc3_7:2 */
164 245, /* xmc3_8:2 */
165 248, /* xmc3_9:2 */
166 251, /* xmc3_10:2 */
167 254, /* xmc3_11:2 */
168 257, /* xmc3_12:2 */
169 46, /* Mc0:0 */
170 102, /* Mc1:0 */
171 158, /* Mc2:0 */
172 214, /* Mc3:0 */
173 51, /* Xmaxc0:1 */
174 107, /* Xmaxc1:1 */
175 163, /* Xmaxc2:1 */
176 219, /* Xmaxc3:1 */
177 54, /* xmc0_0:1 */
178 57, /* xmc0_1:1 */
179 60, /* xmc0_2:1 */
180 63, /* xmc0_3:1 */
181 66, /* xmc0_4:1 */
182 69, /* xmc0_5:1 */
183 72, /* xmc0_6:1 */
184 75, /* xmc0_7:1 */
185 78, /* xmc0_8:1 */
186 81, /* xmc0_9:1 */
187 84, /* xmc0_10:1 */
188 87, /* xmc0_11:1 */
189 90, /* xmc0_12:1 */
190 110, /* xmc1_0:1 */
191 113, /* xmc1_1:1 */
192 116, /* xmc1_2:1 */
193 119, /* xmc1_3:1 */
194 122, /* xmc1_4:1 */
195 125, /* xmc1_5:1 */
196 128, /* xmc1_6:1 */
197 131, /* xmc1_7:1 */
198 134, /* xmc1_8:1 */
199 137, /* xmc1_9:1 */
200 140, /* xmc1_10:1 */
201 143, /* xmc1_11:1 */
202 146, /* xmc1_12:1 */
203 166, /* xmc2_0:1 */
204 169, /* xmc2_1:1 */
205 172, /* xmc2_2:1 */
206 175, /* xmc2_3:1 */
207 178, /* xmc2_4:1 */
208 181, /* xmc2_5:1 */
209 184, /* xmc2_6:1 */
210 187, /* xmc2_7:1 */
211 190, /* xmc2_8:1 */
212 193, /* xmc2_9:1 */
213 196, /* xmc2_10:1 */
214 199, /* xmc2_11:1 */
215 202, /* xmc2_12:1 */
216 222, /* xmc3_0:1 */
217 225, /* xmc3_1:1 */
218 228, /* xmc3_2:1 */
219 231, /* xmc3_3:1 */
220 234, /* xmc3_4:1 */
221 237, /* xmc3_5:1 */
222 240, /* xmc3_6:1 */
223 243, /* xmc3_7:1 */
224 246, /* xmc3_8:1 */
225 249, /* xmc3_9:1 */
226 252, /* xmc3_10:1 */
227 255, /* xmc3_11:1 */
228 258, /* xmc3_12:1 */
229 5, /* LARc0:0 */
230 10, /* LARc1:1 */
231 15, /* LARc2:1 */
232 28, /* LARc5:1 */
233 32, /* LARc6:0 */
234 34, /* LARc7:1 */
235 35, /* LARc7:0 */
236 16, /* LARc2:0 */
237 20, /* LARc3:1 */
238 21, /* LARc3:0 */
239 25, /* LARc4:0 */
240 52, /* Xmaxc0:0 */
241 108, /* Xmaxc1:0 */
242 164, /* Xmaxc2:0 */
243 220, /* Xmaxc3:0 */
244 55, /* xmc0_0:0 */
245 58, /* xmc0_1:0 */
246 61, /* xmc0_2:0 */
247 64, /* xmc0_3:0 */
248 67, /* xmc0_4:0 */
249 70, /* xmc0_5:0 */
250 73, /* xmc0_6:0 */
251 76, /* xmc0_7:0 */
252 79, /* xmc0_8:0 */
253 82, /* xmc0_9:0 */
254 85, /* xmc0_10:0 */
255 88, /* xmc0_11:0 */
256 91, /* xmc0_12:0 */
257 111, /* xmc1_0:0 */
258 114, /* xmc1_1:0 */
259 117, /* xmc1_2:0 */
260 120, /* xmc1_3:0 */
261 123, /* xmc1_4:0 */
262 126, /* xmc1_5:0 */
263 129, /* xmc1_6:0 */
264 132, /* xmc1_7:0 */
265 135, /* xmc1_8:0 */
266 138, /* xmc1_9:0 */
267 141, /* xmc1_10:0 */
268 144, /* xmc1_11:0 */
269 147, /* xmc1_12:0 */
270 167, /* xmc2_0:0 */
271 170, /* xmc2_1:0 */
272 173, /* xmc2_2:0 */
273 176, /* xmc2_3:0 */
274 179, /* xmc2_4:0 */
275 182, /* xmc2_5:0 */
276 185, /* xmc2_6:0 */
277 188, /* xmc2_7:0 */
278 191, /* xmc2_8:0 */
279 194, /* xmc2_9:0 */
280 197, /* xmc2_10:0 */
281 200, /* xmc2_11:0 */
282 203, /* xmc2_12:0 */
283 223, /* xmc3_0:0 */
284 226, /* xmc3_1:0 */
285 229, /* xmc3_2:0 */
286 232, /* xmc3_3:0 */
287 235, /* xmc3_4:0 */
288 238, /* xmc3_5:0 */
289 241, /* xmc3_6:0 */
290 244, /* xmc3_7:0 */
291 247, /* xmc3_8:0 */
292 250, /* xmc3_9:0 */
293 253, /* xmc3_10:0 */
294 256, /* xmc3_11:0 */
295 259, /* xmc3_12:0 */
296 11, /* LARc1:0 */
297 29, /* LARc5:0 */
298};
Maxec8f1922016-05-31 14:50:21 +0200299
300/*! \brief Check whether RTP frame contains FR SID code word according to
301 * TS 101 318 §5.1.2
302 * \param[in] rtp_payload Buffer with RTP payload
303 * \param[in] payload_len Length of payload
304 * \returns true if code word is found, false otherwise
305 */
306bool osmo_fr_check_sid(uint8_t *rtp_payload, size_t payload_len)
307{
308 struct bitvec bv;
Jean-Francois Dionne43058ef2017-04-27 10:11:31 -0400309 uint16_t i, z_bits[] = { 57, 58, 60, 61, 63, 64, 66, 67, 69, 70, 72, 73,
310 75, 76, 78, 79, 81, 82, 84, 85, 87, 88, 90, 91,
311 93, 94, 113, 114, 116, 117, 119, 120, 122, 123,
312 125, 126, 128, 129, 131, 132, 134, 135, 137,
313 138, 140, 141, 143, 144, 146, 147, 149, 150,
314 169, 170, 172, 173, 175, 176, 178, 179, 181,
315 182, 184, 185, 187, 188, 190, 191, 193, 194,
316 196, 197, 199, 200, 202, 203, 205, 206, 225,
317 226, 228, 229, 231, 232, 234, 235, 237, 240,
318 243, 246, 249, 252, 255, 258, 261 };
Maxec8f1922016-05-31 14:50:21 +0200319
320 /* signature does not match Full Rate SID */
321 if ((rtp_payload[0] >> 4) != 0xD)
322 return false;
323
324 bv.data = rtp_payload;
325 bv.data_len = payload_len;
326
327 /* code word is all 0 at given bits, numbered from 1 */
328 for (i = 0; i < ARRAY_SIZE(z_bits); i++)
329 if (bitvec_get_bit_pos(&bv, z_bits[i]) != ZERO)
330 return false;
331
332 return true;
333}