~ubuntu-branches/ubuntu/saucy/sflphone/saucy-proposed

« back to all changes in this revision

Viewing changes to daemon/libs/pjproject/pjmedia/include/pjmedia-codec/amr_helper.h

  • Committer: Package Import Robot
  • Author(s): Mark Purcell
  • Date: 2013-06-30 11:40:56 UTC
  • mfrom: (20.1.3 sid)
  • Revision ID: package-import@ubuntu.com-20130630114056-i0rz9ibang07g7qr
Tags: 1.2.3-2
* changeset_r92d62cfc54732bbbcfff2b1d36c096b120b981a5.diff 
  - fixes automatic endian detection 
* Update Vcs: fixes vcs-field-not-canonical

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* $Id: amr_helper.h 3589 2011-06-20 04:06:19Z nanang $ */
2
 
/* 
3
 
 * Copyright (C) 2008-2011 Teluu Inc. (http://www.teluu.com)
4
 
 * Copyright (C) 2003-2008 Benny Prijono <benny@prijono.org>
5
 
 *
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_CODECS
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
 
 
46
 
PJ_BEGIN_DECL
47
 
 
48
 
 
49
 
/* AMR bits sensitivity order maps */
50
 
 
51
 
const 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
 
 
80
 
const 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
 
 
105
 
const 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
 
 
125
 
const 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
 
 
144
 
const 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
 
 
162
 
const 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
 
 
178
 
const 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
 
 
193
 
const 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
 
 
208
 
const 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
 
 
226
 
const 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
 
 
248
 
const 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
 
 
278
 
const 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
 
 
311
 
const 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
 
 
347
 
const 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
 
 
388
 
const 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
 
 
432
 
const 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
 
 
483
 
const 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
 
 */
538
 
const 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
 
 */
553
 
const 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
 
 */
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};
571
 
/**
572
 
 * Constant of AMR-NB frame lengths in bits.
573
 
 */
574
 
const 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
 
 */
579
 
const 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
 
 */
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};
587
 
/**
588
 
 * Constant of AMR-WB frame lengths in bits.
589
 
 */
590
 
const 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
 
 */
595
 
const 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)
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;
611
 
#pragma pack()
612
 
 
613
 
 
614
 
/**
615
 
 * This structure describes AMR settings.
616
 
 */
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 
623
 
                                     efficient mode.                    */
624
 
    pj_uint8_t cmr:4;           /**< Change Mode Request for remote
625
 
                                     encoder.                           */
626
 
} pjmedia_codec_amr_pack_setting;
627
 
 
628
 
 
629
 
/**
630
 
 * Get AMR mode based on bitrate.
631
 
 *
632
 
 * @param bitrate   AMR bitrate.
633
 
 *
634
 
 * @return          AMR mode.
635
 
 */
636
 
PJ_INLINE(pj_int8_t) pjmedia_codec_amr_get_mode(unsigned bitrate)
637
 
{
638
 
    pj_int8_t mode = -1;
639
 
 
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
 
/**
681
 
 * Get AMR mode based on frame length.
682
 
 *
683
 
 * @param amrnb     Set to PJ_TRUE for AMR-NB domain or PJ_FALSE for AMR-WB.
684
 
 * @param frame_len The frame length.
685
 
 *
686
 
 * @return          AMR mode.
687
 
 */
688
 
 
689
 
PJ_INLINE(pj_int8_t) pjmedia_codec_amr_get_mode2(pj_bool_t amrnb,
690
 
                                                 unsigned frame_len)
691
 
{
692
 
    int i;
693
 
 
694
 
    if (amrnb) {
695
 
        for (i = 0; i < 9; ++i)
696
 
            if (frame_len == pjmedia_codec_amrnb_framelen[i])
697
 
                return (pj_int8_t)i;
698
 
    } else {
699
 
        for (i = 0; i < 10; ++i) {
700
 
            if (frame_len == pjmedia_codec_amrwb_framelen[i])
701
 
                return (pj_int8_t)i;
702
 
        }
703
 
    }
704
 
    
705
 
    pj_assert(!"Invalid AMR frame length");
706
 
    return -1;
707
 
}
708
 
 
709
 
/**
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).
715
 
 *
716
 
 * @param in        Input frame.
717
 
 * @param setting   Settings, see #pjmedia_codec_amr_pack_setting.
718
 
 * @param out       Output frame.
719
 
 *
720
 
 * @return          PJ_SUCCESS on success.
721
 
 */
722
 
PJ_INLINE(pj_status_t) pjmedia_codec_amr_predecode(
723
 
                            const pjmedia_frame *in,
724
 
                            const pjmedia_codec_amr_pack_setting *setting,
725
 
                            pjmedia_frame *out)
726
 
{
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
 
 
749
 
    if (setting->amr_nb) {
750
 
        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 */
787
 
        out_info->mode = in_info->frame_type;
788
 
        out->size = framelen_tbl[out_info->mode];
789
 
 
790
 
        pj_bzero(out->buf, out->size);
791
 
 
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));
807
 
            }
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
 
 
816
 
        if (setting->amr_nb)
