2
* ===================================================================
6
* 3GPP AMR Floating-point Speech Codec
7
* ===================================================================
16
* AMR Floating-Point Codec
19
* This module contains all the functions needed encoding 160
20
* 16-bit speech samples to AMR encoder parameters.
31
#include "interf_rom.h"
34
* Declare structure types
36
/* Declaration transmitted frame types */
37
enum TXFrameType { TX_SPEECH_GOOD = 0,
45
TX_N_FRAMETYPES /* number of frame types */
48
/* Declaration of interface structure */
51
Word16 sid_update_counter; /* Number of frames since last SID */
52
Word16 sid_handover_debt; /* Number of extra SID_UPD frames to schedule */
54
enum TXFrameType prev_ft; /* Type of the previous frame */
55
void *encoderState; /* Points encoder state structure */
56
} enc_interface_State;
65
* value I: value to be converted to binary
66
* no_of_bits I: number of bits associated with value
67
* bitstream O: address where bits are written
70
* Convert integer to binary and write the bits to the array.
71
* The most significant bits are written first.
75
static void Int2Bin( Word16 value, Word16 no_of_bits, Word16 *bitstream )
80
pt_bitstream = &bitstream[no_of_bits];
82
for ( i = 0; i < no_of_bits; i++ ) {
91
value = ( Word16 )( value >> 1 );
102
* prm I: analysis parameters
103
* bits O: serial bits
106
* converts the encoder parameter vector into a vector of serial bits.
110
static void Prm2Bits( enum Mode mode, Word16 prm[], Word16 bits[] )
116
for ( i = 0; i < PRMNO_MR122; i++ ) {
117
Int2Bin( prm[i], bitno_MR122[i], bits );
118
bits += bitno_MR122[i];
123
for ( i = 0; i < PRMNO_MR102; i++ ) {
124
Int2Bin( prm[i], bitno_MR102[i], bits );
125
bits += bitno_MR102[i];
130
for ( i = 0; i < PRMNO_MR795; i++ ) {
131
Int2Bin( prm[i], bitno_MR795[i], bits );
132
bits += bitno_MR795[i];
137
for ( i = 0; i < PRMNO_MR74; i++ ) {
138
Int2Bin( prm[i], bitno_MR74[i], bits );
139
bits += bitno_MR74[i];
144
for ( i = 0; i < PRMNO_MR67; i++ ) {
145
Int2Bin( prm[i], bitno_MR67[i], bits );
146
bits += bitno_MR67[i];
151
for ( i = 0; i < PRMNO_MR59; i++ ) {
152
Int2Bin( prm[i], bitno_MR59[i], bits );
153
bits += bitno_MR59[i];
158
for ( i = 0; i < PRMNO_MR515; i++ ) {
159
Int2Bin( prm[i], bitno_MR515[i], bits );
160
bits += bitno_MR515[i];
165
for ( i = 0; i < PRMNO_MR475; i++ ) {
166
Int2Bin( prm[i], bitno_MR475[i], bits );
167
bits += bitno_MR475[i];
172
for ( i = 0; i < PRMNO_MRDTX; i++ ) {
173
Int2Bin( prm[i], bitno_MRDTX[i], bits );
174
bits += bitno_MRDTX[i];
191
* param I: Encoder output parameters
192
* stream O: packed speech frame
193
* frame_type I: frame type (DTX)
194
* speech_mode I: speech mode (DTX)
197
* Pack encoder output parameters to octet structure according
198
* importance table and AMR file storage format according to
203
static int EncoderMMS( enum Mode mode, Word16 *param, UWord8 *stream, enum
204
TXFrameType frame_type, enum Mode speech_mode )
209
memset(stream, 0, block_size[mode]);
211
*stream = toc_byte[mode];
217
else if ( mode == MRDTX ) {
220
for ( j = 1; j < 36; j++ ) {
221
if ( param[ * mask] & *( mask + 1 ) )
231
/* add SID type information */
232
if ( frame_type == TX_SID_UPDATE )
236
/* speech mode indication */
237
*stream += ( unsigned char )(speech_mode & 0x0007);
241
/* don't shift at the end of the function */
244
else if ( mode == MR475 ) {
247
for ( j = 1; j < 96; j++ ) {
248
if ( param[ * mask] & *( mask + 1 ) )
258
else if ( mode == MR515 ) {
261
for ( j = 1; j < 104; j++ ) {
262
if ( param[ * mask] & *( mask + 1 ) )
272
else if ( mode == MR59 ) {
275
for ( j = 1; j < 119; j++ ) {
276
if ( param[ * mask] & *( mask + 1 ) )
286
else if ( mode == MR67 ) {
289
for ( j = 1; j < 135; j++ ) {
290
if ( param[ * mask] & *( mask + 1 ) )
300
else if ( mode == MR74 ) {
303
for ( j = 1; j < 149; j++ ) {
304
if ( param[ * mask] & *( mask + 1 ) )
314
else if ( mode == MR795 ) {
317
for ( j = 1; j < 160; j++ ) {
318
if ( param[ * mask] & *( mask + 1 ) )
328
else if ( mode == MR102 ) {
331
for ( j = 1; j < 205; j++ ) {
332
if ( param[ * mask] & *( mask + 1 ) )
342
else if ( mode == MR122 ) {
345
for ( j = 1; j < 245; j++ ) {
346
if ( param[ * mask] & *( mask + 1 ) )
357
/* shift remaining bits */
358
if ( k = j % 8 ) *stream <<= ( 8 - k );
359
return( (int)block_size[mode] );
370
* param I: Encoder output parameters
371
* stream O: packed speech frame
372
* frame_type I: frame type (DTX)
373
* speech_mode I: speech mode (DTX)
376
* Pack encoder output parameters to octet structure according
381
static int Encoder3GPP( enum Mode mode, Word16 *param, UWord8 *stream, enum
382
TXFrameType frame_type, enum Mode speech_mode )
387
memset(stream, 0, block_size[mode]);
393
else if ( mode == MRDTX ) {
397
for ( j = 5; j < 40; j++ ) {
398
if ( param[ * mask] & *( mask + 1 ) )
408
/* add SID type information */
409
if ( frame_type == TX_SID_UPDATE )
413
/* speech mode indication */
414
*stream = ( unsigned char )speech_mode;
416
/* don't shift at the end of the function */
419
else if ( mode == MR475 ) {
423
for ( j = 5; j < 100; j++ ) {
424
if ( param[ * mask] & *( mask + 1 ) )
434
else if ( mode == MR515 ) {
438
for ( j = 5; j < 108; j++ ) {
439
if ( param[ * mask] & *( mask + 1 ) )
449
else if ( mode == MR59 ) {
453
for ( j = 5; j < 123; j++ ) {
454
if ( param[ * mask] & *( mask + 1 ) )
464
else if ( mode == MR67 ) {
468
for ( j = 5; j < 139; j++ ) {
469
if ( param[ * mask] & *( mask + 1 ) )
479
else if ( mode == MR74 ) {
483
for ( j = 5; j < 153; j++ ) {
484
if ( param[ * mask] & *( mask + 1 ) )
494
else if ( mode == MR795 ) {
498
for ( j = 5; j < 164; j++ ) {
499
if ( param[ * mask] & *( mask + 1 ) )
509
else if ( mode == MR102 ) {
513
for ( j = 5; j < 209; j++ ) {
514
if ( param[ * mask] & *( mask + 1 ) )
524
else if ( mode == MR122 ) {
528
for ( j = 5; j < 249; j++ ) {
529
if ( param[ * mask] & *( mask + 1 ) )
540
/* shift remaining bits */
541
*stream >>= ( 8 - j % 8 );
542
return( (int)block_size[mode] );
552
* st O: state structure
555
* Initializes state memory
560
static void Sid_Sync_reset( enc_interface_State *st )
562
st->sid_update_counter = 3;
563
st->sid_handover_debt = 0;
564
st->prev_ft = TX_SPEECH_GOOD;
569
* Encoder_Interface_Encode
573
* st I: pointer to state structure
574
* mode I: Speech Mode
575
* speech I: Input speech
576
* serial O: Output octet structure 3GPP or
578
* force_speech I: Force speech in DTX
581
* Encoding and packing one frame of speech
586
int Encoder_Interface_Encode( void *st, enum Mode mode, Word16 *speech,
597
Word16 prm[PRMNO_MR122]; /* speech parameters, max size */
598
const Word16 *homing; /* pointer to homing frame */
599
Word16 homing_size; /* frame size for homing frame */
602
enc_interface_State * s;
603
enum TXFrameType txFrameType; /* frame type */
610
* if used_mode == -1, force VAD on
612
enum Mode used_mode = -force_speech;
615
s = ( enc_interface_State * )st;
618
* Checks if all samples of the input frame matches the encoder
619
* homing frame pattern, which is 0x0008 for all samples.
621
for ( i = 0; i < 160; i++ ) {
622
noHoming = speech[i] ^ 0x0008;
629
Speech_Encode_Frame( s->encoderState, mode, speech, prm, &used_mode );
678
for( i = 0; i < homing_size; i++){
681
/* rest of the parameters are zero */
682
memset(&prm[homing_size], 0, (PRMNO_MR122 - homing_size) << 1);
685
if ( used_mode == MRDTX ) {
686
s->sid_update_counter--;
688
if ( s->prev_ft == TX_SPEECH_GOOD ) {
689
txFrameType = TX_SID_FIRST;
690
s->sid_update_counter = 3;
693
/* TX_SID_UPDATE or TX_NO_DATA */
694
if ( ( s->sid_handover_debt > 0 ) && ( s->sid_update_counter > 2 ) ) {
696
* ensure extra updates are properly delayed after
697
* a possible SID_FIRST
699
txFrameType = TX_SID_UPDATE;
700
s->sid_handover_debt--;
703
if ( s->sid_update_counter == 0 ) {
704
txFrameType = TX_SID_UPDATE;
705
s->sid_update_counter = 8;
708
txFrameType = TX_NO_DATA;
715
s->sid_update_counter = 8;
716
txFrameType = TX_SPEECH_GOOD;
718
s->prev_ft = txFrameType;
720
if ( noHoming == 0 ) {
721
Speech_Encode_Frame_reset( s->encoderState, s->dtx );
727
return Encoder3GPP( used_mode, prm, serial, txFrameType, mode );
730
return EncoderMMS( used_mode, prm, serial, txFrameType, mode );
735
Prm2Bits( used_mode, prm, &serial[1] );
736
serial[0] = ( Word16 )txFrameType;
737
serial[245] = ( Word16 )mode;
745
* Encoder_Interface_init
752
* Allocates state memory and initializes state memory
755
* pointer to encoder interface structure
757
void * Encoder_Interface_init( int dtx )
759
enc_interface_State * s;
761
/* allocate memory */
762
if ( ( s = ( enc_interface_State * ) malloc( sizeof( enc_interface_State ) ) ) ==
764
fprintf( stderr, "Encoder_Interface_init: "
765
"can not malloc state structure\n" );
768
s->encoderState = Speech_Encode_Frame_init( dtx );
776
* DecoderInterfaceExit
780
* state I: state structure
783
* The memory used for state memory is freed
788
void Encoder_Interface_exit( void *state )
790
enc_interface_State * s;
791
s = ( enc_interface_State * )state;
794
Speech_Encode_Frame_exit( &s->encoderState );