blob: 19557164e20672319ab95d9ff13456095a88cd5a [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
219static const uint8_t amr_len_by_ft[16] = {
Jean-Francois Dionned02c8af2017-01-10 10:23:56 +0100220 12, 13, 15, 17, 19, 20, 26, 31, 7, 0, 0, 0, 0, 0, 0, 0
Max92db1502016-05-25 18:13:51 +0200221};
222
223const struct value_string osmo_amr_type_names[] = {
224 { AMR_4_75, "AMR 4,75 kbits/s" },
225 { AMR_5_15, "AMR 5,15 kbit/s" },
226 { AMR_5_90, "AMR 5,90 kbit/s" },
227 { AMR_6_70, "AMR 6,70 kbit/s (PDC-EFR)" },
228 { AMR_7_40, "AMR 7,40 kbit/s (TDMA-EFR)" },
229 { AMR_7_95, "AMR 7,95 kbit/s" },
230 { AMR_10_2, "AMR 10,2 kbit/s" },
231 { AMR_12_2, "AMR 12,2 kbit/s (GSM-EFR)" },
232 { AMR_SID, "AMR SID" },
233 { AMR_GSM_EFR_SID, "GSM-EFR SID" },
234 { AMR_TDMA_EFR_SID, "TDMA-EFR SID" },
235 { AMR_PDC_EFR_SID, "PDC-EFR SID" },
236 { AMR_NO_DATA, "No Data/NA" },
237 { 0, NULL },
238};
239
Neels Hofmeyr87e45502017-06-20 00:17:59 +0200240/*! Decode various AMR parameters from RTP payload (RFC 4867) acording to
Max92db1502016-05-25 18:13:51 +0200241 * 3GPP TS 26.101
242 * \param[in] rtppayload Payload from RTP packet
243 * \param[in] payload_len length of rtppayload
244 * \param[out] cmr AMR Codec Mode Request, not filled if NULL
245 * \param[out] cmi AMR Codec Mode Indicator, -1 if not applicable for this type,
246 * not filled if NULL
247 * \param[out] ft AMR Frame Type, not filled if NULL
248 * \param[out] bfi AMR Bad Frame Indicator, not filled if NULL
249 * \param[out] sti AMR SID Type Indicator, -1 if not applicable for this type,
250 * not filled if NULL
251 * \returns length of AMR data or negative value on error
252 */
253int osmo_amr_rtp_dec(const uint8_t *rtppayload, int payload_len, uint8_t *cmr,
254 int8_t *cmi, enum osmo_amr_type *ft,
255 enum osmo_amr_quality *bfi, int8_t *sti)
256{
Maxe9e5f8e2016-11-07 14:49:13 +0100257 if (payload_len < 2 || !rtppayload)
258 return -EINVAL;
259
Max92db1502016-05-25 18:13:51 +0200260 /* RFC 4867 § 4.4.2 ToC - compound payloads are not supported: F = 0 */
261 uint8_t type = (rtppayload[1] >> 3) & 0xf;
262
263 /* compound payloads are not supported */
264 if (rtppayload[1] >> 7)
265 return -ENOTSUP;
266
Jean-Francois Dionned02c8af2017-01-10 10:23:56 +0100267 if (payload_len < amr_len_by_ft[type])
Max92db1502016-05-25 18:13:51 +0200268 return -ENOTSUP;
269
Max92db1502016-05-25 18:13:51 +0200270 if (ft)
271 *ft = type;
272
273 if (cmr)
274 *cmr = rtppayload[0] >> 4;
275
276 if (bfi)
277 *bfi = (rtppayload[1] >> 2) & 1;
278
279 /* Table 6 in 3GPP TS 26.101 */
280 if (cmi)
281 *cmi = (type == AMR_SID) ? ((rtppayload[6] >> 1) & 7) : -1;
282
283 if (sti)
284 *sti = (type == AMR_SID) ? (rtppayload[6] & 0x10) : -1;
285
286 return 2 + amr_len_by_ft[type];
287}
288
Neels Hofmeyr87e45502017-06-20 00:17:59 +0200289/*! Encode various AMR parameters from RTP payload (RFC 4867)
Max92db1502016-05-25 18:13:51 +0200290 * \param[out] payload Payload for RTP packet, contains speech data (if any)
291 * except for have 2 first bytes where header will be built
292 * \param[in] cmr AMR codec Mode Request
293 * \param[in] ft AMR Frame Type
294 * \param[in] bfi AMR Bad Frame Indicator
295 * \returns length of AMR data (header + ToC + speech data) or negative value
296 * on error
297 *
298 * Note: only octet-aligned mode is supported so the header occupies 2 full
299 * bytes. Optional interleaving header is not supported.
300 */
301int osmo_amr_rtp_enc(uint8_t *payload, uint8_t cmr, enum osmo_amr_type ft,
302 enum osmo_amr_quality bfi)
303{
304 if (cmr > 15)
305 return -EINVAL;
306
307 if (ft > 15)
308 return -ENOTSUP;
309
310 /* RFC 4867 § 4.3.1 payload header */
311 payload[0] = cmr << 4;
312
313 /* RFC 4867 § 4.4.2 ToC - compound payloads are not supported: F = 0 */
314 payload[1] = (((uint8_t)ft) << 3) | (((uint8_t)bfi) << 2);
315
316 /* speech data */
317 return 2 + amr_len_by_ft[ft];
318}