817
 
            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
 
 
826
 
        pj_bzero(out->buf, out->size);
827
 
        for(i = 0; i < framelenbit_tbl[SID_FT]; ++i) {
828
 
            if (amr_bits[i])
829
 
                *w |= (1 << (7-w_bitptr));
830
 
 
831
 
            if (++w_bitptr == 8) {
832
 
                ++w;
833
 
                w_bitptr = 0;
834
 
            }
835
 
        }
836
 
 
837
 
    } else {
838
 
 
839
 
        /* NO DATA */
840
 
        out->size = 0;
841
 
        out_info->mode = -1;
842
 
    }
843
 
 
844
 
    out_info->start_bit = 0;
845
 
 
846
 
    return PJ_SUCCESS;
847
 
}
848
 
 
849
 
 
850
 
/**
851
 
 * Pack encoded AMR frame(s) into an RTP payload.
852
 
 *
853
 
 * @param frames    AMR frames to be packed.
854
 
 * @param nframes   Number of frames to be packed.
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.
859
 
 *
860
 
 * @return          PJ_SUCCESS on success.
861
 
 */
862
 
PJ_INLINE (pj_status_t) pjmedia_codec_amr_pack(
863
 
                            const pjmedia_frame frames[],
864
 
                            unsigned nframes,
865
 
                            const pjmedia_codec_amr_pack_setting *setting,
866
 
                            void *pkt, 
867
 
                            pj_size_t *pkt_size)
868
 
