1
/* $Id: amr_helper.h 3589 2011-06-20 04:06:19Z nanang $ */
3
* Copyright (C) 2008-2011 Teluu Inc. (http://www.teluu.com)
4
* Copyright (C) 2003-2008 Benny Prijono <benny@prijono.org>
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.
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.
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
21
#ifndef __PJMEDIA_CODECS_AMR_HELPER_H__
22
#define __PJMEDIA_CODECS_AMR_HELPER_H__
25
* @file pjmedia-codec/amr_helper.h
26
* @brief Common tables and helper functions for AMR codec (NB & WB).
31
# pragma warning(disable:4214) // bit field types other than int
35
* @defgroup PJMED_AMR_CODEC_HELPER AMR Codec Helper
36
* @ingroup PJMEDIA_CODEC_CODECS
37
* @brief AMR common tables and helper functions.
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).
49
/* AMR bits sensitivity order maps */
51
const pj_int16_t pjmedia_codec_amrnb_ordermap122[244] =
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,
80
const pj_int16_t pjmedia_codec_amrnb_ordermap102[204] =
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,
105
const pj_int16_t pjmedia_codec_amrnb_ordermap795[159] =
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
125
const pj_int16_t pjmedia_codec_amrnb_ordermap74[148] =
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
144
const pj_int16_t pjmedia_codec_amrnb_ordermap67[134] =
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,
162
const pj_int16_t pjmedia_codec_amrnb_ordermap59[118] =
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
178
const pj_int16_t pjmedia_codec_amrnb_ordermap515[103] =
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,
193
const pj_int16_t pjmedia_codec_amrnb_ordermap475[95] =
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,
208
const pj_int16_t pjmedia_codec_amrwb_ordermap_660[] =
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,
226
const pj_int16_t pjmedia_codec_amrwb_ordermap_885[] =
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
248
const pj_int16_t pjmedia_codec_amrwb_ordermap_1265[] =
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,
278
const pj_int16_t pjmedia_codec_amrwb_ordermap_1425[] =
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
311
const pj_int16_t pjmedia_codec_amrwb_ordermap_1585[] =
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
347
const pj_int16_t pjmedia_codec_amrwb_ordermap_1825[] =
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
388
const pj_int16_t pjmedia_codec_amrwb_ordermap_1985[] =
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
432
const pj_int16_t pjmedia_codec_amrwb_ordermap_2305[] =
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,
483
const pj_int16_t pjmedia_codec_amrwb_ordermap_2385[] =
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
536
* AMR-NB bitstream sensitivity order maps.
538
const pj_int16_t* const pjmedia_codec_amrnb_ordermaps[8] =
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
551
* AMR-WB bitstream sensitivity order maps.
553
const pj_int16_t* const pjmedia_codec_amrwb_ordermaps[9] =
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
567
* Constant of AMR-NB frame lengths in bytes.
569
const pj_uint8_t pjmedia_codec_amrnb_framelen[16] =
570
{12, 13, 15, 17, 19, 20, 26, 31, 5, 0, 0, 0, 0, 0, 0, 0};
572
* Constant of AMR-NB frame lengths in bits.
574
const pj_uint16_t pjmedia_codec_amrnb_framelenbits[9] =
575
{95, 103, 118, 134, 148, 159, 204, 244, 39};
577
* Constant of AMR-NB bitrates.
579
const pj_uint16_t pjmedia_codec_amrnb_bitrates[8] =
580
{4750, 5150, 5900, 6700, 7400, 7950, 10200, 12200};
583
* Constant of AMR-WB frame lengths in bytes.
585
const pj_uint8_t pjmedia_codec_amrwb_framelen[16] =
586
{17, 23, 32, 37, 40, 46, 50, 58, 60, 5, 0, 0, 0, 0, 0, 0};
588
* Constant of AMR-WB frame lengths in bits.
590
const pj_uint16_t pjmedia_codec_amrwb_framelenbits[10] =
591
{132, 177, 253, 285, 317, 365, 397, 461, 477, 40};
593
* Constant of AMR-WB bitrates.
595
const pj_uint16_t pjmedia_codec_amrwb_bitrates[9] =
596
{6600, 8850, 12650, 14250, 15850, 18250, 19850, 23050, 23850};
600
* This structure describes AMR frame info, to be fitted into #pjmedia_frame
604
typedef 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. */
608
pj_uint8_t good_quality:1; /**< Flag if frame is good/degraded. */
609
pj_uint8_t STI:1; /**< STI mode (first/update). */
610
} pjmedia_codec_amr_bit_info;
615
* This structure describes AMR settings.
617
typedef struct pjmedia_codec_amr_pack_setting {
618
pj_uint8_t amr_nb:1; /**< Set 1 for AMR-NB, 0 for AMR-WB. */
619
pj_uint8_t reorder:1; /**< Reorder bitstream into descending
620
sensitivity order or vice versa. */
621
pj_uint8_t octet_aligned:1; /**< TRUE if payload is in octet-aligned mode,
622
FALSE if payload is in bandwidth
624
pj_uint8_t cmr:4; /**< Change Mode Request for remote
626
} pjmedia_codec_amr_pack_setting;
630
* Get AMR mode based on bitrate.
632
* @param bitrate AMR bitrate.
636
PJ_INLINE(pj_int8_t) pjmedia_codec_amr_get_mode(unsigned bitrate)
642
} else if(bitrate==5150){
644
} else if(bitrate==5900){
646
} else if(bitrate==6700){
648
} else if(bitrate==7400){
650
} else if(bitrate==7950){
652
} else if(bitrate==10200){
654
} else if(bitrate==12200){
658
} else if(bitrate==6600){
660
} else if(bitrate==8850){
662
} else if(bitrate==12650){
664
} else if(bitrate==14250){
666
} else if(bitrate==15850){
668
} else if(bitrate==18250){
670
} else if(bitrate==19850){
672
} else if(bitrate==23050){
674
} else if(bitrate==23850){
681
* Get AMR mode based on frame length.
683
* @param amrnb Set to PJ_TRUE for AMR-NB domain or PJ_FALSE for AMR-WB.
684
* @param frame_len The frame length.
689
PJ_INLINE(pj_int8_t) pjmedia_codec_amr_get_mode2(pj_bool_t amrnb,
695
for (i = 0; i < 9; ++i)
696
if (frame_len == pjmedia_codec_amrnb_framelen[i])
699
for (i = 0; i < 10; ++i) {
700
if (frame_len == pjmedia_codec_amrwb_framelen[i])
705
pj_assert(!"Invalid AMR frame length");
710
* Prepare a frame before pass it to decoder. This function will do:
711
* - reorder AMR bitstream from descending sensitivity order into
712
* encoder bits order. This can be enabled/disabled via param
713
* 'setting' by setting/resetting field 'reorder'.
714
* - align left the start bit (make the start_bit to be 0).
716
* @param in Input frame.
717
* @param setting Settings, see #pjmedia_codec_amr_pack_setting.
718
* @param out Output frame.
720
* @return PJ_SUCCESS on success.
722
PJ_INLINE(pj_status_t) pjmedia_codec_amr_predecode(
723
const pjmedia_frame *in,
724
const pjmedia_codec_amr_pack_setting *setting,
727
pj_int8_t amr_bits[477 + 7] = {0};
728
pj_int8_t *p_amr_bits = &amr_bits[0];
730
pj_uint8_t *r = (pj_uint8_t*) in->buf; /* read cursor */
731
pj_uint8_t *w = (pj_uint8_t*) out->buf; /* write cursor */
733
/* env vars for AMR or AMRWB */
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;
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;
747
*out_info = *in_info;
749
if (setting->amr_nb) {
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;
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;
763
/* unpack AMR bitstream if there is any data */
764
if (in_info->frame_type <= SID_FT) {
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);
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);
784
if (in_info->frame_type < SID_FT) {
787
out_info->mode = in_info->frame_type;
788
out->size = framelen_tbl[out_info->mode];
790
pj_bzero(out->buf, out->size);
792
if (setting->reorder) {
793
const pj_int16_t *order_map;
795
order_map = order_maps[out_info->mode];
796
for(i = 0; i < framelenbit_tbl[out_info->mode]; ++i) {
799
bitpos = order_map[i];
800
w[bitpos>>3] |= 1 << (7 - (bitpos % 8));
804
for(i = 0; i < framelenbit_tbl[out_info->mode]; ++i) {
806
w[i >> 3] |= 1 << (7 - (i % 8));
810
} else if (in_info->frame_type == SID_FT) {
813
pj_uint8_t w_bitptr = 0;
817
FT_ = (pj_uint8_t)((amr_bits[36] << 2) | (amr_bits[37] << 1) |
820
FT_ = (pj_uint8_t)((amr_bits[36] << 3) | (amr_bits[37] << 2) |
821
(amr_bits[38] << 1) | amr_bits[39]);
823
out_info->mode = FT_;
826
pj_bzero(out->buf, out->size);
827
for(i = 0; i < framelenbit_tbl[SID_FT]; ++i) {
829
*w |= (1 << (7-w_bitptr));
831
if (++w_bitptr == 8) {
844
out_info->start_bit = 0;
851
* Pack encoded AMR frame(s) into an RTP payload.
853
* @param frames AMR frames to be packed.
854
* @param nframes Number of frames to be packed.
855
* @param setting Settings, see #pjmedia_codec_amr_pack_setting.
856
* @param pkt Payload.
857
* @param pkt_size Payload size, as input this specifies payload maximum size,
858
* as output this specifies payload packed size.
860
* @return PJ_SUCCESS on success.
862
PJ_INLINE (pj_status_t) pjmedia_codec_amr_pack(
863
const pjmedia_frame frames[],
865
const pjmedia_codec_amr_pack_setting *setting,
870
pj_uint8_t *w = (pj_uint8_t*)pkt;
871
pj_uint8_t w_bitptr = 0;
876
/* env vars for AMR or AMRWB */
878
const pj_uint8_t *framelen_tbl;
879
const pj_uint16_t *framelenbit_tbl;
880
const pj_uint16_t *bitrate_tbl;
881
const pj_int16_t* const *order_maps;
884
pjmedia_codec_amr_bit_info *info;
886
unsigned i, max_pkt_size;
888
max_pkt_size = *pkt_size;
890
if (setting->amr_nb) {
892
framelen_tbl = pjmedia_codec_amrnb_framelen;
893
framelenbit_tbl = pjmedia_codec_amrnb_framelenbits;
894
bitrate_tbl = pjmedia_codec_amrnb_bitrates;
895
order_maps = pjmedia_codec_amrnb_ordermaps;
898
framelen_tbl = pjmedia_codec_amrwb_framelen;
899
framelenbit_tbl = pjmedia_codec_amrwb_framelenbits;
900
bitrate_tbl = pjmedia_codec_amrwb_bitrates;
901
order_maps = pjmedia_codec_amrwb_ordermaps;
904
/* Code Mode Request, 4 bits */
905
*w = (pj_uint8_t)(setting->cmr << 4);
907
if (setting->octet_aligned) {
912
/* Table Of Contents, 6 bits each */
913
for (i = 0; i < nframes; ++i) {
914
pj_uint8_t TOC, FT, Q;
917
info = (pjmedia_codec_amr_bit_info*)&frames[i].bit_info;
919
F = (i != nframes-1);
920
FT = info->frame_type;
921
Q = (pj_uint8_t)(info->good_quality == 1);
922
pj_assert(FT <= SID_FT || FT == 14 || FT == 15);
924
/* Check buffer availability */
925
*pkt_size = w - (pj_uint8_t*)pkt + 1;
926
PJ_ASSERT_RETURN(*pkt_size <= max_pkt_size, PJ_ETOOSMALL);
928
TOC = (pj_uint8_t)((F<<5) | (FT<<1) | Q);
930
*w = (pj_uint8_t)(TOC<<2);
932
} else if (w_bitptr == 2) {
935
} else if (w_bitptr == 4) {
937
*w = (pj_uint8_t)(TOC<<6);
939
} else if (w_bitptr == 6) {
941
*w = (pj_uint8_t)(TOC<<4);
944
if (setting->octet_aligned) {
951
for (i = 0; i < nframes; ++i) {
952
pj_int8_t amr_bits[477 + 7] = {0};
953
pj_int8_t *p_amr_bits = &amr_bits[0];
956
info = (pjmedia_codec_amr_bit_info*)&frames[i].bit_info;
958
/* Check buffer availability */
959
*pkt_size = w - (pj_uint8_t*)pkt;
960
if (info->frame_type <= SID_FT)
961
*pkt_size += framelen_tbl[info->frame_type] + 1;
962
PJ_ASSERT_RETURN(*pkt_size <= max_pkt_size, PJ_ETOOSMALL);
964
/* Skip if there is no data */
965
if (info->frame_type > SID_FT)
969
r = (pj_uint8_t*) frames[i].buf;
971
if (info->start_bit) {
972
for (; j < (unsigned)(8-info->start_bit); ++j)
973
*p_amr_bits++ = (pj_uint8_t)
974
((*r >> (7-info->start_bit-j)) & 1);
977
for(; j < framelenbit_tbl[info->frame_type]; j+=8, ++r) {
978
*p_amr_bits++ = (pj_uint8_t)((*r >> 7) & 1);
979
*p_amr_bits++ = (pj_uint8_t)((*r >> 6) & 1);
980
*p_amr_bits++ = (pj_uint8_t)((*r >> 5) & 1);
981
*p_amr_bits++ = (pj_uint8_t)((*r >> 4) & 1);
982
*p_amr_bits++ = (pj_uint8_t)((*r >> 3) & 1);
983
*p_amr_bits++ = (pj_uint8_t)((*r >> 2) & 1);
984
*p_amr_bits++ = (pj_uint8_t)((*r >> 1) & 1);
985
*p_amr_bits++ = (pj_uint8_t)((*r ) & 1);
988
if (info->frame_type < SID_FT) {
991
if (w_bitptr == 0) *w = 0;
993
if (setting->reorder) {
994
const pj_int16_t *order_map;
996
/* Put bits in the packet, sensitivity descending ordered */
997
order_map = order_maps[info->frame_type];
998
for(j = 0; j < framelenbit_tbl[info->frame_type]; ++j) {
999
if (amr_bits[order_map[j]])
1000
*w |= (1 << (7-w_bitptr));
1002
if (++w_bitptr == 8) {
1009
for(j = 0; j < framelenbit_tbl[info->frame_type]; ++j) {
1011
*w |= (1 << (7-w_bitptr));
1013
if (++w_bitptr == 8) {
1021
} else if (info->frame_type == SID_FT) {
1024
amr_bits[35] |= info->STI;
1026
if (setting->amr_nb) {
1027
amr_bits[36] = (pj_uint8_t)((info->mode >> 2) & 1);
1028
amr_bits[37] = (pj_uint8_t)((info->mode >> 1) & 1);
1029
amr_bits[38] = (pj_uint8_t)((info->mode) & 1);
1031
amr_bits[36] = (pj_uint8_t)((info->mode >> 3) & 1);
1032
amr_bits[37] = (pj_uint8_t)((info->mode >> 2) & 1);
1033
amr_bits[38] = (pj_uint8_t)((info->mode >> 1) & 1);
1034
amr_bits[39] = (pj_uint8_t)((info->mode) & 1);
1037
if (w_bitptr == 0) *w = 0;
1038
for(j = 0; j < framelenbit_tbl[info->frame_type]; ++j) {
1040
*w |= (1 << (7-w_bitptr));
1042
if (++w_bitptr == 8) {
1050
if (setting->octet_aligned) {
1056
*pkt_size = w - (pj_uint8_t*)pkt;
1065
* Parse AMR payload into frames.
1067
* @param pkt Payload.
1068
* @param pkt_size Payload size.
1069
* @param ts Base timestamp.
1070
* @param setting Settings, see #pjmedia_codec_amr_pack_setting.
1071
* @param frames Frames parsed.
1072
* @param nframes Number of frames parsed.
1073
* @param cmr Change Mode Request message for local encoder.
1075
* @return PJ_SUCCESS on success.
1077
PJ_INLINE(pj_status_t) pjmedia_codec_amr_parse(
1080
const pj_timestamp *ts,
1081
const pjmedia_codec_amr_pack_setting* setting,
1082
pjmedia_frame frames[],
1087
pj_timestamp ts_ = *ts;
1090
pj_uint8_t r_bitptr = 0;
1091
pj_uint8_t *r = (pj_uint8_t*)pkt;
1093
/* env vars for AMR or AMRWB */
1095
const pj_uint8_t *framelen_tbl;
1096
const pj_uint16_t *framelenbit_tbl;
1097
const pj_int16_t* const *order_maps;
1100
pjmedia_codec_amr_bit_info *info;
1102
if (setting->amr_nb) {
1104
framelen_tbl = pjmedia_codec_amrnb_framelen;
1105
framelenbit_tbl = pjmedia_codec_amrnb_framelenbits;
1106
order_maps = pjmedia_codec_amrnb_ordermaps;
1109
framelen_tbl = pjmedia_codec_amrwb_framelen;
1110
framelenbit_tbl = pjmedia_codec_amrwb_framelenbits;
1111
order_maps = pjmedia_codec_amrwb_ordermaps;
1114
PJ_UNUSED_ARG(pkt_size);
1116
/* Code Mode Request, 4 bits */
1117
*cmr = (pj_uint8_t)((*r >> 4) & 0x0F);
1119
if (setting->octet_aligned) {
1124
/* Table Of Contents, 6 bits each */
1127
pj_uint8_t F, FT, Q;
1129
if (r_bitptr == 0) {
1130
TOC = (pj_uint8_t)(*r >> 2);
1132
} else if (r_bitptr == 2) {
1133
TOC = (pj_uint8_t)(*r++ & 0x3F);
1135
} else if (r_bitptr == 4) {
1136
TOC = (pj_uint8_t)((*r++ & 0x0f) << 2);
1139
} else if (r_bitptr == 6) {
1140
TOC = (pj_uint8_t)((*r++ & 0x03) << 4);
1145
F = (pj_uint8_t)(TOC >> 5);
1146
FT = (pj_uint8_t)((TOC >> 1) & 0x0F);
1147
Q = (pj_uint8_t)(TOC & 1);
1149
if (FT > SID_FT && FT < 14) {
1150
pj_assert(!"Invalid AMR frametype, stream may be corrupted!");
1154
if (setting->octet_aligned) {
1159
/* Set frame attributes */
1160
info = (pjmedia_codec_amr_bit_info*) &frames[cnt].bit_info;
1161
info->frame_type = FT;
1162
info->mode = (pj_int8_t)((FT < SID_FT)? FT : -1);
1163
info->good_quality = (pj_uint8_t)(Q == 1);
1164
info->start_bit = 0;
1166
frames[cnt].timestamp = ts_;
1167
frames[cnt].type = PJMEDIA_FRAME_TYPE_AUDIO;
1169
/* AMR frame length is 20ms */
1170
ts_.u64 += setting->amr_nb? 160 : 320;
1172
if (++cnt == *nframes || !F)
1180
while (cnt < *nframes) {
1183
info = (pjmedia_codec_amr_bit_info*) &frames[cnt].bit_info;
1184
FT = info->frame_type;
1186
frames[cnt].buf = r;
1187
info->start_bit = r_bitptr;
1190
unsigned sti_bitptr;
1191
sti_bitptr = r_bitptr + 35;
1192
info->STI = (pj_uint8_t)
1193
(r[sti_bitptr >> 3] >> (7 - (sti_bitptr % 8))) & 1;
1196
if (setting->octet_aligned) {
1197
r += framelen_tbl[FT];
1198
frames[cnt].size = framelen_tbl[FT];
1200
if (FT == 14 || FT == 15) {
1202
frames[cnt].size = 0;
1206
adv_bit = framelenbit_tbl[FT] + r_bitptr;
1208
r_bitptr = (pj_uint8_t)(adv_bit % 8);
1210
frames[cnt].size = adv_bit >> 3;
1228
#endif /* __PJMEDIA_CODECS_AMR_HELPER_H__ */