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