{
869
 
    /* Write cursor */
870
 
    pj_uint8_t *w = (pj_uint8_t*)pkt;
871
 
    pj_uint8_t w_bitptr = 0;
872
 
 
873
 
    /* Read cursor */
874
 
    pj_uint8_t *r;
875
 
 
876
 
    /* env vars for AMR or AMRWB */
877
 
    pj_uint8_t               SID_FT;
878
 
    const pj_uint8_t        *framelen_tbl;
879
 
    const pj_uint16_t       *framelenbit_tbl;
880
 
    const pj_uint16_t       *bitrate_tbl;
881
 
    const pj_int16_t* const *order_maps;
882
 
 
883
 
    /* frame info */
884
 
    pjmedia_codec_amr_bit_info *info;
885
 
 
886
 
    unsigned i, max_pkt_size;
887
 
 
888
 
    max_pkt_size = *pkt_size;
889
 
 
890
 
    if (setting->amr_nb) {
891
 
        SID_FT          = 8;
892
 
        framelen_tbl    = pjmedia_codec_amrnb_framelen;
893
 
        framelenbit_tbl = pjmedia_codec_amrnb_framelenbits;
894
 
        bitrate_tbl     = pjmedia_codec_amrnb_bitrates;
895
 
        order_maps      = pjmedia_codec_amrnb_ordermaps;
896
 
    } else {
897
 
        SID_FT          = 9;
898
 
        framelen_tbl    = pjmedia_codec_amrwb_framelen;
899
 
        framelenbit_tbl = pjmedia_codec_amrwb_framelenbits;
900
 
        bitrate_tbl     = pjmedia_codec_amrwb_bitrates;
901
 
        order_maps      = pjmedia_codec_amrwb_ordermaps;
902
 
    }
903
 
 
904
 
    /* Code Mode Request, 4 bits */
905
 
    *w = (pj_uint8_t)(setting->cmr << 4);
906
 
    w_bitptr = 4;
907
 
    if (setting->octet_aligned) {
908
 
        ++w;
909
 
        w_bitptr = 0;
910
 
    }
911
 
 
912
 
    /* Table Of Contents, 6 bits each */
913
 
    for (i = 0; i < nframes; ++i) {
914
 
        pj_uint8_t TOC, FT, Q;
915
 
        pj_bool_t F;
916
 
 
917
 
        info = (pjmedia_codec_amr_bit_info*)&frames[i].bit_info;
918
 
 
919
 
        F = (i != nframes-1);
920
 
        FT = info->frame_type;
921
 
        Q  = (pj_uint8_t)(info->good_quality == 1);
922
 
        pj_assert(FT <= SID_FT || FT == 14 || FT == 15);
923
 
 
924
 
        /* Check buffer availability */
925
 
        *pkt_size = w - (pj_uint8_t*)pkt + 1;
926
 
        PJ_ASSERT_RETURN(*pkt_size <= max_pkt_size, PJ_ETOOSMALL);
927
 
 
928
 
        TOC = (pj_uint8_t)((F<<5) | (FT<<1) | Q);
929
 
        if (w_bitptr == 0) {
930
 
            *w = (pj_uint8_t)(TOC<<2);
931
 
            w_bitptr = 6;
932
 
        } else if (w_bitptr == 2) {
933
 
            *w++ |= TOC;
934
 
            w_bitptr = 0;
935
 
        } else if (w_bitptr == 4) {
936
 
            *w++ |= TOC>>2;
937
 
            *w = (pj_uint8_t)(TOC<<6);
938
 
            w_bitptr = 2;
939
 
        } else if (w_bitptr == 6) {
940
 
            *w++ |= TOC>>4;
941
 
            *w = (pj_uint8_t)(TOC<<4);
942
 
            w_bitptr = 4;
943
 
        }
944
 
        if (setting->octet_aligned) {
945
 
            ++w;
946
 
            w_bitptr = 0;
947
 
        }
948
 
    }
949
 
 
950
 
    /* Encoded data */
951
 
    for (i = 0; i < nframes; ++i) {
952
 
        pj_int8_t amr_bits[477 + 7] = {0};
953
 
        pj_int8_t *p_amr_bits = &amr_bits[0];
954
 
        unsigned j;
955
 
 
956
 
        info = (pjmedia_codec_amr_bit_info*)&frames[i].bit_info;
957
 
 
958
 
        /* Check buffer availability */
959
 
        *pkt_size = w - (pj_uint8_t*)pkt;
960
 
        if (info->frame_type <= SID_FT)
961
 
            *pkt_size += framelen_tbl[info->frame_type] + 1;
962
 
        PJ_ASSERT_RETURN(*pkt_size <= max_pkt_size, PJ_ETOOSMALL);
963
 
 
964
 
        /* Skip if there is no data */
965
 
        if (info->frame_type > SID_FT)
966
 
            continue;
967
 
 
968
 
        /* Unpack bits */
969
 
        r = (pj_uint8_t*) frames[i].buf;
970
 
        j = 0;
971
 
        if (info->start_bit) {
972
 
            for (; j < (unsigned)(8-info->start_bit); ++j)
973
 
                *p_amr_bits++ = (pj_uint8_t)
974
 
                                ((*r >> (7-info->start_bit-j)) & 1);
975
 
            ++r;
976
 
        }
977
 
        for(; j < framelenbit_tbl[info->frame_type]; j+=8, ++r) {
978
 
            *p_amr_bits++ = (pj_uint8_t)((*r >> 7) & 1);
979
 
            *p_amr_bits++ = (pj_uint8_t)((*r >> 6) & 1);
980
 
            *p_amr_bits++ = (pj_uint8_t)((*r >> 5) & 1);
981
 
            *p_amr_bits++ = (pj_uint8_t)((*r >> 4) & 1);
982
 
            *p_amr_bits++ = (pj_uint8_t)((*r >> 3) & 1);
983
 
            *p_amr_bits++ = (pj_uint8_t)((*r >> 2) & 1);
984
 
            *p_amr_bits++ = (pj_uint8_t)((*r >> 1) & 1);
985
 
            *p_amr_bits++ = (pj_uint8_t)((*r ) & 1);
986
 
        }
987
 
 
988
 
        if (info->frame_type < SID_FT) {
989
 
 
990
 
            /* Speech */
991
 
            if (w_bitptr == 0) *w = 0;
992
 
 
993
 
            if (setting->reorder) {
994
 
                const pj_int16_t *order_map;
995
 
 
996
 
                /* Put bits in the packet, sensitivity descending ordered */
997
 
                order_map = order_maps[info->frame_type];
998
 
                for(j = 0; j < framelenbit_tbl[info->frame_type]; ++j) {
999
 
                    if (amr_bits[order_map[j]])
1000
 
                        *w |= (1 << (7-w_bitptr));
1001
 
 
1002
 
                    if (++w_bitptr == 8) {
1003
 
                        w_bitptr = 0;
1004
 
                        ++w;
1005
 
                        *w = 0;
1006
 
                    }
1007
 
                }
1008
 
            } else {
1009
 
                for(j = 0; j < framelenbit_tbl[info->frame_type]; ++j) {
1010
 
                    if (amr_bits[j])
1011
 
                        *w |= (1 << (7-w_bitptr));
1012
 
 
1013
 
                    if (++w_bitptr == 8) {
1014
 
                        w_bitptr = 0;
1015
 
                        ++w;
1016
 
                        *w = 0;
1017
 
                    }
1018
 
                }
1019
 
            }
1020
 
 
1021
 
        } else if (info->frame_type == SID_FT) {
1022
 
 
1023
 
            /* SID */
1024
 
            amr_bits[35] |= info->STI;
1025
 
 
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);
1030
 
            } else {
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);
1035
 
            }
