blob: ba3a26cf2b73003888239c2a8c1e6895b6e82ba6 [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{
691 unsigned i;
692
693 if (amrnb) {
694 for (i = 0; i < 9; ++i)
695 if (frame_len == pjmedia_codec_amrnb_framelen[i])
696 return i;
697 } else {
698 for (i = 0; i < 10; ++i) {
699 if (frame_len == pjmedia_codec_amrwb_framelen[i])
700 return i;
701 }
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;
825 PJ_ASSERT_RETURN(out->size <= in->size, PJMEDIA_CODEC_EFRMINLEN);
826
827 pj_bzero(out->buf, out->size);
828 for(i = 0; i < framelenbit_tbl[SID_FT]; ++i) {
829 if (amr_bits[i])
830 *w |= (1 << (7-w_bitptr));
831
832 if (++w_bitptr == 8) {
833 ++w;
834 w_bitptr = 0;
835 }
836 }
837
838 } else {
839
840 /* NO DATA */
841 out->size = 0;
842 out_info->mode = -1;
843 }
844
845 out_info->start_bit = 0;
846
847 return PJ_SUCCESS;
848}
849
850
851/**
852 * Pack encoded AMR frame(s) into an RTP payload.
853 *
854 * @param frames AMR frames to be packed.
855 * @param nframes Number of frames to be packed.
Nanang Izzuddin0b8f4ca2008-11-11 11:25:13 +0000856 * @param setting Settings, see @pjmedia_codec_amr_pack_setting.
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000857 * @param pkt Payload.
858 * @param pkt_size Payload size, as input this specifies payload maximum size,
859 * as output this specifies payload packed size.
860 *
861 * @return PJ_SUCCESS on success.
862 */
863PJ_INLINE (pj_status_t) pjmedia_codec_amr_pack(
Nanang Izzuddin0b8f4ca2008-11-11 11:25:13 +0000864 const pjmedia_frame frames[],
865 unsigned nframes,
866 const pjmedia_codec_amr_pack_setting *setting,
867 void *pkt,
868 pj_size_t *pkt_size)
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000869{
870 /* Write cursor */
871 pj_uint8_t *w = (pj_uint8_t*)pkt;
872 pj_uint8_t w_bitptr = 0;
873
874 /* Read cursor */
875 pj_uint8_t *r;
876
877 /* env vars for AMR or AMRWB */
878 pj_uint8_t SID_FT;
879 const pj_uint8_t *framelen_tbl;
880 const pj_uint16_t *framelenbit_tbl;
881 const pj_uint16_t *bitrate_tbl;
882 const pj_int16_t* const *order_maps;
883
884 /* frame info */
885 pjmedia_codec_amr_bit_info *info;
886
887 unsigned i, max_pkt_size;
888
889 max_pkt_size = *pkt_size;
890
891 if (setting->amr_nb) {
892 SID_FT = 8;
893 framelen_tbl = pjmedia_codec_amrnb_framelen;
894 framelenbit_tbl = pjmedia_codec_amrnb_framelenbits;
895 bitrate_tbl = pjmedia_codec_amrnb_bitrates;
896 order_maps = pjmedia_codec_amrnb_ordermaps;
897 } else {
898 SID_FT = 9;
899 framelen_tbl = pjmedia_codec_amrwb_framelen;
900 framelenbit_tbl = pjmedia_codec_amrwb_framelenbits;
901 bitrate_tbl = pjmedia_codec_amrwb_bitrates;
902 order_maps = pjmedia_codec_amrwb_ordermaps;
903 }
904
905 /* Code Mode Request, 4 bits */
Nanang Izzuddin0b8f4ca2008-11-11 11:25:13 +0000906 *w = (pj_uint8_t)(setting->cmr << 4);
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000907 w_bitptr = 4;
908 if (setting->octet_aligned) {
909 ++w;
910 w_bitptr = 0;
911 }
912
913 /* Table Of Contents, 6 bits each */
914 for (i = 0; i < nframes; ++i) {
915 pj_uint8_t TOC, FT, Q;
916 pj_bool_t F;
917
918 info = (pjmedia_codec_amr_bit_info*)&frames[i].bit_info;
919
920 F = (i != nframes-1);
921 FT = info->frame_type;
922 Q = (pj_uint8_t)(info->good_quality == 1);
923 pj_assert(FT <= SID_FT || FT == 14 || FT == 15);
924
925 /* Check buffer availability */
926 *pkt_size = w - (pj_uint8_t*)pkt + 1;
927 PJ_ASSERT_RETURN(*pkt_size <= max_pkt_size, PJ_ETOOSMALL);
928
929 TOC = (pj_uint8_t)((F<<5) | (FT<<1) | Q);
930 if (w_bitptr == 0) {
931 *w = (pj_uint8_t)(TOC<<2);
932 w_bitptr = 6;
933 } else if (w_bitptr == 2) {
934 *w++ |= TOC;
935 w_bitptr = 0;
936 } else if (w_bitptr == 4) {
937 *w++ |= TOC>>2;
938 *w = (pj_uint8_t)(TOC<<6);
939 w_bitptr = 2;
940 } else if (w_bitptr == 6) {
941 *w++ |= TOC>>4;
942 *w = (pj_uint8_t)(TOC<<4);
943 w_bitptr = 4;
944 }
945 if (setting->octet_aligned) {
946 ++w;
947 w_bitptr = 0;
948 }
949 }
950
951 /* Encoded data */
952 for (i = 0; i < nframes; ++i) {
953 pj_int8_t amr_bits[477 + 7] = {0};
954 pj_int8_t *p_amr_bits = &amr_bits[0];
955 unsigned j;
956
957 info = (pjmedia_codec_amr_bit_info*)&frames[i].bit_info;
958
959 /* Check buffer availability */
960 *pkt_size = w - (pj_uint8_t*)pkt;
961 if (info->frame_type <= SID_FT)
962 *pkt_size += framelen_tbl[info->frame_type] + 1;
963 PJ_ASSERT_RETURN(*pkt_size <= max_pkt_size, PJ_ETOOSMALL);
964
965 /* Skip if there is no data */
966 if (info->frame_type > SID_FT)
967 continue;
968
969 /* Unpack bits */
970 r = (pj_uint8_t*) frames[i].buf;
971 j = 0;
972 if (info->start_bit) {
973 for (; j < (unsigned)(8-info->start_bit); ++j)
974 *p_amr_bits++ = (pj_uint8_t)
975 ((*r >> (7-info->start_bit-j)) & 1);
976 ++r;
977 }
978 for(; j < framelenbit_tbl[info->frame_type]; j+=8, ++r) {
979 *p_amr_bits++ = (pj_uint8_t)((*r >> 7) & 1);
980 *p_amr_bits++ = (pj_uint8_t)((*r >> 6) & 1);
981 *p_amr_bits++ = (pj_uint8_t)((*r >> 5) & 1);
982 *p_amr_bits++ = (pj_uint8_t)((*r >> 4) & 1);
983 *p_amr_bits++ = (pj_uint8_t)((*r >> 3) & 1);
984 *p_amr_bits++ = (pj_uint8_t)((*r >> 2) & 1);
985 *p_amr_bits++ = (pj_uint8_t)((*r >> 1) & 1);
986 *p_amr_bits++ = (pj_uint8_t)((*r ) & 1);
987 }
988
989 if (info->frame_type < SID_FT) {
990
991 /* Speech */
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000992 if (w_bitptr == 0) *w = 0;
Nanang Izzuddind55553a2008-10-28 02:24:46 +0000993
Nanang Izzuddin35e01de2008-10-29 10:17:02 +0000994 if (setting->reorder) {
995 const pj_int16_t *order_map;
996
997 /* Put bits in the packet, sensitivity descending ordered */
998 order_map = order_maps[info->frame_type];
999 for(j = 0; j < framelenbit_tbl[info->frame_type]; ++j) {
1000 if (amr_bits[order_map[j]])
1001 *w |= (1 << (7-w_bitptr));
1002
1003 if (++w_bitptr == 8) {
1004 w_bitptr = 0;
1005 ++w;
1006 *w = 0;
1007 }
1008 }
1009 } else {
1010 for(j = 0; j < framelenbit_tbl[info->frame_type]; ++j) {
1011 if (amr_bits[j])
1012 *w |= (1 << (7-w_bitptr));
1013
1014 if (++w_bitptr == 8) {
1015 w_bitptr = 0;
1016 ++w;
1017 *w = 0;
1018 }
Nanang Izzuddind55553a2008-10-28 02:24:46 +00001019 }
1020 }
1021
1022 } else if (info->frame_type == SID_FT) {
1023
1024 /* SID */
1025 pj_uint8_t STI = 0;
1026
1027 amr_bits[35] = (pj_uint8_t)(STI & 1);
1028
1029 if (setting->amr_nb) {
1030 amr_bits[36] = (pj_uint8_t)((info->mode >> 2) & 1);
1031 amr_bits[37] = (pj_uint8_t)((info->mode >> 1) & 1);
1032 amr_bits[38] = (pj_uint8_t)((info->mode) & 1);
1033 } else {
1034 amr_bits[36] = (pj_uint8_t)((info->mode >> 3) & 1);
1035 amr_bits[37] = (pj_uint8_t)((info->mode >> 2) & 1);
1036 amr_bits[38] = (pj_uint8_t)((info->mode >> 1) & 1);
1037 amr_bits[39] = (pj_uint8_t)((info->mode) & 1);
1038 }
1039
1040 if (w_bitptr == 0) *w = 0;
1041 for(j = 0; j < framelenbit_tbl[info->frame_type]; ++j) {
1042 if (amr_bits[j])
1043 *w |= (1 << (7-w_bitptr));
1044
1045 if (++w_bitptr == 8) {
1046 w_bitptr = 0;
1047 ++w;
1048 *w = 0;
1049 }
1050 }
1051 }
1052
1053 if (setting->octet_aligned) {
1054 ++w;
1055 w_bitptr = 0;
1056 }
1057 }
1058
1059 *pkt_size = w - (pj_uint8_t*)pkt;
1060 if (w_bitptr)
1061 *pkt_size += 1;
1062
1063 return PJ_SUCCESS;
1064}
1065
1066
1067/**
1068 * Parse AMR payload into frames.
1069 *
1070 * @param pkt Payload.
1071 * @param pkt_size Payload size.
1072 * @param ts Base timestamp.
Nanang Izzuddin0b8f4ca2008-11-11 11:25:13 +00001073 * @param setting Settings, see @pjmedia_codec_amr_pack_setting.
Nanang Izzuddind55553a2008-10-28 02:24:46 +00001074 * @param frames Frames parsed.
1075 * @param nframes Number of frames parsed.
Nanang Izzuddin0b8f4ca2008-11-11 11:25:13 +00001076 * @param cmr Change Mode Request message for local encoder.
Nanang Izzuddind55553a2008-10-28 02:24:46 +00001077 *
1078 * @return PJ_SUCCESS on success.
1079 */
1080PJ_INLINE(pj_status_t) pjmedia_codec_amr_parse(
Nanang Izzuddin0b8f4ca2008-11-11 11:25:13 +00001081 void *pkt,
1082 pj_size_t pkt_size,
1083 const pj_timestamp *ts,
1084 const pjmedia_codec_amr_pack_setting* setting,
1085 pjmedia_frame frames[],
1086 unsigned *nframes,
1087 pj_uint8_t *cmr)
Nanang Izzuddind55553a2008-10-28 02:24:46 +00001088{
1089 unsigned cnt = 0;
1090 pj_timestamp ts_ = *ts;
1091
1092 /* Read cursor */
1093 pj_uint8_t r_bitptr = 0;
1094 pj_uint8_t *r = (pj_uint8_t*)pkt;
1095
1096 /* env vars for AMR or AMRWB */
1097 pj_uint8_t SID_FT;
1098 const pj_uint8_t *framelen_tbl;
1099 const pj_uint16_t *framelenbit_tbl;
1100 const pj_int16_t* const *order_maps;
1101
1102 /* frame info */
1103 pjmedia_codec_amr_bit_info *info;
1104
1105 if (setting->amr_nb) {
1106 SID_FT = 8;
1107 framelen_tbl = pjmedia_codec_amrnb_framelen;
1108 framelenbit_tbl = pjmedia_codec_amrnb_framelenbits;
1109 order_maps = pjmedia_codec_amrnb_ordermaps;
1110 } else {
1111 SID_FT = 9;
1112 framelen_tbl = pjmedia_codec_amrwb_framelen;
1113 framelenbit_tbl = pjmedia_codec_amrwb_framelenbits;
1114 order_maps = pjmedia_codec_amrwb_ordermaps;
1115 }
1116
1117 PJ_UNUSED_ARG(pkt_size);
1118
1119 /* Code Mode Request, 4 bits */
Nanang Izzuddin0b8f4ca2008-11-11 11:25:13 +00001120 *cmr = (pj_uint8_t)((*r >> 4) & 0x0F);
Nanang Izzuddind55553a2008-10-28 02:24:46 +00001121 r_bitptr = 4;
1122 if (setting->octet_aligned) {
1123 ++r;
1124 r_bitptr = 0;
1125 }
1126
1127 /* Table Of Contents, 6 bits each */
1128 for (;;) {
1129 pj_uint8_t TOC = 0;
1130 pj_uint8_t F, FT, Q;
1131
1132 if (r_bitptr == 0) {
1133 TOC = (pj_uint8_t)(*r >> 2);
1134 r_bitptr = 6;
1135 } else if (r_bitptr == 2) {
1136 TOC = (pj_uint8_t)(*r++ & 0x3F);
1137 r_bitptr = 0;
1138 } else if (r_bitptr == 4) {
1139 TOC = (pj_uint8_t)((*r++ & 0x0f) << 2);
1140 TOC |= *r >> 6;
1141 r_bitptr = 2;
1142 } else if (r_bitptr == 6) {
1143 TOC = (pj_uint8_t)((*r++ & 0x03) << 4);
1144 TOC |= *r >> 4;
1145 r_bitptr = 4;
1146 }
1147
1148 F = (pj_uint8_t)(TOC >> 5);
1149 FT = (pj_uint8_t)((TOC >> 1) & 0x0F);
1150 Q = (pj_uint8_t)(TOC & 1);
1151
1152 if (FT > SID_FT && FT < 14) {
1153 pj_assert(!"Invalid AMR frametype, stream may be corrupted!");
1154 break;
1155 }
1156
1157 if (setting->octet_aligned) {
1158 ++r;
1159 r_bitptr = 0;
1160 }
1161
1162 /* Set frame attributes */
1163 info = (pjmedia_codec_amr_bit_info*) &frames[cnt].bit_info;
1164 info->frame_type = FT;
1165 info->mode = (pj_int8_t)((FT < SID_FT)? FT : -1);
1166 info->good_quality = (pj_uint8_t)(Q == 1);
1167 info->start_bit = 0;
1168 frames[cnt].timestamp = ts_;
1169 frames[cnt].type = PJMEDIA_FRAME_TYPE_AUDIO;
1170
1171 /* AMR frame length is 20ms */
1172 ts_.u64 += setting->amr_nb? 160 : 320;
1173
1174 if (++cnt == *nframes || !F)
1175 break;
1176 }
1177 *nframes = cnt;
1178
1179 cnt = 0;
1180
1181 /* Speech frames */
1182 while (cnt < *nframes) {
1183 pj_uint8_t FT;
1184
1185 info = (pjmedia_codec_amr_bit_info*) &frames[cnt].bit_info;
1186 FT = info->frame_type;
1187
1188 frames[cnt].buf = r;
1189 info->start_bit = r_bitptr;
1190
1191 if (setting->octet_aligned) {
1192 r += framelen_tbl[FT];
1193 frames[cnt].size = framelen_tbl[FT];
1194 } else {
1195 if (FT == 14 || FT == 15) {
1196 /* NO DATA */
1197 frames[cnt].size = 0;
1198 } else {
1199 unsigned adv_bit;
1200
1201 adv_bit = framelenbit_tbl[FT] + r_bitptr;
1202 r += adv_bit >> 3;
1203 r_bitptr = (pj_uint8_t)(adv_bit % 8);
1204
1205 frames[cnt].size = adv_bit >> 3;
1206 if (r_bitptr)
1207 ++frames[cnt].size;
1208 }
1209 }
1210 ++cnt;
1211 }
1212
1213 return PJ_SUCCESS;
1214}
1215
1216
1217PJ_END_DECL
1218
1219/**
1220 * @}
1221 */
1222
1223#endif /* __PJMEDIA_CODECS_AMR_HELPER_H__ */