2
* ===================================================================
6
* 3GPP AMR Floating-point Speech Codec
7
* ===================================================================
16
* AMR Floating-Point Codec
19
* This module provides means to conversion from 3GPP or ETSI
20
* bitstream to AMR parameters
31
#include "interf_rom.h"
35
* definition of constants
37
#define EHF_MASK 0x0008 /* encoder homing frame pattern */
42
int reset_flag_old; /* previous was homing frame */
45
enum RXFrameType prev_ft; /* previous frame type */
46
enum Mode prev_mode; /* previous mode */
47
void *decoder_State; /* Points decoder state */
60
* no_of_bits I: number of bits associated with value
61
* bits O: address where bits are written
64
* Read nuber of bits from the array and convert to integer.
69
static Word16 Bin2Int( Word16 no_of_bits, Word16 *bitstream )
76
for ( i = 0; i < no_of_bits; i++ ) {
83
return( Word16 )( value );
94
* param O: AMR parameters
97
* Retrieves the vector of encoder parameters from
98
* the received serial bits in a frame.
103
static void Bits2Prm( enum Mode mode, Word16 bits[], Word16 prm[] )
110
for ( i = 0; i < PRMNO_MR122; i++ ) {
111
prm[i] = Bin2Int( bitno_MR122[i], bits );
112
bits += bitno_MR122[i];
117
for ( i = 0; i < PRMNO_MR102; i++ ) {
118
prm[i] = Bin2Int( bitno_MR102[i], bits );
119
bits += bitno_MR102[i];
124
for ( i = 0; i < PRMNO_MR795; i++ ) {
125
prm[i] = Bin2Int( bitno_MR795[i], bits );
126
bits += bitno_MR795[i];
131
for ( i = 0; i < PRMNO_MR74; i++ ) {
132
prm[i] = Bin2Int( bitno_MR74[i], bits );
133
bits += bitno_MR74[i];
138
for ( i = 0; i < PRMNO_MR67; i++ ) {
139
prm[i] = Bin2Int( bitno_MR67[i], bits );
140
bits += bitno_MR67[i];
145
for ( i = 0; i < PRMNO_MR59; i++ ) {
146
prm[i] = Bin2Int( bitno_MR59[i], bits );
147
bits += bitno_MR59[i];
152
for ( i = 0; i < PRMNO_MR515; i++ ) {
153
prm[i] = Bin2Int( bitno_MR515[i], bits );
154
bits += bitno_MR515[i];
159
for ( i = 0; i < PRMNO_MR475; i++ ) {
160
prm[i] = Bin2Int( bitno_MR475[i], bits );
161
bits += bitno_MR475[i];
166
for ( i = 0; i < PRMNO_MRDTX; i++ ) {
167
prm[i] = Bin2Int( bitno_MRDTX[i], bits );
168
bits += bitno_MRDTX[i];
184
* param O: AMR parameters
185
* stream I: input bitstream
186
* frame_type O: frame type
187
* speech_mode O: speech mode in DTX
190
* AMR file storage format frame to decoder parameters
195
enum Mode DecoderMMS( Word16 *param, UWord8 *stream, enum RXFrameType
196
*frame_type, enum Mode *speech_mode, Word16 *q_bit )
203
memset( param, 0, PRMNO_MR122 <<1 );
204
*q_bit = 0x01 & (*stream >> 2);
205
mode = 0x0F & (*stream >> 3);
208
if ( mode == MRDTX ) {
211
for ( j = 1; j < 36; j++ ) {
212
if ( *stream & 0x80 )
213
param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
222
/* get SID type bit */
224
*frame_type = RX_SID_FIRST;
226
*frame_type = RX_SID_UPDATE;
228
/* since there is update, use it */
229
/* *frame_type = RX_SID_UPDATE; */
231
/* speech mode indicator */
232
*speech_mode = (*stream >> 4) && 0x07;
235
else if ( mode == 15 ) {
236
*frame_type = RX_NO_DATA;
238
else if ( mode == MR475 ) {
241
for ( j = 1; j < 96; j++ ) {
242
if ( *stream & 0x80 )
243
param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
251
*frame_type = RX_SPEECH_GOOD;
253
else if ( mode == MR515 ) {
256
for ( j = 1; j < 104; j++ ) {
257
if ( *stream & 0x80 )
258
param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
266
*frame_type = RX_SPEECH_GOOD;
268
else if ( mode == MR59 ) {
271
for ( j = 1; j < 119; j++ ) {
272
if ( *stream & 0x80 )
273
param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
281
*frame_type = RX_SPEECH_GOOD;
283
else if ( mode == MR67 ) {
286
for ( j = 1; j < 135; j++ ) {
287
if ( *stream & 0x80 )
288
param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
296
*frame_type = RX_SPEECH_GOOD;
298
else if ( mode == MR74 ) {
301
for ( j = 1; j < 149; j++ ) {
302
if ( *stream & 0x80 )
303
param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
311
*frame_type = RX_SPEECH_GOOD;
313
else if ( mode == MR795 ) {
316
for ( j = 1; j < 160; j++ ) {
317
if ( *stream & 0x80 )
318
param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
326
*frame_type = RX_SPEECH_GOOD;
328
else if ( mode == MR102 ) {
331
for ( j = 1; j < 205; j++ ) {
332
if ( *stream & 0x80 )
333
param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
341
*frame_type = RX_SPEECH_GOOD;
343
else if ( mode == MR122 ) {
346
for ( j = 1; j < 245; j++ ) {
347
if ( *stream & 0x80 )
348
param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
356
*frame_type = RX_SPEECH_GOOD;
359
*frame_type = RX_SPEECH_BAD;
370
* param O: AMR parameters
371
* stream I: input bitstream
372
* frame_type O: frame type
373
* speech_mode O: speech mode in DTX
376
* Resets state memory
381
enum Mode Decoder3GPP( Word16 *param, UWord8 *stream, enum RXFrameType
382
*frame_type, enum Mode *speech_mode )
389
memset( param, 0, PRMNO_MR122 <<1 );
390
mode = 0xF & *stream;
393
if ( mode == MRDTX ) {
396
for ( j = 5; j < 40; j++ ) {
398
param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
407
/* get SID type bit */
409
*frame_type = RX_SID_FIRST;
411
*frame_type = RX_SID_UPDATE;
413
/* since there is update, use it */
414
/* *frame_type = RX_SID_UPDATE; */
417
/* speech mode indicator */
418
*speech_mode = *stream;
420
else if ( mode == 15 ) {
421
*frame_type = RX_NO_DATA;
423
else if ( mode == MR475 ) {
426
for ( j = 5; j < 100; j++ ) {
428
param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
436
*frame_type = RX_SPEECH_GOOD;
438
else if ( mode == MR515 ) {
441
for ( j = 5; j < 108; j++ ) {
443
param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
451
*frame_type = RX_SPEECH_GOOD;
453
else if ( mode == MR59 ) {
456
for ( j = 5; j < 123; j++ ) {
458
param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
466
*frame_type = RX_SPEECH_GOOD;
468
else if ( mode == MR67 ) {
471
for ( j = 5; j < 139; j++ ) {
473
param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
481
*frame_type = RX_SPEECH_GOOD;
483
else if ( mode == MR74 ) {
486
for ( j = 5; j < 153; j++ ) {
488
param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
496
*frame_type = RX_SPEECH_GOOD;
498
else if ( mode == MR795 ) {
501
for ( j = 5; j < 164; j++ ) {
503
param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
511
*frame_type = RX_SPEECH_GOOD;
513
else if ( mode == MR102 ) {
516
for ( j = 5; j < 209; j++ ) {
518
param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
526
*frame_type = RX_SPEECH_GOOD;
528
else if ( mode == MR122 ) {
531
for ( j = 5; j < 249; j++ ) {
533
param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
541
*frame_type = RX_SPEECH_GOOD;
544
*frame_type = RX_SPEECH_BAD;
551
* Decoder_Interface_reset
558
* Reset homing frame counter
563
void Decoder_Interface_reset( dec_interface_State *st )
565
st->reset_flag_old = 1;
566
st->prev_ft = RX_SPEECH_GOOD;
567
st->prev_mode = MR475; /* minimum bitrate */
572
* Decoder_Interface_init
579
* Allocates state memory and initializes state memory
582
* success : pointer to structure
585
void * Decoder_Interface_init( void )
587
dec_interface_State * s;
589
/* allocate memory */
590
if ( ( s = ( dec_interface_State * ) malloc( sizeof( dec_interface_State ) ) ) ==
592
fprintf( stderr, "Decoder_Interface_init: "
593
"can not malloc state structure\n" );
596
s->decoder_State = Speech_Decode_Frame_init( );
598
if ( s->decoder_State == NULL ) {
602
Decoder_Interface_reset( s );
608
* Decoder_Interface_exit
612
* state I: state structure
615
* The memory used for state memory is freed
620
void Decoder_Interface_exit( void *state )
622
dec_interface_State * s;
623
s = ( dec_interface_State * )state;
626
Speech_Decode_Frame_exit(s->decoder_State );
634
* Decoder_Interface_Decode
638
* st B: state structure
640
* synth O: synthesized speech
641
* bfi I: bad frame indicator
644
* Decode bit stream to synthesized speech
649
void Decoder_Interface_Decode( void *st,
658
Word16 *synth, int bfi)
660
enum Mode mode; /* AMR mode */
663
enum Mode speech_mode = MR475; /* speech mode */
666
Word16 prm[PRMNO_MR122]; /* AMR parameters */
668
enum RXFrameType frame_type; /* frame type */
669
dec_interface_State * s; /* pointer to structure */
671
const Word16 *homing; /* pointer to homing frame */
672
Word16 homingSize; /* frame size for homing frame */
673
Word32 i; /* counter */
674
Word32 resetFlag = 1; /* homing frame */
682
s = ( dec_interface_State * )st;
687
* extract mode information and frametype,
688
* octets to parameters
691
mode = Decoder3GPP( prm, bits, &frame_type, &speech_mode );
693
mode = DecoderMMS( prm, bits, &frame_type, &speech_mode, &q_bit );
694
if (!bfi) bfi = 1 - q_bit;
698
if ( mode <= MR122 ) {
699
frame_type = RX_SPEECH_BAD;
701
else if ( frame_type != RX_NO_DATA ) {
702
frame_type = RX_SID_BAD;
706
if ( frame_type == RX_SID_FIRST || frame_type == RX_SID_UPDATE) {
709
else if ( frame_type == RX_NO_DATA ) {
713
* if no mode information
714
* guess one from the previous frame
716
if ( frame_type == RX_SPEECH_BAD ) {
718
if ( s->prev_ft >= RX_SID_FIRST ) {
719
frame_type = RX_SID_BAD;
725
frame_type = bits[0];
727
switch ( frame_type ) {
729
frame_type = RX_SPEECH_GOOD;
731
Bits2Prm( mode, &bits[1], prm );
735
frame_type = RX_SID_FIRST;
740
frame_type = RX_SID_UPDATE;
742
Bits2Prm( MRDTX, &bits[1], prm );
746
frame_type = RX_NO_DATA;
752
/* test for homing frame */
753
if ( s->reset_flag_old == 1 ) {
801
for ( i = 0; i < homingSize; i++ ) {
802
resetFlag = prm[i] ^ homing[i];
809
if ( ( resetFlag == 0 ) && ( s->reset_flag_old != 0 ) ) {
810
for ( i = 0; i < 160; i++ ) {
815
Speech_Decode_Frame( s->decoder_State, mode, prm, frame_type, synth );
817
if ( s->reset_flag_old == 0 ) {
818
/* check whole frame */
822
homingSize = PRMNO_MR122;
827
homingSize = PRMNO_MR102;
832
homingSize = PRMNO_MR795;
837
homingSize = PRMNO_MR74;
842
homingSize = PRMNO_MR67;
847
homingSize = PRMNO_MR59;
852
homingSize = PRMNO_MR515;
857
homingSize = PRMNO_MR475;
865
for ( i = 0; i < homingSize; i++ ) {
866
resetFlag = prm[i] ^ homing[i];
873
/* reset decoder if current frame is a homing frame */
874
if ( resetFlag == 0 ) {
875
Speech_Decode_Frame_reset( s->decoder_State );
877
s->reset_flag_old = !resetFlag;
878
s->prev_ft = frame_type;