1036
 
 
1037
 
            if (w_bitptr == 0) *w = 0;
1038
 
            for(j = 0; j < framelenbit_tbl[info->frame_type]; ++j) {
1039
 
                if (amr_bits[j])
1040
 
                    *w |= (1 << (7-w_bitptr));
1041
 
 
1042
 
                if (++w_bitptr == 8) {
1043
 
                    w_bitptr = 0;
1044
 
                    ++w;
1045
 
                    *w = 0;
1046
 
                }
1047
 
            }
1048
 
        }
1049
 
 
1050
 
        if (setting->octet_aligned) {
1051
 
            ++w;
1052
 
            w_bitptr = 0;
1053
 
        }
1054
 
    }
1055
 
 
1056
 
    *pkt_size = w - (pj_uint8_t*)pkt;
1057
 
    if (w_bitptr)
1058
 
        *pkt_size += 1;
1059
 
 
1060
 
    return PJ_SUCCESS;
1061
 
}
1062
 
 
1063
 
 
1064
 
/**
1065
 
 * Parse AMR payload into frames.
1066
 
 *
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.
1074
 
 *
1075
 
 * @return          PJ_SUCCESS on success.
1076
 
 */
1077
 
PJ_INLINE(pj_status_t) pjmedia_codec_amr_parse(
1078
 
                             void *pkt, 
1079
 
                             pj_size_t pkt_size, 
1080
 
                             const pj_timestamp *ts,
1081
 
                             const pjmedia_codec_amr_pack_setting* setting,
1082
 
                             pjmedia_frame frames[], 
1083
 
                             unsigned *nframes,
1084
 
                             pj_uint8_t *cmr)
1085
 
