blob: e8df0a0a75012917d9624607c3cca849921b2bc3 [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
Benny Prijono2e8cf632009-08-13 15:57:26 +000036 * @ingroup PJMEDIA_CODEC_CODECS
Nanang Izzuddind55553a2008-10-28 02:24:46 +000037 * @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/**
Benny Prijonob8aeb9d2010-09-30 04:23:27 +0000600 * This structure describes AMR frame info, to be fitted into #pjmedia_frame
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000601 * 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 *
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000715 * @param in Input frame.
Benny Prijonob8aeb9d2010-09-30 04:23:27 +0000716 * @param setting Settings, see #pjmedia_codec_amr_pack_setting.
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000717 * @param out Output frame.
718 *
719 * @return PJ_SUCCESS on success.
720 */
Nanang Izzuddin35e01de2008-10-29 10:17:02 +0000721PJ_INLINE(pj_status_t) pjmedia_codec_amr_predecode(
Nanang Izzuddin0b8f4ca2008-11-11 11:25:13 +0000722 const pjmedia_frame *in,
723 const pjmedia_codec_amr_pack_setting *setting,
724 pjmedia_frame *out)
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000725{
726 pj_int8_t amr_bits[477 + 7] = {0};
727 pj_int8_t *p_amr_bits = &amr_bits[0];
728
729 pj_uint8_t *r = (pj_uint8_t*) in->buf; /* read cursor */
730 pj_uint8_t *w = (pj_uint8_t*) out->buf; /* write cursor */
731
732 /* env vars for AMR or AMRWB */
733 pj_uint8_t SID_FT;
734 const pj_uint8_t *framelen_tbl;
735 const pj_uint16_t *framelenbit_tbl;
736 const pj_uint16_t *bitrate_tbl;
737 const pj_int16_t* const *order_maps;
738
739 pjmedia_codec_amr_bit_info *in_info =
740 (pjmedia_codec_amr_bit_info*) &in->bit_info;
741 pjmedia_codec_amr_bit_info *out_info =
742 (pjmedia_codec_amr_bit_info*) &out->bit_info;
743
744 unsigned i;
745
746 *out_info = *in_info;
747
Nanang Izzuddin35e01de2008-10-29 10:17:02 +0000748 if (setting->amr_nb) {
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000749 SID_FT = 8;
750 framelen_tbl = pjmedia_codec_amrnb_framelen;
751 framelenbit_tbl = pjmedia_codec_amrnb_framelenbits;
752 bitrate_tbl = pjmedia_codec_amrnb_bitrates;
753 order_maps = pjmedia_codec_amrnb_ordermaps;
754 } else {
755 SID_FT = 9;
756 framelen_tbl = pjmedia_codec_amrwb_framelen;
757 framelenbit_tbl = pjmedia_codec_amrwb_framelenbits;
758 bitrate_tbl = pjmedia_codec_amrwb_bitrates;
759 order_maps = pjmedia_codec_amrwb_ordermaps;
760 }
761
762 /* unpack AMR bitstream if there is any data */
763 if (in_info->frame_type <= SID_FT) {
764 i = 0;
765 if (in_info->start_bit) {
766 for (; i < (unsigned)(8-in_info->start_bit); ++i)
767 *p_amr_bits++ = (pj_uint8_t)
768 ((*r >> (7-in_info->start_bit-i)) & 1);
769 ++r;
770 }
771 for(; i < framelenbit_tbl[in_info->frame_type]; i += 8, ++r) {
772 *p_amr_bits++ = (pj_uint8_t)((*r >> 7) & 1);
773 *p_amr_bits++ = (pj_uint8_t)((*r >> 6) & 1);
774 *p_amr_bits++ = (pj_uint8_t)((*r >> 5) & 1);
775 *p_amr_bits++ = (pj_uint8_t)((*r >> 4) & 1);
776 *p_amr_bits++ = (pj_uint8_t)((*r >> 3) & 1);
777 *p_amr_bits++ = (pj_uint8_t)((*r >> 2) & 1);
778 *p_amr_bits++ = (pj_uint8_t)((*r >> 1) & 1);
779 *p_amr_bits++ = (pj_uint8_t)((*r ) & 1);
780 }
781 }
782
783 if (in_info->frame_type < SID_FT) {
784
785 /* Speech */
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000786 out_info->mode = in_info->frame_type;
787 out->size = framelen_tbl[out_info->mode];
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000788
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000789 pj_bzero(out->buf, out->size);
Nanang Izzuddin35e01de2008-10-29 10:17:02 +0000790
791 if (setting->reorder) {
792 const pj_int16_t *order_map;
793
794 order_map = order_maps[out_info->mode];
795 for(i = 0; i < framelenbit_tbl[out_info->mode]; ++i) {
796 if (amr_bits[i]) {
797 pj_uint16_t bitpos;
798 bitpos = order_map[i];
799 w[bitpos>>3] |= 1 << (7 - (bitpos % 8));
800 }
801 }
802 } else {
803 for(i = 0; i < framelenbit_tbl[out_info->mode]; ++i) {
804 if (amr_bits[i])
805 w[i >> 3] |= 1 << (7 - (i % 8));
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000806 }
807 }
808
809 } else if (in_info->frame_type == SID_FT) {
810
811 /* SID */
812 pj_uint8_t w_bitptr = 0;
813 pj_uint8_t FT_;
814
Nanang Izzuddin35e01de2008-10-29 10:17:02 +0000815 if (setting->amr_nb)
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000816 FT_ = (pj_uint8_t)((amr_bits[36] << 2) | (amr_bits[37] << 1) |
817 amr_bits[38]);
818 else
819 FT_ = (pj_uint8_t)((amr_bits[36] << 3) | (amr_bits[37] << 2) |
820 (amr_bits[38] << 1) | amr_bits[39]);
821
822 out_info->mode = FT_;
823 out->size = 5;
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000824
825 pj_bzero(out->buf, out->size);
826 for(i = 0; i < framelenbit_tbl[SID_FT]; ++i) {
827 if (amr_bits[i])
828 *w |= (1 << (7-w_bitptr));
829
830 if (++w_bitptr == 8) {
831 ++w;
832 w_bitptr = 0;
833 }
834 }
835
836 } else {
837
838 /* NO DATA */
839 out->size = 0;
840 out_info->mode = -1;
841 }
842
843 out_info->start_bit = 0;
844
845 return PJ_SUCCESS;
846}
847
848
849/**
850 * Pack encoded AMR frame(s) into an RTP payload.
851 *
852 * @param frames AMR frames to be packed.
853 * @param nframes Number of frames to be packed.
Benny Prijonob8aeb9d2010-09-30 04:23:27 +0000854 * @param setting Settings, see #pjmedia_codec_amr_pack_setting.
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000855 * @param pkt Payload.
856 * @param pkt_size Payload size, as input this specifies payload maximum size,
857 * as output this specifies payload packed size.
858 *
859 * @return PJ_SUCCESS on success.
860 */
861PJ_INLINE (pj_status_t) pjmedia_codec_amr_pack(
Nanang Izzuddin0b8f4ca2008-11-11 11:25:13 +0000862 const pjmedia_frame frames[],
863 unsigned nframes,
864 const pjmedia_codec_amr_pack_setting *setting,
865 void *pkt,
866 pj_size_t *pkt_size)
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000867{
868 /* Write cursor */
869 pj_uint8_t *w = (pj_uint8_t*)pkt;
870 pj_uint8_t w_bitptr = 0;
871
872 /* Read cursor */
873 pj_uint8_t *r;
874
875 /* env vars for AMR or AMRWB */
876 pj_uint8_t SID_FT;
877 const pj_uint8_t *framelen_tbl;
878 const pj_uint16_t *framelenbit_tbl;
879 const pj_uint16_t *bitrate_tbl;
880 const pj_int16_t* const *order_maps;
881
882 /* frame info */
883 pjmedia_codec_amr_bit_info *info;
884
885 unsigned i, max_pkt_size;
886
887 max_pkt_size = *pkt_size;
888
889 if (setting->amr_nb) {
890 SID_FT = 8;
891 framelen_tbl = pjmedia_codec_amrnb_framelen;
892 framelenbit_tbl = pjmedia_codec_amrnb_framelenbits;
893 bitrate_tbl = pjmedia_codec_amrnb_bitrates;
894 order_maps = pjmedia_codec_amrnb_ordermaps;
895 } else {
896 SID_FT = 9;
897 framelen_tbl = pjmedia_codec_amrwb_framelen;
898 framelenbit_tbl = pjmedia_codec_amrwb_framelenbits;
899 bitrate_tbl = pjmedia_codec_amrwb_bitrates;
900 order_maps = pjmedia_codec_amrwb_ordermaps;
901 }
902
903 /* Code Mode Request, 4 bits */
Nanang Izzuddin0b8f4ca2008-11-11 11:25:13 +0000904 *w = (pj_uint8_t)(setting->cmr << 4);
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000905 w_bitptr = 4;
906 if (setting->octet_aligned) {
907 ++w;
908 w_bitptr = 0;
909 }
910
911 /* Table Of Contents, 6 bits each */
912 for (i = 0; i < nframes; ++i) {
913 pj_uint8_t TOC, FT, Q;
914 pj_bool_t F;
915
916 info = (pjmedia_codec_amr_bit_info*)&frames[i].bit_info;
917
918 F = (i != nframes-1);
919 FT = info->frame_type;
920 Q = (pj_uint8_t)(info->good_quality == 1);
921 pj_assert(FT <= SID_FT || FT == 14 || FT == 15);
922
923 /* Check buffer availability */
924 *pkt_size = w - (pj_uint8_t*)pkt + 1;
925 PJ_ASSERT_RETURN(*pkt_size <= max_pkt_size, PJ_ETOOSMALL);
926
927 TOC = (pj_uint8_t)((F<<5) | (FT<<1) | Q);
928 if (w_bitptr == 0) {
929 *w = (pj_uint8_t)(TOC<<2);
930 w_bitptr = 6;
931 } else if (w_bitptr == 2) {
932 *w++ |= TOC;
933 w_bitptr = 0;
934 } else if (w_bitptr == 4) {
935 *w++ |= TOC>>2;
936 *w = (pj_uint8_t)(TOC<<6);
937 w_bitptr = 2;
938 } else if (w_bitptr == 6) {
939 *w++ |= TOC>>4;
940 *w = (pj_uint8_t)(TOC<<4);
941 w_bitptr = 4;
942 }
943 if (setting->octet_aligned) {
944 ++w;
945 w_bitptr = 0;
946 }
947 }
948
949 /* Encoded data */
950 for (i = 0; i < nframes; ++i) {
951 pj_int8_t amr_bits[477 + 7] = {0};
952 pj_int8_t *p_amr_bits = &amr_bits[0];
953 unsigned j;
954
955 info = (pjmedia_codec_amr_bit_info*)&frames[i].bit_info;
956
957 /* Check buffer availability */
958 *pkt_size = w - (pj_uint8_t*)pkt;
959 if (info->frame_type <= SID_FT)
960 *pkt_size += framelen_tbl[info->frame_type] + 1;
961 PJ_ASSERT_RETURN(*pkt_size <= max_pkt_size, PJ_ETOOSMALL);
962
963 /* Skip if there is no data */
964 if (info->frame_type > SID_FT)
965 continue;
966
967 /* Unpack bits */
968 r = (pj_uint8_t*) frames[i].buf;
969 j = 0;
970 if (info->start_bit) {
971 for (; j < (unsigned)(8-info->start_bit); ++j)
972 *p_amr_bits++ = (pj_uint8_t)
973 ((*r >> (7-info->start_bit-j)) & 1);
974 ++r;
975 }
976 for(; j < framelenbit_tbl[info->frame_type]; j+=8, ++r) {
977 *p_amr_bits++ = (pj_uint8_t)((*r >> 7) & 1);
978 *p_amr_bits++ = (pj_uint8_t)((*r >> 6) & 1);
979 *p_amr_bits++ = (pj_uint8_t)((*r >> 5) & 1);
980 *p_amr_bits++ = (pj_uint8_t)((*r >> 4) & 1);
981 *p_amr_bits++ = (pj_uint8_t)((*r >> 3) & 1);
982 *p_amr_bits++ = (pj_uint8_t)((*r >> 2) & 1);
983 *p_amr_bits++ = (pj_uint8_t)((*r >> 1) & 1);
984 *p_amr_bits++ = (pj_uint8_t)((*r ) & 1);
985 }
986
987 if (info->frame_type < SID_FT) {
988
989 /* Speech */
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000990 if (w_bitptr == 0) *w = 0;
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000991
Nanang Izzuddin35e01de2008-10-29 10:17:02 +0000992 if (setting->reorder) {
993 const pj_int16_t *order_map;
994
995 /* Put bits in the packet, sensitivity descending ordered */
996 order_map = order_maps[info->frame_type];
997 for(j = 0; j < framelenbit_tbl[info->frame_type]; ++j) {
998 if (amr_bits[order_map[j]])
999 *w |= (1 << (7-w_bitptr));
1000
1001 if (++w_bitptr == 8) {
1002 w_bitptr = 0;
1003 ++w;
1004 *w = 0;
1005 }
1006 }
1007 } else {
1008 for(j = 0; j < framelenbit_tbl[info->frame_type]; ++j) {
1009 if (amr_bits[j])
1010 *w |= (1 << (7-w_bitptr));
1011
1012 if (++w_bitptr == 8) {
1013 w_bitptr = 0;
1014 ++w;
1015 *w = 0;
1016 }
Nanang Izzuddind55553a2008-10-28 02:24:46 +00001017 }
1018 }
1019
1020 } else if (info->frame_type == SID_FT) {
1021
1022 /* SID */
1023 pj_uint8_t STI = 0;
1024
1025 amr_bits[35] = (pj_uint8_t)(STI & 1);
1026
1027 if (setting->amr_nb) {
1028 amr_bits[36] = (pj_uint8_t)((info->mode >> 2) & 1);
1029 amr_bits[37] = (pj_uint8_t)((info->mode >> 1) & 1);
1030 amr_bits[38] = (pj_uint8_t)((info->mode) & 1);
1031 } else {
1032 amr_bits[36] = (pj_uint8_t)((info->mode >> 3) & 1);
1033 amr_bits[37] = (pj_uint8_t)((info->mode >> 2) & 1);
1034 amr_bits[38] = (pj_uint8_t)((info->mode >> 1) & 1);
1035 amr_bits[39] = (pj_uint8_t)((info->mode) & 1);
1036 }
1037
1038 if (w_bitptr == 0) *w = 0;
1039 for(j = 0; j < framelenbit_tbl[info->frame_type]; ++j) {
1040 if (amr_bits[j])
1041 *w |= (1 << (7-w_bitptr));
1042
1043 if (++w_bitptr == 8) {
1044 w_bitptr = 0;
1045 ++w;
1046 *w = 0;
1047 }
1048 }
1049 }
1050
1051 if (setting->octet_aligned) {
1052 ++w;
1053 w_bitptr = 0;
1054 }
1055 }
1056
1057 *pkt_size = w - (pj_uint8_t*)pkt;
1058 if (w_bitptr)
1059 *pkt_size += 1;
1060
1061 return PJ_SUCCESS;
1062}
1063
1064
1065/**
1066 * Parse AMR payload into frames.
1067 *
1068 * @param pkt Payload.
1069 * @param pkt_size Payload size.
1070 * @param ts Base timestamp.
Benny Prijonob8aeb9d2010-09-30 04:23:27 +00001071 * @param setting Settings, see #pjmedia_codec_amr_pack_setting.
Nanang Izzuddind55553a2008-10-28 02:24:46 +00001072 * @param frames Frames parsed.
1073 * @param nframes Number of frames parsed.
Nanang Izzuddin0b8f4ca2008-11-11 11:25:13 +00001074 * @param cmr Change Mode Request message for local encoder.
Nanang Izzuddind55553a2008-10-28 02:24:46 +00001075 *
1076 * @return PJ_SUCCESS on success.
1077 */
1078PJ_INLINE(pj_status_t) pjmedia_codec_amr_parse(
Nanang Izzuddin0b8f4ca2008-11-11 11:25:13 +00001079 void *pkt,
1080 pj_size_t pkt_size,
1081 const pj_timestamp *ts,
1082 const pjmedia_codec_amr_pack_setting* setting,
1083 pjmedia_frame frames[],
1084 unsigned *nframes,
1085 pj_uint8_t *cmr)
Nanang Izzuddind55553a2008-10-28 02:24:46 +00001086{
1087 unsigned cnt = 0;
1088 pj_timestamp ts_ = *ts;
1089
1090 /* Read cursor */
1091 pj_uint8_t r_bitptr = 0;
1092 pj_uint8_t *r = (pj_uint8_t*)pkt;
1093
1094 /* env vars for AMR or AMRWB */
1095 pj_uint8_t SID_FT;
1096 const pj_uint8_t *framelen_tbl;
1097 const pj_uint16_t *framelenbit_tbl;
1098 const pj_int16_t* const *order_maps;
1099
1100 /* frame info */
1101 pjmedia_codec_amr_bit_info *info;
1102
1103 if (setting->amr_nb) {
1104 SID_FT = 8;
1105 framelen_tbl = pjmedia_codec_amrnb_framelen;
1106 framelenbit_tbl = pjmedia_codec_amrnb_framelenbits;
1107 order_maps = pjmedia_codec_amrnb_ordermaps;
1108 } else {
1109 SID_FT = 9;
1110 framelen_tbl = pjmedia_codec_amrwb_framelen;
1111 framelenbit_tbl = pjmedia_codec_amrwb_framelenbits;
1112 order_maps = pjmedia_codec_amrwb_ordermaps;
1113 }
1114
1115 PJ_UNUSED_ARG(pkt_size);
1116
1117 /* Code Mode Request, 4 bits */
Nanang Izzuddin0b8f4ca2008-11-11 11:25:13 +00001118 *cmr = (pj_uint8_t)((*r >> 4) & 0x0F);
Nanang Izzuddind55553a2008-10-28 02:24:46 +00001119 r_bitptr = 4;
1120 if (setting->octet_aligned) {
1121 ++r;
1122 r_bitptr = 0;
1123 }
1124
1125 /* Table Of Contents, 6 bits each */
1126 for (;;) {
1127 pj_uint8_t TOC = 0;
1128 pj_uint8_t F, FT, Q;
1129
1130 if (r_bitptr == 0) {
1131 TOC = (pj_uint8_t)(*r >> 2);
1132 r_bitptr = 6;
1133 } else if (r_bitptr == 2) {
1134 TOC = (pj_uint8_t)(*r++ & 0x3F);
1135 r_bitptr = 0;
1136 } else if (r_bitptr == 4) {
1137 TOC = (pj_uint8_t)((*r++ & 0x0f) << 2);
1138 TOC |= *r >> 6;
1139 r_bitptr = 2;
1140 } else if (r_bitptr == 6) {
1141 TOC = (pj_uint8_t)((*r++ & 0x03) << 4);
1142 TOC |= *r >> 4;
1143 r_bitptr = 4;
1144 }
1145
1146 F = (pj_uint8_t)(TOC >> 5);
1147 FT = (pj_uint8_t)((TOC >> 1) & 0x0F);
1148 Q = (pj_uint8_t)(TOC & 1);
1149
1150 if (FT > SID_FT && FT < 14) {
1151 pj_assert(!"Invalid AMR frametype, stream may be corrupted!");
1152 break;
1153 }
1154
1155 if (setting->octet_aligned) {
1156 ++r;
1157 r_bitptr = 0;
1158 }
1159
1160 /* Set frame attributes */
1161 info = (pjmedia_codec_amr_bit_info*) &frames[cnt].bit_info;
1162 info->frame_type = FT;
1163 info->mode = (pj_int8_t)((FT < SID_FT)? FT : -1);
1164 info->good_quality = (pj_uint8_t)(Q == 1);
1165 info->start_bit = 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 (setting->octet_aligned) {
1190 r += framelen_tbl[FT];
1191 frames[cnt].size = framelen_tbl[FT];
1192 } else {
1193 if (FT == 14 || FT == 15) {
1194 /* NO DATA */
1195 frames[cnt].size = 0;
1196 } else {
1197 unsigned adv_bit;
1198
1199 adv_bit = framelenbit_tbl[FT] + r_bitptr;
1200 r += adv_bit >> 3;
1201 r_bitptr = (pj_uint8_t)(adv_bit % 8);
1202
1203 frames[cnt].size = adv_bit >> 3;
1204 if (r_bitptr)
1205 ++frames[cnt].size;
1206 }
1207 }
1208 ++cnt;
1209 }
1210
1211 return PJ_SUCCESS;
1212}
1213
1214
1215PJ_END_DECL
1216
1217/**
1218 * @}
1219 */
1220
1221#endif /* __PJMEDIA_CODECS_AMR_HELPER_H__ */