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