blob: cc6cdf0c9dce86986250af1bd63a33fe773fb6cc [file] [log] [blame]
Neels Hofmeyr17518fe2017-06-20 04:35:06 +02001/*! \file gsm690.c
2 * GSM 06.90 - GSM AMR Codec. */
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +02003/*
4 * (C) 2010 Sylvain Munaut <tnt@246tNt.com>
Harald Welte5785a4a2020-05-13 23:10:31 +02005 * (C) 2020 Harald Welte <laforge@gnumonks.org>
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +02006 *
7 * All Rights Reserved
8 *
Harald Weltee08da972017-11-13 01:00:26 +09009 * SPDX-License-Identifier: GPL-2.0+
10 *
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +020011 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License along
22 * with this program; if not, write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 *
25 */
26
27#include <stdint.h>
Max92db1502016-05-25 18:13:51 +020028#include <errno.h>
29#include <stdio.h>
30#include <stdlib.h>
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +020031
Max92db1502016-05-25 18:13:51 +020032#include <osmocom/core/utils.h>
Harald Welte5785a4a2020-05-13 23:10:31 +020033#include <osmocom/core/bits.h>
Max92db1502016-05-25 18:13:51 +020034#include <osmocom/codec/codec.h>
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +020035/*
36 * These table map between the raw encoder parameter output and
37 * the format used before channel coding. Both in GSM and in various
38 * file/network format (same tables used in several specs).
39 */
40
41/* AMR 12.2 kbits - subjective importance bit ordering */
42 /* This array encodes GSM 05.03 Table 7
43 * It's also TS 26.101 Table B.8
44 */
Diego Elio Pettenò23431c72012-06-29 13:01:27 -070045const uint16_t gsm690_12_2_bitorder[244] = {
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +020046 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
47 10, 11, 12, 13, 14, 23, 15, 16, 17, 18,
48 19, 20, 21, 22, 24, 25, 26, 27, 28, 38,
49 141, 39, 142, 40, 143, 41, 144, 42, 145, 43,
50 146, 44, 147, 45, 148, 46, 149, 47, 97, 150,
51 200, 48, 98, 151, 201, 49, 99, 152, 202, 86,
52 136, 189, 239, 87, 137, 190, 240, 88, 138, 191,
53 241, 91, 194, 92, 195, 93, 196, 94, 197, 95,
54 198, 29, 30, 31, 32, 33, 34, 35, 50, 100,
55 153, 203, 89, 139, 192, 242, 51, 101, 154, 204,
56 55, 105, 158, 208, 90, 140, 193, 243, 59, 109,
57 162, 212, 63, 113, 166, 216, 67, 117, 170, 220,
58 36, 37, 54, 53, 52, 58, 57, 56, 62, 61,
59 60, 66, 65, 64, 70, 69, 68, 104, 103, 102,
60 108, 107, 106, 112, 111, 110, 116, 115, 114, 120,
61 119, 118, 157, 156, 155, 161, 160, 159, 165, 164,
62 163, 169, 168, 167, 173, 172, 171, 207, 206, 205,
63 211, 210, 209, 215, 214, 213, 219, 218, 217, 223,
64 222, 221, 73, 72, 71, 76, 75, 74, 79, 78,
65 77, 82, 81, 80, 85, 84, 83, 123, 122, 121,
66 126, 125, 124, 129, 128, 127, 132, 131, 130, 135,
67 134, 133, 176, 175, 174, 179, 178, 177, 182, 181,
68 180, 185, 184, 183, 188, 187, 186, 226, 225, 224,
69 229, 228, 227, 232, 231, 230, 235, 234, 233, 238,
70 237, 236, 96, 199,
71};
72
73/* AMR 10.2 kbits - subjective importance bit ordering */
74 /* This array encodes GSM 05.03 Table 8
75 * It's also TS 26.101 Table B.7
76 */
Diego Elio Pettenò23431c72012-06-29 13:01:27 -070077const uint16_t gsm690_10_2_bitorder[204] = {
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +020078 7, 6, 5, 4, 3, 2, 1, 0, 16, 15,
79 14, 13, 12, 11, 10, 9, 8, 26, 27, 28,
80 29, 30, 31, 115, 116, 117, 118, 119, 120, 72,
81 73, 161, 162, 65, 68, 69, 108, 111, 112, 154,
82 157, 158, 197, 200, 201, 32, 33, 121, 122, 74,
83 75, 163, 164, 66, 109, 155, 198, 19, 23, 21,
84 22, 18, 17, 20, 24, 25, 37, 36, 35, 34,
85 80, 79, 78, 77, 126, 125, 124, 123, 169, 168,
86 167, 166, 70, 67, 71, 113, 110, 114, 159, 156,
87 160, 202, 199, 203, 76, 165, 81, 82, 92, 91,
88 93, 83, 95, 85, 84, 94, 101, 102, 96, 104,
89 86, 103, 87, 97, 127, 128, 138, 137, 139, 129,
90 141, 131, 130, 140, 147, 148, 142, 150, 132, 149,
91 133, 143, 170, 171, 181, 180, 182, 172, 184, 174,
92 173, 183, 190, 191, 185, 193, 175, 192, 176, 186,
93 38, 39, 49, 48, 50, 40, 52, 42, 41, 51,
94 58, 59, 53, 61, 43, 60, 44, 54, 194, 179,
95 189, 196, 177, 195, 178, 187, 188, 151, 136, 146,
96 153, 134, 152, 135, 144, 145, 105, 90, 100, 107,
97 88, 106, 89, 98, 99, 62, 47, 57, 64, 45,
98 63, 46, 55, 56,
99};
100
101/* AMR 7.95 kbits - subjective importance bit ordering */
102 /* This array encodes GSM 05.03 Table 9
103 * It's also TS 26.101 Table B.6
104 */
Diego Elio Pettenò23431c72012-06-29 13:01:27 -0700105const uint16_t gsm690_7_95_bitorder[159] = {
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +0200106 8, 7, 6, 5, 4, 3, 2, 14, 16, 9,
107 10, 12, 13, 15, 11, 17, 20, 22, 24, 23,
108 19, 18, 21, 56, 88, 122, 154, 57, 89, 123,
109 155, 58, 90, 124, 156, 52, 84, 118, 150, 53,
110 85, 119, 151, 27, 93, 28, 94, 29, 95, 30,
111 96, 31, 97, 61, 127, 62, 128, 63, 129, 59,
112 91, 125, 157, 32, 98, 64, 130, 1, 0, 25,
113 26, 33, 99, 34, 100, 65, 131, 66, 132, 54,
114 86, 120, 152, 60, 92, 126, 158, 55, 87, 121,
115 153, 117, 116, 115, 46, 78, 112, 144, 43, 75,
116 109, 141, 40, 72, 106, 138, 36, 68, 102, 134,
117 114, 149, 148, 147, 146, 83, 82, 81, 80, 51,
118 50, 49, 48, 47, 45, 44, 42, 39, 35, 79,
119 77, 76, 74, 71, 67, 113, 111, 110, 108, 105,
120 101, 145, 143, 142, 140, 137, 133, 41, 73, 107,
121 139, 37, 69, 103, 135, 38, 70, 104, 136,
122};
123
124/* AMR 7.4 kbits - subjective importance bit ordering */
125 /* This array encodes GSM 05.03 Table 10
126 * It's also TS 26.101 Table B.5
127 */
Diego Elio Pettenò23431c72012-06-29 13:01:27 -0700128const uint16_t gsm690_7_4_bitorder[148] = {
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +0200129 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
130 10, 11, 12, 13, 14, 15, 16, 26, 87, 27,
131 88, 28, 89, 29, 90, 30, 91, 51, 80, 112,
132 141, 52, 81, 113, 142, 54, 83, 115, 144, 55,
133 84, 116, 145, 58, 119, 59, 120, 21, 22, 23,
134 17, 18, 19, 31, 60, 92, 121, 56, 85, 117,
135 146, 20, 24, 25, 50, 79, 111, 140, 57, 86,
136 118, 147, 49, 78, 110, 139, 48, 77, 53, 82,
137 114, 143, 109, 138, 47, 76, 108, 137, 32, 33,
138 61, 62, 93, 94, 122, 123, 41, 42, 43, 44,
139 45, 46, 70, 71, 72, 73, 74, 75, 102, 103,
140 104, 105, 106, 107, 131, 132, 133, 134, 135, 136,
141 34, 63, 95, 124, 35, 64, 96, 125, 36, 65,
142 97, 126, 37, 66, 98, 127, 38, 67, 99, 128,
143 39, 68, 100, 129, 40, 69, 101, 130,
144};
145
146/* AMR 6.7 kbits - subjective importance bit ordering */
147 /* This array encodes GSM 05.03 Table 11
148 * It's also TS 26.101 Table B.4
149 */
Diego Elio Pettenò23431c72012-06-29 13:01:27 -0700150const uint16_t gsm690_6_7_bitorder[134] = {
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +0200151 0, 1, 4, 3, 5, 6, 13, 7, 2, 8,
152 9, 11, 15, 12, 14, 10, 28, 82, 29, 83,
153 27, 81, 26, 80, 30, 84, 16, 55, 109, 56,
154 110, 31, 85, 57, 111, 48, 73, 102, 127, 32,
155 86, 51, 76, 105, 130, 52, 77, 106, 131, 58,
156 112, 33, 87, 19, 23, 53, 78, 107, 132, 21,
157 22, 18, 17, 20, 24, 25, 50, 75, 104, 129,
158 47, 72, 101, 126, 54, 79, 108, 133, 46, 71,
159 100, 125, 128, 103, 74, 49, 45, 70, 99, 124,
160 42, 67, 96, 121, 39, 64, 93, 118, 38, 63,
161 92, 117, 35, 60, 89, 114, 34, 59, 88, 113,
162 44, 69, 98, 123, 43, 68, 97, 122, 41, 66,
163 95, 120, 40, 65, 94, 119, 37, 62, 91, 116,
164 36, 61, 90, 115,
165};
166
167/* AMR 5.9 kbits - subjective importance bit ordering */
168 /* This array encodes GSM 05.03 Table 12
169 * It's also TS 26.101 Table B.3
170 */
Diego Elio Pettenò23431c72012-06-29 13:01:27 -0700171const uint16_t gsm690_5_9_bitorder[118] = {
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +0200172 0, 1, 4, 5, 3, 6, 7, 2, 13, 15,
173 8, 9, 11, 12, 14, 10, 16, 28, 74, 29,
174 75, 27, 73, 26, 72, 30, 76, 51, 97, 50,
175 71, 96, 117, 31, 77, 52, 98, 49, 70, 95,
176 116, 53, 99, 32, 78, 33, 79, 48, 69, 94,
177 115, 47, 68, 93, 114, 46, 67, 92, 113, 19,
178 21, 23, 22, 18, 17, 20, 24, 111, 43, 89,
179 110, 64, 65, 44, 90, 25, 45, 66, 91, 112,
180 54, 100, 40, 61, 86, 107, 39, 60, 85, 106,
181 36, 57, 82, 103, 35, 56, 81, 102, 34, 55,
182 80, 101, 42, 63, 88, 109, 41, 62, 87, 108,
183 38, 59, 84, 105, 37, 58, 83, 104,
184};
185
186/* AMR 5.15 kbits - subjective importance bit ordering */
187 /* This array encodes GSM 05.03 Table 13
188 * It's also TS 26.101 Table B.2
189 */
Diego Elio Pettenò23431c72012-06-29 13:01:27 -0700190const uint16_t gsm690_5_15_bitorder[103] = {
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +0200191 7, 6, 5, 4, 3, 2, 1, 0, 15, 14,
192 13, 12, 11, 10, 9, 8, 23, 24, 25, 26,
193 27, 46, 65, 84, 45, 44, 43, 64, 63, 62,
194 83, 82, 81, 102, 101, 100, 42, 61, 80, 99,
195 28, 47, 66, 85, 18, 41, 60, 79, 98, 29,
196 48, 67, 17, 20, 22, 40, 59, 78, 97, 21,
197 30, 49, 68, 86, 19, 16, 87, 39, 38, 58,
198 57, 77, 35, 54, 73, 92, 76, 96, 95, 36,
199 55, 74, 93, 32, 51, 33, 52, 70, 71, 89,
200 90, 31, 50, 69, 88, 37, 56, 75, 94, 34,
201 53, 72, 91,
202};
203
204/* AMR 4.75 kbits - subjective importance bit ordering */
205 /* This array encodes GSM 05.03 Table 14
206 * It's also TS 26.101 Table B.1
207 */
Diego Elio Pettenò23431c72012-06-29 13:01:27 -0700208const uint16_t gsm690_4_75_bitorder[95] = {
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +0200209 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
210 10, 11, 12, 13, 14, 15, 23, 24, 25, 26,
211 27, 28, 48, 49, 61, 62, 82, 83, 47, 46,
212 45, 44, 81, 80, 79, 78, 17, 18, 20, 22,
213 77, 76, 75, 74, 29, 30, 43, 42, 41, 40,
214 38, 39, 16, 19, 21, 50, 51, 59, 60, 63,
215 64, 72, 73, 84, 85, 93, 94, 32, 33, 35,
216 36, 53, 54, 56, 57, 66, 67, 69, 70, 87,
217 88, 90, 91, 34, 55, 68, 89, 37, 58, 71,
218 92, 31, 52, 65, 86,
219};
Max92db1502016-05-25 18:13:51 +0200220
Harald Welte5785a4a2020-05-13 23:10:31 +0200221/*! These constants refer to the length of one "AMR core frame" as per
222 * TS 26.101 Section 4.2.2 / Table 2. */
223const uint8_t gsm690_bitlength[AMR_NO_DATA+1] = {
224 [AMR_4_75] = 95,
225 [AMR_5_15] = 103,
226 [AMR_5_90] = 118,
227 [AMR_6_70] = 134,
228 [AMR_7_40] = 148,
229 [AMR_7_95] = 159,
230 [AMR_10_2] = 204,
231 [AMR_12_2] = 244,
232 [AMR_SID] = 39,
233};
234
235struct ts26101_reorder_table {
236 /*! Table as per TS 26.101 Annex B to compute d-bits from s-bits */
237 const uint16_t *s_to_d;
238 /*! size of table */
239 uint8_t len;
240};
241
242static const struct ts26101_reorder_table ts26101_reorder_tables[8] = {
243 [AMR_4_75] = {
244 .s_to_d = gsm690_4_75_bitorder,
245 .len = ARRAY_SIZE(gsm690_4_75_bitorder),
246 },
247 [AMR_5_15] = {
248 .s_to_d = gsm690_5_15_bitorder,
249 .len = ARRAY_SIZE(gsm690_5_15_bitorder),
250 },
251 [AMR_5_90] = {
252 .s_to_d = gsm690_5_9_bitorder,
253 .len = ARRAY_SIZE(gsm690_5_9_bitorder),
254 },
255 [AMR_6_70] = {
256 .s_to_d = gsm690_6_7_bitorder,
257 .len = ARRAY_SIZE(gsm690_6_7_bitorder),
258 },
259 [AMR_7_40] = {
260 .s_to_d = gsm690_7_4_bitorder,
261 .len = ARRAY_SIZE(gsm690_7_4_bitorder),
262 },
263 [AMR_7_95] = {
264 .s_to_d = gsm690_7_95_bitorder,
265 .len = ARRAY_SIZE(gsm690_7_95_bitorder),
266 },
267 [AMR_10_2] = {
268 .s_to_d = gsm690_10_2_bitorder,
269 .len = ARRAY_SIZE(gsm690_10_2_bitorder),
270 },
271 [AMR_12_2] = {
272 .s_to_d = gsm690_12_2_bitorder,
273 .len = ARRAY_SIZE(gsm690_12_2_bitorder),
274 },
275};
276
277/*! Convert from S-bits (codec output) to d-bits.
278 * \param[out] out user-provided output buffer for generated unpacked d-bits
279 * \param[in] in input buffer for unpacked s-bits
280 * \param[in] n_bits number of bits (in both in and out)
281 * \param[in] AMR mode (0..7) */
282int osmo_amr_s_to_d(ubit_t *out, const ubit_t *in, uint16_t n_bits, enum osmo_amr_type amr_mode)
283{
284 const struct ts26101_reorder_table *tbl;
285 int i;
286
287 if (amr_mode >= ARRAY_SIZE(ts26101_reorder_tables))
288 return -ENODEV;
289
290 tbl = &ts26101_reorder_tables[amr_mode];
291
292 if (n_bits > tbl->len)
293 return -EINVAL;
294
295 for (i = 0; i < n_bits; i++) {
296 uint16_t n = tbl->s_to_d[i];
297 out[i] = in[n];
298 }
299
300 return n_bits;
301}
302
303/*! Convert from d-bits to s-bits (codec input).
304 * \param[out] out user-provided output buffer for generated unpacked s-bits
305 * \param[in] in input buffer for unpacked d-bits
306 * \param[in] n_bits number of bits (in both in and out)
307 * \param[in] AMR mode (0..7) */
308int osmo_amr_d_to_s(ubit_t *out, const ubit_t *in, uint16_t n_bits, enum osmo_amr_type amr_mode)
309{
310 const struct ts26101_reorder_table *tbl;
311 int i;
312
313 if (amr_mode >= ARRAY_SIZE(ts26101_reorder_tables))
314 return -ENODEV;
315
316 tbl = &ts26101_reorder_tables[amr_mode];
317
318 if (n_bits > tbl->len)
319 return -EINVAL;
320
321 for (i = 0; i < n_bits; i++) {
322 uint16_t n = tbl->s_to_d[i];
323 out[n] = in[i];
324 }
325
326 return n_bits;
327}
328
Philipp Maier3a5917b2020-03-12 13:22:53 +0100329/* See also RFC 4867 §3.6, Table 1, Column "Total speech bits" */
Max92db1502016-05-25 18:13:51 +0200330static const uint8_t amr_len_by_ft[16] = {
Philipp Maier3a5917b2020-03-12 13:22:53 +0100331 12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0
Max92db1502016-05-25 18:13:51 +0200332};
333
334const struct value_string osmo_amr_type_names[] = {
335 { AMR_4_75, "AMR 4,75 kbits/s" },
336 { AMR_5_15, "AMR 5,15 kbit/s" },
337 { AMR_5_90, "AMR 5,90 kbit/s" },
338 { AMR_6_70, "AMR 6,70 kbit/s (PDC-EFR)" },
339 { AMR_7_40, "AMR 7,40 kbit/s (TDMA-EFR)" },
340 { AMR_7_95, "AMR 7,95 kbit/s" },
341 { AMR_10_2, "AMR 10,2 kbit/s" },
342 { AMR_12_2, "AMR 12,2 kbit/s (GSM-EFR)" },
343 { AMR_SID, "AMR SID" },
344 { AMR_GSM_EFR_SID, "GSM-EFR SID" },
345 { AMR_TDMA_EFR_SID, "TDMA-EFR SID" },
346 { AMR_PDC_EFR_SID, "PDC-EFR SID" },
347 { AMR_NO_DATA, "No Data/NA" },
348 { 0, NULL },
349};
350
Neels Hofmeyr87e45502017-06-20 00:17:59 +0200351/*! Decode various AMR parameters from RTP payload (RFC 4867) acording to
Max92db1502016-05-25 18:13:51 +0200352 * 3GPP TS 26.101
353 * \param[in] rtppayload Payload from RTP packet
354 * \param[in] payload_len length of rtppayload
355 * \param[out] cmr AMR Codec Mode Request, not filled if NULL
356 * \param[out] cmi AMR Codec Mode Indicator, -1 if not applicable for this type,
357 * not filled if NULL
358 * \param[out] ft AMR Frame Type, not filled if NULL
359 * \param[out] bfi AMR Bad Frame Indicator, not filled if NULL
360 * \param[out] sti AMR SID Type Indicator, -1 if not applicable for this type,
361 * not filled if NULL
362 * \returns length of AMR data or negative value on error
363 */
364int osmo_amr_rtp_dec(const uint8_t *rtppayload, int payload_len, uint8_t *cmr,
365 int8_t *cmi, enum osmo_amr_type *ft,
366 enum osmo_amr_quality *bfi, int8_t *sti)
367{
Maxe9e5f8e2016-11-07 14:49:13 +0100368 if (payload_len < 2 || !rtppayload)
369 return -EINVAL;
370
Max92db1502016-05-25 18:13:51 +0200371 /* RFC 4867 § 4.4.2 ToC - compound payloads are not supported: F = 0 */
372 uint8_t type = (rtppayload[1] >> 3) & 0xf;
373
374 /* compound payloads are not supported */
375 if (rtppayload[1] >> 7)
376 return -ENOTSUP;
377
Jean-Francois Dionned02c8af2017-01-10 10:23:56 +0100378 if (payload_len < amr_len_by_ft[type])
Max92db1502016-05-25 18:13:51 +0200379 return -ENOTSUP;
380
Max92db1502016-05-25 18:13:51 +0200381 if (ft)
382 *ft = type;
383
384 if (cmr)
385 *cmr = rtppayload[0] >> 4;
386
387 if (bfi)
388 *bfi = (rtppayload[1] >> 2) & 1;
389
390 /* Table 6 in 3GPP TS 26.101 */
391 if (cmi)
392 *cmi = (type == AMR_SID) ? ((rtppayload[6] >> 1) & 7) : -1;
393
394 if (sti)
395 *sti = (type == AMR_SID) ? (rtppayload[6] & 0x10) : -1;
396
397 return 2 + amr_len_by_ft[type];
398}
399
Neels Hofmeyr87e45502017-06-20 00:17:59 +0200400/*! Encode various AMR parameters from RTP payload (RFC 4867)
Max92db1502016-05-25 18:13:51 +0200401 * \param[out] payload Payload for RTP packet, contains speech data (if any)
402 * except for have 2 first bytes where header will be built
403 * \param[in] cmr AMR codec Mode Request
404 * \param[in] ft AMR Frame Type
405 * \param[in] bfi AMR Bad Frame Indicator
406 * \returns length of AMR data (header + ToC + speech data) or negative value
407 * on error
408 *
409 * Note: only octet-aligned mode is supported so the header occupies 2 full
410 * bytes. Optional interleaving header is not supported.
411 */
412int osmo_amr_rtp_enc(uint8_t *payload, uint8_t cmr, enum osmo_amr_type ft,
413 enum osmo_amr_quality bfi)
414{
415 if (cmr > 15)
416 return -EINVAL;
417
418 if (ft > 15)
419 return -ENOTSUP;
420
421 /* RFC 4867 § 4.3.1 payload header */
422 payload[0] = cmr << 4;
423
424 /* RFC 4867 § 4.4.2 ToC - compound payloads are not supported: F = 0 */
425 payload[1] = (((uint8_t)ft) << 3) | (((uint8_t)bfi) << 2);
426
427 /* speech data */
428 return 2 + amr_len_by_ft[ft];
429}