blob: 6d8ada08641585e00801e371f9482b73685d8e6b [file] [log] [blame]
Nanang Izzuddin493a8db2008-08-15 13:17:39 +00001/* $Id$ */
2/*
3 * Copyright (C)2003-2008 Benny Prijono <benny@prijono.org>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 */
19#include <pjmedia-codec/ipp_codecs.h>
20#include <pjmedia/codec.h>
21#include <pjmedia/errno.h>
22#include <pjmedia/endpoint.h>
23#include <pjmedia/plc.h>
24#include <pjmedia/port.h>
25#include <pjmedia/silencedet.h>
26#include <pj/assert.h>
27#include <pj/log.h>
28#include <pj/pool.h>
29#include <pj/string.h>
30#include <pj/os.h>
31
32/*
33 * Only build this file if PJMEDIA_HAS_INTEL_IPP_CODECS != 0
34 */
35#if defined(PJMEDIA_HAS_INTEL_IPP_CODECS) && PJMEDIA_HAS_INTEL_IPP_CODECS != 0
36
37#include <usc.h>
38
39#define THIS_FILE "ipp_codecs.c"
40
41/* Prototypes for IPP codecs factory */
42static pj_status_t ipp_test_alloc( pjmedia_codec_factory *factory,
43 const pjmedia_codec_info *id );
44static pj_status_t ipp_default_attr( pjmedia_codec_factory *factory,
45 const pjmedia_codec_info *id,
46 pjmedia_codec_param *attr );
47static pj_status_t ipp_enum_codecs( pjmedia_codec_factory *factory,
48 unsigned *count,
49 pjmedia_codec_info codecs[]);
50static pj_status_t ipp_alloc_codec( pjmedia_codec_factory *factory,
51 const pjmedia_codec_info *id,
52 pjmedia_codec **p_codec);
53static pj_status_t ipp_dealloc_codec( pjmedia_codec_factory *factory,
54 pjmedia_codec *codec );
55
56/* Prototypes for IPP codecs implementation. */
57static pj_status_t ipp_codec_init( pjmedia_codec *codec,
58 pj_pool_t *pool );
59static pj_status_t ipp_codec_open( pjmedia_codec *codec,
60 pjmedia_codec_param *attr );
61static pj_status_t ipp_codec_close( pjmedia_codec *codec );
62static pj_status_t ipp_codec_modify(pjmedia_codec *codec,
63 const pjmedia_codec_param *attr );
64static pj_status_t ipp_codec_parse( pjmedia_codec *codec,
65 void *pkt,
66 pj_size_t pkt_size,
67 const pj_timestamp *ts,
68 unsigned *frame_cnt,
69 pjmedia_frame frames[]);
70static pj_status_t ipp_codec_encode( pjmedia_codec *codec,
71 const struct pjmedia_frame *input,
72 unsigned output_buf_len,
73 struct pjmedia_frame *output);
74static pj_status_t ipp_codec_decode( pjmedia_codec *codec,
75 const struct pjmedia_frame *input,
76 unsigned output_buf_len,
77 struct pjmedia_frame *output);
78static pj_status_t ipp_codec_recover(pjmedia_codec *codec,
79 unsigned output_buf_len,
80 struct pjmedia_frame *output);
81
82/* Definition for IPP codecs operations. */
83static pjmedia_codec_op ipp_op =
84{
85 &ipp_codec_init,
86 &ipp_codec_open,
87 &ipp_codec_close,
88 &ipp_codec_modify,
89 &ipp_codec_parse,
90 &ipp_codec_encode,
91 &ipp_codec_decode,
92 &ipp_codec_recover
93};
94
95/* Definition for IPP codecs factory operations. */
96static pjmedia_codec_factory_op ipp_factory_op =
97{
98 &ipp_test_alloc,
99 &ipp_default_attr,
100 &ipp_enum_codecs,
101 &ipp_alloc_codec,
102 &ipp_dealloc_codec
103};
104
105/* IPP codecs factory */
106static struct ipp_factory {
107 pjmedia_codec_factory base;
108 pjmedia_endpt *endpt;
109 pj_pool_t *pool;
110 pj_mutex_t *mutex;
111} ipp_factory;
112
113/* IPP codecs private data. */
114typedef struct ipp_private {
115 int codec_idx; /**< Codec index. */
116 pj_pool_t *pool; /**< Pool for each instance. */
117
118 USC_Handle enc; /**< Encoder state. */
119 USC_Handle dec; /**< Decoder state. */
120 USC_CodecInfo *info; /**< Native codec info. */
121 pj_uint16_t frame_size; /**< Bitstream frame size. */
122
123 pj_bool_t plc_enabled;
124 pjmedia_plc *plc;
125
126 pj_bool_t vad_enabled;
127 pjmedia_silence_det *vad;
128 pj_timestamp last_tx;
129} ipp_private_t;
130
131
132/* USC codec implementations. */
133extern USC_Fxns USC_G729AFP_Fxns;
134extern USC_Fxns USC_G723_Fxns;
135extern USC_Fxns USC_G726_Fxns;
136extern USC_Fxns USC_G728_Fxns;
137extern USC_Fxns USC_G722_Fxns;
138extern USC_Fxns USC_GSMAMR_Fxns;
139extern USC_Fxns USC_AMRWB_Fxns;
140extern USC_Fxns USC_AMRWBE_Fxns;
141
142/* CUSTOM CALLBACKS */
143
144/* Get frame attributes: frame_type and bitrate.
145 */
146typedef void (*frm_attr_cb)(void *frame, int frame_size,
147 int *bitrate, int *frametype);
148
149/* Parse frames of a packet, returning PJ_SUCCESS on success. This is useful
150 * for parsing a packet that contains multiple frames, while each frame may
151 * be an SID frame or audio frame, this is also useful for multirate codec,
152 * i.e: AMR.
153 */
154typedef pj_status_t (*parse_cb)(ipp_private_t *codec_data, void *pkt,
155 pj_size_t pkt_size, const pj_timestamp *ts,
156 unsigned *frame_cnt, pjmedia_frame frames[]);
157
158/* Pack frames into a packet.
159 */
160typedef pj_status_t (*pack_cb)(ipp_private_t *codec_data, void *pkt,
161 pj_size_t *pkt_size, pj_size_t max_pkt_size);
162
163
164
165/* Callback implementations. */
166static void frm_attr_g723(void *frame, int frame_size,
167 int *bitrate, int *frametype);
168static void frm_attr_g729(void *frame, int frame_size,
169 int *bitrate, int *frametype);
170
171static pj_status_t parse_g723(ipp_private_t *codec_data, void *pkt,
172 pj_size_t pkt_size, const pj_timestamp *ts,
173 unsigned *frame_cnt, pjmedia_frame frames[]);
174static pj_status_t parse_amr(ipp_private_t *codec_data, void *pkt,
175 pj_size_t pkt_size, const pj_timestamp *ts,
176 unsigned *frame_cnt, pjmedia_frame frames[]);
177static pj_status_t pack_amr(ipp_private_t *codec_data, void *pkt,
178 pj_size_t *pkt_size, pj_size_t max_pkt_size);
179
180
181/* IPP codec implementation descriptions. */
182static struct ipp_codec {
183 int enabled; /* Is this codec enabled? */
184 const char *name; /* Codec name. */
185 pj_uint8_t pt; /* Payload type. */
186 USC_Fxns *fxns; /* USC callback functions. */
187 unsigned clock_rate; /* Codec's clock rate. */
188 unsigned channel_count; /* Codec's channel count. */
189 unsigned samples_per_frame; /* Codec's samples count. */
190
191 unsigned def_bitrate; /* Default bitrate of this codec. */
192 unsigned max_bitrate; /* Maximum bitrate of this codec. */
193 pj_uint8_t frm_per_pkt; /* Default num of frames per packet.*/
194 int has_native_vad; /* Codec has internal VAD? */
195 int has_native_plc; /* Codec has internal PLC? */
196
197 frm_attr_cb frm_attr; /* Callback to get frame attribute */
198 parse_cb parse; /* Callback to parse bitstream */
199 pack_cb pack; /* Callback to pack bitstream */
200}
201
202ipp_codec[] =
203{
204# if defined(PJMEDIA_HAS_INTEL_IPP_CODEC_AMR) && PJMEDIA_HAS_INTEL_IPP_CODEC_AMR != 0
205 {1, "AMR", PJMEDIA_RTP_PT_AMR, &USC_GSMAMR_Fxns, 8000, 1, 160,
206 5900, 12200, 4, 1, 1,
207 NULL, &parse_amr, &pack_amr
208 },
209# endif
210
211# if defined(PJMEDIA_HAS_INTEL_IPP_CODEC_G729) && PJMEDIA_HAS_INTEL_IPP_CODEC_G729 != 0
212 /* G.729 actually has internal VAD, but for now we need to disable it,
213 * since its RTP packaging (multiple frames per packet) requires
214 * SID frame to only be occured in the last frame, while controling
215 * encoder on each loop (to enable/disable VAD) is considered inefficient.
216 * This should still be interoperable with other implementations.
217 */
218 {1, "G729", PJMEDIA_RTP_PT_G729, &USC_G729AFP_Fxns, 8000, 1, 80,
219 8000, 11800, 2, 0, 1,
220 &frm_attr_g729, NULL, NULL
221 },
222# endif
223
224# if defined(PJMEDIA_HAS_INTEL_IPP_CODEC_G723) && PJMEDIA_HAS_INTEL_IPP_CODEC_G723 != 0
225 /* This is actually G.723.1 */
226 {1, "G723", PJMEDIA_RTP_PT_G723, &USC_G723_Fxns, 8000, 1, 240,
227 5300, 6300, 1, 1, 1,
228 &frm_attr_g723, &parse_g723, NULL
229 },
230# endif
231
232# if defined(PJMEDIA_HAS_INTEL_IPP_CODEC_G726) && PJMEDIA_HAS_INTEL_IPP_CODEC_G726 != 0
233 {1, "G726-16", PJMEDIA_RTP_PT_G726_16, &USC_G726_Fxns, 8000, 1, 80,
234 16000, 16000, 2, 0, 0,
235 NULL, NULL, NULL
236 },
237 {1, "G726-24", PJMEDIA_RTP_PT_G726_24, &USC_G726_Fxns, 8000, 1, 80,
238 24000, 24000, 2, 0, 0,
239 NULL, NULL, NULL
240 },
241 {1, "G726-32", PJMEDIA_RTP_PT_G726_32, &USC_G726_Fxns, 8000, 1, 80,
242 32000, 32000, 2, 0, 0,
243 NULL, NULL, NULL
244 },
245 {1, "G726-40", PJMEDIA_RTP_PT_G726_40, &USC_G726_Fxns, 8000, 1, 80,
246 40000, 40000, 2, 0, 0,
247 NULL, NULL, NULL
248 },
249# endif
250
251# if defined(PJMEDIA_HAS_INTEL_IPP_CODEC_G728) && PJMEDIA_HAS_INTEL_IPP_CODEC_G728 != 0
252 {1, "G728", PJMEDIA_RTP_PT_G728, &USC_G728_Fxns, 8000, 1, 80,
253 16000, 16000, 2, 0, 1,
254 NULL, NULL, NULL
255 },
256# endif
257
258# if defined(PJMEDIA_HAS_INTEL_IPP_CODEC_G722_1) && PJMEDIA_HAS_INTEL_IPP_CODEC_G722_1 != 0
259 {1, "G722.1-16",PJMEDIA_RTP_PT_G722_1_16, &USC_G722_Fxns, 16000, 1, 320,
260 16000, 16000, 1, 0, 1,
261 NULL, NULL, NULL
262 },
263 {0, "G722.1-24",PJMEDIA_RTP_PT_G722_1_24, &USC_G722_Fxns, 16000, 1, 320,
264 24000, 24000, 1, 0, 1,
265 NULL, NULL, NULL
266 },
267 {0, "G722.1-32",PJMEDIA_RTP_PT_G722_1_32, &USC_G722_Fxns, 16000, 1, 320,
268 32000, 32000, 1, 0, 0,
269 NULL, NULL, NULL
270 },
271# endif
272};
273
274
275static int amr_get_mode(unsigned bitrate);
276static void amr_predecode(pj_bool_t AMRWB, pjmedia_frame *f,
277 int *frametype, int *bitrate);
278
279/*
280 * Initialize and register IPP codec factory to pjmedia endpoint.
281 */
282PJ_DEF(pj_status_t) pjmedia_codec_ipp_init( pjmedia_endpt *endpt )
283{
284 pjmedia_codec_mgr *codec_mgr;
285 pj_status_t status;
286
287 if (ipp_factory.pool != NULL) {
288 /* Already initialized. */
289 return PJ_SUCCESS;
290 }
291
292 /* Create IPP codec factory. */
293 ipp_factory.base.op = &ipp_factory_op;
294 ipp_factory.base.factory_data = NULL;
295 ipp_factory.endpt = endpt;
296
297 ipp_factory.pool = pjmedia_endpt_create_pool(endpt, "IPP codecs", 4000, 4000);
298 if (!ipp_factory.pool)
299 return PJ_ENOMEM;
300
301 /* Create mutex. */
302 status = pj_mutex_create_simple(ipp_factory.pool, "IPP codecs",
303 &ipp_factory.mutex);
304 if (status != PJ_SUCCESS)
305 goto on_error;
306
307 /* Get the codec manager. */
308 codec_mgr = pjmedia_endpt_get_codec_mgr(endpt);
309 if (!codec_mgr) {
310 status = PJ_EINVALIDOP;
311 goto on_error;
312 }
313
314 /* Register codec factory to endpoint. */
315 status = pjmedia_codec_mgr_register_factory(codec_mgr,
316 &ipp_factory.base);
317 if (status != PJ_SUCCESS)
318 goto on_error;
319
320 /* Done. */
321 return PJ_SUCCESS;
322
323on_error:
324 pj_pool_release(ipp_factory.pool);
325 ipp_factory.pool = NULL;
326 return status;
327}
328
329/*
330 * Unregister IPP codecs factory from pjmedia endpoint.
331 */
332PJ_DEF(pj_status_t) pjmedia_codec_ipp_deinit(void)
333{
334 pjmedia_codec_mgr *codec_mgr;
335 pj_status_t status;
336
337 if (ipp_factory.pool == NULL) {
338 /* Already deinitialized */
339 return PJ_SUCCESS;
340 }
341
342 pj_mutex_lock(ipp_factory.mutex);
343
344 /* Get the codec manager. */
345 codec_mgr = pjmedia_endpt_get_codec_mgr(ipp_factory.endpt);
346 if (!codec_mgr) {
347 pj_pool_release(ipp_factory.pool);
348 ipp_factory.pool = NULL;
349 return PJ_EINVALIDOP;
350 }
351
352 /* Unregister IPP codecs factory. */
353 status = pjmedia_codec_mgr_unregister_factory(codec_mgr,
354 &ipp_factory.base);
355
356 /* Destroy mutex. */
357 pj_mutex_destroy(ipp_factory.mutex);
358
359 /* Destroy pool. */
360 pj_pool_release(ipp_factory.pool);
361 ipp_factory.pool = NULL;
362
363 return status;
364}
365
366/*
367 * Check if factory can allocate the specified codec.
368 */
369static pj_status_t ipp_test_alloc( pjmedia_codec_factory *factory,
370 const pjmedia_codec_info *info )
371{
372 unsigned i;
373
374 PJ_UNUSED_ARG(factory);
375
376 /* Type MUST be audio. */
377 if (info->type != PJMEDIA_TYPE_AUDIO)
378 return PJMEDIA_CODEC_EUNSUP;
379
380 for (i = 0; i < PJ_ARRAY_SIZE(ipp_codec); ++i) {
381 pj_str_t name = pj_str((char*)ipp_codec[i].name);
382 if ((pj_stricmp(&info->encoding_name, &name) == 0) &&
383 (info->clock_rate == (unsigned)ipp_codec[i].clock_rate) &&
384 (info->channel_cnt == (unsigned)ipp_codec[i].channel_count) &&
385 (ipp_codec[i].enabled))
386 {
387 return PJ_SUCCESS;
388 }
389 }
390
391 /* Unsupported, or mode is disabled. */
392 return PJMEDIA_CODEC_EUNSUP;
393}
394
395/*
396 * Generate default attribute.
397 */
398static pj_status_t ipp_default_attr (pjmedia_codec_factory *factory,
399 const pjmedia_codec_info *id,
400 pjmedia_codec_param *attr )
401{
402 unsigned i;
403
404 PJ_ASSERT_RETURN(factory==&ipp_factory.base, PJ_EINVAL);
405
406 pj_bzero(attr, sizeof(pjmedia_codec_param));
407
408 for (i = 0; i < PJ_ARRAY_SIZE(ipp_codec); ++i) {
409 pj_str_t name = pj_str((char*)ipp_codec[i].name);
410 if ((pj_stricmp(&id->encoding_name, &name) == 0) &&
411 (id->clock_rate == (unsigned)ipp_codec[i].clock_rate) &&
412 (id->channel_cnt == (unsigned)ipp_codec[i].channel_count))
413 {
414 attr->info.pt = (pj_uint8_t)id->pt;
415 attr->info.channel_cnt = ipp_codec[i].channel_count;
416 attr->info.clock_rate = ipp_codec[i].clock_rate;
417 attr->info.avg_bps = ipp_codec[i].def_bitrate;
418 attr->info.max_bps = ipp_codec[i].max_bitrate;
419 attr->info.pcm_bits_per_sample = 16;
420 attr->info.frm_ptime = (pj_uint16_t)
421 (ipp_codec[i].samples_per_frame * 1000 /
422 ipp_codec[i].channel_count /
423 ipp_codec[i].clock_rate);
424 attr->setting.frm_per_pkt = ipp_codec[i].frm_per_pkt;
425
426 /* Default flags. */
427 attr->setting.cng = 0;
428 attr->setting.plc = 1;
429 attr->setting.penh= 0;
430 attr->setting.vad = 1; /* Always disable for now */
431
432 return PJ_SUCCESS;
433 }
434 }
435
436 return PJMEDIA_CODEC_EUNSUP;
437}
438
439/*
440 * Enum codecs supported by this factory.
441 */
442static pj_status_t ipp_enum_codecs(pjmedia_codec_factory *factory,
443 unsigned *count,
444 pjmedia_codec_info codecs[])
445{
446 unsigned max;
447 unsigned i;
448
449 PJ_UNUSED_ARG(factory);
450 PJ_ASSERT_RETURN(codecs && *count > 0, PJ_EINVAL);
451
452 max = *count;
453
454 for (i = 0, *count = 0; i < PJ_ARRAY_SIZE(ipp_codec) && *count < max; ++i)
455 {
456 if (!ipp_codec[i].enabled)
457 continue;
458
459 pj_bzero(&codecs[*count], sizeof(pjmedia_codec_info));
460 codecs[*count].encoding_name = pj_str((char*)ipp_codec[i].name);
461 codecs[*count].pt = ipp_codec[i].pt;
462 codecs[*count].type = PJMEDIA_TYPE_AUDIO;
463 codecs[*count].clock_rate = ipp_codec[i].clock_rate;
464 codecs[*count].channel_cnt = ipp_codec[i].channel_count;
465
466 ++*count;
467 }
468
469 return PJ_SUCCESS;
470}
471
472/*
473 * Allocate a new codec instance.
474 */
475static pj_status_t ipp_alloc_codec( pjmedia_codec_factory *factory,
476 const pjmedia_codec_info *id,
477 pjmedia_codec **p_codec)
478{
479 ipp_private_t *codec_data;
480 pjmedia_codec *codec;
481 int idx;
482 pj_pool_t *pool;
483 unsigned i;
484
485 PJ_ASSERT_RETURN(factory && id && p_codec, PJ_EINVAL);
486 PJ_ASSERT_RETURN(factory == &ipp_factory.base, PJ_EINVAL);
487
488 pj_mutex_lock(ipp_factory.mutex);
489
490 /* Find codec's index */
491 idx = -1;
492 for (i = 0; i < PJ_ARRAY_SIZE(ipp_codec); ++i) {
493 pj_str_t name = pj_str((char*)ipp_codec[i].name);
494 if ((pj_stricmp(&id->encoding_name, &name) == 0) &&
495 (id->clock_rate == (unsigned)ipp_codec[i].clock_rate) &&
496 (id->channel_cnt == (unsigned)ipp_codec[i].channel_count) &&
497 (ipp_codec[i].enabled))
498 {
499 idx = i;
500 break;
501 }
502 }
503 if (idx == -1) {
504 *p_codec = NULL;
505 return PJMEDIA_CODEC_EFAILED;
506 }
507
508 /* Create pool for codec instance */
509 pool = pjmedia_endpt_create_pool(ipp_factory.endpt, "IPP codec inst",
510 4000, 4000);
511 codec = PJ_POOL_ZALLOC_T(pool, pjmedia_codec);
512 PJ_ASSERT_RETURN(codec != NULL, PJ_ENOMEM);
513 codec->op = &ipp_op;
514 codec->factory = factory;
515 codec->codec_data = PJ_POOL_ZALLOC_T(pool, ipp_private_t);
516 codec_data = (ipp_private_t*) codec->codec_data;
517
518 /* Create PLC if codec has no internal PLC */
519 if (!ipp_codec[idx].has_native_plc) {
520 pj_status_t status;
521 status = pjmedia_plc_create(pool, ipp_codec[idx].clock_rate,
522 ipp_codec[idx].samples_per_frame, 0,
523 &codec_data->plc);
524 if (status != PJ_SUCCESS) {
525 pj_pool_release(pool);
526 pj_mutex_unlock(ipp_factory.mutex);
527 return status;
528 }
529 }
530
531 /* Create silence detector if codec has no internal VAD */
532 if (!ipp_codec[idx].has_native_vad) {
533 pj_status_t status;
534 status = pjmedia_silence_det_create(pool,
535 ipp_codec[idx].clock_rate,
536 ipp_codec[idx].samples_per_frame,
537 &codec_data->vad);
538 if (status != PJ_SUCCESS) {
539 pj_pool_release(pool);
540 pj_mutex_unlock(ipp_factory.mutex);
541 return status;
542 }
543 }
544
545 codec_data->pool = pool;
546 codec_data->codec_idx = idx;
547
548 pj_mutex_unlock(ipp_factory.mutex);
549
550 *p_codec = codec;
551 return PJ_SUCCESS;
552}
553
554/*
555 * Free codec.
556 */
557static pj_status_t ipp_dealloc_codec( pjmedia_codec_factory *factory,
558 pjmedia_codec *codec )
559{
560 ipp_private_t *codec_data;
561
562 PJ_ASSERT_RETURN(factory && codec, PJ_EINVAL);
563 PJ_ASSERT_RETURN(factory == &ipp_factory.base, PJ_EINVAL);
564
565 /* Close codec, if it's not closed. */
566 codec_data = (ipp_private_t*) codec->codec_data;
567 if (codec_data->enc != NULL || codec_data->dec != NULL) {
568 ipp_codec_close(codec);
569 }
570
571 pj_pool_release(codec_data->pool);
572
573 return PJ_SUCCESS;
574}
575
576/*
577 * Init codec.
578 */
579static pj_status_t ipp_codec_init( pjmedia_codec *codec,
580 pj_pool_t *pool )
581{
582 PJ_UNUSED_ARG(codec);
583 PJ_UNUSED_ARG(pool);
584 return PJ_SUCCESS;
585}
586
587/*
588 * Open codec.
589 */
590static pj_status_t ipp_codec_open( pjmedia_codec *codec,
591 pjmedia_codec_param *attr )
592{
593 ipp_private_t *codec_data = (ipp_private_t*) codec->codec_data;
594 int info_size;
595 pj_pool_t *pool;
596 int i, j, idx;
597 USC_MemBank *membanks;
598 int nb_membanks;
599
600 pool = codec_data->pool;
601 idx = codec_data->codec_idx;
602
603 /* Get the codec info size */
604 if (USC_NoError != ipp_codec[idx].fxns->std.GetInfoSize(&info_size)) {
605 PJ_LOG(3,(THIS_FILE, "Error getting codec info size"));
606 goto on_error;
607 }
608 /* Get the codec info */
609 codec_data->info = pj_pool_zalloc(pool, info_size);
610 if (USC_NoError != ipp_codec[idx].fxns->std.GetInfo((USC_Handle)NULL,
611 codec_data->info))
612 {
613 PJ_LOG(3,(THIS_FILE, "Error getting codec info"));
614 goto on_error;
615 }
616
617 /* PREPARING THE ENCODER */
618
619 /* Setting the encoder params */
620 codec_data->info->params.direction = USC_ENCODE;
621 codec_data->info->params.modes.vad = attr->setting.vad;
622 codec_data->info->params.modes.bitrate = attr->info.avg_bps;
623 codec_data->info->params.law = 0; /* Linear PCM input */
624
625 /* Get number of memory blocks needed by the encoder */
626 if (USC_NoError !=
627 ipp_codec[idx].fxns->std.NumAlloc(&codec_data->info->params,
628 &nb_membanks))
629 {
630 PJ_LOG(3,(THIS_FILE, "Error getting no of memory blocks of encoder"));
631 goto on_error;
632 }
633
634 /* Allocate memory blocks table */
635 membanks = (USC_MemBank*) pj_pool_zalloc(pool,
636 sizeof(USC_MemBank) * nb_membanks);
637 /* Get size of each memory block */
638 if (USC_NoError !=
639 ipp_codec[idx].fxns->std.MemAlloc(&codec_data->info->params, membanks))
640 {
641 PJ_LOG(3,(THIS_FILE, "Error getting memory blocks size of encoder"));
642 goto on_error;
643 }
644
645 /* Allocate memory for each block */
646 for (i = 0; i < nb_membanks; i++) {
647 membanks[i].pMem = (char*) pj_pool_zalloc(pool, membanks[i].nbytes);
648 }
649
650 /* Create encoder instance */
651 if (USC_NoError != ipp_codec[idx].fxns->std.Init(&codec_data->info->params,
652 membanks,
653 &codec_data->enc))
654 {
655 PJ_LOG(3,(THIS_FILE, "Error initializing encoder"));
656 goto on_error;
657 }
658
659 /* PREPARING THE DECODER */
660
661 /* Setting the decoder params */
662 codec_data->info->params.direction = USC_DECODE;
663
664 /* Get number of memory blocks needed by the decoder */
665 if (USC_NoError !=
666 ipp_codec[idx].fxns->std.NumAlloc(&codec_data->info->params,
667 &nb_membanks))
668 {
669 PJ_LOG(3,(THIS_FILE, "Error getting no of memory blocks of decoder"));
670 goto on_error;
671 }
672
673 /* Allocate memory blocks table */
674 membanks = (USC_MemBank*) pj_pool_zalloc(pool,
675 sizeof(USC_MemBank) * nb_membanks);
676 /* Get size of each memory block */
677 if (USC_NoError !=
678 ipp_codec[idx].fxns->std.MemAlloc(&codec_data->info->params, membanks))
679 {
680 PJ_LOG(3,(THIS_FILE, "Error getting memory blocks size of decoder"));
681 goto on_error;
682 }
683
684 /* Allocate memory for each block */
685 for (i = 0; i < nb_membanks; i++) {
686 membanks[i].pMem = (char*) pj_pool_zalloc(pool, membanks[i].nbytes);
687 }
688
689 /* Create decoder instance */
690 if (USC_NoError != ipp_codec[idx].fxns->std.Init(&codec_data->info->params,
691 membanks,
692 &codec_data->dec))
693 {
694 PJ_LOG(3,(THIS_FILE, "Error initializing decoder"));
695 goto on_error;
696 }
697
698 /* Update codec info */
699 ipp_codec[idx].fxns->std.GetInfo((USC_Handle)codec_data->enc, codec_data->info);
700
701 /* Get bitstream size */
702 i = codec_data->info->params.modes.bitrate * ipp_codec[idx].samples_per_frame;
703 j = ipp_codec[idx].clock_rate << 3;
704 codec_data->frame_size = (pj_uint16_t)(i / j);
705 if (i % j) ++codec_data->frame_size;
706
707 codec_data->vad_enabled = (attr->setting.vad != 0);
708 codec_data->plc_enabled = (attr->setting.plc != 0);
709
710 return PJ_SUCCESS;
711
712on_error:
713 return PJMEDIA_CODEC_EFAILED;
714}
715
716/*
717 * Close codec.
718 */
719static pj_status_t ipp_codec_close( pjmedia_codec *codec )
720{
721 PJ_UNUSED_ARG(codec);
722
723 return PJ_SUCCESS;
724}
725
726
727/*
728 * Modify codec settings.
729 */
730static pj_status_t ipp_codec_modify(pjmedia_codec *codec,
731 const pjmedia_codec_param *attr )
732{
733 ipp_private_t *codec_data = (ipp_private_t*) codec->codec_data;
734
735 codec_data->vad_enabled = (attr->setting.vad != 0);
736 codec_data->plc_enabled = (attr->setting.plc != 0);
737
738 if (ipp_codec[codec_data->codec_idx].has_native_vad) {
739 USC_Modes modes;
740
741 modes = codec_data->info->params.modes;
742 modes.vad = codec_data->vad_enabled;
743 ipp_codec[codec_data->codec_idx].fxns->std.Control(&modes, codec_data->enc);
744 }
745
746 return PJ_SUCCESS;
747}
748
749/*
750 * Get frames in the packet.
751 */
752static pj_status_t ipp_codec_parse( pjmedia_codec *codec,
753 void *pkt,
754 pj_size_t pkt_size,
755 const pj_timestamp *ts,
756 unsigned *frame_cnt,
757 pjmedia_frame frames[])
758{
759 ipp_private_t *codec_data = (ipp_private_t*) codec->codec_data;
760 unsigned count = 0;
761
762 PJ_ASSERT_RETURN(frame_cnt, PJ_EINVAL);
763
764 if (ipp_codec[codec_data->codec_idx].parse != NULL) {
765 return ipp_codec[codec_data->codec_idx].parse(codec_data, pkt,
766 pkt_size, ts, frame_cnt, frames);
767 }
768
769 while (pkt_size >= codec_data->frame_size && count < *frame_cnt) {
770 frames[count].type = PJMEDIA_FRAME_TYPE_AUDIO;
771 frames[count].buf = pkt;
772 frames[count].size = codec_data->frame_size;
773 frames[count].timestamp.u64 = ts->u64 + count *
774 ipp_codec[codec_data->codec_idx].samples_per_frame;
775
776 pkt = ((char*)pkt) + codec_data->frame_size;
777 pkt_size -= codec_data->frame_size;
778
779 ++count;
780 }
781
782 if (pkt_size && count < *frame_cnt) {
783 frames[count].type = PJMEDIA_FRAME_TYPE_AUDIO;
784 frames[count].buf = pkt;
785 frames[count].size = pkt_size;
786 frames[count].timestamp.u64 = ts->u64 + count *
787 ipp_codec[codec_data->codec_idx].samples_per_frame;
788 ++count;
789 }
790
791 *frame_cnt = count;
792 return PJ_SUCCESS;
793}
794
795/*
796 * Encode frames.
797 */
798static pj_status_t ipp_codec_encode( pjmedia_codec *codec,
799 const struct pjmedia_frame *input,
800 unsigned output_buf_len,
801 struct pjmedia_frame *output)
802{
803 ipp_private_t *codec_data = (ipp_private_t*) codec->codec_data;
804 unsigned samples_per_frame;
805 unsigned nsamples;
806 pj_size_t tx = 0;
807 pj_int16_t *pcm_in = (pj_int16_t*)input->buf;
808 pj_int8_t *bits_out = (pj_int8_t*) output->buf;
809
810 /* Invoke external VAD if codec has no internal VAD */
811 if (codec_data->vad && codec_data->vad_enabled) {
812 pj_bool_t is_silence;
813 pj_int32_t silence_duration;
814
815 silence_duration = pj_timestamp_diff32(&codec_data->last_tx,
816 &input->timestamp);
817
818 is_silence = pjmedia_silence_det_detect(codec_data->vad,
819 (const pj_int16_t*) input->buf,
820 (input->size >> 1),
821 NULL);
822 if (is_silence &&
823 PJMEDIA_CODEC_MAX_SILENCE_PERIOD != -1 &&
824 silence_duration < (PJMEDIA_CODEC_MAX_SILENCE_PERIOD*
825 (int)ipp_codec[codec_data->codec_idx].clock_rate/1000))
826 {
827 output->type = PJMEDIA_FRAME_TYPE_NONE;
828 output->buf = NULL;
829 output->size = 0;
830 output->timestamp = input->timestamp;
831 return PJ_SUCCESS;
832 } else {
833 codec_data->last_tx = input->timestamp;
834 }
835 }
836
837 nsamples = input->size >> 1;
838 samples_per_frame=ipp_codec[codec_data->codec_idx].samples_per_frame;
839
840 PJ_ASSERT_RETURN(nsamples % samples_per_frame == 0,
841 PJMEDIA_CODEC_EPCMFRMINLEN);
842
843 /* Encode the frames */
844 while (nsamples >= samples_per_frame) {
845 USC_PCMStream in;
846 USC_Bitstream out;
847
848 in.bitrate = codec_data->info->params.modes.bitrate;
849 in.nbytes = samples_per_frame << 1;
850 in.pBuffer = (char*)pcm_in;
851 in.pcmType.bitPerSample = codec_data->info->params.pcmType.bitPerSample;
852 in.pcmType.nChannels = codec_data->info->params.pcmType.nChannels;
853 in.pcmType.sample_frequency = codec_data->info->params.pcmType.sample_frequency;
854
855 out.pBuffer = bits_out;
856
857#if defined(PJMEDIA_HAS_INTEL_IPP_CODEC_AMR) && PJMEDIA_HAS_INTEL_IPP_CODEC_AMR != 0
858 /* For AMR: reserve the first byte for frame info */
859 if (ipp_codec[codec_data->codec_idx].pt == PJMEDIA_RTP_PT_AMR) {
860 ++out.pBuffer;
861 }
862#endif
863
864 if (USC_NoError != ipp_codec[codec_data->codec_idx].fxns->Encode(codec_data->enc, &in, &out)) {
865 break;
866 }
867
868#if defined(PJMEDIA_HAS_INTEL_IPP_CODEC_AMR) && PJMEDIA_HAS_INTEL_IPP_CODEC_AMR != 0
869 /* For AMR: put info (frametype, degraded, last frame) in the first byte */
870 if (ipp_codec[codec_data->codec_idx].pt == PJMEDIA_RTP_PT_AMR) {
871 pj_uint8_t *info = (pj_uint8_t*)bits_out;
872
873 ++out.nbytes;
874
875 /* One byte AMR frame type & quality flag:
876 * bit 0-3 : frame type
877 * bit 6 : last frame flag
878 * bit 7 : quality flag
879 */
880 if (out.frametype == 1 || out.frametype == 2 || out.frametype == 7) {
881 /* SID */
882 *info = 8;
883 /* Degraded */
884 if (out.frametype == 7)
885 *info |= 0x80;
886 } else if (out.frametype == 3) {
887 /* Untransmited */
888 *info = 15;
889 out.nbytes = 1;
890 } else {
891 /* Normal */
892 *info = (char)amr_get_mode(out.bitrate);
893 /* Degraded */
894 if (out.frametype != 0)
895 *info |= 0x80;
896 }
897
898 /* Last frame flag */
899 if (nsamples == samples_per_frame)
900 *info |= 0x40;
901 }
902
903 pcm_in += samples_per_frame;
904 nsamples -= samples_per_frame;
905 tx += out.nbytes;
906 bits_out += out.nbytes;
907 }
908#endif
909
910 if (ipp_codec[codec_data->codec_idx].pack != NULL) {
911 ipp_codec[codec_data->codec_idx].pack(codec_data, output->buf,
912 &tx, output_buf_len);
913 }
914
915 /* Check if we don't need to transmit the frame (DTX) */
916 if (tx == 0) {
917 output->buf = NULL;
918 output->size = 0;
919 output->timestamp.u64 = input->timestamp.u64;
920 output->type = PJMEDIA_FRAME_TYPE_NONE;
921 return PJ_SUCCESS;
922 }
923
924 output->size = tx;
925 output->type = PJMEDIA_FRAME_TYPE_AUDIO;
926 output->timestamp = input->timestamp;
927
928 return PJ_SUCCESS;
929}
930
931/*
932 * Decode frame.
933 */
934static pj_status_t ipp_codec_decode( pjmedia_codec *codec,
935 const struct pjmedia_frame *input,
936 unsigned output_buf_len,
937 struct pjmedia_frame *output)
938{
939 ipp_private_t *codec_data = (ipp_private_t*) codec->codec_data;
940 unsigned samples_per_frame;
941 USC_PCMStream out;
942 USC_Bitstream in;
943 pj_uint8_t pt;
944
945 samples_per_frame = ipp_codec[codec_data->codec_idx].samples_per_frame;
946
947 PJ_ASSERT_RETURN(output_buf_len >= samples_per_frame << 1,
948 PJMEDIA_CODEC_EPCMTOOSHORT);
949
950 if (input->type == PJMEDIA_FRAME_TYPE_AUDIO) {
951 in.nbytes = input->size;
952 in.pBuffer = (char*)input->buf;
953 if (ipp_codec[codec_data->codec_idx].frm_attr) {
954 ipp_codec[codec_data->codec_idx].frm_attr(input->buf, input->size,
955 &in.bitrate,
956 &in.frametype);
957 } else {
958 /* Most IPP codecs have frametype==0 for speech frame */
959 in.frametype = 0;
960 in.bitrate = codec_data->info->params.modes.bitrate;
961 }
962
963 out.pBuffer = output->buf;
964
965#if defined(PJMEDIA_HAS_INTEL_IPP_CODEC_AMR) && PJMEDIA_HAS_INTEL_IPP_CODEC_AMR != 0
966 /* For AMR: unorder the sensitivity order */
967 if (ipp_codec[codec_data->codec_idx].pt == PJMEDIA_RTP_PT_AMR) {
968 pjmedia_frame input_ = *input;
969 amr_predecode(PJ_FALSE, &input_, &in.frametype, &in.bitrate);
970 in.nbytes = input_.size;
971 }
972 }
973#endif
974
975 if (input->type != PJMEDIA_FRAME_TYPE_AUDIO ||
976 USC_NoError != ipp_codec[codec_data->codec_idx].fxns->Decode(
977 codec_data->dec, &in, &out))
978 {
979 pjmedia_zero_samples((pj_int16_t*)output->buf, samples_per_frame);
980 output->size = samples_per_frame << 1;
981 output->timestamp.u64 = input->timestamp.u64;
982 output->type = PJMEDIA_FRAME_TYPE_AUDIO;
983 return PJ_SUCCESS;
984 }
985
986#if defined(PJMEDIA_HAS_INTEL_IPP_CODEC_G726) && PJMEDIA_HAS_INTEL_IPP_CODEC_G726 != 0
987 /* For G.726: amplify decoding result (USC G.726 encoder deamplified it) */
988 pt = ipp_codec[codec_data->codec_idx].pt;
989 if (pt == PJMEDIA_RTP_PT_G726_16 || pt == PJMEDIA_RTP_PT_G726_24 ||
990 pt == PJMEDIA_RTP_PT_G726_32 || pt == PJMEDIA_RTP_PT_G726_40)
991 {
992 unsigned i;
993 pj_int16_t *s = (pj_int16_t*)output->buf;
994
995 for (i = 0; i < samples_per_frame; ++i)
996 s[i] <<= 2;
997 }
998#endif
999
1000 output->type = PJMEDIA_FRAME_TYPE_AUDIO;
1001 output->size = samples_per_frame << 1;
1002 output->timestamp.u64 = input->timestamp.u64;
1003
1004 /* Invoke external PLC if codec has no internal PLC */
1005 if (codec_data->plc && codec_data->plc_enabled)
1006 pjmedia_plc_save(codec_data->plc, (pj_int16_t*)output->buf);
1007
1008 return PJ_SUCCESS;
1009}
1010
1011/*
1012 * Recover lost frame.
1013 */
1014static pj_status_t ipp_codec_recover(pjmedia_codec *codec,
1015 unsigned output_buf_len,
1016 struct pjmedia_frame *output)
1017{
1018 ipp_private_t *codec_data = (ipp_private_t*) codec->codec_data;
1019 unsigned samples_per_frame;
1020
1021 PJ_UNUSED_ARG(output_buf_len);
1022
1023 samples_per_frame = ipp_codec[codec_data->codec_idx].samples_per_frame;
1024
1025 output->type = PJMEDIA_FRAME_TYPE_AUDIO;
1026 output->size = samples_per_frame << 1;
1027
1028 if (codec_data->plc_enabled) {
1029 if (codec_data->plc) {
1030 pjmedia_plc_generate(codec_data->plc, (pj_int16_t*)output->buf);
1031 } else {
1032 USC_PCMStream out;
1033 out.pBuffer = output->buf;
1034 ipp_codec[codec_data->codec_idx].fxns->Decode(codec_data->dec,
1035 NULL, &out);
1036 }
1037 } else {
1038 pjmedia_zero_samples((pj_int16_t*)output->buf, samples_per_frame);
1039 }
1040
1041 return PJ_SUCCESS;
1042}
1043
1044#if defined(PJMEDIA_HAS_INTEL_IPP_CODEC_G729) && PJMEDIA_HAS_INTEL_IPP_CODEC_G729 != 0
1045
1046static void frm_attr_g729(void *frame, int frame_size,
1047 int *bitrate, int *frametype)
1048{
1049 PJ_UNUSED_ARG(frame);
1050
1051 switch (frame_size) {
1052 case 2:
1053 /* SID */
1054 *frametype = 1;
1055 *bitrate = 8000;
1056 break;
1057 case 8:
1058 /* G729D */
1059 *frametype = 2;
1060 *bitrate = 6400;
1061 break;
1062 case 10:
1063 /* G729 */
1064 *frametype = 3;
1065 *bitrate = 8000;
1066 break;
1067 case 15:
1068 /* G729E */
1069 *frametype = 4;
1070 *bitrate = 11800;
1071 break;
1072 default:
1073 *frametype = 0;
1074 *bitrate = 0;
1075 break;
1076 }
1077}
1078
1079#endif /* PJMEDIA_HAS_INTEL_IPP_CODEC_G729 */
1080
1081
1082#if defined(PJMEDIA_HAS_INTEL_IPP_CODEC_G723) && PJMEDIA_HAS_INTEL_IPP_CODEC_G723 != 0
1083
1084static void frm_attr_g723(void *frame, int frame_size,
1085 int *bitrate, int *frametype)
1086{
1087 int i, HDR = 0;
1088 pj_uint8_t *f = (pj_uint8_t*)frame;
1089
1090 PJ_UNUSED_ARG(frame_size);
1091
1092 for (i = 0; i < 2; ++i){
1093 int tmp;
1094 tmp = (f[0] >> (i & 0x7)) & 1;
1095 HDR += tmp << i ;
1096 }
1097
1098 *bitrate = HDR == 0? 6300 : 5300;
1099 *frametype = 0;
1100}
1101
1102static pj_status_t parse_g723(ipp_private_t *codec_data, void *pkt,
1103 pj_size_t pkt_size, const pj_timestamp *ts,
1104 unsigned *frame_cnt, pjmedia_frame frames[])
1105{
1106 unsigned count = 0;
1107 pj_uint8_t *f = (pj_uint8_t*)pkt;
1108
1109 while (pkt_size && count < *frame_cnt) {
1110 int framesize, i, j;
1111 int HDR = 0;
1112
1113 for (i = 0; i < 2; ++i){
1114 j = (f[0] >> (i & 0x7)) & 1;
1115 HDR += j << i ;
1116 }
1117
1118 if (HDR == 0)
1119 framesize = 24;
1120 else if (HDR == 1)
1121 framesize = 20;
1122 else if (HDR == 2)
1123 framesize = 4;
1124 else if (HDR == 3)
1125 framesize = 1;
1126 else {
1127 pj_assert(!"Unknown G723.1 frametype, bitstream may be corrupted!");
1128 return PJMEDIA_CODEC_EINMODE;
1129 }
1130
1131 frames[count].type = PJMEDIA_FRAME_TYPE_AUDIO;
1132 frames[count].buf = f;
1133 frames[count].size = framesize;
1134 frames[count].timestamp.u64 = ts->u64 + count *
1135 ipp_codec[codec_data->codec_idx].samples_per_frame;
1136
1137 f += framesize;
1138 pkt_size -= framesize;
1139
1140 ++count;
1141 }
1142
1143 *frame_cnt = count;
1144 return PJ_SUCCESS;
1145}
1146
1147#endif /* PJMEDIA_HAS_INTEL_IPP_CODEC_G723 */
1148
1149
1150#if defined(PJMEDIA_HAS_INTEL_IPP_CODEC_AMR) && PJMEDIA_HAS_INTEL_IPP_CODEC_AMR != 0
1151
1152/* AMR bitstream sensitivity order map */
1153static pj_int16_t AMRNB_ordermap122[244] =
1154{
1155 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
1156 10, 11, 12, 13, 14, 23, 15, 16, 17, 18,
1157 19, 20, 21, 22, 24, 25, 26, 27, 28, 38,
1158 141, 39, 142, 40, 143, 41, 144, 42, 145, 43,
1159 146, 44, 147, 45, 148, 46, 149, 47, 97, 150,
1160 200, 48, 98, 151, 201, 49, 99, 152, 202, 86,
1161 136, 189, 239, 87, 137, 190, 240, 88, 138, 191,
1162 241, 91, 194, 92, 195, 93, 196, 94, 197, 95,
1163 198, 29, 30, 31, 32, 33, 34, 35, 50, 100,
1164 153, 203, 89, 139, 192, 242, 51, 101, 154, 204,
1165 55, 105, 158, 208, 90, 140, 193, 243, 59, 109,
1166 162, 212, 63, 113, 166, 216, 67, 117, 170, 220,
1167 36, 37, 54, 53, 52, 58, 57, 56, 62, 61,
1168 60, 66, 65, 64, 70, 69, 68, 104, 103, 102,
1169 108, 107, 106, 112, 111, 110, 116, 115, 114, 120,
1170 119, 118, 157, 156, 155, 161, 160, 159, 165, 164,
1171 163, 169, 168, 167, 173, 172, 171, 207, 206, 205,
1172 211, 210, 209, 215, 214, 213, 219, 218, 217, 223,
1173 222, 221, 73, 72, 71, 76, 75, 74, 79, 78,
1174 77, 82, 81, 80, 85, 84, 83, 123, 122, 121,
1175 126, 125, 124, 129, 128, 127, 132, 131, 130, 135,
1176 134, 133, 176, 175, 174, 179, 178, 177, 182, 181,
1177 180, 185, 184, 183, 188, 187, 186, 226, 225, 224,
1178 229, 228, 227, 232, 231, 230, 235, 234, 233, 238,
1179 237, 236, 96, 199
1180};
1181
1182static pj_int16_t AMRNB_ordermap102[204] =
1183{
1184 7, 6, 5, 4, 3, 2, 1, 0, 16, 15,
1185 14, 13, 12, 11, 10, 9, 8, 26, 27, 28,
1186 29, 30, 31, 115, 116, 117, 118, 119, 120, 72,
1187 73, 161, 162, 65, 68, 69, 108, 111, 112, 154,
1188 157, 158, 197, 200, 201, 32, 33, 121, 122, 74,
1189 75, 163, 164, 66, 109, 155, 198, 19, 23, 21,
1190 22, 18, 17, 20, 24, 25, 37, 36, 35, 34,
1191 80, 79, 78, 77, 126, 125, 124, 123, 169, 168,
1192 167, 166, 70, 67, 71, 113, 110, 114, 159, 156,
1193 160, 202, 199, 203, 76, 165, 81, 82, 92, 91,
1194 93, 83, 95, 85, 84, 94, 101, 102, 96, 104,
1195 86, 103, 87, 97, 127, 128, 138, 137, 139, 129,
1196 141, 131, 130, 140, 147, 148, 142, 150, 132, 149,
1197 133, 143, 170, 171, 181, 180, 182, 172, 184, 174,
1198 173, 183, 190, 191, 185, 193, 175, 192, 176, 186,
1199 38, 39, 49, 48, 50, 40, 52, 42, 41, 51,
1200 58, 59, 53, 61, 43, 60, 44, 54, 194, 179,
1201 189, 196, 177, 195, 178, 187, 188, 151, 136, 146,
1202 153, 134, 152, 135, 144, 145, 105, 90, 100, 107,
1203 88, 106, 89, 98, 99, 62, 47, 57, 64, 45,
1204 63, 46, 55, 56
1205};
1206
1207static pj_int16_t AMRNB_ordermap795[159] =
1208{
1209 8, 7, 6, 5, 4, 3, 2, 14, 16, 9,
1210 10, 12, 13, 15, 11, 17, 20, 22, 24, 23,
1211 19, 18, 21, 56, 88, 122, 154, 57, 89, 123,
1212 155, 58, 90, 124, 156, 52, 84, 118, 150, 53,
1213 85, 119, 151, 27, 93, 28, 94, 29, 95, 30,
1214 96, 31, 97, 61, 127, 62, 128, 63, 129, 59,
1215 91, 125, 157, 32, 98, 64, 130, 1, 0, 25,
1216 26, 33, 99, 34, 100, 65, 131, 66, 132, 54,
1217 86, 120, 152, 60, 92, 126, 158, 55, 87, 121,
1218 153, 117, 116, 115, 46, 78, 112, 144, 43, 75,
1219 109, 141, 40, 72, 106, 138, 36, 68, 102, 134,
1220 114, 149, 148, 147, 146, 83, 82, 81, 80, 51,
1221 50, 49, 48, 47, 45, 44, 42, 39, 35, 79,
1222 77, 76, 74, 71, 67, 113, 111, 110, 108, 105,
1223 101, 145, 143, 142, 140, 137, 133, 41, 73, 107,
1224 139, 37, 69, 103, 135, 38, 70, 104, 136
1225
1226};
1227
1228static pj_int16_t AMRNB_ordermap74[148] =
1229{
1230 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
1231 10, 11, 12, 13, 14, 15, 16, 26, 87, 27,
1232 88, 28, 89, 29, 90, 30, 91, 51, 80, 112,
1233 141, 52, 81, 113, 142, 54, 83, 115, 144, 55,
1234 84, 116, 145, 58, 119, 59, 120, 21, 22, 23,
1235 17, 18, 19, 31, 60, 92, 121, 56, 85, 117,
1236 146, 20, 24, 25, 50, 79, 111, 140, 57, 86,
1237 118, 147, 49, 78, 110, 139, 48, 77, 53, 82,
1238 114, 143, 109, 138, 47, 76, 108, 137, 32, 33,
1239 61, 62, 93, 94, 122, 123, 41, 42, 43, 44,
1240 45, 46, 70, 71, 72, 73, 74, 75, 102, 103,
1241 104, 105, 106, 107, 131, 132, 133, 134, 135, 136,
1242 34, 63, 95, 124, 35, 64, 96, 125, 36, 65,
1243 97, 126, 37, 66, 98, 127, 38, 67, 99, 128,
1244 39, 68, 100, 129, 40, 69, 101, 130
1245};
1246
1247static pj_int16_t AMRNB_ordermap67[134] =
1248{
1249 0, 1, 4, 3, 5, 6, 13, 7, 2, 8,
1250 9, 11, 15, 12, 14, 10, 28, 82, 29, 83,
1251 27, 81, 26, 80, 30, 84, 16, 55, 109, 56,
1252 110, 31, 85, 57, 111, 48, 73, 102, 127, 32,
1253 86, 51, 76, 105, 130, 52, 77, 106, 131, 58,
1254 112, 33, 87, 19, 23, 53, 78, 107, 132, 21,
1255 22, 18, 17, 20, 24, 25, 50, 75, 104, 129,
1256 47, 72, 101, 126, 54, 79, 108, 133, 46, 71,
1257 100, 125, 128, 103, 74, 49, 45, 70, 99, 124,
1258 42, 67, 96, 121, 39, 64, 93, 118, 38, 63,
1259 92, 117, 35, 60, 89, 114, 34, 59, 88, 113,
1260 44, 69, 98, 123, 43, 68, 97, 122, 41, 66,
1261 95, 120, 40, 65, 94, 119, 37, 62, 91, 116,
1262 36, 61, 90, 115
1263};
1264
1265static pj_int16_t AMRNB_ordermap59[118] =
1266{
1267 0, 1, 4, 5, 3, 6, 7, 2, 13, 15,
1268 8, 9, 11, 12, 14, 10, 16, 28, 74, 29,
1269 75, 27, 73, 26, 72, 30, 76, 51, 97, 50,
1270 71, 96, 117, 31, 77, 52, 98, 49, 70, 95,
1271 116, 53, 99, 32, 78, 33, 79, 48, 69, 94,
1272 115, 47, 68, 93, 114, 46, 67, 92, 113, 19,
1273 21, 23, 22, 18, 17, 20, 24, 111, 43, 89,
1274 110, 64, 65, 44, 90, 25, 45, 66, 91, 112,
1275 54, 100, 40, 61, 86, 107, 39, 60, 85, 106,
1276 36, 57, 82, 103, 35, 56, 81, 102, 34, 55,
1277 80, 101, 42, 63, 88, 109, 41, 62, 87, 108,
1278 38, 59, 84, 105, 37, 58, 83, 104
1279};
1280
1281static pj_int16_t AMRNB_ordermap515[103] =
1282{
1283 7, 6, 5, 4, 3, 2, 1, 0, 15, 14,
1284 13, 12, 11, 10, 9, 8, 23, 24, 25, 26,
1285 27, 46, 65, 84, 45, 44, 43, 64, 63, 62,
1286 83, 82, 81, 102, 101, 100, 42, 61, 80, 99,
1287 28, 47, 66, 85, 18, 41, 60, 79, 98, 29,
1288 48, 67, 17, 20, 22, 40, 59, 78, 97, 21,
1289 30, 49, 68, 86, 19, 16, 87, 39, 38, 58,
1290 57, 77, 35, 54, 73, 92, 76, 96, 95, 36,
1291 55, 74, 93, 32, 51, 33, 52, 70, 71, 89,
1292 90, 31, 50, 69, 88, 37, 56, 75, 94, 34,
1293 53, 72, 91
1294};
1295
1296static pj_int16_t AMRNB_ordermap475[95] =
1297{
1298 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
1299 10, 11, 12, 13, 14, 15, 23, 24, 25, 26,
1300 27, 28, 48, 49, 61, 62, 82, 83, 47, 46,
1301 45, 44, 81, 80, 79, 78, 17, 18, 20, 22,
1302 77, 76, 75, 74, 29, 30, 43, 42, 41, 40,
1303 38, 39, 16, 19, 21, 50, 51, 59, 60, 63,
1304 64, 72, 73, 84, 85, 93, 94, 32, 33, 35,
1305 36, 53, 54, 56, 57, 66, 67, 69, 70, 87,
1306 88, 90, 91, 34, 55, 68, 89, 37, 58, 71,
1307 92, 31, 52, 65, 86
1308};
1309
1310static pj_int16_t *AMRNB_ordermaps[8] =
1311{
1312 AMRNB_ordermap475,
1313 AMRNB_ordermap515,
1314 AMRNB_ordermap59,
1315 AMRNB_ordermap67,
1316 AMRNB_ordermap74,
1317 AMRNB_ordermap795,
1318 AMRNB_ordermap102,
1319 AMRNB_ordermap122
1320};
1321
1322static pj_int16_t AMRWB_ordermap_660[] =
1323{
1324 0, 5, 6, 7, 61, 84, 107, 130, 62, 85,
1325 8, 4, 37, 38, 39, 40, 58, 81, 104, 127,
1326 60, 83, 106, 129, 108, 131, 128, 41, 42, 80,
1327 126, 1, 3, 57, 103, 82, 105, 59, 2, 63,
1328 109, 110, 86, 19, 22, 23, 64, 87, 18, 20,
1329 21, 17, 13, 88, 43, 89, 65, 111, 14, 24,
1330 25, 26, 27, 28, 15, 16, 44, 90, 66, 112,
1331 9, 11, 10, 12, 67, 113, 29, 30, 31, 32,
1332 34, 33, 35, 36, 45, 51, 68, 74, 91, 97,
1333 114, 120, 46, 69, 92, 115, 52, 75, 98, 121,
1334 47, 70, 93, 116, 53, 76, 99, 122, 48, 71,
1335 94, 117, 54, 77, 100, 123, 49, 72, 95, 118,
1336 55, 78, 101, 124, 50, 73, 96, 119, 56, 79,
1337 102, 125
1338};
1339
1340static pj_int16_t AMRWB_ordermap_885[] =
1341{
1342 0, 4, 6, 7, 5, 3, 47, 48, 49, 112,
1343 113, 114, 75, 106, 140, 171, 80, 111, 145, 176,
1344 77, 108, 142, 173, 78, 109, 143, 174, 79, 110,
1345 144, 175, 76, 107, 141, 172, 50, 115, 51, 2,
1346 1, 81, 116, 146, 19, 21, 12, 17, 18, 20,
1347 16, 25, 13, 10, 14, 24, 23, 22, 26, 8,
1348 15, 52, 117, 31, 82, 147, 9, 33, 11, 83,
1349 148, 53, 118, 28, 27, 84, 149, 34, 35, 29,
1350 46, 32, 30, 54, 119, 37, 36, 39, 38, 40,
1351 85, 150, 41, 42, 43, 44, 45, 55, 60, 65,
1352 70, 86, 91, 96, 101, 120, 125, 130, 135, 151,
1353 156, 161, 166, 56, 87, 121, 152, 61, 92, 126,
1354 157, 66, 97, 131, 162, 71, 102, 136, 167, 57,
1355 88, 122, 153, 62, 93, 127, 158, 67, 98, 132,
1356 163, 72, 103, 137, 168, 58, 89, 123, 154, 63,
1357 94, 128, 159, 68, 99, 133, 164, 73, 104, 138,
1358 169, 59, 90, 124, 155, 64, 95, 129, 160, 69,
1359 100, 134, 165, 74, 105, 139, 170
1360};
1361
1362static pj_int16_t AMRWB_ordermap_1265[] =
1363{
1364 0, 4, 6, 93, 143, 196, 246, 7, 5, 3,
1365 47, 48, 49, 50, 51, 150, 151, 152, 153, 154,
1366 94, 144, 197, 247, 99, 149, 202, 252, 96, 146,
1367 199, 249, 97, 147, 200, 250, 100, 203, 98, 148,
1368 201, 251, 95, 145, 198, 248, 52, 2, 1, 101,
1369 204, 155, 19, 21, 12, 17, 18, 20, 16, 25,
1370 13, 10, 14, 24, 23, 22, 26, 8, 15, 53,
1371 156, 31, 102, 205, 9, 33, 11, 103, 206, 54,
1372 157, 28, 27, 104, 207, 34, 35, 29, 46, 32,
1373 30, 55, 158, 37, 36, 39, 38, 40, 105, 208,
1374 41, 42, 43, 44, 45, 56, 106, 159, 209, 57,
1375 66, 75, 84, 107, 116, 125, 134, 160, 169, 178,
1376 187, 210, 219, 228, 237, 58, 108, 161, 211, 62,
1377 112, 165, 215, 67, 117, 170, 220, 71, 121, 174,
1378 224, 76, 126, 179, 229, 80, 130, 183, 233, 85,
1379 135, 188, 238, 89, 139, 192, 242, 59, 109, 162,
1380 212, 63, 113, 166, 216, 68, 118, 171, 221, 72,
1381 122, 175, 225, 77, 127, 180, 230, 81, 131, 184,
1382 234, 86, 136, 189, 239, 90, 140, 193, 243, 60,
1383 110, 163, 213, 64, 114, 167, 217, 69, 119, 172,
1384 222, 73, 123, 176, 226, 78, 128, 181, 231, 82,
1385 132, 185, 235, 87, 137, 190, 240, 91, 141, 194,
1386 244, 61, 111, 164, 214, 65, 115, 168, 218, 70,
1387 120, 173, 223, 74, 124, 177, 227, 79, 129, 182,
1388 232, 83, 133, 186, 236, 88, 138, 191, 241, 92,
1389 142, 195, 245
1390};
1391
1392static pj_int16_t AMRWB_ordermap_1425[] =
1393{
1394 0, 4, 6, 101, 159, 220, 278, 7, 5, 3,
1395 47, 48, 49, 50, 51, 166, 167, 168, 169, 170,
1396 102, 160, 221, 279, 107, 165, 226, 284, 104, 162,
1397 223, 281, 105, 163, 224, 282, 108, 227, 106, 164,
1398 225, 283, 103, 161, 222, 280, 52, 2, 1, 109,
1399 228, 171, 19, 21, 12, 17, 18, 20, 16, 25,
1400 13, 10, 14, 24, 23, 22, 26, 8, 15, 53,
1401 172, 31, 110, 229, 9, 33, 11, 111, 230, 54,
1402 173, 28, 27, 112, 231, 34, 35, 29, 46, 32,
1403 30, 55, 174, 37, 36, 39, 38, 40, 113, 232,
1404 41, 42, 43, 44, 45, 56, 114, 175, 233, 62,
1405 120, 181, 239, 75, 133, 194, 252, 57, 115, 176,
1406 234, 63, 121, 182, 240, 70, 128, 189, 247, 76,
1407 134, 195, 253, 83, 141, 202, 260, 92, 150, 211,
1408 269, 84, 142, 203, 261, 93, 151, 212, 270, 85,
1409 143, 204, 262, 94, 152, 213, 271, 86, 144, 205,
1410 263, 95, 153, 214, 272, 64, 122, 183, 241, 77,
1411 135, 196, 254, 65, 123, 184, 242, 78, 136, 197,
1412 255, 87, 145, 206, 264, 96, 154, 215, 273, 58,
1413 116, 177, 235, 66, 124, 185, 243, 71, 129, 190,
1414 248, 79, 137, 198, 256, 88, 146, 207, 265, 97,
1415 155, 216, 274, 59, 117, 178, 236, 67, 125, 186,
1416 244, 72, 130, 191, 249, 80, 138, 199, 257, 89,
1417 147, 208, 266, 98, 156, 217, 275, 60, 118, 179,
1418 237, 68, 126, 187, 245, 73, 131, 192, 250, 81,
1419 139, 200, 258, 90, 148, 209, 267, 99, 157, 218,
1420 276, 61, 119, 180, 238, 69, 127, 188, 246, 74,
1421 132, 193, 251, 82, 140, 201, 259, 91, 149, 210,
1422 268, 100, 158, 219, 277
1423};
1424
1425static pj_int16_t AMRWB_ordermap_1585[] =
1426{
1427 0, 4, 6, 109, 175, 244, 310, 7, 5, 3,
1428 47, 48, 49, 50, 51, 182, 183, 184, 185, 186,
1429 110, 176, 245, 311, 115, 181, 250, 316, 112, 178,
1430 247, 313, 113, 179, 248, 314, 116, 251, 114, 180,
1431 249, 315, 111, 177, 246, 312, 52, 2, 1, 117,
1432 252, 187, 19, 21, 12, 17, 18, 20, 16, 25,
1433 13, 10, 14, 24, 23, 22, 26, 8, 15, 53,
1434 188, 31, 118, 253, 9, 33, 11, 119, 254, 54,
1435 189, 28, 27, 120, 255, 34, 35, 29, 46, 32,
1436 30, 55, 190, 37, 36, 39, 38, 40, 121, 256,
1437 41, 42, 43, 44, 45, 56, 122, 191, 257, 63,
1438 129, 198, 264, 76, 142, 211, 277, 89, 155, 224,
1439 290, 102, 168, 237, 303, 57, 123, 192, 258, 70,
1440 136, 205, 271, 83, 149, 218, 284, 96, 162, 231,
1441 297, 62, 128, 197, 263, 75, 141, 210, 276, 88,
1442 154, 223, 289, 101, 167, 236, 302, 58, 124, 193,
1443 259, 71, 137, 206, 272, 84, 150, 219, 285, 97,
1444 163, 232, 298, 59, 125, 194, 260, 64, 130, 199,
1445 265, 67, 133, 202, 268, 72, 138, 207, 273, 77,
1446 143, 212, 278, 80, 146, 215, 281, 85, 151, 220,
1447 286, 90, 156, 225, 291, 93, 159, 228, 294, 98,
1448 164, 233, 299, 103, 169, 238, 304, 106, 172, 241,
1449 307, 60, 126, 195, 261, 65, 131, 200, 266, 68,
1450 134, 203, 269, 73, 139, 208, 274, 78, 144, 213,
1451 279, 81, 147, 216, 282, 86, 152, 221, 287, 91,
1452 157, 226, 292, 94, 160, 229, 295, 99, 165, 234,
1453 300, 104, 170, 239, 305, 107, 173, 242, 308, 61,
1454 127, 196, 262, 66, 132, 201, 267, 69, 135, 204,
1455 270, 74, 140, 209, 275, 79, 145, 214, 280, 82,
1456 148, 217, 283, 87, 153, 222, 288, 92, 158, 227,
1457 293, 95, 161, 230, 296, 100, 166, 235, 301, 105,
1458 171, 240, 306, 108, 174, 243, 309
1459};
1460
1461static pj_int16_t AMRWB_ordermap_1825[] =
1462{
1463 0, 4, 6, 121, 199, 280, 358, 7, 5, 3,
1464 47, 48, 49, 50, 51, 206, 207, 208, 209, 210,
1465 122, 200, 281, 359, 127, 205, 286, 364, 124, 202,
1466 283, 361, 125, 203, 284, 362, 128, 287, 126, 204,
1467 285, 363, 123, 201, 282, 360, 52, 2, 1, 129,
1468 288, 211, 19, 21, 12, 17, 18, 20, 16, 25,
1469 13, 10, 14, 24, 23, 22, 26, 8, 15, 53,
1470 212, 31, 130, 289, 9, 33, 11, 131, 290, 54,
1471 213, 28, 27, 132, 291, 34, 35, 29, 46, 32,
1472 30, 55, 214, 37, 36, 39, 38, 40, 133, 292,
1473 41, 42, 43, 44, 45, 56, 134, 215, 293, 198,
1474 299, 136, 120, 138, 60, 279, 58, 62, 357, 139,
1475 140, 295, 156, 57, 219, 297, 63, 217, 137, 170,
1476 300, 222, 64, 106, 61, 78, 294, 92, 142, 141,
1477 135, 221, 296, 301, 343, 59, 298, 184, 329, 315,
1478 220, 216, 265, 251, 218, 237, 352, 223, 157, 86,
1479 171, 87, 164, 351, 111, 302, 65, 178, 115, 323,
1480 72, 192, 101, 179, 93, 73, 193, 151, 337, 309,
1481 143, 274, 69, 324, 165, 150, 97, 338, 110, 310,
1482 330, 273, 68, 107, 175, 245, 114, 79, 113, 189,
1483 246, 259, 174, 71, 185, 96, 344, 100, 322, 83,
1484 334, 316, 333, 252, 161, 348, 147, 82, 269, 232,
1485 260, 308, 353, 347, 163, 231, 306, 320, 188, 270,
1486 146, 177, 266, 350, 256, 85, 149, 116, 191, 160,
1487 238, 258, 336, 305, 255, 88, 224, 99, 339, 230,
1488 228, 227, 272, 242, 241, 319, 233, 311, 102, 74,
1489 180, 275, 66, 194, 152, 325, 172, 247, 244, 261,
1490 117, 158, 166, 354, 75, 144, 108, 312, 94, 186,
1491 303, 80, 234, 89, 195, 112, 340, 181, 345, 317,
1492 326, 276, 239, 167, 118, 313, 70, 355, 327, 253,
1493 190, 176, 271, 104, 98, 153, 103, 90, 76, 267,
1494 277, 248, 225, 262, 182, 84, 154, 235, 335, 168,
1495 331, 196, 341, 249, 162, 307, 148, 349, 263, 321,
1496 257, 243, 229, 356, 159, 119, 67, 187, 173, 145,
1497 240, 77, 304, 332, 314, 342, 109, 254, 81, 278,
1498 105, 91, 346, 318, 183, 250, 197, 328, 95, 155,
1499 169, 268, 226, 236, 264
1500};
1501
1502static pj_int16_t AMRWB_ordermap_1985[] =
1503{
1504 0, 4, 6, 129, 215, 304, 390, 7, 5, 3,
1505 47, 48, 49, 50, 51, 222, 223, 224, 225, 226,
1506 130, 216, 305, 391, 135, 221, 310, 396, 132, 218,
1507 307, 393, 133, 219, 308, 394, 136, 311, 134, 220,
1508 309, 395, 131, 217, 306, 392, 52, 2, 1, 137,
1509 312, 227, 19, 21, 12, 17, 18, 20, 16, 25,
1510 13, 10, 14, 24, 23, 22, 26, 8, 15, 53,
1511 228, 31, 138, 313, 9, 33, 11, 139, 314, 54,
1512 229, 28, 27, 140, 315, 34, 35, 29, 46, 32,
1513 30, 55, 230, 37, 36, 39, 38, 40, 141, 316,
1514 41, 42, 43, 44, 45, 56, 142, 231, 317, 63,
1515 73, 92, 340, 82, 324, 149, 353, 159, 334, 165,
1516 338, 178, 163, 254, 77, 168, 257, 153, 343, 57,
1517 248, 238, 79, 252, 166, 67, 80, 201, 101, 267,
1518 143, 164, 341, 255, 339, 187, 376, 318, 78, 328,
1519 362, 115, 232, 242, 253, 290, 276, 62, 58, 158,
1520 68, 93, 179, 319, 148, 169, 154, 72, 385, 329,
1521 333, 344, 102, 83, 144, 233, 323, 124, 243, 192,
1522 354, 237, 64, 247, 202, 209, 150, 116, 335, 268,
1523 239, 299, 188, 196, 298, 94, 195, 258, 123, 363,
1524 384, 109, 325, 371, 170, 370, 84, 110, 295, 180,
1525 74, 210, 191, 106, 291, 205, 367, 381, 377, 206,
1526 355, 122, 119, 120, 383, 160, 105, 108, 277, 380,
1527 294, 284, 285, 345, 208, 269, 249, 366, 386, 300,
1528 297, 259, 125, 369, 197, 97, 194, 286, 211, 281,
1529 280, 183, 372, 87, 155, 283, 59, 348, 327, 184,
1530 76, 111, 330, 203, 349, 69, 98, 152, 145, 189,
1531 66, 320, 337, 173, 358, 251, 198, 174, 263, 262,
1532 126, 241, 193, 88, 388, 117, 95, 387, 112, 359,
1533 287, 244, 103, 272, 301, 171, 162, 234, 273, 127,
1534 373, 181, 292, 85, 378, 302, 121, 107, 364, 346,
1535 356, 212, 278, 213, 65, 382, 288, 207, 113, 175,
1536 99, 296, 374, 368, 199, 260, 185, 336, 331, 161,
1537 270, 264, 250, 240, 75, 350, 151, 60, 89, 321,
1538 156, 274, 360, 326, 70, 282, 167, 146, 352, 81,
1539 91, 389, 266, 245, 177, 235, 190, 256, 204, 342,
1540 128, 118, 303, 104, 379, 182, 114, 375, 200, 96,
1541 293, 172, 214, 365, 279, 86, 289, 351, 347, 357,
1542 261, 186, 176, 271, 90, 100, 147, 322, 275, 361,
1543 71, 332, 61, 265, 157, 246, 236
1544};
1545
1546static pj_int16_t AMRWB_ordermap_2305[] =
1547{
1548 0, 4, 6, 145, 247, 352, 454, 7, 5, 3,
1549 47, 48, 49, 50, 51, 254, 255, 256, 257, 258,
1550 146, 248, 353, 455, 151, 253, 358, 460, 148, 250,
1551 355, 457, 149, 251, 356, 458, 152, 359, 150, 252,
1552 357, 459, 147, 249, 354, 456, 52, 2, 1, 153,
1553 360, 259, 19, 21, 12, 17, 18, 20, 16, 25,
1554 13, 10, 14, 24, 23, 22, 26, 8, 15, 53,
1555 260, 31, 154, 361, 9, 33, 11, 155, 362, 54,
1556 261, 28, 27, 156, 363, 34, 35, 29, 46, 32,
1557 30, 55, 262, 37, 36, 39, 38, 40, 157, 364,
1558 41, 42, 43, 44, 45, 56, 158, 263, 365, 181,
1559 192, 170, 79, 57, 399, 90, 159, 297, 377, 366,
1560 275, 68, 183, 388, 286, 194, 299, 92, 70, 182,
1561 401, 172, 59, 91, 58, 400, 368, 161, 81, 160,
1562 264, 171, 80, 389, 390, 378, 379, 193, 298, 69,
1563 266, 265, 367, 277, 288, 276, 287, 184, 60, 195,
1564 82, 93, 71, 369, 402, 173, 162, 444, 300, 391,
1565 98, 76, 278, 61, 267, 374, 135, 411, 167, 102,
1566 380, 200, 87, 178, 65, 94, 204, 124, 72, 342,
1567 189, 305, 381, 396, 433, 301, 226, 407, 289, 237,
1568 113, 215, 185, 128, 309, 403, 116, 320, 196, 331,
1569 370, 422, 174, 64, 392, 83, 425, 219, 134, 188,
1570 432, 112, 427, 139, 279, 163, 436, 208, 447, 218,
1571 236, 229, 97, 294, 385, 230, 166, 268, 177, 443,
1572 225, 426, 101, 272, 138, 127, 290, 117, 347, 199,
1573 414, 95, 140, 240, 410, 395, 209, 129, 283, 346,
1574 105, 241, 437, 86, 308, 448, 203, 345, 186, 107,
1575 220, 415, 334, 319, 106, 313, 118, 123, 73, 207,
1576 421, 214, 384, 373, 438, 62, 371, 341, 75, 449,
1577 168, 323, 164, 242, 416, 324, 304, 197, 335, 404,
1578 271, 63, 191, 325, 96, 169, 231, 280, 312, 187,
1579 406, 84, 201, 100, 67, 382, 175, 336, 202, 330,
1580 269, 393, 376, 383, 293, 307, 409, 179, 285, 314,
1581 302, 372, 398, 190, 180, 89, 99, 103, 232, 78,
1582 88, 77, 136, 387, 165, 198, 394, 125, 176, 428,
1583 74, 375, 238, 227, 66, 273, 282, 141, 306, 412,
1584 114, 85, 130, 348, 119, 291, 296, 386, 233, 397,
1585 303, 405, 284, 445, 423, 221, 210, 205, 450, 108,
1586 274, 434, 216, 343, 337, 142, 243, 321, 408, 451,
1587 310, 292, 120, 109, 281, 439, 270, 429, 332, 295,
1588 418, 211, 315, 222, 326, 131, 430, 244, 327, 349,
1589 417, 316, 143, 338, 440, 234, 110, 212, 452, 245,
1590 121, 419, 350, 223, 132, 441, 328, 413, 317, 339,
1591 126, 104, 137, 446, 344, 239, 435, 115, 333, 206,
1592 322, 217, 228, 424, 453, 311, 351, 111, 442, 224,
1593 213, 122, 431, 340, 235, 246, 133, 144, 420, 329,
1594 318
1595};
1596
1597static pj_int16_t AMRWB_ordermap_2385[] =
1598{
1599 0, 4, 6, 145, 251, 360, 466, 7, 5, 3,
1600 47, 48, 49, 50, 51, 262, 263, 264, 265, 266,
1601 146, 252, 361, 467, 151, 257, 366, 472, 148, 254,
1602 363, 469, 149, 255, 364, 470, 156, 371, 150, 256,
1603 365, 471, 147, 253, 362, 468, 52, 2, 1, 157,
1604 372, 267, 19, 21, 12, 17, 18, 20, 16, 25,
1605 13, 10, 14, 24, 23, 22, 26, 8, 15, 53,
1606 268, 31, 152, 153, 154, 155, 258, 259, 260, 261,
1607 367, 368, 369, 370, 473, 474, 475, 476, 158, 373,
1608 9, 33, 11, 159, 374, 54, 269, 28, 27, 160,
1609 375, 34, 35, 29, 46, 32, 30, 55, 270, 37,
1610 36, 39, 38, 40, 161, 376, 41, 42, 43, 44,
1611 45, 56, 162, 271, 377, 185, 196, 174, 79, 57,
1612 411, 90, 163, 305, 389, 378, 283, 68, 187, 400,
1613 294, 198, 307, 92, 70, 186, 413, 176, 59, 91,
1614 58, 412, 380, 165, 81, 164, 272, 175, 80, 401,
1615 402, 390, 391, 197, 306, 69, 274, 273, 379, 285,
1616 296, 284, 295, 188, 60, 199, 82, 93, 71, 381,
1617 414, 177, 166, 456, 308, 403, 98, 76, 286, 61,
1618 275, 386, 135, 423, 171, 102, 392, 204, 87, 182,
1619 65, 94, 208, 124, 72, 350, 193, 313, 393, 408,
1620 445, 309, 230, 419, 297, 241, 113, 219, 189, 128,
1621 317, 415, 116, 328, 200, 339, 382, 434, 178, 64,
1622 404, 83, 437, 223, 134, 192, 444, 112, 439, 139,
1623 287, 167, 448, 212, 459, 222, 240, 233, 97, 302,
1624 397, 234, 170, 276, 181, 455, 229, 438, 101, 280,
1625 138, 127, 298, 117, 355, 203, 426, 95, 140, 244,
1626 422, 407, 213, 129, 291, 354, 105, 245, 449, 86,
1627 316, 460, 207, 353, 190, 107, 224, 427, 342, 327,
1628 106, 321, 118, 123, 73, 211, 433, 218, 396, 385,
1629 450, 62, 383, 349, 75, 461, 172, 331, 168, 246,
1630 428, 332, 312, 201, 343, 416, 279, 63, 195, 333,
1631 96, 173, 235, 288, 320, 191, 418, 84, 205, 100,
1632 67, 394, 179, 344, 206, 338, 277, 405, 388, 395,
1633 301, 315, 421, 183, 293, 322, 310, 384, 410, 194,
1634 184, 89, 99, 103, 236, 78, 88, 77, 136, 399,
1635 169, 202, 406, 125, 180, 440, 74, 387, 242, 231,
1636 66, 281, 290, 141, 314, 424, 114, 85, 130, 356,
1637 119, 299, 304, 398, 237, 409, 311, 417, 292, 457,
1638 435, 225, 214, 209, 462, 108, 282, 446, 220, 351,
1639 345, 142, 247, 329, 420, 463, 318, 300, 120, 109,
1640 289, 451, 278, 441, 340, 303, 430, 215, 323, 226,
1641 334, 131, 442, 248, 335, 357, 429, 324, 143, 346,
1642 452, 238, 110, 216, 464, 249, 121, 431, 358, 227,
1643 132, 453, 336, 425, 325, 347, 126, 104, 137, 458,
1644 352, 243, 447, 115, 341, 210, 330, 221, 232, 436,
1645 465, 319, 359, 111, 454, 228, 217, 122, 443, 348,
1646 239, 250, 133, 144, 432, 337, 326
1647};
1648
1649static pj_int16_t *AMRWB_ordermaps[9] =
1650{
1651 AMRWB_ordermap_660,
1652 AMRWB_ordermap_885,
1653 AMRWB_ordermap_1265,
1654 AMRWB_ordermap_1425,
1655 AMRWB_ordermap_1585,
1656 AMRWB_ordermap_1825,
1657 AMRWB_ordermap_1985,
1658 AMRWB_ordermap_2305,
1659 AMRWB_ordermap_2385
1660};
1661
1662static pj_uint8_t AMRNB_framelen[] =
1663 {12, 13, 15, 17, 19, 20, 26, 31, 5};
1664static pj_uint8_t AMRNB_framelenbits[] =
1665 {95, 103, 118, 134, 148, 159, 204, 244, 39};
1666static pj_uint32_t AMRNB_bitrates[] =
1667 {4750, 5150, 5900, 6700, 7400, 7950, 10200, 12200};
1668
1669
1670/* Get mode based on bitrate */
1671static int amr_get_mode(unsigned bitrate)
1672{
1673 int mode = -1;
1674
1675 if(bitrate==4750){
1676 mode = 0;
1677 } else if(bitrate==5150){
1678 mode = 1;
1679 } else if(bitrate==5900){
1680 mode = 2;
1681 } else if(bitrate==6700){
1682 mode = 3;
1683 } else if(bitrate==7400){
1684 mode = 4;
1685 } else if(bitrate==7950){
1686 mode = 5;
1687 } else if(bitrate==10200){
1688 mode = 6;
1689 } else if(bitrate==12200){
1690 mode = 7;
1691
1692 /* AMRWB */
1693 } else if(bitrate==6600){
1694 mode = 0;
1695 } else if(bitrate==8850){
1696 mode = 1;
1697 } else if(bitrate==12650){
1698 mode = 2;
1699 } else if(bitrate==14250){
1700 mode = 3;
1701 } else if(bitrate==15850){
1702 mode = 4;
1703 } else if(bitrate==18250){
1704 mode = 5;
1705 } else if(bitrate==19850){
1706 mode = 6;
1707 } else if(bitrate==23050){
1708 mode = 7;
1709 } else if(bitrate==23850){
1710 mode = 8;
1711 }
1712 return mode;
1713}
1714
1715
1716static pj_status_t pack_amr(ipp_private_t *codec_data, void *pkt,
1717 pj_size_t *pkt_size, pj_size_t max_pkt_size)
1718{
1719 /* Settings */
1720 pj_uint8_t CMR = 15; /* We don't request any code mode */
1721 pj_uint8_t octet_aligned = 0; /* default==0 when SDP not specifying */
1722
1723 /* Write cursor */
1724 pj_uint8_t *w = (pj_uint8_t*)pkt;
1725 pj_uint8_t w_bitptr = 0;
1726
1727 /* Read cursor */
1728 pj_uint8_t *r;
1729
1730 PJ_UNUSED_ARG(codec_data);
1731
1732 PJ_TODO(Make_sure_buffer_is_enough_for_packing_AMR_packet);
1733
1734 r = (pj_uint8_t*)pkt + max_pkt_size - *pkt_size;
1735
1736 /* Align pkt buf right */
1737 pj_memmove(r, w, *pkt_size);
1738
1739 /* Code Mode Request, 4 bits */
1740 *w = (CMR << 4);
1741 w_bitptr = 4;
1742 if (octet_aligned) {
1743 ++w;
1744 w_bitptr = 0;
1745 }
1746
1747 /* Table Of Contents, 6 bits each */
1748 for (;;) {
1749 pj_uint8_t TOC;
1750 pj_uint8_t F, FT, Q;
1751
1752 F = (*r & 0x40) == 0;
1753 FT = (*r & 0x0F);
1754 Q = (*r & 0x80) == 0;
1755
1756 pj_assert((FT >=0 && FT <= 8) || FT == 14 || FT == 15);
1757 TOC = (pj_uint8_t)((F<<5) | (FT<<1) | Q);
1758
1759 if (w_bitptr == 0) {
1760 *w = TOC<<2;
1761 w_bitptr = 6;
1762 } else if (w_bitptr == 2) {
1763 *w++ |= TOC;
1764 w_bitptr = 0;
1765 } else if (w_bitptr == 4) {
1766 *w++ |= TOC>>2;
1767 *w = TOC<<6;
1768 w_bitptr = 2;
1769 } else if (w_bitptr == 6) {
1770 *w++ |= TOC>>4;
1771 *w = TOC<<4;
1772 w_bitptr = 4;
1773 }
1774
1775 if (octet_aligned) {
1776 ++w;
1777 w_bitptr = 0;
1778 }
1779
1780 if (FT == 14 || FT == 15)
1781 r += 1;
1782 else
1783 r += AMRNB_framelen[FT] + 1;
1784
1785 /* Last frame */
1786 if (!F)
1787 break;
1788 }
1789
1790 /* Speech frames */
1791 r = (pj_uint8_t*)pkt + max_pkt_size - *pkt_size;
1792
1793 for (;;) {
1794 pj_uint8_t F, FT;
1795 pj_int8_t amr_bits[477 + 7] = {0};
1796 pj_int8_t *p_amr_bits = &amr_bits[0];
1797 unsigned i;
1798
1799 F = (*r & 0x40) == 0;
1800 FT = (*r & 0x0F);
1801 pj_assert((FT >=0 && FT <= 8) || FT == 14 || FT == 15);
1802
1803 ++r;
1804 if (FT == 14 || FT == 15) {
1805 if (!F)
1806 break;
1807 continue;
1808 }
1809
1810 /* Unpack bits */
1811 for(i = 0; i < AMRNB_framelen[FT]; ++i) {
1812 *p_amr_bits++ = (*r >> 7) & 1;
1813 *p_amr_bits++ = (*r >> 6) & 1;
1814 *p_amr_bits++ = (*r >> 5) & 1;
1815 *p_amr_bits++ = (*r >> 4) & 1;
1816 *p_amr_bits++ = (*r >> 3) & 1;
1817 *p_amr_bits++ = (*r >> 2) & 1;
1818 *p_amr_bits++ = (*r >> 1) & 1;
1819 *p_amr_bits++ = (*r ) & 1;
1820 ++r;
1821 }
1822
1823 if (FT == 8) {
1824 /* SID */
1825 pj_uint8_t STI = 0;
1826
1827 amr_bits[35] = (STI & 1);
1828 amr_bits[36] = (FT >> 2) & 1;
1829 amr_bits[37] = (FT >> 1) & 1;
1830 amr_bits[38] = (FT) & 1;
1831
1832 if (w_bitptr == 0) *w = 0;
1833 for(i = 0; i < AMRNB_framelenbits[FT]; ++i) {
1834 if (amr_bits[i])
1835 *w |= (1 << (7-w_bitptr));
1836
1837 if (++w_bitptr == 8) {
1838 w_bitptr = 0;
1839 ++w;
1840 *w = 0;
1841 }
1842 }
1843
1844 if (octet_aligned) {
1845 ++w;
1846 w_bitptr = 0;
1847 }
1848 } else {
1849 /* Speech */
1850 pj_int16_t *order_map;
1851
1852 /* Put bits in the packet, sensitivity descending ordered */
1853 order_map = AMRNB_ordermaps[FT];
1854 if (w_bitptr == 0) *w = 0;
1855 for(i = 0; i < AMRNB_framelenbits[FT]; ++i) {
1856 pj_uint8_t bit;
1857 bit = amr_bits[order_map[i]];
1858
1859 if (bit)
1860 *w |= (1 << (7-w_bitptr));
1861
1862 if (++w_bitptr == 8) {
1863 w_bitptr = 0;
1864 ++w;
1865 *w = 0;
1866 }
1867 }
1868
1869 if (octet_aligned) {
1870 ++w;
1871 w_bitptr = 0;
1872 }
1873 }
1874
1875 if (!F)
1876 break;
1877 }
1878
1879 *pkt_size = w - (pj_uint8_t*)pkt;
1880 if (w_bitptr)
1881 *pkt_size += 1;
1882
1883 pj_assert(*pkt_size <= max_pkt_size);
1884
1885 return PJ_SUCCESS;
1886}
1887
1888
1889/* Parse AMR payload into frames. Frame.bit_info will contain start_bit and
1890 * AMR frame type, it is mapped as below (bit 0:MSB - bit 31:LSB)
1891 * - bit 0-16: unused
1892 * - bit 17-24: start_bit
1893 * - bit 25-32: frame_type
1894 */
1895static pj_status_t parse_amr(ipp_private_t *codec_data, void *pkt,
1896 pj_size_t pkt_size, const pj_timestamp *ts,
1897 unsigned *frame_cnt, pjmedia_frame frames[])
1898{
1899 unsigned cnt = 0;
1900 pj_timestamp ts_ = *ts;
1901
1902 /* Settings */
1903 pj_uint8_t CMR = 15; /* See if remote request code mode */
1904 pj_uint8_t octet_aligned = 0; /* default==0 when SDP not specifying */
1905
1906 /* Read cursor */
1907 pj_uint8_t r_bitptr = 0;
1908 pj_uint8_t *r = (pj_uint8_t*)pkt;
1909
1910 PJ_UNUSED_ARG(pkt_size);
1911
1912 *frame_cnt = 0;
1913
1914 /* Code Mode Request, 4 bits */
1915 CMR = (*r >> 4) & 0x0F;
1916 r_bitptr = 4;
1917 if (octet_aligned) {
1918 ++r;
1919 r_bitptr = 0;
1920 }
1921
1922 /* Table Of Contents, 6 bits each */
1923 for (;;) {
1924 pj_uint8_t TOC = 0;
1925 pj_uint8_t F, FT, Q;
1926
1927 if (r_bitptr == 0) {
1928 TOC = *r >> 2;
1929 r_bitptr = 6;
1930 } else if (r_bitptr == 2) {
1931 TOC = *r++ & 0x3F;
1932 r_bitptr = 0;
1933 } else if (r_bitptr == 4) {
1934 TOC = (*r++ & 0x0f) << 2;
1935 TOC |= *r >> 6;
1936 r_bitptr = 2;
1937 } else if (r_bitptr == 6) {
1938 TOC = (*r++ & 0x03) << 4;
1939 TOC |= *r >> 4;
1940 r_bitptr = 4;
1941 }
1942
1943 F = TOC >> 5;
1944 FT = (TOC >> 1) & 0x0F;
1945 Q = TOC & 1;
1946
1947 if (!((FT >=0 && FT <= 8) || FT == 14 || FT == 15))
1948 break;
1949
1950 if (octet_aligned) {
1951 ++r;
1952 r_bitptr = 0;
1953 }
1954
1955 /* Set frame attributes */
1956 if (FT != 14 && FT != 15) {
1957 frames[cnt].bit_info = FT;
1958 frames[cnt].timestamp = ts_;
1959 frames[cnt].type = PJMEDIA_FRAME_TYPE_AUDIO;
1960
1961 ++cnt;
1962 }
1963 ts_.u64 += ipp_codec[codec_data->codec_idx].samples_per_frame;
1964
1965 if (!F || cnt == *frame_cnt)
1966 break;
1967 }
1968 *frame_cnt = cnt;
1969
1970 cnt = 0;
1971
1972 /* Speech frames */
1973 while (cnt < *frame_cnt) {
1974 unsigned FT;
1975
1976 FT = frames[cnt].bit_info;
1977
1978 frames[cnt].bit_info |= (r_bitptr << 8);
1979 frames[cnt].buf = r;
1980
1981 if (octet_aligned) {
1982 r += AMRNB_framelen[FT];
1983 frames[cnt].size = AMRNB_framelen[FT];
1984 } else {
1985 unsigned adv_bit;
1986
1987 adv_bit = AMRNB_framelenbits[FT] + r_bitptr;
1988 r += adv_bit >> 3;
1989 r_bitptr = (pj_uint8_t)(adv_bit % 8);
1990
1991 frames[cnt].size = adv_bit >> 3;
1992 if (r_bitptr)
1993 ++frames[cnt].size;
1994 }
1995 ++cnt;
1996 }
1997
1998 return PJ_SUCCESS;
1999}
2000
2001/* Rearrange bits in the frame so its start_bit is 0 and also
2002 * unorder bitstream (off the sensitivity order) if the frame
2003 * contains speech (not SID frame).
2004 */
2005static void amr_predecode(pj_bool_t AMRWB, pjmedia_frame *f,
2006 int *frametype, int *bitrate)
2007{
2008 pj_uint8_t FT;
2009 pj_int8_t amr_bits[477 + 7] = {0};
2010 pj_int8_t *p_amr_bits = &amr_bits[0];
2011 unsigned i;
2012 /* read cursor */
2013 pj_uint8_t *r = (pj_uint8_t*)f->buf;
2014 pj_uint8_t start_bit;
2015 /* write cursor */
2016 pj_uint8_t *w = (pj_uint8_t*)f->buf;
2017
2018 PJ_UNUSED_ARG(AMRWB);
2019
2020 start_bit = (pj_uint8_t)((f->bit_info & 0xFF00) >> 8);
2021 FT = (pj_uint8_t)(f->bit_info & 0xFF);
2022
2023 /* unpack AMR bitstream */
2024 i = 0;
2025 if (start_bit) {
2026 for (; i < (unsigned)(8-start_bit); ++i)
2027 *p_amr_bits++ = (pj_uint8_t)(*r >> (7-start_bit-i)) & 1;
2028 ++r;
2029 }
2030 for(; i < AMRNB_framelenbits[FT]; i += 8) {
2031 *p_amr_bits++ = (*r >> 7) & 1;
2032 *p_amr_bits++ = (*r >> 6) & 1;
2033 *p_amr_bits++ = (*r >> 5) & 1;
2034 *p_amr_bits++ = (*r >> 4) & 1;
2035 *p_amr_bits++ = (*r >> 3) & 1;
2036 *p_amr_bits++ = (*r >> 2) & 1;
2037 *p_amr_bits++ = (*r >> 1) & 1;
2038 *p_amr_bits++ = (*r ) & 1;
2039 ++r;
2040 }
2041
2042 if (FT >= 0 && FT <= 7) {
2043 /* Speech */
2044 pj_int16_t *order_map;
2045
2046 order_map = AMRNB_ordermaps[FT];
2047 pj_bzero(f->buf, f->size);
2048 for(i = 0; i < AMRNB_framelenbits[FT]; ++i) {
2049 if (amr_bits[i]) {
2050 pj_uint16_t bitpos;
2051 bitpos = order_map[i];
2052 w[bitpos>>3] |= 1 << (7 - (bitpos % 8));
2053 }
2054 }
2055 f->size = AMRNB_framelen[FT];
2056 *frametype = 0;
2057 *bitrate = AMRNB_bitrates[FT];
2058 } else {
2059 /* SID */
2060 pj_uint8_t w_bitptr = 0;
2061 pj_uint8_t STI;
2062 pj_uint8_t mode;
2063
2064 STI = amr_bits[35];
2065 mode = (amr_bits[36] << 2) | (amr_bits[37] << 1) | amr_bits[38];
2066
2067 pj_bzero(f->buf, f->size);
2068 for(i = 0; i < AMRNB_framelenbits[FT]; ++i) {
2069 if (amr_bits[i])
2070 *w |= (1 << (7-w_bitptr));
2071
2072 if (++w_bitptr == 8) {
2073 ++w;
2074 w_bitptr = 0;
2075 }
2076 }
2077
2078 f->size = 5;
2079 *frametype = STI? 2 : 1;
2080 *bitrate = AMRNB_bitrates[mode];
2081 }
2082}
2083
2084#endif /* PJMEDIA_HAS_INTEL_IPP_CODEC_AMR */
2085
2086
2087#ifdef _MSC_VER
2088# pragma comment( lib, "ippcore.lib")
2089# pragma comment( lib, "ipps.lib")
2090# pragma comment( lib, "ippsc.lib")
2091# pragma comment( lib, "ippsr.lib")
2092# pragma comment( lib, "usc.lib")
2093#endif
2094
2095
2096#endif /* PJMEDIA_HAS_INTEL_IPP_CODECS */
2097