blob: 8ab1df12d91d64dc94fc0b5d2b4cb5d1492b416e [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>
5 *
6 * All Rights Reserved
7 *
Harald Weltee08da972017-11-13 01:00:26 +09008 * SPDX-License-Identifier: GPL-2.0+
9 *
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +020010 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License along
21 * with this program; if not, write to the Free Software Foundation, Inc.,
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
23 *
24 */
25
26#include <stdint.h>
Max92db1502016-05-25 18:13:51 +020027#include <errno.h>
28#include <stdio.h>
29#include <stdlib.h>
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +020030
Max92db1502016-05-25 18:13:51 +020031#include <osmocom/core/utils.h>
32#include <osmocom/codec/codec.h>
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +020033/*
34 * These table map between the raw encoder parameter output and
35 * the format used before channel coding. Both in GSM and in various
36 * file/network format (same tables used in several specs).
37 */
38
39/* AMR 12.2 kbits - subjective importance bit ordering */
40 /* This array encodes GSM 05.03 Table 7
41 * It's also TS 26.101 Table B.8
42 */
Diego Elio Pettenò23431c72012-06-29 13:01:27 -070043const uint16_t gsm690_12_2_bitorder[244] = {
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +020044 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
45 10, 11, 12, 13, 14, 23, 15, 16, 17, 18,
46 19, 20, 21, 22, 24, 25, 26, 27, 28, 38,
47 141, 39, 142, 40, 143, 41, 144, 42, 145, 43,
48 146, 44, 147, 45, 148, 46, 149, 47, 97, 150,
49 200, 48, 98, 151, 201, 49, 99, 152, 202, 86,
50 136, 189, 239, 87, 137, 190, 240, 88, 138, 191,
51 241, 91, 194, 92, 195, 93, 196, 94, 197, 95,
52 198, 29, 30, 31, 32, 33, 34, 35, 50, 100,
53 153, 203, 89, 139, 192, 242, 51, 101, 154, 204,
54 55, 105, 158, 208, 90, 140, 193, 243, 59, 109,
55 162, 212, 63, 113, 166, 216, 67, 117, 170, 220,
56 36, 37, 54, 53, 52, 58, 57, 56, 62, 61,
57 60, 66, 65, 64, 70, 69, 68, 104, 103, 102,
58 108, 107, 106, 112, 111, 110, 116, 115, 114, 120,
59 119, 118, 157, 156, 155, 161, 160, 159, 165, 164,
60 163, 169, 168, 167, 173, 172, 171, 207, 206, 205,
61 211, 210, 209, 215, 214, 213, 219, 218, 217, 223,
62 222, 221, 73, 72, 71, 76, 75, 74, 79, 78,
63 77, 82, 81, 80, 85, 84, 83, 123, 122, 121,
64 126, 125, 124, 129, 128, 127, 132, 131, 130, 135,
65 134, 133, 176, 175, 174, 179, 178, 177, 182, 181,
66 180, 185, 184, 183, 188, 187, 186, 226, 225, 224,
67 229, 228, 227, 232, 231, 230, 235, 234, 233, 238,
68 237, 236, 96, 199,
69};
70
71/* AMR 10.2 kbits - subjective importance bit ordering */
72 /* This array encodes GSM 05.03 Table 8
73 * It's also TS 26.101 Table B.7
74 */
Diego Elio Pettenò23431c72012-06-29 13:01:27 -070075const uint16_t gsm690_10_2_bitorder[204] = {
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +020076 7, 6, 5, 4, 3, 2, 1, 0, 16, 15,
77 14, 13, 12, 11, 10, 9, 8, 26, 27, 28,
78 29, 30, 31, 115, 116, 117, 118, 119, 120, 72,
79 73, 161, 162, 65, 68, 69, 108, 111, 112, 154,
80 157, 158, 197, 200, 201, 32, 33, 121, 122, 74,
81 75, 163, 164, 66, 109, 155, 198, 19, 23, 21,
82 22, 18, 17, 20, 24, 25, 37, 36, 35, 34,
83 80, 79, 78, 77, 126, 125, 124, 123, 169, 168,
84 167, 166, 70, 67, 71, 113, 110, 114, 159, 156,
85 160, 202, 199, 203, 76, 165, 81, 82, 92, 91,
86 93, 83, 95, 85, 84, 94, 101, 102, 96, 104,
87 86, 103, 87, 97, 127, 128, 138, 137, 139, 129,
88 141, 131, 130, 140, 147, 148, 142, 150, 132, 149,
89 133, 143, 170, 171, 181, 180, 182, 172, 184, 174,
90 173, 183, 190, 191, 185, 193, 175, 192, 176, 186,
91 38, 39, 49, 48, 50, 40, 52, 42, 41, 51,
92 58, 59, 53, 61, 43, 60, 44, 54, 194, 179,
93 189, 196, 177, 195, 178, 187, 188, 151, 136, 146,
94 153, 134, 152, 135, 144, 145, 105, 90, 100, 107,
95 88, 106, 89, 98, 99, 62, 47, 57, 64, 45,
96 63, 46, 55, 56,
97};
98
99/* AMR 7.95 kbits - subjective importance bit ordering */
100 /* This array encodes GSM 05.03 Table 9
101 * It's also TS 26.101 Table B.6
102 */
Diego Elio Pettenò23431c72012-06-29 13:01:27 -0700103const uint16_t gsm690_7_95_bitorder[159] = {
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +0200104 8, 7, 6, 5, 4, 3, 2, 14, 16, 9,
105 10, 12, 13, 15, 11, 17, 20, 22, 24, 23,
106 19, 18, 21, 56, 88, 122, 154, 57, 89, 123,
107 155, 58, 90, 124, 156, 52, 84, 118, 150, 53,
108 85, 119, 151, 27, 93, 28, 94, 29, 95, 30,
109 96, 31, 97, 61, 127, 62, 128, 63, 129, 59,
110 91, 125, 157, 32, 98, 64, 130, 1, 0, 25,
111 26, 33, 99, 34, 100, 65, 131, 66, 132, 54,
112 86, 120, 152, 60, 92, 126, 158, 55, 87, 121,
113 153, 117, 116, 115, 46, 78, 112, 144, 43, 75,
114 109, 141, 40, 72, 106, 138, 36, 68, 102, 134,
115 114, 149, 148, 147, 146, 83, 82, 81, 80, 51,
116 50, 49, 48, 47, 45, 44, 42, 39, 35, 79,
117 77, 76, 74, 71, 67, 113, 111, 110, 108, 105,
118 101, 145, 143, 142, 140, 137, 133, 41, 73, 107,
119 139, 37, 69, 103, 135, 38, 70, 104, 136,
120};
121
122/* AMR 7.4 kbits - subjective importance bit ordering */
123 /* This array encodes GSM 05.03 Table 10
124 * It's also TS 26.101 Table B.5
125 */
Diego Elio Pettenò23431c72012-06-29 13:01:27 -0700126const uint16_t gsm690_7_4_bitorder[148] = {
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +0200127 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
128 10, 11, 12, 13, 14, 15, 16, 26, 87, 27,
129 88, 28, 89, 29, 90, 30, 91, 51, 80, 112,
130 141, 52, 81, 113, 142, 54, 83, 115, 144, 55,
131 84, 116, 145, 58, 119, 59, 120, 21, 22, 23,
132 17, 18, 19, 31, 60, 92, 121, 56, 85, 117,
133 146, 20, 24, 25, 50, 79, 111, 140, 57, 86,
134 118, 147, 49, 78, 110, 139, 48, 77, 53, 82,
135 114, 143, 109, 138, 47, 76, 108, 137, 32, 33,
136 61, 62, 93, 94, 122, 123, 41, 42, 43, 44,
137 45, 46, 70, 71, 72, 73, 74, 75, 102, 103,
138 104, 105, 106, 107, 131, 132, 133, 134, 135, 136,
139 34, 63, 95, 124, 35, 64, 96, 125, 36, 65,
140 97, 126, 37, 66, 98, 127, 38, 67, 99, 128,
141 39, 68, 100, 129, 40, 69, 101, 130,
142};
143
144/* AMR 6.7 kbits - subjective importance bit ordering */
145 /* This array encodes GSM 05.03 Table 11
146 * It's also TS 26.101 Table B.4
147 */
Diego Elio Pettenò23431c72012-06-29 13:01:27 -0700148const uint16_t gsm690_6_7_bitorder[134] = {
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +0200149 0, 1, 4, 3, 5, 6, 13, 7, 2, 8,
150 9, 11, 15, 12, 14, 10, 28, 82, 29, 83,
151 27, 81, 26, 80, 30, 84, 16, 55, 109, 56,
152 110, 31, 85, 57, 111, 48, 73, 102, 127, 32,
153 86, 51, 76, 105, 130, 52, 77, 106, 131, 58,
154 112, 33, 87, 19, 23, 53, 78, 107, 132, 21,
155 22, 18, 17, 20, 24, 25, 50, 75, 104, 129,
156 47, 72, 101, 126, 54, 79, 108, 133, 46, 71,
157 100, 125, 128, 103, 74, 49, 45, 70, 99, 124,
158 42, 67, 96, 121, 39, 64, 93, 118, 38, 63,
159 92, 117, 35, 60, 89, 114, 34, 59, 88, 113,
160 44, 69, 98, 123, 43, 68, 97, 122, 41, 66,
161 95, 120, 40, 65, 94, 119, 37, 62, 91, 116,
162 36, 61, 90, 115,
163};
164
165/* AMR 5.9 kbits - subjective importance bit ordering */
166 /* This array encodes GSM 05.03 Table 12
167 * It's also TS 26.101 Table B.3
168 */
Diego Elio Pettenò23431c72012-06-29 13:01:27 -0700169const uint16_t gsm690_5_9_bitorder[118] = {
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +0200170 0, 1, 4, 5, 3, 6, 7, 2, 13, 15,
171 8, 9, 11, 12, 14, 10, 16, 28, 74, 29,
172 75, 27, 73, 26, 72, 30, 76, 51, 97, 50,
173 71, 96, 117, 31, 77, 52, 98, 49, 70, 95,
174 116, 53, 99, 32, 78, 33, 79, 48, 69, 94,
175 115, 47, 68, 93, 114, 46, 67, 92, 113, 19,
176 21, 23, 22, 18, 17, 20, 24, 111, 43, 89,
177 110, 64, 65, 44, 90, 25, 45, 66, 91, 112,
178 54, 100, 40, 61, 86, 107, 39, 60, 85, 106,
179 36, 57, 82, 103, 35, 56, 81, 102, 34, 55,
180 80, 101, 42, 63, 88, 109, 41, 62, 87, 108,
181 38, 59, 84, 105, 37, 58, 83, 104,
182};
183
184/* AMR 5.15 kbits - subjective importance bit ordering */
185 /* This array encodes GSM 05.03 Table 13
186 * It's also TS 26.101 Table B.2
187 */
Diego Elio Pettenò23431c72012-06-29 13:01:27 -0700188const uint16_t gsm690_5_15_bitorder[103] = {
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +0200189 7, 6, 5, 4, 3, 2, 1, 0, 15, 14,
190 13, 12, 11, 10, 9, 8, 23, 24, 25, 26,
191 27, 46, 65, 84, 45, 44, 43, 64, 63, 62,
192 83, 82, 81, 102, 101, 100, 42, 61, 80, 99,
193 28, 47, 66, 85, 18, 41, 60, 79, 98, 29,
194 48, 67, 17, 20, 22, 40, 59, 78, 97, 21,
195 30, 49, 68, 86, 19, 16, 87, 39, 38, 58,
196 57, 77, 35, 54, 73, 92, 76, 96, 95, 36,
197 55, 74, 93, 32, 51, 33, 52, 70, 71, 89,
198 90, 31, 50, 69, 88, 37, 56, 75, 94, 34,
199 53, 72, 91,
200};
201
202/* AMR 4.75 kbits - subjective importance bit ordering */
203 /* This array encodes GSM 05.03 Table 14
204 * It's also TS 26.101 Table B.1
205 */
Diego Elio Pettenò23431c72012-06-29 13:01:27 -0700206const uint16_t gsm690_4_75_bitorder[95] = {
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +0200207 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
208 10, 11, 12, 13, 14, 15, 23, 24, 25, 26,
209 27, 28, 48, 49, 61, 62, 82, 83, 47, 46,
210 45, 44, 81, 80, 79, 78, 17, 18, 20, 22,
211 77, 76, 75, 74, 29, 30, 43, 42, 41, 40,
212 38, 39, 16, 19, 21, 50, 51, 59, 60, 63,
213 64, 72, 73, 84, 85, 93, 94, 32, 33, 35,
214 36, 53, 54, 56, 57, 66, 67, 69, 70, 87,
215 88, 90, 91, 34, 55, 68, 89, 37, 58, 71,
216 92, 31, 52, 65, 86,
217};
Max92db1502016-05-25 18:13:51 +0200218
Philipp Maier3a5917b2020-03-12 13:22:53 +0100219/* See also RFC 4867 §3.6, Table 1, Column "Total speech bits" */
Max92db1502016-05-25 18:13:51 +0200220static const uint8_t amr_len_by_ft[16] = {
Philipp Maier3a5917b2020-03-12 13:22:53 +0100221 12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0
Max92db1502016-05-25 18:13:51 +0200222};
223
224const struct value_string osmo_amr_type_names[] = {
225 { AMR_4_75, "AMR 4,75 kbits/s" },
226 { AMR_5_15, "AMR 5,15 kbit/s" },
227 { AMR_5_90, "AMR 5,90 kbit/s" },
228 { AMR_6_70, "AMR 6,70 kbit/s (PDC-EFR)" },
229 { AMR_7_40, "AMR 7,40 kbit/s (TDMA-EFR)" },
230 { AMR_7_95, "AMR 7,95 kbit/s" },
231 { AMR_10_2, "AMR 10,2 kbit/s" },
232 { AMR_12_2, "AMR 12,2 kbit/s (GSM-EFR)" },
233 { AMR_SID, "AMR SID" },
234 { AMR_GSM_EFR_SID, "GSM-EFR SID" },
235 { AMR_TDMA_EFR_SID, "TDMA-EFR SID" },
236 { AMR_PDC_EFR_SID, "PDC-EFR SID" },
237 { AMR_NO_DATA, "No Data/NA" },
238 { 0, NULL },
239};
240
Neels Hofmeyr87e45502017-06-20 00:17:59 +0200241/*! Decode various AMR parameters from RTP payload (RFC 4867) acording to
Max92db1502016-05-25 18:13:51 +0200242 * 3GPP TS 26.101
243 * \param[in] rtppayload Payload from RTP packet
244 * \param[in] payload_len length of rtppayload
245 * \param[out] cmr AMR Codec Mode Request, not filled if NULL
246 * \param[out] cmi AMR Codec Mode Indicator, -1 if not applicable for this type,
247 * not filled if NULL
248 * \param[out] ft AMR Frame Type, not filled if NULL
249 * \param[out] bfi AMR Bad Frame Indicator, not filled if NULL
250 * \param[out] sti AMR SID Type Indicator, -1 if not applicable for this type,
251 * not filled if NULL
252 * \returns length of AMR data or negative value on error
253 */
254int osmo_amr_rtp_dec(const uint8_t *rtppayload, int payload_len, uint8_t *cmr,
255 int8_t *cmi, enum osmo_amr_type *ft,
256 enum osmo_amr_quality *bfi, int8_t *sti)
257{
Maxe9e5f8e2016-11-07 14:49:13 +0100258 if (payload_len < 2 || !rtppayload)
259 return -EINVAL;
260
Max92db1502016-05-25 18:13:51 +0200261 /* RFC 4867 § 4.4.2 ToC - compound payloads are not supported: F = 0 */
262 uint8_t type = (rtppayload[1] >> 3) & 0xf;
263
264 /* compound payloads are not supported */
265 if (rtppayload[1] >> 7)
266 return -ENOTSUP;
267
Jean-Francois Dionned02c8af2017-01-10 10:23:56 +0100268 if (payload_len < amr_len_by_ft[type])
Max92db1502016-05-25 18:13:51 +0200269 return -ENOTSUP;
270
Max92db1502016-05-25 18:13:51 +0200271 if (ft)
272 *ft = type;
273
274 if (cmr)
275 *cmr = rtppayload[0] >> 4;
276
277 if (bfi)
278 *bfi = (rtppayload[1] >> 2) & 1;
279
280 /* Table 6 in 3GPP TS 26.101 */
281 if (cmi)
282 *cmi = (type == AMR_SID) ? ((rtppayload[6] >> 1) & 7) : -1;
283
284 if (sti)
285 *sti = (type == AMR_SID) ? (rtppayload[6] & 0x10) : -1;
286
287 return 2 + amr_len_by_ft[type];
288}
289
Neels Hofmeyr87e45502017-06-20 00:17:59 +0200290/*! Encode various AMR parameters from RTP payload (RFC 4867)
Max92db1502016-05-25 18:13:51 +0200291 * \param[out] payload Payload for RTP packet, contains speech data (if any)
292 * except for have 2 first bytes where header will be built
293 * \param[in] cmr AMR codec Mode Request
294 * \param[in] ft AMR Frame Type
295 * \param[in] bfi AMR Bad Frame Indicator
296 * \returns length of AMR data (header + ToC + speech data) or negative value
297 * on error
298 *
299 * Note: only octet-aligned mode is supported so the header occupies 2 full
300 * bytes. Optional interleaving header is not supported.
301 */
302int osmo_amr_rtp_enc(uint8_t *payload, uint8_t cmr, enum osmo_amr_type ft,
303 enum osmo_amr_quality bfi)
304{
305 if (cmr > 15)
306 return -EINVAL;
307
308 if (ft > 15)
309 return -ENOTSUP;
310
311 /* RFC 4867 § 4.3.1 payload header */
312 payload[0] = cmr << 4;
313
314 /* RFC 4867 § 4.4.2 ToC - compound payloads are not supported: F = 0 */
315 payload[1] = (((uint8_t)ft) << 3) | (((uint8_t)bfi) << 2);
316
317 /* speech data */
318 return 2 + amr_len_by_ft[ft];
319}