blob: 79d324af2e7cac487e2aca362e2b563ed7ccd282 [file] [log] [blame]
Nanang Izzuddind55553a2008-10-28 02:24:46 +00001/* $Id$ */
2/*
Benny Prijono844653c2008-12-23 17:27:53 +00003 * Copyright (C) 2008-2009 Teluu Inc. (http://www.teluu.com)
4 * Copyright (C) 2003-2008 Benny Prijono <benny@prijono.org>
Nanang Izzuddind55553a2008-10-28 02:24:46 +00005 *
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
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, 5};
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, 5};
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. */
Nanang Izzuddin35e01de2008-10-29 10:17:02 +0000608 pj_uint8_t good_quality:1; /**< Flag if frame is good/degraded. */
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000609} pjmedia_codec_amr_bit_info;
610#pragma pack()
611
612
613/**
614 * This structure describes AMR settings.
615 */
Nanang Izzuddin0b8f4ca2008-11-11 11:25:13 +0000616typedef struct pjmedia_codec_amr_pack_setting {
617 pj_uint8_t amr_nb:1; /**< Set 1 for AMR-NB, 0 for AMR-WB. */
618 pj_uint8_t reorder:1; /**< Reorder bitstream into descending
Nanang Izzuddin35e01de2008-10-29 10:17:02 +0000619 sensitivity order or vice versa. */
Nanang Izzuddin0b8f4ca2008-11-11 11:25:13 +0000620 pj_uint8_t octet_aligned:1; /**< TRUE if payload is in octet-aligned mode,
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000621 FALSE if payload is in bandwidth
622 efficient mode. */
Nanang Izzuddin0b8f4ca2008-11-11 11:25:13 +0000623 pj_uint8_t cmr:4; /**< Change Mode Request for remote
Nanang Izzuddin35e01de2008-10-29 10:17:02 +0000624 encoder. */
Nanang Izzuddin0b8f4ca2008-11-11 11:25:13 +0000625} pjmedia_codec_amr_pack_setting;
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000626
627
628/**
629 * Get AMR mode based on bitrate.
630 *
631 * @param bitrate AMR bitrate.
632 *
633 * @return AMR mode.
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 Izzuddinbfa860b2009-02-09 10:39:58 +0000680 * Get AMR mode based on frame length.
681 *
682 * @param amrnb Set to PJ_TRUE for AMR-NB domain or PJ_FALSE for AMR-WB.
683 * @param frame_len The frame length.
684 *
685 * @return AMR mode.
686 */
687
688PJ_INLINE(pj_int8_t) pjmedia_codec_amr_get_mode2(pj_bool_t amrnb,
689 unsigned frame_len)
690{
Benny Prijonob7dfc9c2009-02-13 11:53:12 +0000691 int i;
Nanang Izzuddinbfa860b2009-02-09 10:39:58 +0000692
693 if (amrnb) {
694 for (i = 0; i < 9; ++i)
695 if (frame_len == pjmedia_codec_amrnb_framelen[i])
Benny Prijonob7dfc9c2009-02-13 11:53:12 +0000696 return (pj_int8_t)i;
Nanang Izzuddinbfa860b2009-02-09 10:39:58 +0000697 } else {
698 for (i = 0; i < 10; ++i) {
699 if (frame_len == pjmedia_codec_amrwb_framelen[i])
Benny Prijonob7dfc9c2009-02-13 11:53:12 +0000700 return (pj_int8_t)i;
Nanang Izzuddinbfa860b2009-02-09 10:39:58 +0000701 }
702 }
703
704 pj_assert(!"Invalid AMR frame length");
705 return -1;
706}
707
708/**
Nanang Izzuddin35e01de2008-10-29 10:17:02 +0000709 * Prepare a frame before pass it to decoder. This function will do:
710 * - reorder AMR bitstream from descending sensitivity order into
711 * encoder bits order. This can be enabled/disabled via param
712 * 'setting' by setting/resetting field 'reorder'.
713 * - align left the start bit (make the start_bit to be 0).
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000714 *
715 * @param amr_nb Set PJ_TRUE for AMR-NB and PJ_FALSE for AMR-WB.
716 * @param in Input frame.
Nanang Izzuddin0b8f4ca2008-11-11 11:25:13 +0000717 * @param setting Settings, see @pjmedia_codec_amr_pack_setting.
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000718 * @param out Output frame.
719 *
720 * @return PJ_SUCCESS on success.
721 */
Nanang Izzuddin35e01de2008-10-29 10:17:02 +0000722PJ_INLINE(pj_status_t) pjmedia_codec_amr_predecode(
Nanang Izzuddin0b8f4ca2008-11-11 11:25:13 +0000723 const pjmedia_frame *in,
724 const pjmedia_codec_amr_pack_setting *setting,
725 pjmedia_frame *out)
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000726{
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
Nanang Izzuddin35e01de2008-10-29 10:17:02 +0000749 if (setting->amr_nb) {
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000750 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 */
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000787 out_info->mode = in_info->frame_type;
788 out->size = framelen_tbl[out_info->mode];
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000789
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000790 pj_bzero(out->buf, out->size);
Nanang Izzuddin35e01de2008-10-29 10:17:02 +0000791
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));
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000807 }
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
Nanang Izzuddin35e01de2008-10-29 10:17:02 +0000816 if (setting->amr_nb)
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000817 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;
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000825
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.
Nanang Izzuddin0b8f4ca2008-11-11 11:25:13 +0000855 * @param setting Settings, see @pjmedia_codec_amr_pack_setting.
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000856 * @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(
Nanang Izzuddin0b8f4ca2008-11-11 11:25:13 +0000863 const pjmedia_frame frames[],
864 unsigned nframes,
865 const pjmedia_codec_amr_pack_setting *setting,
866 void *pkt,
867 pj_size_t *pkt_size)
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000868{
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 */
Nanang Izzuddin0b8f4ca2008-11-11 11:25:13 +0000905 *w = (pj_uint8_t)(setting->cmr << 4);
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000906 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 */
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000991 if (w_bitptr == 0) *w = 0;
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000992
Nanang Izzuddin35e01de2008-10-29 10:17:02 +0000993 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 }
Nanang Izzuddind55553a2008-10-28 02:24:46 +00001018 }
1019 }
1020
1021 } else if (info->frame_type == SID_FT) {
1022
1023 /* SID */
1024 pj_uint8_t STI = 0;
1025
1026 amr_bits[35] = (pj_uint8_t)(STI & 1);
1027
1028 if (setting->amr_nb) {
1029 amr_bits[36] = (pj_uint8_t)((info->mode >> 2) & 1);
1030 amr_bits[37] = (pj_uint8_t)((info->mode >> 1) & 1);
1031 amr_bits[38] = (pj_uint8_t)((info->mode) & 1);
1032 } else {
1033 amr_bits[36] = (pj_uint8_t)((info->mode >> 3) & 1);
1034 amr_bits[37] = (pj_uint8_t)((info->mode >> 2) & 1);
1035 amr_bits[38] = (pj_uint8_t)((info->mode >> 1) & 1);
1036 amr_bits[39] = (pj_uint8_t)((info->mode) & 1);
1037 }
1038
1039 if (w_bitptr == 0) *w = 0;
1040 for(j = 0; j < framelenbit_tbl[info->frame_type]; ++j) {
1041 if (amr_bits[j])
1042 *w |= (1 << (7-w_bitptr));
1043
1044 if (++w_bitptr == 8) {
1045 w_bitptr = 0;
1046 ++w;
1047 *w = 0;
1048 }
1049 }
1050 }
1051
1052 if (setting->octet_aligned) {
1053 ++w;
1054 w_bitptr = 0;
1055 }
1056 }
1057
1058 *pkt_size = w - (pj_uint8_t*)pkt;
1059 if (w_bitptr)
1060 *pkt_size += 1;
1061
1062 return PJ_SUCCESS;
1063}
1064
1065
1066/**
1067 * Parse AMR payload into frames.
1068 *
1069 * @param pkt Payload.
1070 * @param pkt_size Payload size.
1071 * @param ts Base timestamp.
Nanang Izzuddin0b8f4ca2008-11-11 11:25:13 +00001072 * @param setting Settings, see @pjmedia_codec_amr_pack_setting.
Nanang Izzuddind55553a2008-10-28 02:24:46 +00001073 * @param frames Frames parsed.
1074 * @param nframes Number of frames parsed.
Nanang Izzuddin0b8f4ca2008-11-11 11:25:13 +00001075 * @param cmr Change Mode Request message for local encoder.
Nanang Izzuddind55553a2008-10-28 02:24:46 +00001076 *
1077 * @return PJ_SUCCESS on success.
1078 */
1079PJ_INLINE(pj_status_t) pjmedia_codec_amr_parse(
Nanang Izzuddin0b8f4ca2008-11-11 11:25:13 +00001080 void *pkt,
1081 pj_size_t pkt_size,
1082 const pj_timestamp *ts,
1083 const pjmedia_codec_amr_pack_setting* setting,
1084 pjmedia_frame frames[],
1085 unsigned *nframes,
1086 pj_uint8_t *cmr)
Nanang Izzuddind55553a2008-10-28 02:24:46 +00001087{
1088 unsigned cnt = 0;
1089 pj_timestamp ts_ = *ts;
1090
1091 /* Read cursor */
1092 pj_uint8_t r_bitptr = 0;
1093 pj_uint8_t *r = (pj_uint8_t*)pkt;
1094
1095 /* env vars for AMR or AMRWB */
1096 pj_uint8_t SID_FT;
1097 const pj_uint8_t *framelen_tbl;
1098 const pj_uint16_t *framelenbit_tbl;
1099 const pj_int16_t* const *order_maps;
1100
1101 /* frame info */
1102 pjmedia_codec_amr_bit_info *info;
1103
1104 if (setting->amr_nb) {
1105 SID_FT = 8;
1106 framelen_tbl = pjmedia_codec_amrnb_framelen;
1107 framelenbit_tbl = pjmedia_codec_amrnb_framelenbits;
1108 order_maps = pjmedia_codec_amrnb_ordermaps;
1109 } else {
1110 SID_FT = 9;
1111 framelen_tbl = pjmedia_codec_amrwb_framelen;
1112 framelenbit_tbl = pjmedia_codec_amrwb_framelenbits;
1113 order_maps = pjmedia_codec_amrwb_ordermaps;
1114 }
1115
1116 PJ_UNUSED_ARG(pkt_size);
1117
1118 /* Code Mode Request, 4 bits */
Nanang Izzuddin0b8f4ca2008-11-11 11:25:13 +00001119 *cmr = (pj_uint8_t)((*r >> 4) & 0x0F);
Nanang Izzuddind55553a2008-10-28 02:24:46 +00001120 r_bitptr = 4;
1121 if (setting->octet_aligned) {
1122 ++r;
1123 r_bitptr = 0;
1124 }
1125
1126 /* Table Of Contents, 6 bits each */
1127 for (;;) {
1128 pj_uint8_t TOC = 0;
1129 pj_uint8_t F, FT, Q;
1130
1131 if (r_bitptr == 0) {
1132 TOC = (pj_uint8_t)(*r >> 2);
1133 r_bitptr = 6;
1134 } else if (r_bitptr == 2) {
1135 TOC = (pj_uint8_t)(*r++ & 0x3F);
1136 r_bitptr = 0;
1137 } else if (r_bitptr == 4) {
1138 TOC = (pj_uint8_t)((*r++ & 0x0f) << 2);
1139 TOC |= *r >> 6;
1140 r_bitptr = 2;
1141 } else if (r_bitptr == 6) {
1142 TOC = (pj_uint8_t)((*r++ & 0x03) << 4);
1143 TOC |= *r >> 4;
1144 r_bitptr = 4;
1145 }
1146
1147 F = (pj_uint8_t)(TOC >> 5);
1148 FT = (pj_uint8_t)((TOC >> 1) & 0x0F);
1149 Q = (pj_uint8_t)(TOC & 1);
1150
1151 if (FT > SID_FT && FT < 14) {
1152 pj_assert(!"Invalid AMR frametype, stream may be corrupted!");
1153 break;
1154 }
1155
1156 if (setting->octet_aligned) {
1157 ++r;
1158 r_bitptr = 0;
1159 }
1160
1161 /* Set frame attributes */
1162 info = (pjmedia_codec_amr_bit_info*) &frames[cnt].bit_info;
1163 info->frame_type = FT;
1164 info->mode = (pj_int8_t)((FT < SID_FT)? FT : -1);
1165 info->good_quality = (pj_uint8_t)(Q == 1);
1166 info->start_bit = 0;
1167 frames[cnt].timestamp = ts_;
1168 frames[cnt].type = PJMEDIA_FRAME_TYPE_AUDIO;
1169
1170 /* AMR frame length is 20ms */
1171 ts_.u64 += setting->amr_nb? 160 : 320;
1172
1173 if (++cnt == *nframes || !F)
1174 break;
1175 }
1176 *nframes = cnt;
1177
1178 cnt = 0;
1179
1180 /* Speech frames */
1181 while (cnt < *nframes) {
1182 pj_uint8_t FT;
1183
1184 info = (pjmedia_codec_amr_bit_info*) &frames[cnt].bit_info;
1185 FT = info->frame_type;
1186
1187 frames[cnt].buf = r;
1188 info->start_bit = r_bitptr;
1189
1190 if (setting->octet_aligned) {
1191 r += framelen_tbl[FT];
1192 frames[cnt].size = framelen_tbl[FT];
1193 } else {
1194 if (FT == 14 || FT == 15) {
1195 /* NO DATA */
1196 frames[cnt].size = 0;
1197 } else {
1198 unsigned adv_bit;
1199
1200 adv_bit = framelenbit_tbl[FT] + r_bitptr;
1201 r += adv_bit >> 3;
1202 r_bitptr = (pj_uint8_t)(adv_bit % 8);
1203
1204 frames[cnt].size = adv_bit >> 3;
1205 if (r_bitptr)
1206 ++frames[cnt].size;
1207 }
1208 }
1209 ++cnt;
1210 }
1211
1212 return PJ_SUCCESS;
1213}
1214
1215
1216PJ_END_DECL
1217
1218/**
1219 * @}
1220 */
1221
1222#endif /* __PJMEDIA_CODECS_AMR_HELPER_H__ */