{
1086
 
    unsigned cnt = 0;
1087
 
    pj_timestamp ts_ = *ts;
1088
 
 
1089
 
    /* Read cursor */
1090
 
    pj_uint8_t r_bitptr = 0;
1091
 
    pj_uint8_t *r = (pj_uint8_t*)pkt;
1092
 
 
1093
 
    /* env vars for AMR or AMRWB */
1094
 
    pj_uint8_t               SID_FT;
1095
 
    const pj_uint8_t        *framelen_tbl;
1096
 
    const pj_uint16_t       *framelenbit_tbl;
1097
 
    const pj_int16_t* const *order_maps;
1098
 
 
1099
 
    /* frame info */
1100
 
    pjmedia_codec_amr_bit_info *info;
1101
 
 
1102
 
    if (setting->amr_nb) {
1103
 
        SID_FT          = 8;
1104
 
        framelen_tbl    = pjmedia_codec_amrnb_framelen;
1105
 
        framelenbit_tbl = pjmedia_codec_amrnb_framelenbits;
1106
 
        order_maps      = pjmedia_codec_amrnb_ordermaps;
1107
 
    } else {
1108
 
        SID_FT          = 9;
1109
 
        framelen_tbl    = pjmedia_codec_amrwb_framelen;
1110
 
        framelenbit_tbl = pjmedia_codec_amrwb_framelenbits;
1111
 
        order_maps      = pjmedia_codec_amrwb_ordermaps;
1112
 
    }
1113
 
 
1114
 
    PJ_UNUSED_ARG(pkt_size);
1115
 
 
1116
 
    /* Code Mode Request, 4 bits */
1117
 
    *cmr = (pj_uint8_t)((*r >> 4) & 0x0F);
1118
 
    r_bitptr = 4;
1119
 
    if (setting->octet_aligned) {
1120
 
        ++r;
1121
 
        r_bitptr = 0;
1122
 
    }
1123
 
 
1124
 
    /* Table Of Contents, 6 bits each */
1125
 
    for (;;) {
1126
 
        pj_uint8_t TOC = 0;
1127
 
        pj_uint8_t F, FT, Q;
1128
 
 
1129
 
        if (r_bitptr == 0) {
1130
 
            TOC = (pj_uint8_t)(*r >> 2);
1131
 
            r_bitptr = 6;
1132
 
        } else if (r_bitptr == 2) {
1133
 
            TOC = (pj_uint8_t)(*r++ & 0x3F);
1134
 
            r_bitptr = 0;
1135
 
        } else if (r_bitptr == 4) {
1136
 
            TOC = (pj_uint8_t)((*r++ & 0x0f) << 2);
1137
 
            TOC |= *r >> 6;
1138
 
            r_bitptr = 2;
1139
 
        } else if (r_bitptr == 6) {
1140
 
            TOC = (pj_uint8_t)((*r++ & 0x03) << 4);
1141
 
            TOC |= *r >> 4;
1142
 
            r_bitptr = 4;
1143
 
        }
1144
 
 
1145
 
        F = (pj_uint8_t)(TOC >> 5);
1146
 
        FT = (pj_uint8_t)((TOC >> 1) & 0x0F);
1147
 
        Q = (pj_uint8_t)(TOC & 1);
1148
 
 
1149
 
        if (FT > SID_FT && FT < 14) {
1150
 
            pj_assert(!"Invalid AMR frametype, stream may be corrupted!");
1151
 
            break;
1152
 
        }
1153
 
 
1154
 
        if (setting->octet_aligned) {
1155
 
            ++r;
1156
 
            r_bitptr = 0;
1157
 
        }
1158
 
 
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;
1165
 
        info->STI = 0;
1166
 
        frames[cnt].timestamp = ts_;
1167
 
        frames[cnt].type = PJMEDIA_FRAME_TYPE_AUDIO;
1168
 
 
1169
 
        /* AMR frame length is 20ms */
1170
 
        ts_.u64 += setting->amr_nb? 160 : 320;
1171
 
        
1172
 
        if (++cnt == *nframes || !F)
1173
 
            break;
1174
 
    }
1175
 
    *nframes = cnt;
1176
 
 
1177
 
    cnt = 0;
1178
 
 
1179
 
    /* Speech frames */
1180
 
    while (cnt < *nframes) {
1181
 
        pj_uint8_t FT;
1182
 
 
1183
 
        info = (pjmedia_codec_amr_bit_info*) &frames[cnt].bit_info;
1184
 
        FT = info->frame_type;
1185
 
 
1186
 
        frames[cnt].buf = r;
1187
 
        info->start_bit = r_bitptr;
1188
 
 
1189
 
        if (FT == SID_FT) {
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;
1194
 
        }
1195
 
 
1196
 
        if (setting->octet_aligned) {
1197
 
            r += framelen_tbl[FT];
1198
 
            frames[cnt].size = framelen_tbl[FT];
1199
 
        } else {
1200
 
            if (FT == 14 || FT == 15) {
1201
 
                /* NO DATA */
1202
 
                frames[cnt].size = 0;
1203
 
            } else {
1204
 
                unsigned adv_bit;
1205
 
 
1206
 
                adv_bit = framelenbit_tbl[FT] + r_bitptr;
1207
 
                r += adv_bit >> 3;
1208
 
                r_bitptr = (pj_uint8_t)(adv_bit % 8);
1209
 
 
1210
 
                frames[cnt].size = adv_bit >> 3;
1211
 
                if (r_bitptr)
1212
 
                    ++frames[cnt].size;
1213
 
            }
1214
 
        }
1215
 
        ++cnt;
1216
 
    }
1217
 
 
1218
 
    return PJ_SUCCESS;
1219
 
}
1220
 
 
1221
 
 
1222
 
PJ_END_DECL
1223
 
 
1224
 
/**
1225
 
 * @}
1226
 
 */
1227
 
 
1228
 
#endif /* __PJMEDIA_CODECS_AMR_HELPER_H__ */