blob: cf900165b137274e72dec7c6539a0de31e766357 [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 */
635
Nanang Izzuddin35e01de2008-10-29 10:17:02 +0000636PJ_INLINE(pj_int8_t) pjmedia_codec_amr_get_mode(unsigned bitrate)
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000637{
Nanang Izzuddin35e01de2008-10-29 10:17:02 +0000638 pj_int8_t mode = -1;
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000639
640 if(bitrate==4750){
641 mode = 0;
642 } else if(bitrate==5150){
643 mode = 1;
644 } else if(bitrate==5900){
645 mode = 2;
646 } else if(bitrate==6700){
647 mode = 3;
648 } else if(bitrate==7400){
649 mode = 4;
650 } else if(bitrate==7950){
651 mode = 5;
652 } else if(bitrate==10200){
653 mode = 6;
654 } else if(bitrate==12200){
655 mode = 7;
656
657 /* AMRWB */
658 } else if(bitrate==6600){
659 mode = 0;
660 } else if(bitrate==8850){
661 mode = 1;
662 } else if(bitrate==12650){
663 mode = 2;
664 } else if(bitrate==14250){
665 mode = 3;
666 } else if(bitrate==15850){
667 mode = 4;
668 } else if(bitrate==18250){
669 mode = 5;
670 } else if(bitrate==19850){
671 mode = 6;
672 } else if(bitrate==23050){
673 mode = 7;
674 } else if(bitrate==23850){
675 mode = 8;
676 }
677 return mode;
678}
679
680/**
Nanang Izzuddin35e01de2008-10-29 10:17:02 +0000681 * Prepare a frame before pass it to decoder. This function will do:
682 * - reorder AMR bitstream from descending sensitivity order into
683 * encoder bits order. This can be enabled/disabled via param
684 * 'setting' by setting/resetting field 'reorder'.
685 * - align left the start bit (make the start_bit to be 0).
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000686 *
687 * @param amr_nb Set PJ_TRUE for AMR-NB and PJ_FALSE for AMR-WB.
688 * @param in Input frame.
Nanang Izzuddin0b8f4ca2008-11-11 11:25:13 +0000689 * @param setting Settings, see @pjmedia_codec_amr_pack_setting.
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000690 * @param out Output frame.
691 *
692 * @return PJ_SUCCESS on success.
693 */
Nanang Izzuddin35e01de2008-10-29 10:17:02 +0000694PJ_INLINE(pj_status_t) pjmedia_codec_amr_predecode(
Nanang Izzuddin0b8f4ca2008-11-11 11:25:13 +0000695 const pjmedia_frame *in,
696 const pjmedia_codec_amr_pack_setting *setting,
697 pjmedia_frame *out)
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000698{
699 pj_int8_t amr_bits[477 + 7] = {0};
700 pj_int8_t *p_amr_bits = &amr_bits[0];
701
702 pj_uint8_t *r = (pj_uint8_t*) in->buf; /* read cursor */
703 pj_uint8_t *w = (pj_uint8_t*) out->buf; /* write cursor */
704
705 /* env vars for AMR or AMRWB */
706 pj_uint8_t SID_FT;
707 const pj_uint8_t *framelen_tbl;
708 const pj_uint16_t *framelenbit_tbl;
709 const pj_uint16_t *bitrate_tbl;
710 const pj_int16_t* const *order_maps;
711
712 pjmedia_codec_amr_bit_info *in_info =
713 (pjmedia_codec_amr_bit_info*) &in->bit_info;
714 pjmedia_codec_amr_bit_info *out_info =
715 (pjmedia_codec_amr_bit_info*) &out->bit_info;
716
717 unsigned i;
718
719 *out_info = *in_info;
720
Nanang Izzuddin35e01de2008-10-29 10:17:02 +0000721 if (setting->amr_nb) {
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000722 SID_FT = 8;
723 framelen_tbl = pjmedia_codec_amrnb_framelen;
724 framelenbit_tbl = pjmedia_codec_amrnb_framelenbits;
725 bitrate_tbl = pjmedia_codec_amrnb_bitrates;
726 order_maps = pjmedia_codec_amrnb_ordermaps;
727 } else {
728 SID_FT = 9;
729 framelen_tbl = pjmedia_codec_amrwb_framelen;
730 framelenbit_tbl = pjmedia_codec_amrwb_framelenbits;
731 bitrate_tbl = pjmedia_codec_amrwb_bitrates;
732 order_maps = pjmedia_codec_amrwb_ordermaps;
733 }
734
735 /* unpack AMR bitstream if there is any data */
736 if (in_info->frame_type <= SID_FT) {
737 i = 0;
738 if (in_info->start_bit) {
739 for (; i < (unsigned)(8-in_info->start_bit); ++i)
740 *p_amr_bits++ = (pj_uint8_t)
741 ((*r >> (7-in_info->start_bit-i)) & 1);
742 ++r;
743 }
744 for(; i < framelenbit_tbl[in_info->frame_type]; i += 8, ++r) {
745 *p_amr_bits++ = (pj_uint8_t)((*r >> 7) & 1);
746 *p_amr_bits++ = (pj_uint8_t)((*r >> 6) & 1);
747 *p_amr_bits++ = (pj_uint8_t)((*r >> 5) & 1);
748 *p_amr_bits++ = (pj_uint8_t)((*r >> 4) & 1);
749 *p_amr_bits++ = (pj_uint8_t)((*r >> 3) & 1);
750 *p_amr_bits++ = (pj_uint8_t)((*r >> 2) & 1);
751 *p_amr_bits++ = (pj_uint8_t)((*r >> 1) & 1);
752 *p_amr_bits++ = (pj_uint8_t)((*r ) & 1);
753 }
754 }
755
756 if (in_info->frame_type < SID_FT) {
757
758 /* Speech */
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000759 out_info->mode = in_info->frame_type;
760 out->size = framelen_tbl[out_info->mode];
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000761
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.
Nanang Izzuddin0b8f4ca2008-11-11 11:25:13 +0000828 * @param setting Settings, see @pjmedia_codec_amr_pack_setting.
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000829 * @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(
Nanang Izzuddin0b8f4ca2008-11-11 11:25:13 +0000836 const pjmedia_frame frames[],
837 unsigned nframes,
838 const pjmedia_codec_amr_pack_setting *setting,
839 void *pkt,
840 pj_size_t *pkt_size)
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000841{
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 */
Nanang Izzuddin0b8f4ca2008-11-11 11:25:13 +0000878 *w = (pj_uint8_t)(setting->cmr << 4);
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000879 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.
Nanang Izzuddin0b8f4ca2008-11-11 11:25:13 +00001045 * @param setting Settings, see @pjmedia_codec_amr_pack_setting.
Nanang Izzuddind55553a2008-10-28 02:24:46 +00001046 * @param frames Frames parsed.
1047 * @param nframes Number of frames parsed.
Nanang Izzuddin0b8f4ca2008-11-11 11:25:13 +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(
Nanang Izzuddin0b8f4ca2008-11-11 11:25:13 +00001053 void *pkt,
1054 pj_size_t pkt_size,
1055 const pj_timestamp *ts,
1056 const pjmedia_codec_amr_pack_setting* setting,
1057 pjmedia_frame frames[],
1058 unsigned *nframes,
1059 pj_uint8_t *cmr)
Nanang Izzuddind55553a2008-10-28 02:24:46 +00001060{
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 */
Nanang Izzuddin0b8f4ca2008-11-11 11:25:13 +00001092 *cmr = (pj_uint8_t)((*r >> 4) & 0x0F);
Nanang Izzuddind55553a2008-10-28 02:24:46 +00001093 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__ */