~ubuntu-branches/ubuntu/wily/sflphone/wily

« back to all changes in this revision

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

  • Committer: Package Import Robot
  • Author(s): Mark Purcell
  • Date: 2014-01-28 18:23:36 UTC
  • mfrom: (1.1.11)
  • mto: This revision was merged to the branch mainline in revision 24.
  • Revision ID: package-import@ubuntu.com-20140128182336-3xenud1kbnwmf3mz
* New upstream release 
  - Fixes "New Upstream Release" (Closes: #735846)
  - Fixes "Ringtone does not stop" (Closes: #727164)
  - Fixes "[sflphone-kde] crash on startup" (Closes: #718178)
  - Fixes "sflphone GUI crashes when call is hung up" (Closes: #736583)
* Build-Depends: ensure GnuTLS 2.6
  - libucommon-dev (>= 6.0.7-1.1), libccrtp-dev (>= 2.0.6-3)
  - Fixes "FTBFS Build-Depends libgnutls{26,28}-dev" (Closes: #722040)
* Fix "boost 1.49 is going away" unversioned Build-Depends: (Closes: #736746)
* Add Build-Depends: libsndfile-dev, nepomuk-core-dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* $Id: amr_helper.h 3841 2011-10-24 09:28:13Z ming $ */
 
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__ */