blob: fc63eb478831c150f84e28a11f48093b41e15108 [file] [log] [blame]
Tristan Matthews0a329cc2013-07-17 13:20:14 -04001/* $Id$ */
2/*
3 * Copyright (C) 2008-2011 Teluu Inc. (http://www.teluu.com)
4 * Copyright (C) 2003-2008 Benny Prijono <benny@prijono.org>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
20
21#ifndef __PJMEDIA_CODECS_AMR_HELPER_H__
22#define __PJMEDIA_CODECS_AMR_HELPER_H__
23
24/**
25 * @file pjmedia-codec/amr_helper.h
26 * @brief Common tables and helper functions for AMR codec (NB & WB).
27 */
28
29
30#ifdef _MSC_VER
31# pragma warning(disable:4214) // bit field types other than int
32#endif
33
34/**
35 * @defgroup PJMED_AMR_CODEC_HELPER AMR Codec Helper
36 * @ingroup PJMEDIA_CODEC_CODECS
37 * @brief AMR common tables and helper functions.
38 * @{
39 *
40 * This sections describes common AMR constants tables (e.g: bits sensitivity
41 * order map, frame lengths, bitrates) and helper functions (e.g: pack AMR
42 * payload in octet-aligned mode or bandwidth-efficient mode, payload parser,
43 * reorder AMR bitstream).
44 */
45
46PJ_BEGIN_DECL
47
48
49/* AMR bits sensitivity order maps */
50
51const pj_int16_t pjmedia_codec_amrnb_ordermap122[244] =
52{
53 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
54 10, 11, 12, 13, 14, 23, 15, 16, 17, 18,
55 19, 20, 21, 22, 24, 25, 26, 27, 28, 38,
56 141, 39, 142, 40, 143, 41, 144, 42, 145, 43,
57 146, 44, 147, 45, 148, 46, 149, 47, 97, 150,
58 200, 48, 98, 151, 201, 49, 99, 152, 202, 86,
59 136, 189, 239, 87, 137, 190, 240, 88, 138, 191,
60 241, 91, 194, 92, 195, 93, 196, 94, 197, 95,
61 198, 29, 30, 31, 32, 33, 34, 35, 50, 100,
62 153, 203, 89, 139, 192, 242, 51, 101, 154, 204,
63 55, 105, 158, 208, 90, 140, 193, 243, 59, 109,
64 162, 212, 63, 113, 166, 216, 67, 117, 170, 220,
65 36, 37, 54, 53, 52, 58, 57, 56, 62, 61,
66 60, 66, 65, 64, 70, 69, 68, 104, 103, 102,
67 108, 107, 106, 112, 111, 110, 116, 115, 114, 120,
68 119, 118, 157, 156, 155, 161, 160, 159, 165, 164,
69 163, 169, 168, 167, 173, 172, 171, 207, 206, 205,
70 211, 210, 209, 215, 214, 213, 219, 218, 217, 223,
71 222, 221, 73, 72, 71, 76, 75, 74, 79, 78,
72 77, 82, 81, 80, 85, 84, 83, 123, 122, 121,
73 126, 125, 124, 129, 128, 127, 132, 131, 130, 135,
74 134, 133, 176, 175, 174, 179, 178, 177, 182, 181,
75 180, 185, 184, 183, 188, 187, 186, 226, 225, 224,
76 229, 228, 227, 232, 231, 230, 235, 234, 233, 238,
77 237, 236, 96, 199
78};
79
80const pj_int16_t pjmedia_codec_amrnb_ordermap102[204] =
81{
82 7, 6, 5, 4, 3, 2, 1, 0, 16, 15,
83 14, 13, 12, 11, 10, 9, 8, 26, 27, 28,
84 29, 30, 31, 115, 116, 117, 118, 119, 120, 72,
85 73, 161, 162, 65, 68, 69, 108, 111, 112, 154,
86 157, 158, 197, 200, 201, 32, 33, 121, 122, 74,
87 75, 163, 164, 66, 109, 155, 198, 19, 23, 21,
88 22, 18, 17, 20, 24, 25, 37, 36, 35, 34,
89 80, 79, 78, 77, 126, 125, 124, 123, 169, 168,
90 167, 166, 70, 67, 71, 113, 110, 114, 159, 156,
91 160, 202, 199, 203, 76, 165, 81, 82, 92, 91,
92 93, 83, 95, 85, 84, 94, 101, 102, 96, 104,
93 86, 103, 87, 97, 127, 128, 138, 137, 139, 129,
94 141, 131, 130, 140, 147, 148, 142, 150, 132, 149,
95 133, 143, 170, 171, 181, 180, 182, 172, 184, 174,
96 173, 183, 190, 191, 185, 193, 175, 192, 176, 186,
97 38, 39, 49, 48, 50, 40, 52, 42, 41, 51,
98 58, 59, 53, 61, 43, 60, 44, 54, 194, 179,
99 189, 196, 177, 195, 178, 187, 188, 151, 136, 146,
100 153, 134, 152, 135, 144, 145, 105, 90, 100, 107,
101 88, 106, 89, 98, 99, 62, 47, 57, 64, 45,
102 63, 46, 55, 56
103};
104
105const pj_int16_t pjmedia_codec_amrnb_ordermap795[159] =
106{
107 8, 7, 6, 5, 4, 3, 2, 14, 16, 9,
108 10, 12, 13, 15, 11, 17, 20, 22, 24, 23,
109 19, 18, 21, 56, 88, 122, 154, 57, 89, 123,
110 155, 58, 90, 124, 156, 52, 84, 118, 150, 53,
111 85, 119, 151, 27, 93, 28, 94, 29, 95, 30,
112 96, 31, 97, 61, 127, 62, 128, 63, 129, 59,
113 91, 125, 157, 32, 98, 64, 130, 1, 0, 25,
114 26, 33, 99, 34, 100, 65, 131, 66, 132, 54,
115 86, 120, 152, 60, 92, 126, 158, 55, 87, 121,
116 153, 117, 116, 115, 46, 78, 112, 144, 43, 75,
117 109, 141, 40, 72, 106, 138, 36, 68, 102, 134,
118 114, 149, 148, 147, 146, 83, 82, 81, 80, 51,
119 50, 49, 48, 47, 45, 44, 42, 39, 35, 79,
120 77, 76, 74, 71, 67, 113, 111, 110, 108, 105,
121 101, 145, 143, 142, 140, 137, 133, 41, 73, 107,
122 139, 37, 69, 103, 135, 38, 70, 104, 136
123};
124
125const pj_int16_t pjmedia_codec_amrnb_ordermap74[148] =
126{
127 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
144const pj_int16_t pjmedia_codec_amrnb_ordermap67[134] =
145{
146 0, 1, 4, 3, 5, 6, 13, 7, 2, 8,
147 9, 11, 15, 12, 14, 10, 28, 82, 29, 83,
148 27, 81, 26, 80, 30, 84, 16, 55, 109, 56,
149 110, 31, 85, 57, 111, 48, 73, 102, 127, 32,
150 86, 51, 76, 105, 130, 52, 77, 106, 131, 58,
151 112, 33, 87, 19, 23, 53, 78, 107, 132, 21,
152 22, 18, 17, 20, 24, 25, 50, 75, 104, 129,
153 47, 72, 101, 126, 54, 79, 108, 133, 46, 71,
154 100, 125, 128, 103, 74, 49, 45, 70, 99, 124,
155 42, 67, 96, 121, 39, 64, 93, 118, 38, 63,
156 92, 117, 35, 60, 89, 114, 34, 59, 88, 113,
157 44, 69, 98, 123, 43, 68, 97, 122, 41, 66,
158 95, 120, 40, 65, 94, 119, 37, 62, 91, 116,
159 36, 61, 90, 115
160};
161
162const pj_int16_t pjmedia_codec_amrnb_ordermap59[118] =
163{
164 0, 1, 4, 5, 3, 6, 7, 2, 13, 15,
165 8, 9, 11, 12, 14, 10, 16, 28, 74, 29,
166 75, 27, 73, 26, 72, 30, 76, 51, 97, 50,
167 71, 96, 117, 31, 77, 52, 98, 49, 70, 95,
168 116, 53, 99, 32, 78, 33, 79, 48, 69, 94,
169 115, 47, 68, 93, 114, 46, 67, 92, 113, 19,
170 21, 23, 22, 18, 17, 20, 24, 111, 43, 89,
171 110, 64, 65, 44, 90, 25, 45, 66, 91, 112,
172 54, 100, 40, 61, 86, 107, 39, 60, 85, 106,
173 36, 57, 82, 103, 35, 56, 81, 102, 34, 55,
174 80, 101, 42, 63, 88, 109, 41, 62, 87, 108,
175 38, 59, 84, 105, 37, 58, 83, 104
176};
177
178const pj_int16_t pjmedia_codec_amrnb_ordermap515[103] =
179{
180 7, 6, 5, 4, 3, 2, 1, 0, 15, 14,
181 13, 12, 11, 10, 9, 8, 23, 24, 25, 26,
182 27, 46, 65, 84, 45, 44, 43, 64, 63, 62,
183 83, 82, 81, 102, 101, 100, 42, 61, 80, 99,
184 28, 47, 66, 85, 18, 41, 60, 79, 98, 29,
185 48, 67, 17, 20, 22, 40, 59, 78, 97, 21,
186 30, 49, 68, 86, 19, 16, 87, 39, 38, 58,
187 57, 77, 35, 54, 73, 92, 76, 96, 95, 36,
188 55, 74, 93, 32, 51, 33, 52, 70, 71, 89,
189 90, 31, 50, 69, 88, 37, 56, 75, 94, 34,
190 53, 72, 91
191};
192
193const pj_int16_t pjmedia_codec_amrnb_ordermap475[95] =
194{
195 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
196 10, 11, 12, 13, 14, 15, 23, 24, 25, 26,
197 27, 28, 48, 49, 61, 62, 82, 83, 47, 46,
198 45, 44, 81, 80, 79, 78, 17, 18, 20, 22,
199 77, 76, 75, 74, 29, 30, 43, 42, 41, 40,
200 38, 39, 16, 19, 21, 50, 51, 59, 60, 63,
201 64, 72, 73, 84, 85, 93, 94, 32, 33, 35,
202 36, 53, 54, 56, 57, 66, 67, 69, 70, 87,
203 88, 90, 91, 34, 55, 68, 89, 37, 58, 71,
204 92, 31, 52, 65, 86
205};
206
207
208const pj_int16_t pjmedia_codec_amrwb_ordermap_660[] =
209{
210 0, 5, 6, 7, 61, 84, 107, 130, 62, 85,
211 8, 4, 37, 38, 39, 40, 58, 81, 104, 127,
212 60, 83, 106, 129, 108, 131, 128, 41, 42, 80,
213 126, 1, 3, 57, 103, 82, 105, 59, 2, 63,
214 109, 110, 86, 19, 22, 23, 64, 87, 18, 20,
215 21, 17, 13, 88, 43, 89, 65, 111, 14, 24,
216 25, 26, 27, 28, 15, 16, 44, 90, 66, 112,
217 9, 11, 10, 12, 67, 113, 29, 30, 31, 32,
218 34, 33, 35, 36, 45, 51, 68, 74, 91, 97,
219 114, 120, 46, 69, 92, 115, 52, 75, 98, 121,
220 47, 70, 93, 116, 53, 76, 99, 122, 48, 71,
221 94, 117, 54, 77, 100, 123, 49, 72, 95, 118,
222 55, 78, 101, 124, 50, 73, 96, 119, 56, 79,
223 102, 125
224};
225
226const pj_int16_t pjmedia_codec_amrwb_ordermap_885[] =
227{
228 0, 4, 6, 7, 5, 3, 47, 48, 49, 112,
229 113, 114, 75, 106, 140, 171, 80, 111, 145, 176,
230 77, 108, 142, 173, 78, 109, 143, 174, 79, 110,
231 144, 175, 76, 107, 141, 172, 50, 115, 51, 2,
232 1, 81, 116, 146, 19, 21, 12, 17, 18, 20,
233 16, 25, 13, 10, 14, 24, 23, 22, 26, 8,
234 15, 52, 117, 31, 82, 147, 9, 33, 11, 83,
235 148, 53, 118, 28, 27, 84, 149, 34, 35, 29,
236 46, 32, 30, 54, 119, 37, 36, 39, 38, 40,
237 85, 150, 41, 42, 43, 44, 45, 55, 60, 65,
238 70, 86, 91, 96, 101, 120, 125, 130, 135, 151,
239 156, 161, 166, 56, 87, 121, 152, 61, 92, 126,
240 157, 66, 97, 131, 162, 71, 102, 136, 167, 57,
241 88, 122, 153, 62, 93, 127, 158, 67, 98, 132,
242 163, 72, 103, 137, 168, 58, 89, 123, 154, 63,
243 94, 128, 159, 68, 99, 133, 164, 73, 104, 138,
244 169, 59, 90, 124, 155, 64, 95, 129, 160, 69,
245 100, 134, 165, 74, 105, 139, 170
246};
247
248const pj_int16_t pjmedia_codec_amrwb_ordermap_1265[] =
249{
250 0, 4, 6, 93, 143, 196, 246, 7, 5, 3,
251 47, 48, 49, 50, 51, 150, 151, 152, 153, 154,
252 94, 144, 197, 247, 99, 149, 202, 252, 96, 146,
253 199, 249, 97, 147, 200, 250, 100, 203, 98, 148,
254 201, 251, 95, 145, 198, 248, 52, 2, 1, 101,
255 204, 155, 19, 21, 12, 17, 18, 20, 16, 25,
256 13, 10, 14, 24, 23, 22, 26, 8, 15, 53,
257 156, 31, 102, 205, 9, 33, 11, 103, 206, 54,
258 157, 28, 27, 104, 207, 34, 35, 29, 46, 32,
259 30, 55, 158, 37, 36, 39, 38, 40, 105, 208,
260 41, 42, 43, 44, 45, 56, 106, 159, 209, 57,
261 66, 75, 84, 107, 116, 125, 134, 160, 169, 178,
262 187, 210, 219, 228, 237, 58, 108, 161, 211, 62,
263 112, 165, 215, 67, 117, 170, 220, 71, 121, 174,
264 224, 76, 126, 179, 229, 80, 130, 183, 233, 85,
265 135, 188, 238, 89, 139, 192, 242, 59, 109, 162,
266 212, 63, 113, 166, 216, 68, 118, 171, 221, 72,
267 122, 175, 225, 77, 127, 180, 230, 81, 131, 184,
268 234, 86, 136, 189, 239, 90, 140, 193, 243, 60,
269 110, 163, 213, 64, 114, 167, 217, 69, 119, 172,
270 222, 73, 123, 176, 226, 78, 128, 181, 231, 82,
271 132, 185, 235, 87, 137, 190, 240, 91, 141, 194,
272 244, 61, 111, 164, 214, 65, 115, 168, 218, 70,
273 120, 173, 223, 74, 124, 177, 227, 79, 129, 182,
274 232, 83, 133, 186, 236, 88, 138, 191, 241, 92,
275 142, 195, 245
276};
277
278const pj_int16_t pjmedia_codec_amrwb_ordermap_1425[] =
279{
280 0, 4, 6, 101, 159, 220, 278, 7, 5, 3,
281 47, 48, 49, 50, 51, 166, 167, 168, 169, 170,
282 102, 160, 221, 279, 107, 165, 226, 284, 104, 162,
283 223, 281, 105, 163, 224, 282, 108, 227, 106, 164,
284 225, 283, 103, 161, 222, 280, 52, 2, 1, 109,
285 228, 171, 19, 21, 12, 17, 18, 20, 16, 25,
286 13, 10, 14, 24, 23, 22, 26, 8, 15, 53,
287 172, 31, 110, 229, 9, 33, 11, 111, 230, 54,
288 173, 28, 27, 112, 231, 34, 35, 29, 46, 32,
289 30, 55, 174, 37, 36, 39, 38, 40, 113, 232,
290 41, 42, 43, 44, 45, 56, 114, 175, 233, 62,
291 120, 181, 239, 75, 133, 194, 252, 57, 115, 176,
292 234, 63, 121, 182, 240, 70, 128, 189, 247, 76,
293 134, 195, 253, 83, 141, 202, 260, 92, 150, 211,
294 269, 84, 142, 203, 261, 93, 151, 212, 270, 85,
295 143, 204, 262, 94, 152, 213, 271, 86, 144, 205,
296 263, 95, 153, 214, 272, 64, 122, 183, 241, 77,
297 135, 196, 254, 65, 123, 184, 242, 78, 136, 197,
298 255, 87, 145, 206, 264, 96, 154, 215, 273, 58,
299 116, 177, 235, 66, 124, 185, 243, 71, 129, 190,
300 248, 79, 137, 198, 256, 88, 146, 207, 265, 97,
301 155, 216, 274, 59, 117, 178, 236, 67, 125, 186,
302 244, 72, 130, 191, 249, 80, 138, 199, 257, 89,
303 147, 208, 266, 98, 156, 217, 275, 60, 118, 179,
304 237, 68, 126, 187, 245, 73, 131, 192, 250, 81,
305 139, 200, 258, 90, 148, 209, 267, 99, 157, 218,
306 276, 61, 119, 180, 238, 69, 127, 188, 246, 74,
307 132, 193, 251, 82, 140, 201, 259, 91, 149, 210,
308 268, 100, 158, 219, 277
309};
310
311const pj_int16_t pjmedia_codec_amrwb_ordermap_1585[] =
312{
313 0, 4, 6, 109, 175, 244, 310, 7, 5, 3,
314 47, 48, 49, 50, 51, 182, 183, 184, 185, 186,
315 110, 176, 245, 311, 115, 181, 250, 316, 112, 178,
316 247, 313, 113, 179, 248, 314, 116, 251, 114, 180,
317 249, 315, 111, 177, 246, 312, 52, 2, 1, 117,
318 252, 187, 19, 21, 12, 17, 18, 20, 16, 25,
319 13, 10, 14, 24, 23, 22, 26, 8, 15, 53,
320 188, 31, 118, 253, 9, 33, 11, 119, 254, 54,
321 189, 28, 27, 120, 255, 34, 35, 29, 46, 32,
322 30, 55, 190, 37, 36, 39, 38, 40, 121, 256,
323 41, 42, 43, 44, 45, 56, 122, 191, 257, 63,
324 129, 198, 264, 76, 142, 211, 277, 89, 155, 224,
325 290, 102, 168, 237, 303, 57, 123, 192, 258, 70,
326 136, 205, 271, 83, 149, 218, 284, 96, 162, 231,
327 297, 62, 128, 197, 263, 75, 141, 210, 276, 88,
328 154, 223, 289, 101, 167, 236, 302, 58, 124, 193,
329 259, 71, 137, 206, 272, 84, 150, 219, 285, 97,
330 163, 232, 298, 59, 125, 194, 260, 64, 130, 199,
331 265, 67, 133, 202, 268, 72, 138, 207, 273, 77,
332 143, 212, 278, 80, 146, 215, 281, 85, 151, 220,
333 286, 90, 156, 225, 291, 93, 159, 228, 294, 98,
334 164, 233, 299, 103, 169, 238, 304, 106, 172, 241,
335 307, 60, 126, 195, 261, 65, 131, 200, 266, 68,
336 134, 203, 269, 73, 139, 208, 274, 78, 144, 213,
337 279, 81, 147, 216, 282, 86, 152, 221, 287, 91,
338 157, 226, 292, 94, 160, 229, 295, 99, 165, 234,
339 300, 104, 170, 239, 305, 107, 173, 242, 308, 61,
340 127, 196, 262, 66, 132, 201, 267, 69, 135, 204,
341 270, 74, 140, 209, 275, 79, 145, 214, 280, 82,
342 148, 217, 283, 87, 153, 222, 288, 92, 158, 227,
343 293, 95, 161, 230, 296, 100, 166, 235, 301, 105,
344 171, 240, 306, 108, 174, 243, 309
345};
346
347const pj_int16_t pjmedia_codec_amrwb_ordermap_1825[] =
348{
349 0, 4, 6, 121, 199, 280, 358, 7, 5, 3,
350 47, 48, 49, 50, 51, 206, 207, 208, 209, 210,
351 122, 200, 281, 359, 127, 205, 286, 364, 124, 202,
352 283, 361, 125, 203, 284, 362, 128, 287, 126, 204,
353 285, 363, 123, 201, 282, 360, 52, 2, 1, 129,
354 288, 211, 19, 21, 12, 17, 18, 20, 16, 25,
355 13, 10, 14, 24, 23, 22, 26, 8, 15, 53,
356 212, 31, 130, 289, 9, 33, 11, 131, 290, 54,
357 213, 28, 27, 132, 291, 34, 35, 29, 46, 32,
358 30, 55, 214, 37, 36, 39, 38, 40, 133, 292,
359 41, 42, 43, 44, 45, 56, 134, 215, 293, 198,
360 299, 136, 120, 138, 60, 279, 58, 62, 357, 139,
361 140, 295, 156, 57, 219, 297, 63, 217, 137, 170,
362 300, 222, 64, 106, 61, 78, 294, 92, 142, 141,
363 135, 221, 296, 301, 343, 59, 298, 184, 329, 315,
364 220, 216, 265, 251, 218, 237, 352, 223, 157, 86,
365 171, 87, 164, 351, 111, 302, 65, 178, 115, 323,
366 72, 192, 101, 179, 93, 73, 193, 151, 337, 309,
367 143, 274, 69, 324, 165, 150, 97, 338, 110, 310,
368 330, 273, 68, 107, 175, 245, 114, 79, 113, 189,
369 246, 259, 174, 71, 185, 96, 344, 100, 322, 83,
370 334, 316, 333, 252, 161, 348, 147, 82, 269, 232,
371 260, 308, 353, 347, 163, 231, 306, 320, 188, 270,
372 146, 177, 266, 350, 256, 85, 149, 116, 191, 160,
373 238, 258, 336, 305, 255, 88, 224, 99, 339, 230,
374 228, 227, 272, 242, 241, 319, 233, 311, 102, 74,
375 180, 275, 66, 194, 152, 325, 172, 247, 244, 261,
376 117, 158, 166, 354, 75, 144, 108, 312, 94, 186,
377 303, 80, 234, 89, 195, 112, 340, 181, 345, 317,
378 326, 276, 239, 167, 118, 313, 70, 355, 327, 253,
379 190, 176, 271, 104, 98, 153, 103, 90, 76, 267,
380 277, 248, 225, 262, 182, 84, 154, 235, 335, 168,
381 331, 196, 341, 249, 162, 307, 148, 349, 263, 321,
382 257, 243, 229, 356, 159, 119, 67, 187, 173, 145,
383 240, 77, 304, 332, 314, 342, 109, 254, 81, 278,
384 105, 91, 346, 318, 183, 250, 197, 328, 95, 155,
385 169, 268, 226, 236, 264
386};
387
388const pj_int16_t pjmedia_codec_amrwb_ordermap_1985[] =
389{
390 0, 4, 6, 129, 215, 304, 390, 7, 5, 3,
391 47, 48, 49, 50, 51, 222, 223, 224, 225, 226,
392 130, 216, 305, 391, 135, 221, 310, 396, 132, 218,
393 307, 393, 133, 219, 308, 394, 136, 311, 134, 220,
394 309, 395, 131, 217, 306, 392, 52, 2, 1, 137,
395 312, 227, 19, 21, 12, 17, 18, 20, 16, 25,
396 13, 10, 14, 24, 23, 22, 26, 8, 15, 53,
397 228, 31, 138, 313, 9, 33, 11, 139, 314, 54,
398 229, 28, 27, 140, 315, 34, 35, 29, 46, 32,
399 30, 55, 230, 37, 36, 39, 38, 40, 141, 316,
400 41, 42, 43, 44, 45, 56, 142, 231, 317, 63,
401 73, 92, 340, 82, 324, 149, 353, 159, 334, 165,
402 338, 178, 163, 254, 77, 168, 257, 153, 343, 57,
403 248, 238, 79, 252, 166, 67, 80, 201, 101, 267,
404 143, 164, 341, 255, 339, 187, 376, 318, 78, 328,
405 362, 115, 232, 242, 253, 290, 276, 62, 58, 158,
406 68, 93, 179, 319, 148, 169, 154, 72, 385, 329,
407 333, 344, 102, 83, 144, 233, 323, 124, 243, 192,
408 354, 237, 64, 247, 202, 209, 150, 116, 335, 268,
409 239, 299, 188, 196, 298, 94, 195, 258, 123, 363,
410 384, 109, 325, 371, 170, 370, 84, 110, 295, 180,
411 74, 210, 191, 106, 291, 205, 367, 381, 377, 206,
412 355, 122, 119, 120, 383, 160, 105, 108, 277, 380,
413 294, 284, 285, 345, 208, 269, 249, 366, 386, 300,
414 297, 259, 125, 369, 197, 97, 194, 286, 211, 281,
415 280, 183, 372, 87, 155, 283, 59, 348, 327, 184,
416 76, 111, 330, 203, 349, 69, 98, 152, 145, 189,
417 66, 320, 337, 173, 358, 251, 198, 174, 263, 262,
418 126, 241, 193, 88, 388, 117, 95, 387, 112, 359,
419 287, 244, 103, 272, 301, 171, 162, 234, 273, 127,
420 373, 181, 292, 85, 378, 302, 121, 107, 364, 346,
421 356, 212, 278, 213, 65, 382, 288, 207, 113, 175,
422 99, 296, 374, 368, 199, 260, 185, 336, 331, 161,
423 270, 264, 250, 240, 75, 350, 151, 60, 89, 321,
424 156, 274, 360, 326, 70, 282, 167, 146, 352, 81,
425 91, 389, 266, 245, 177, 235, 190, 256, 204, 342,
426 128, 118, 303, 104, 379, 182, 114, 375, 200, 96,
427 293, 172, 214, 365, 279, 86, 289, 351, 347, 357,
428 261, 186, 176, 271, 90, 100, 147, 322, 275, 361,
429 71, 332, 61, 265, 157, 246, 236
430};
431
432const pj_int16_t pjmedia_codec_amrwb_ordermap_2305[] =
433{
434 0, 4, 6, 145, 247, 352, 454, 7, 5, 3,
435 47, 48, 49, 50, 51, 254, 255, 256, 257, 258,
436 146, 248, 353, 455, 151, 253, 358, 460, 148, 250,
437 355, 457, 149, 251, 356, 458, 152, 359, 150, 252,
438 357, 459, 147, 249, 354, 456, 52, 2, 1, 153,
439 360, 259, 19, 21, 12, 17, 18, 20, 16, 25,
440 13, 10, 14, 24, 23, 22, 26, 8, 15, 53,
441 260, 31, 154, 361, 9, 33, 11, 155, 362, 54,
442 261, 28, 27, 156, 363, 34, 35, 29, 46, 32,
443 30, 55, 262, 37, 36, 39, 38, 40, 157, 364,
444 41, 42, 43, 44, 45, 56, 158, 263, 365, 181,
445 192, 170, 79, 57, 399, 90, 159, 297, 377, 366,
446 275, 68, 183, 388, 286, 194, 299, 92, 70, 182,
447 401, 172, 59, 91, 58, 400, 368, 161, 81, 160,
448 264, 171, 80, 389, 390, 378, 379, 193, 298, 69,
449 266, 265, 367, 277, 288, 276, 287, 184, 60, 195,
450 82, 93, 71, 369, 402, 173, 162, 444, 300, 391,
451 98, 76, 278, 61, 267, 374, 135, 411, 167, 102,
452 380, 200, 87, 178, 65, 94, 204, 124, 72, 342,
453 189, 305, 381, 396, 433, 301, 226, 407, 289, 237,
454 113, 215, 185, 128, 309, 403, 116, 320, 196, 331,
455 370, 422, 174, 64, 392, 83, 425, 219, 134, 188,
456 432, 112, 427, 139, 279, 163, 436, 208, 447, 218,
457 236, 229, 97, 294, 385, 230, 166, 268, 177, 443,
458 225, 426, 101, 272, 138, 127, 290, 117, 347, 199,
459 414, 95, 140, 240, 410, 395, 209, 129, 283, 346,
460 105, 241, 437, 86, 308, 448, 203, 345, 186, 107,
461 220, 415, 334, 319, 106, 313, 118, 123, 73, 207,
462 421, 214, 384, 373, 438, 62, 371, 341, 75, 449,
463 168, 323, 164, 242, 416, 324, 304, 197, 335, 404,
464 271, 63, 191, 325, 96, 169, 231, 280, 312, 187,
465 406, 84, 201, 100, 67, 382, 175, 336, 202, 330,
466 269, 393, 376, 383, 293, 307, 409, 179, 285, 314,
467 302, 372, 398, 190, 180, 89, 99, 103, 232, 78,
468 88, 77, 136, 387, 165, 198, 394, 125, 176, 428,
469 74, 375, 238, 227, 66, 273, 282, 141, 306, 412,
470 114, 85, 130, 348, 119, 291, 296, 386, 233, 397,
471 303, 405, 284, 445, 423, 221, 210, 205, 450, 108,
472 274, 434, 216, 343, 337, 142, 243, 321, 408, 451,
473 310, 292, 120, 109, 281, 439, 270, 429, 332, 295,
474 418, 211, 315, 222, 326, 131, 430, 244, 327, 349,
475 417, 316, 143, 338, 440, 234, 110, 212, 452, 245,
476 121, 419, 350, 223, 132, 441, 328, 413, 317, 339,
477 126, 104, 137, 446, 344, 239, 435, 115, 333, 206,
478 322, 217, 228, 424, 453, 311, 351, 111, 442, 224,
479 213, 122, 431, 340, 235, 246, 133, 144, 420, 329,
480 318
481};
482
483const pj_int16_t pjmedia_codec_amrwb_ordermap_2385[] =
484{
485 0, 4, 6, 145, 251, 360, 466, 7, 5, 3,
486 47, 48, 49, 50, 51, 262, 263, 264, 265, 266,
487 146, 252, 361, 467, 151, 257, 366, 472, 148, 254,
488 363, 469, 149, 255, 364, 470, 156, 371, 150, 256,
489 365, 471, 147, 253, 362, 468, 52, 2, 1, 157,
490 372, 267, 19, 21, 12, 17, 18, 20, 16, 25,
491 13, 10, 14, 24, 23, 22, 26, 8, 15, 53,
492 268, 31, 152, 153, 154, 155, 258, 259, 260, 261,
493 367, 368, 369, 370, 473, 474, 475, 476, 158, 373,
494 9, 33, 11, 159, 374, 54, 269, 28, 27, 160,
495 375, 34, 35, 29, 46, 32, 30, 55, 270, 37,
496 36, 39, 38, 40, 161, 376, 41, 42, 43, 44,
497 45, 56, 162, 271, 377, 185, 196, 174, 79, 57,
498 411, 90, 163, 305, 389, 378, 283, 68, 187, 400,
499 294, 198, 307, 92, 70, 186, 413, 176, 59, 91,
500 58, 412, 380, 165, 81, 164, 272, 175, 80, 401,
501 402, 390, 391, 197, 306, 69, 274, 273, 379, 285,
502 296, 284, 295, 188, 60, 199, 82, 93, 71, 381,
503 414, 177, 166, 456, 308, 403, 98, 76, 286, 61,
504 275, 386, 135, 423, 171, 102, 392, 204, 87, 182,
505 65, 94, 208, 124, 72, 350, 193, 313, 393, 408,
506 445, 309, 230, 419, 297, 241, 113, 219, 189, 128,
507 317, 415, 116, 328, 200, 339, 382, 434, 178, 64,
508 404, 83, 437, 223, 134, 192, 444, 112, 439, 139,
509 287, 167, 448, 212, 459, 222, 240, 233, 97, 302,
510 397, 234, 170, 276, 181, 455, 229, 438, 101, 280,
511 138, 127, 298, 117, 355, 203, 426, 95, 140, 244,
512 422, 407, 213, 129, 291, 354, 105, 245, 449, 86,
513 316, 460, 207, 353, 190, 107, 224, 427, 342, 327,
514 106, 321, 118, 123, 73, 211, 433, 218, 396, 385,
515 450, 62, 383, 349, 75, 461, 172, 331, 168, 246,
516 428, 332, 312, 201, 343, 416, 279, 63, 195, 333,
517 96, 173, 235, 288, 320, 191, 418, 84, 205, 100,
518 67, 394, 179, 344, 206, 338, 277, 405, 388, 395,
519 301, 315, 421, 183, 293, 322, 310, 384, 410, 194,
520 184, 89, 99, 103, 236, 78, 88, 77, 136, 399,
521 169, 202, 406, 125, 180, 440, 74, 387, 242, 231,
522 66, 281, 290, 141, 314, 424, 114, 85, 130, 356,
523 119, 299, 304, 398, 237, 409, 311, 417, 292, 457,
524 435, 225, 214, 209, 462, 108, 282, 446, 220, 351,
525 345, 142, 247, 329, 420, 463, 318, 300, 120, 109,
526 289, 451, 278, 441, 340, 303, 430, 215, 323, 226,
527 334, 131, 442, 248, 335, 357, 429, 324, 143, 346,
528 452, 238, 110, 216, 464, 249, 121, 431, 358, 227,
529 132, 453, 336, 425, 325, 347, 126, 104, 137, 458,
530 352, 243, 447, 115, 341, 210, 330, 221, 232, 436,
531 465, 319, 359, 111, 454, 228, 217, 122, 443, 348,
532 239, 250, 133, 144, 432, 337, 326
533};
534
535/**
536 * AMR-NB bitstream sensitivity order maps.
537 */
538const pj_int16_t* const pjmedia_codec_amrnb_ordermaps[8] =
539{
540 pjmedia_codec_amrnb_ordermap475,
541 pjmedia_codec_amrnb_ordermap515,
542 pjmedia_codec_amrnb_ordermap59,
543 pjmedia_codec_amrnb_ordermap67,
544 pjmedia_codec_amrnb_ordermap74,
545 pjmedia_codec_amrnb_ordermap795,
546 pjmedia_codec_amrnb_ordermap102,
547 pjmedia_codec_amrnb_ordermap122
548};
549
550/**
551 * AMR-WB bitstream sensitivity order maps.
552 */
553const pj_int16_t* const pjmedia_codec_amrwb_ordermaps[9] =
554{
555 pjmedia_codec_amrwb_ordermap_660,
556 pjmedia_codec_amrwb_ordermap_885,
557 pjmedia_codec_amrwb_ordermap_1265,
558 pjmedia_codec_amrwb_ordermap_1425,
559 pjmedia_codec_amrwb_ordermap_1585,
560 pjmedia_codec_amrwb_ordermap_1825,
561 pjmedia_codec_amrwb_ordermap_1985,
562 pjmedia_codec_amrwb_ordermap_2305,
563 pjmedia_codec_amrwb_ordermap_2385
564};
565
566/**
567 * Constant of AMR-NB frame lengths in bytes.
568 */
569const pj_uint8_t pjmedia_codec_amrnb_framelen[16] =
570 {12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0};
571/**
572 * Constant of AMR-NB frame lengths in bits.
573 */
574const pj_uint16_t pjmedia_codec_amrnb_framelenbits[9] =
575 {95, 103, 118, 134, 148, 159, 204, 244, 39};
576/**
577 * Constant of AMR-NB bitrates.
578 */
579const pj_uint16_t pjmedia_codec_amrnb_bitrates[8] =
580 {4750, 5150, 5900, 6700, 7400, 7950, 10200, 12200};
581
582/**
583 * Constant of AMR-WB frame lengths in bytes.
584 */
585const pj_uint8_t pjmedia_codec_amrwb_framelen[16] =
586 {17, 23, 32, 37, 40, 46, 50, 58, 60, 5, 0, 0, 0, 0, 0, 0};
587/**
588 * Constant of AMR-WB frame lengths in bits.
589 */
590const pj_uint16_t pjmedia_codec_amrwb_framelenbits[10] =
591 {132, 177, 253, 285, 317, 365, 397, 461, 477, 40};
592/**
593 * Constant of AMR-WB bitrates.
594 */
595const pj_uint16_t pjmedia_codec_amrwb_bitrates[9] =
596 {6600, 8850, 12650, 14250, 15850, 18250, 19850, 23050, 23850};
597
598
599/**
600 * This structure describes AMR frame info, to be fitted into #pjmedia_frame
601 * bit info.
602 */
603#pragma pack(1)
604typedef struct pjmedia_codec_amr_bit_info {
605 pj_uint8_t frame_type; /**< AMR frame type. */
606 pj_int8_t mode; /**< AMR mode. */
607 pj_uint8_t start_bit; /**< Frame start bit. */
608 pj_uint8_t good_quality:1; /**< Flag if frame is good/degraded. */
609 pj_uint8_t STI:1; /**< STI mode (first/update). */
610} pjmedia_codec_amr_bit_info;
611#pragma pack()
612
613
614/**
615 * This structure describes AMR settings.
616 */
617typedef struct pjmedia_codec_amr_pack_setting {
618 pj_uint8_t amr_nb:1; /**< Set 1 for AMR-NB, 0 for AMR-WB. */
619 pj_uint8_t reorder:1; /**< Reorder bitstream into descending
620 sensitivity order or vice versa. */
621 pj_uint8_t octet_aligned:1; /**< TRUE if payload is in octet-aligned mode,
622 FALSE if payload is in bandwidth
623 efficient mode. */
624 pj_uint8_t cmr:4; /**< Change Mode Request for remote
625 encoder. */
626} pjmedia_codec_amr_pack_setting;
627
628
629/**
630 * Get AMR mode based on bitrate.
631 *
632 * @param bitrate AMR bitrate.
633 *
634 * @return AMR mode.
635 */
636PJ_INLINE(pj_int8_t) pjmedia_codec_amr_get_mode(unsigned bitrate)
637{
638 pj_int8_t mode = -1;
639
640 if(bitrate==4750){
641 mode = 0;
642 } else if(bitrate==5150){
643 mode = 1;
644 } else if(bitrate==5900){
645 mode = 2;
646 } else if(bitrate==6700){
647 mode = 3;
648 } else if(bitrate==7400){
649 mode = 4;
650 } else if(bitrate==7950){
651 mode = 5;
652 } else if(bitrate==10200){
653 mode = 6;
654 } else if(bitrate==12200){
655 mode = 7;
656
657 /* AMRWB */
658 } else if(bitrate==6600){
659 mode = 0;
660 } else if(bitrate==8850){
661 mode = 1;
662 } else if(bitrate==12650){
663 mode = 2;
664 } else if(bitrate==14250){
665 mode = 3;
666 } else if(bitrate==15850){
667 mode = 4;
668 } else if(bitrate==18250){
669 mode = 5;
670 } else if(bitrate==19850){
671 mode = 6;
672 } else if(bitrate==23050){
673 mode = 7;
674 } else if(bitrate==23850){
675 mode = 8;
676 }
677 return mode;
678}
679
680/**
681 * Get AMR mode based on frame length.
682 *
683 * @param amrnb Set to PJ_TRUE for AMR-NB domain or PJ_FALSE for AMR-WB.
684 * @param frame_len The frame length.
685 *
686 * @return AMR mode.
687 */
688
689PJ_INLINE(pj_int8_t) pjmedia_codec_amr_get_mode2(pj_bool_t amrnb,
690 unsigned frame_len)
691{
692 int i;
693
694 if (amrnb) {
695 for (i = 0; i < 9; ++i)
696 if (frame_len == pjmedia_codec_amrnb_framelen[i])
697 return (pj_int8_t)i;
698 } else {
699 for (i = 0; i < 10; ++i) {
700 if (frame_len == pjmedia_codec_amrwb_framelen[i])
701 return (pj_int8_t)i;
702 }
703 }
704
705 pj_assert(!"Invalid AMR frame length");
706 return -1;
707}
708
709/**
710 * Prepare a frame before pass it to decoder. This function will do:
711 * - reorder AMR bitstream from descending sensitivity order into
712 * encoder bits order. This can be enabled/disabled via param
713 * 'setting' by setting/resetting field 'reorder'.
714 * - align left the start bit (make the start_bit to be 0).
715 *
716 * @param in Input frame.
717 * @param setting Settings, see #pjmedia_codec_amr_pack_setting.
718 * @param out Output frame.
719 *
720 * @return PJ_SUCCESS on success.
721 */
722PJ_INLINE(pj_status_t) pjmedia_codec_amr_predecode(
723 const pjmedia_frame *in,
724 const pjmedia_codec_amr_pack_setting *setting,
725 pjmedia_frame *out)
726{
727 pj_int8_t amr_bits[477 + 7] = {0};
728 pj_int8_t *p_amr_bits = &amr_bits[0];
729
730 pj_uint8_t *r = (pj_uint8_t*) in->buf; /* read cursor */
731 pj_uint8_t *w = (pj_uint8_t*) out->buf; /* write cursor */
732
733 /* env vars for AMR or AMRWB */
734 pj_uint8_t SID_FT;
735 const pj_uint8_t *framelen_tbl;
736 const pj_uint16_t *framelenbit_tbl;
737 const pj_uint16_t *bitrate_tbl;
738 const pj_int16_t* const *order_maps;
739
740 pjmedia_codec_amr_bit_info *in_info =
741 (pjmedia_codec_amr_bit_info*) &in->bit_info;
742 pjmedia_codec_amr_bit_info *out_info =
743 (pjmedia_codec_amr_bit_info*) &out->bit_info;
744
745 unsigned i;
746
747 *out_info = *in_info;
748
749 if (setting->amr_nb) {
750 SID_FT = 8;
751 framelen_tbl = pjmedia_codec_amrnb_framelen;
752 framelenbit_tbl = pjmedia_codec_amrnb_framelenbits;
753 bitrate_tbl = pjmedia_codec_amrnb_bitrates;
754 order_maps = pjmedia_codec_amrnb_ordermaps;
755 } else {
756 SID_FT = 9;
757 framelen_tbl = pjmedia_codec_amrwb_framelen;
758 framelenbit_tbl = pjmedia_codec_amrwb_framelenbits;
759 bitrate_tbl = pjmedia_codec_amrwb_bitrates;
760 order_maps = pjmedia_codec_amrwb_ordermaps;
761 }
762
763 /* unpack AMR bitstream if there is any data */
764 if (in_info->frame_type <= SID_FT) {
765 i = 0;
766 if (in_info->start_bit) {
767 for (; i < (unsigned)(8-in_info->start_bit); ++i)
768 *p_amr_bits++ = (pj_uint8_t)
769 ((*r >> (7-in_info->start_bit-i)) & 1);
770 ++r;
771 }
772 for(; i < framelenbit_tbl[in_info->frame_type]; i += 8, ++r) {
773 *p_amr_bits++ = (pj_uint8_t)((*r >> 7) & 1);
774 *p_amr_bits++ = (pj_uint8_t)((*r >> 6) & 1);
775 *p_amr_bits++ = (pj_uint8_t)((*r >> 5) & 1);
776 *p_amr_bits++ = (pj_uint8_t)((*r >> 4) & 1);
777 *p_amr_bits++ = (pj_uint8_t)((*r >> 3) & 1);
778 *p_amr_bits++ = (pj_uint8_t)((*r >> 2) & 1);
779 *p_amr_bits++ = (pj_uint8_t)((*r >> 1) & 1);
780 *p_amr_bits++ = (pj_uint8_t)((*r ) & 1);
781 }
782 }
783
784 if (in_info->frame_type < SID_FT) {
785
786 /* Speech */
787 out_info->mode = in_info->frame_type;
788 out->size = framelen_tbl[out_info->mode];
789
790 pj_bzero(out->buf, out->size);
791
792 if (setting->reorder) {
793 const pj_int16_t *order_map;
794
795 order_map = order_maps[out_info->mode];
796 for(i = 0; i < framelenbit_tbl[out_info->mode]; ++i) {
797 if (amr_bits[i]) {
798 pj_uint16_t bitpos;
799 bitpos = order_map[i];
800 w[bitpos>>3] |= 1 << (7 - (bitpos % 8));
801 }
802 }
803 } else {
804 for(i = 0; i < framelenbit_tbl[out_info->mode]; ++i) {
805 if (amr_bits[i])
806 w[i >> 3] |= 1 << (7 - (i % 8));
807 }
808 }
809
810 } else if (in_info->frame_type == SID_FT) {
811
812 /* SID */
813 pj_uint8_t w_bitptr = 0;
814 pj_uint8_t FT_;
815
816 if (setting->amr_nb)
817 FT_ = (pj_uint8_t)((amr_bits[36] << 2) | (amr_bits[37] << 1) |
818 amr_bits[38]);
819 else
820 FT_ = (pj_uint8_t)((amr_bits[36] << 3) | (amr_bits[37] << 2) |
821 (amr_bits[38] << 1) | amr_bits[39]);
822
823 out_info->mode = FT_;
824 out->size = 5;
825
826 pj_bzero(out->buf, out->size);
827 for(i = 0; i < framelenbit_tbl[SID_FT]; ++i) {
828 if (amr_bits[i])
829 *w |= (1 << (7-w_bitptr));
830
831 if (++w_bitptr == 8) {
832 ++w;
833 w_bitptr = 0;
834 }
835 }
836
837 } else {
838
839 /* NO DATA */
840 out->size = 0;
841 out_info->mode = -1;
842 }
843
844 out_info->start_bit = 0;
845
846 return PJ_SUCCESS;
847}
848
849
850/**
851 * Pack encoded AMR frame(s) into an RTP payload.
852 *
853 * @param frames AMR frames to be packed.
854 * @param nframes Number of frames to be packed.
855 * @param setting Settings, see #pjmedia_codec_amr_pack_setting.
856 * @param pkt Payload.
857 * @param pkt_size Payload size, as input this specifies payload maximum size,
858 * as output this specifies payload packed size.
859 *
860 * @return PJ_SUCCESS on success.
861 */
862PJ_INLINE (pj_status_t) pjmedia_codec_amr_pack(
863 const pjmedia_frame frames[],
864 unsigned nframes,
865 const pjmedia_codec_amr_pack_setting *setting,
866 void *pkt,
867 pj_size_t *pkt_size)
868{
869 /* Write cursor */
870 pj_uint8_t *w = (pj_uint8_t*)pkt;
871 pj_uint8_t w_bitptr = 0;
872
873 /* Read cursor */
874 pj_uint8_t *r;
875
876 /* env vars for AMR or AMRWB */
877 pj_uint8_t SID_FT;
878 const pj_uint8_t *framelen_tbl;
879 const pj_uint16_t *framelenbit_tbl;
880 const pj_uint16_t *bitrate_tbl;
881 const pj_int16_t* const *order_maps;
882
883 /* frame info */
884 pjmedia_codec_amr_bit_info *info;
885
886 unsigned i, max_pkt_size;
887
888 max_pkt_size = *pkt_size;
889
890 if (setting->amr_nb) {
891 SID_FT = 8;
892 framelen_tbl = pjmedia_codec_amrnb_framelen;
893 framelenbit_tbl = pjmedia_codec_amrnb_framelenbits;
894 bitrate_tbl = pjmedia_codec_amrnb_bitrates;
895 order_maps = pjmedia_codec_amrnb_ordermaps;
896 } else {
897 SID_FT = 9;
898 framelen_tbl = pjmedia_codec_amrwb_framelen;
899 framelenbit_tbl = pjmedia_codec_amrwb_framelenbits;
900 bitrate_tbl = pjmedia_codec_amrwb_bitrates;
901 order_maps = pjmedia_codec_amrwb_ordermaps;
902 }
903
904 /* Code Mode Request, 4 bits */
905 *w = (pj_uint8_t)(setting->cmr << 4);
906 w_bitptr = 4;
907 if (setting->octet_aligned) {
908 ++w;
909 w_bitptr = 0;
910 }
911
912 /* Table Of Contents, 6 bits each */
913 for (i = 0; i < nframes; ++i) {
914 pj_uint8_t TOC, FT, Q;
915 pj_bool_t F;
916
917 info = (pjmedia_codec_amr_bit_info*)&frames[i].bit_info;
918
919 F = (i != nframes-1);
920 FT = info->frame_type;
921 Q = (pj_uint8_t)(info->good_quality == 1);
922 pj_assert(FT <= SID_FT || FT == 14 || FT == 15);
923
924 /* Check buffer availability */
925 *pkt_size = w - (pj_uint8_t*)pkt + 1;
926 PJ_ASSERT_RETURN(*pkt_size <= max_pkt_size, PJ_ETOOSMALL);
927
928 TOC = (pj_uint8_t)((F<<5) | (FT<<1) | Q);
929 if (w_bitptr == 0) {
930 *w = (pj_uint8_t)(TOC<<2);
931 w_bitptr = 6;
932 } else if (w_bitptr == 2) {
933 *w++ |= TOC;
934 w_bitptr = 0;
935 } else if (w_bitptr == 4) {
936 *w++ |= TOC>>2;
937 *w = (pj_uint8_t)(TOC<<6);
938 w_bitptr = 2;
939 } else if (w_bitptr == 6) {
940 *w++ |= TOC>>4;
941 *w = (pj_uint8_t)(TOC<<4);
942 w_bitptr = 4;
943 }
944 if (setting->octet_aligned) {
945 ++w;
946 w_bitptr = 0;
947 }
948 }
949
950 /* Encoded data */
951 for (i = 0; i < nframes; ++i) {
952 pj_int8_t amr_bits[477 + 7] = {0};
953 pj_int8_t *p_amr_bits = &amr_bits[0];
954 unsigned j;
955
956 info = (pjmedia_codec_amr_bit_info*)&frames[i].bit_info;
957
958 /* Check buffer availability */
959 *pkt_size = w - (pj_uint8_t*)pkt;
960 if (info->frame_type <= SID_FT)
961 *pkt_size += framelen_tbl[info->frame_type] + 1;
962 PJ_ASSERT_RETURN(*pkt_size <= max_pkt_size, PJ_ETOOSMALL);
963
964 /* Skip if there is no data */
965 if (info->frame_type > SID_FT)
966 continue;
967
968 /* Unpack bits */
969 r = (pj_uint8_t*) frames[i].buf;
970 j = 0;
971 if (info->start_bit) {
972 for (; j < (unsigned)(8-info->start_bit); ++j)
973 *p_amr_bits++ = (pj_uint8_t)
974 ((*r >> (7-info->start_bit-j)) & 1);
975 ++r;
976 }
977 for(; j < framelenbit_tbl[info->frame_type]; j+=8, ++r) {
978 *p_amr_bits++ = (pj_uint8_t)((*r >> 7) & 1);
979 *p_amr_bits++ = (pj_uint8_t)((*r >> 6) & 1);
980 *p_amr_bits++ = (pj_uint8_t)((*r >> 5) & 1);
981 *p_amr_bits++ = (pj_uint8_t)((*r >> 4) & 1);
982 *p_amr_bits++ = (pj_uint8_t)((*r >> 3) & 1);
983 *p_amr_bits++ = (pj_uint8_t)((*r >> 2) & 1);
984 *p_amr_bits++ = (pj_uint8_t)((*r >> 1) & 1);
985 *p_amr_bits++ = (pj_uint8_t)((*r ) & 1);
986 }
987
988 if (info->frame_type < SID_FT) {
989
990 /* Speech */
991 if (w_bitptr == 0) *w = 0;
992
993 if (setting->reorder) {
994 const pj_int16_t *order_map;
995
996 /* Put bits in the packet, sensitivity descending ordered */
997 order_map = order_maps[info->frame_type];
998 for(j = 0; j < framelenbit_tbl[info->frame_type]; ++j) {
999 if (amr_bits[order_map[j]])
1000 *w |= (1 << (7-w_bitptr));
1001
1002 if (++w_bitptr == 8) {
1003 w_bitptr = 0;
1004 ++w;
1005 *w = 0;
1006 }
1007 }
1008 } else {
1009 for(j = 0; j < framelenbit_tbl[info->frame_type]; ++j) {
1010 if (amr_bits[j])
1011 *w |= (1 << (7-w_bitptr));
1012
1013 if (++w_bitptr == 8) {
1014 w_bitptr = 0;
1015 ++w;
1016 *w = 0;
1017 }
1018 }
1019 }
1020
1021 } else if (info->frame_type == SID_FT) {
1022
1023 /* SID */
1024 amr_bits[35] |= info->STI;
1025
1026 if (setting->amr_nb) {
1027 amr_bits[36] = (pj_uint8_t)((info->mode >> 2) & 1);
1028 amr_bits[37] = (pj_uint8_t)((info->mode >> 1) & 1);
1029 amr_bits[38] = (pj_uint8_t)((info->mode) & 1);
1030 } else {
1031 amr_bits[36] = (pj_uint8_t)((info->mode >> 3) & 1);
1032 amr_bits[37] = (pj_uint8_t)((info->mode >> 2) & 1);
1033 amr_bits[38] = (pj_uint8_t)((info->mode >> 1) & 1);
1034 amr_bits[39] = (pj_uint8_t)((info->mode) & 1);
1035 }
1036
1037 if (w_bitptr == 0) *w = 0;
1038 for(j = 0; j < framelenbit_tbl[info->frame_type]; ++j) {
1039 if (amr_bits[j])
1040 *w |= (1 << (7-w_bitptr));
1041
1042 if (++w_bitptr == 8) {
1043 w_bitptr = 0;
1044 ++w;
1045 *w = 0;
1046 }
1047 }
1048 }
1049
1050 if (setting->octet_aligned) {
1051 ++w;
1052 w_bitptr = 0;
1053 }
1054 }
1055
1056 *pkt_size = w - (pj_uint8_t*)pkt;
1057 if (w_bitptr)
1058 *pkt_size += 1;
1059
1060 return PJ_SUCCESS;
1061}
1062
1063
1064/**
1065 * Parse AMR payload into frames.
1066 *
1067 * @param pkt Payload.
1068 * @param pkt_size Payload size.
1069 * @param ts Base timestamp.
1070 * @param setting Settings, see #pjmedia_codec_amr_pack_setting.
1071 * @param frames Frames parsed.
1072 * @param nframes Number of frames parsed.
1073 * @param cmr Change Mode Request message for local encoder.
1074 *
1075 * @return PJ_SUCCESS on success.
1076 */
1077PJ_INLINE(pj_status_t) pjmedia_codec_amr_parse(
1078 void *pkt,
1079 pj_size_t pkt_size,
1080 const pj_timestamp *ts,
1081 const pjmedia_codec_amr_pack_setting* setting,
1082 pjmedia_frame frames[],
1083 unsigned *nframes,
1084 pj_uint8_t *cmr)
1085{
1086 unsigned cnt = 0;
1087 pj_timestamp ts_ = *ts;
1088
1089 /* Read cursor */
1090 pj_uint8_t r_bitptr = 0;
1091 pj_uint8_t *r = (pj_uint8_t*)pkt;
1092
1093 /* env vars for AMR or AMRWB */
1094 pj_uint8_t SID_FT;
1095 const pj_uint8_t *framelen_tbl;
1096 const pj_uint16_t *framelenbit_tbl;
1097 const pj_int16_t* const *order_maps;
1098
1099 /* frame info */
1100 pjmedia_codec_amr_bit_info *info;
1101
1102 if (setting->amr_nb) {
1103 SID_FT = 8;
1104 framelen_tbl = pjmedia_codec_amrnb_framelen;
1105 framelenbit_tbl = pjmedia_codec_amrnb_framelenbits;
1106 order_maps = pjmedia_codec_amrnb_ordermaps;
1107 } else {
1108 SID_FT = 9;
1109 framelen_tbl = pjmedia_codec_amrwb_framelen;
1110 framelenbit_tbl = pjmedia_codec_amrwb_framelenbits;
1111 order_maps = pjmedia_codec_amrwb_ordermaps;
1112 }
1113
1114 PJ_UNUSED_ARG(pkt_size);
1115
1116 /* Code Mode Request, 4 bits */
1117 *cmr = (pj_uint8_t)((*r >> 4) & 0x0F);
1118 r_bitptr = 4;
1119 if (setting->octet_aligned) {
1120 ++r;
1121 r_bitptr = 0;
1122 }
1123
1124 /* Table Of Contents, 6 bits each */
1125 for (;;) {
1126 pj_uint8_t TOC = 0;
1127 pj_uint8_t F, FT, Q;
1128
1129 if (r_bitptr == 0) {
1130 TOC = (pj_uint8_t)(*r >> 2);
1131 r_bitptr = 6;
1132 } else if (r_bitptr == 2) {
1133 TOC = (pj_uint8_t)(*r++ & 0x3F);
1134 r_bitptr = 0;
1135 } else if (r_bitptr == 4) {
1136 TOC = (pj_uint8_t)((*r++ & 0x0f) << 2);
1137 TOC |= *r >> 6;
1138 r_bitptr = 2;
1139 } else if (r_bitptr == 6) {
1140 TOC = (pj_uint8_t)((*r++ & 0x03) << 4);
1141 TOC |= *r >> 4;
1142 r_bitptr = 4;
1143 }
1144
1145 F = (pj_uint8_t)(TOC >> 5);
1146 FT = (pj_uint8_t)((TOC >> 1) & 0x0F);
1147 Q = (pj_uint8_t)(TOC & 1);
1148
1149 if (FT > SID_FT && FT < 14) {
1150 pj_assert(!"Invalid AMR frametype, stream may be corrupted!");
1151 break;
1152 }
1153
1154 if (setting->octet_aligned) {
1155 ++r;
1156 r_bitptr = 0;
1157 }
1158
1159 /* Set frame attributes */
1160 info = (pjmedia_codec_amr_bit_info*) &frames[cnt].bit_info;
1161 info->frame_type = FT;
1162 info->mode = (pj_int8_t)((FT < SID_FT)? FT : -1);
1163 info->good_quality = (pj_uint8_t)(Q == 1);
1164 info->start_bit = 0;
1165 info->STI = 0;
1166 frames[cnt].timestamp = ts_;
1167 frames[cnt].type = PJMEDIA_FRAME_TYPE_AUDIO;
1168
1169 /* AMR frame length is 20ms */
1170 ts_.u64 += setting->amr_nb? 160 : 320;
1171
1172 if (++cnt == *nframes || !F)
1173 break;
1174 }
1175 *nframes = cnt;
1176
1177 cnt = 0;
1178
1179 /* Speech frames */
1180 while (cnt < *nframes) {
1181 pj_uint8_t FT;
1182
1183 info = (pjmedia_codec_amr_bit_info*) &frames[cnt].bit_info;
1184 FT = info->frame_type;
1185
1186 frames[cnt].buf = r;
1187 info->start_bit = r_bitptr;
1188
1189 if (FT == SID_FT) {
1190 unsigned sti_bitptr;
1191 sti_bitptr = r_bitptr + 35;
1192 info->STI = (pj_uint8_t)
1193 (r[sti_bitptr >> 3] >> (7 - (sti_bitptr % 8))) & 1;
1194 }
1195
1196 if (setting->octet_aligned) {
1197 r += framelen_tbl[FT];
1198 frames[cnt].size = framelen_tbl[FT];
1199 } else {
1200 if (FT == 14 || FT == 15) {
1201 /* NO DATA */
1202 frames[cnt].size = 0;
1203 } else {
1204 unsigned adv_bit;
1205
1206 adv_bit = framelenbit_tbl[FT] + r_bitptr;
1207 r += adv_bit >> 3;
1208 r_bitptr = (pj_uint8_t)(adv_bit % 8);
1209
1210 frames[cnt].size = adv_bit >> 3;
1211 if (r_bitptr)
1212 ++frames[cnt].size;
1213 }
1214 }
1215 ++cnt;
1216 }
1217
1218 return PJ_SUCCESS;
1219}
1220
1221
1222PJ_END_DECL
1223
1224/**
1225 * @}
1226 */
1227
1228#endif /* __PJMEDIA_CODECS_AMR_HELPER_H__ */