blob: 7067239c6f9907d3ec706b32527fc1e0edac8b1c [file] [log] [blame]
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +02001/* GSM 06.20 - GSM HR 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 HR unvoiced (mode=0) frames - subjective importance bit ordering */
32 /* This array encode mapping between GSM 05.03 Table 3a (bits
33 * ordering before channel coding on TCH) and GSM 06.20 Table B.1
34 * (bit ordering on A-bis */
Diego Elio Pettenò23431c72012-06-29 13:01:27 -070035const uint16_t gsm620_unvoiced_bitorder[112] = {
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +020036 3, /* R0:1 */
37 25, /* LPC 3:7 */
38 52, /* GSP 0-1:2 */
39 71, /* GSP 0-2:2 */
40 90, /* GSP 0-3:2 */
41 109, /* GSP 0-4:2 */
42 15, /* LPC 1:0 */
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +020043 19, /* LPC 2:5 */
Sylvain Munauted8170a2013-03-01 16:35:46 +010044 20, /* LPC 2:4 */
45 21, /* LPC 2:3 */
46 22, /* LPC 2:2 */
47 23, /* LPC 2:1 */
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +020048 26, /* LPC 3:6 */
Sylvain Munauted8170a2013-03-01 16:35:46 +010049 27, /* LPC 3:5 */
50 28, /* LPC 3:4 */
51 29, /* LPC 3:3 */
52 30, /* LPC 3:2 */
53 31, /* LPC 3:1 */
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +020054 61, /* Code 1-2:0 */
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +020055 62, /* Code 2-2:6 */
Sylvain Munauted8170a2013-03-01 16:35:46 +010056 63, /* Code 2-2:5 */
57 64, /* Code 2-2:4 */
58 65, /* Code 2-2:3 */
59 66, /* Code 2-2:2 */
60 67, /* Code 2-2:1 */
61 68, /* Code 2-2:0 */
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +020062 74, /* Code 1-3:6 */
Sylvain Munauted8170a2013-03-01 16:35:46 +010063 75, /* Code 1-3:5 */
64 76, /* Code 1-3:4 */
65 77, /* Code 1-3:3 */
66 78, /* Code 1-3:2 */
67 79, /* Code 1-3:1 */
68 80, /* Code 1-3:0 */
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +020069 81, /* Code 2-3:6 */
Sylvain Munauted8170a2013-03-01 16:35:46 +010070 82, /* Code 2-3:5 */
71 83, /* Code 2-3:4 */
72 84, /* Code 2-3:3 */
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +020073 32, /* LPC 3:0 */
74 4, /* R0:0 */
75 33, /* INT-LPC:0 */
76 60, /* Code 1-2:1 */
77 59, /* Code 1-2:2 */
78 58, /* Code 1-2:3 */
79 57, /* Code 1-2:4 */
80 56, /* Code 1-2:5 */
81 55, /* Code 1-2:6 */
82 49, /* Code 2-1:0 */
83 48, /* Code 2-1:1 */
84 47, /* Code 2-1:2 */
85 46, /* Code 2-1:3 */
86 45, /* Code 2-1:4 */
87 44, /* Code 2-1:5 */
88 43, /* Code 2-1:6 */
89 42, /* Code 1-1:0 */
90 41, /* Code 1-1:1 */
91 40, /* Code 1-1:2 */
92 39, /* Code 1-1:3 */
93 38, /* Code 1-1:4 */
94 37, /* Code 1-1:5 */
95 36, /* Code 1-1:6 */
96 111, /* GSP 0-4:0 */
97 92, /* GSP 0-3:0 */
98 73, /* GSP 0-2:0 */
99 54, /* GSP 0-1:0 */
100 24, /* LPC 2:0 */
101 110, /* GSP 0-4:1 */
102 91, /* GSP 0-3:1 */
103 72, /* GSP 0-2:1 */
104 53, /* GSP 0-1:1 */
105 14, /* LPC 1:1 */
106 13, /* LPC 1:2 */
107 12, /* LPC 1:3 */
108 11, /* LPC 1:4 */
109 10, /* LPC 1:5 */
110 108, /* GSP 0-4:3 */
111 89, /* GSP 0-3:3 */
112 70, /* GSP 0-2:3 */
113 51, /* GSP 0-1:3 */
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +0200114 16, /* LPC 2:8 */
Sylvain Munauted8170a2013-03-01 16:35:46 +0100115 17, /* LPC 2:7 */
116 18, /* LPC 2:6 */
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +0200117 107, /* GSP 0-4:4 */
118 88, /* GSP 0-3:4 */
119 69, /* GSP 0-2:4 */
120 50, /* GSP 0-1:4 */
121 9, /* LPC 1:6 */
122 8, /* LPC 1:7 */
123 7, /* LPC 1:8 */
124 6, /* LPC 1:9 */
125 2, /* R0:2 */
126 5, /* LPC 1:10 */
127 1, /* R0:3 */
128 0, /* R0:4 */
129 35, /* Mode:0 */
130 34, /* Mode:1 */
131 106, /* Code 2-4:0 */
132 105, /* Code 2-4:1 */
133 104, /* Code 2-4:2 */
134 103, /* Code 2-4:3 */
135 102, /* Code 2-4:4 */
136 101, /* Code 2-4:5 */
137 100, /* Code 2-4:6 */
138 99, /* Code 1-4:0 */
139 98, /* Code 1-4:1 */
140 97, /* Code 1-4:2 */
141 96, /* Code 1-4:3 */
142 95, /* Code 1-4:4 */
143 94, /* Code 1-4:5 */
144 93, /* Code 1-4:6 */
145 87, /* Code 2-3:0 */
146 86, /* Code 2-3:1 */
147 85, /* Code 2-3:2 */
148};
149
150/* GSM HR voiced (mode=1,2,3) frames - subjective importance bit ordering */
151 /* This array encode mapping between GSM 05.03 Table 3b (bits
152 * ordering before channel coding on TCH) and GSM 06.20 Table B.2
153 * (bit ordering on A-bis */
Diego Elio Pettenò23431c72012-06-29 13:01:27 -0700154const uint16_t gsm620_voiced_bitorder[112] = {
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +0200155 13, /* LPC 1:2 */
156 14, /* LPC 1:1 */
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +0200157 18, /* LPC 2:6 */
Sylvain Munauted8170a2013-03-01 16:35:46 +0100158 19, /* LPC 2:5 */
159 20, /* LPC 2:4 */
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +0200160 53, /* GSP 0-1:4 */
161 71, /* GSP 0-2:4 */
162 89, /* GSP 0-3:4 */
163 107, /* GSP 0-4:4 */
164 54, /* GSP 0-1:3 */
165 72, /* GSP 0-2:3 */
166 90, /* GSP 0-3:3 */
167 108, /* GSP 0-4:3 */
168 55, /* GSP 0-1:2 */
169 73, /* GSP 0-2:2 */
170 91, /* GSP 0-3:2 */
171 109, /* GSP 0-4:2 */
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +0200172 44, /* Code 1:8 */
Sylvain Munauted8170a2013-03-01 16:35:46 +0100173 45, /* Code 1:7 */
174 46, /* Code 1:6 */
175 47, /* Code 1:5 */
176 48, /* Code 1:4 */
177 49, /* Code 1:3 */
178 50, /* Code 1:2 */
179 51, /* Code 1:1 */
180 52, /* Code 1:0 */
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +0200181 62, /* Code 2:8 */
Sylvain Munauted8170a2013-03-01 16:35:46 +0100182 63, /* Code 2:7 */
183 64, /* Code 2:6 */
184 65, /* Code 2:5 */
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +0200185 68, /* Code 2:2 */
Sylvain Munauted8170a2013-03-01 16:35:46 +0100186 69, /* Code 2:1 */
187 70, /* Code 2:0 */
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +0200188 80, /* Code 3:8 */
189 66, /* Code 2:4 */
190 67, /* Code 2:3 */
191 56, /* GSP 0-1:1 */
192 74, /* GSP 0-2:1 */
193 92, /* GSP 0-3:1 */
194 110, /* GSP 0-4:1 */
195 57, /* GSP 0-1:0 */
196 75, /* GSP 0-2:0 */
197 93, /* GSP 0-3:0 */
198 111, /* GSP 0-4:0 */
199 33, /* INT-LPC:0 */
200 24, /* LPC 2:0 */
201 32, /* LPC 3:0 */
202 97, /* LAG 4:0 */
203 31, /* LPC 3:1 */
204 23, /* LPC 2:1 */
205 96, /* LAG 4:1 */
206 79, /* LAG 3:0 */
207 61, /* LAG 2:0 */
208 43, /* LAG 1:0 */
209 95, /* LAG 4:2 */
210 78, /* LAG 3:1 */
211 60, /* LAG 2:1 */
212 42, /* LAG 1:1 */
213 30, /* LPC 3:2 */
214 29, /* LPC 3:3 */
215 28, /* LPC 3:4 */
216 22, /* LPC 2:2 */
217 27, /* LPC 3:5 */
218 26, /* LPC 3:6 */
219 21, /* LPC 2:3 */
220 4, /* R0:0 */
221 25, /* LPC 3:7 */
222 15, /* LPC 1:0 */
223 94, /* LAG 4:3 */
224 77, /* LAG 3:2 */
225 59, /* LAG 2:2 */
226 41, /* LAG 1:2 */
227 3, /* R0:1 */
228 76, /* LAG 3:3 */
229 58, /* LAG 2:3 */
230 40, /* LAG 1:3 */
231 39, /* LAG 1:4 */
232 17, /* LPC 2:7 */
233 16, /* LPC 2:8 */
234 12, /* LPC 1:3 */
235 11, /* LPC 1:4 */
236 10, /* LPC 1:5 */
237 9, /* LPC 1:6 */
238 2, /* R0:2 */
239 38, /* LAG 1:5 */
240 37, /* LAG 1:6 */
241 36, /* LAG 1:7 */
242 8, /* LPC 1:7 */
243 7, /* LPC 1:8 */
244 6, /* LPC 1:9 */
245 5, /* LPC 1:10 */
246 1, /* R0:3 */
247 0, /* R0:4 */
248 35, /* Mode:0 */
249 34, /* Mode:1 */
250 106, /* Code 4:0 */
251 105, /* Code 4:1 */
252 104, /* Code 4:2 */
253 103, /* Code 4:3 */
254 102, /* Code 4:4 */
255 101, /* Code 4:5 */
256 100, /* Code 4:6 */
257 99, /* Code 4:7 */
258 98, /* Code 4:8 */
259 88, /* Code 3:0 */
260 87, /* Code 3:1 */
261 86, /* Code 3:2 */
262 85, /* Code 3:3 */
263 84, /* Code 3:4 */
264 83, /* Code 3:5 */
265 82, /* Code 3:6 */
266 81, /* Code 3:7 */
267};
Maxec8f1922016-05-31 14:50:21 +0200268
269static inline uint16_t mask(const uint8_t msb)
270{
271 const uint16_t m = (uint16_t)1 << (msb - 1);
272 return (m - 1) ^ m;
273}
274
275/*! \brief Check whether RTP frame contains HR SID code word according to
276 * TS 101 318 §5.2.2
277 * \param[in] rtp_payload Buffer with RTP payload
278 * \param[in] payload_len Length of payload
279 * \returns true if code word is found, false otherwise
280 */
Harald Welte6789ba32017-05-31 02:47:43 +0200281bool osmo_hr_check_sid(const uint8_t *rtp_payload, size_t payload_len)
Maxec8f1922016-05-31 14:50:21 +0200282{
283 uint8_t i, bits[] = { 1, 2, 8, 9, 5, 4, 9, 5, 4, 9, 5, 4, 9, 5 };
284 struct bitvec bv;
Harald Welte6789ba32017-05-31 02:47:43 +0200285 bv.data = (uint8_t *) rtp_payload;
Maxec8f1922016-05-31 14:50:21 +0200286 bv.data_len = payload_len;
287 bv.cur_bit = 33;
288
289 /* code word is all 1 at given bits, numbered from 1, MODE is always 3 */
290 for (i = 0; i < ARRAY_SIZE(bits); i++)
291 if (bitvec_get_uint(&bv, bits[i]) != mask(bits[i]))
292 return false;
293
294 return true;
295}