📄 interf_dec.c
字号:
if ( *stream & 0x1 )
param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
mask += 2;
if ( j % 8 )
*stream >>= 1;
else
stream++;
}
*frame_type = RX_SPEECH_GOOD;
}
else if ( mode == MR59 ) {
mask = order_MR59;
for ( j = 5; j < 123; j++ ) {
if ( *stream & 0x1 )
param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
mask += 2;
if ( j % 8 )
*stream >>= 1;
else
stream++;
}
*frame_type = RX_SPEECH_GOOD;
}
else if ( mode == MR67 ) {
mask = order_MR67;
for ( j = 5; j < 139; j++ ) {
if ( *stream & 0x1 )
param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
mask += 2;
if ( j % 8 )
*stream >>= 1;
else
stream++;
}
*frame_type = RX_SPEECH_GOOD;
}
else if ( mode == MR74 ) {
mask = order_MR74;
for ( j = 5; j < 153; j++ ) {
if ( *stream & 0x1 )
param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
mask += 2;
if ( j % 8 )
*stream >>= 1;
else
stream++;
}
*frame_type = RX_SPEECH_GOOD;
}
else if ( mode == MR795 ) {
mask = order_MR795;
for ( j = 5; j < 164; j++ ) {
if ( *stream & 0x1 )
param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
mask += 2;
if ( j % 8 )
*stream >>= 1;
else
stream++;
}
*frame_type = RX_SPEECH_GOOD;
}
else if ( mode == MR102 ) {
mask = order_MR102;
for ( j = 5; j < 209; j++ ) {
if ( *stream & 0x1 )
param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
mask += 2;
if ( j % 8 )
*stream >>= 1;
else
stream++;
}
*frame_type = RX_SPEECH_GOOD;
}
else if ( mode == MR122 ) {
mask = order_MR122;
for ( j = 5; j < 249; j++ ) {
if ( *stream & 0x1 )
param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
mask += 2;
if ( j % 8 )
*stream >>= 1;
else
stream++;
}
*frame_type = RX_SPEECH_GOOD;
}
else
*frame_type = RX_SPEECH_BAD;
return mode;
}
#endif
#endif
/*
* Decoder_Interface_reset
*
*
* Parameters:
* st O: state struct
*
* Function:
* Reset homing frame counter
*
* Returns:
* void
*/
void Decoder_Interface_reset( dec_interface_State *st )
{
st->reset_flag_old = 1;
st->prev_ft = RX_SPEECH_GOOD;
st->prev_mode = MR475; /* minimum bitrate */
}
/*
* Decoder_Interface_init
*
*
* Parameters:
* void
*
* Function:
* Allocates state memory and initializes state memory
*
* Returns:
* success : pointer to structure
* failure : NULL
*/
void * Decoder_Interface_init( void )
{
dec_interface_State * s;
/* allocate memory */
if ( ( s = ( dec_interface_State * ) malloc( sizeof( dec_interface_State ) ) ) ==
NULL ) {
fprintf( stderr, "Decoder_Interface_init: "
"can not malloc state structure\n" );
return NULL;
}
s->decoder_State = Speech_Decode_Frame_init( );
if ( s->decoder_State == NULL ) {
free( s );
return NULL;
}
Decoder_Interface_reset( s );
return s;
}
/*
* Decoder_Interface_exit
*
*
* Parameters:
* state I: state structure
*
* Function:
* The memory used for state memory is freed
*
* Returns:
* Void
*/
void Decoder_Interface_exit( void *state )
{
dec_interface_State * s;
s = ( dec_interface_State * )state;
/* free memory */
Speech_Decode_Frame_exit(s->decoder_State );
free( s );
s = NULL;
state = NULL;
}
/*
* Decoder_Interface_Decode
*
*
* Parameters:
* st B: state structure
* bits I: bit stream
* synth O: synthesized speech
* bfi I: bad frame indicator
*
* Function:
* Decode bit stream to synthesized speech
*
* Returns:
* Void
*/
void Decoder_Interface_Decode( void *st,
#ifndef ETSI
UWord8 *bits,
#else
Word16 *bits,
#endif
Word16 *synth, int bfi)
{
enum Mode mode; /* AMR mode */
#ifndef ETSI
enum Mode speech_mode = MR475; /* speech mode */
#endif
Word16 prm[PRMNO_MR122]; /* AMR parameters */
enum RXFrameType frame_type; /* frame type */
dec_interface_State * s; /* pointer to structure */
const Word16 *homing; /* pointer to homing frame */
Word16 homingSize; /* frame size for homing frame */
Word32 i; /* counter */
Word32 resetFlag = 1; /* homing frame */
#ifndef ETSI
#ifndef IF2
Word16 q_bit;
#endif
#endif
s = ( dec_interface_State * )st;
#ifndef ETSI
/*
* extract mode information and frametype,
* octets to parameters
*/
#ifdef IF2
mode = Decoder3GPP( prm, bits, &frame_type, &speech_mode );
#else
mode = DecoderMMS( prm, bits, &frame_type, &speech_mode, &q_bit );
if (!bfi) bfi = 1 - q_bit;
#endif
if ( bfi == 1 ) {
if ( mode <= MR122 ) {
frame_type = RX_SPEECH_BAD;
}
else if ( frame_type != RX_NO_DATA ) {
frame_type = RX_SID_BAD;
mode = s->prev_mode;
}
} else {
if ( frame_type == RX_SID_FIRST || frame_type == RX_SID_UPDATE) {
mode = speech_mode;
}
else if ( frame_type == RX_NO_DATA ) {
mode = s->prev_mode;
}
/*
* if no mode information
* guess one from the previous frame
*/
if ( frame_type == RX_SPEECH_BAD ) {
mode = s->prev_mode;
if ( s->prev_ft >= RX_SID_FIRST ) {
frame_type = RX_SID_BAD;
}
}
}
#else
bfi = 0;
frame_type = bits[0];
switch ( frame_type ) {
case 0:
frame_type = RX_SPEECH_GOOD;
mode = bits[245];
Bits2Prm( mode, &bits[1], prm );
break;
case 1:
frame_type = RX_SID_FIRST;
mode = bits[245];
break;
case 2:
frame_type = RX_SID_UPDATE;
mode = bits[245];
Bits2Prm( MRDTX, &bits[1], prm );
break;
case 3:
frame_type = RX_NO_DATA;
mode = s->prev_mode;
break;
}
#endif
/* test for homing frame */
if ( s->reset_flag_old == 1 ) {
switch ( mode ) {
case MR122:
homing = dhf_MR122;
homingSize = 18;
break;
case MR102:
homing = dhf_MR102;
homingSize = 12;
break;
case MR795:
homing = dhf_MR795;
homingSize = 8;
break;
case MR74:
homing = dhf_MR74;
homingSize = 7;
break;
case MR67:
homing = dhf_MR67;
homingSize = 7;
break;
case MR59:
homing = dhf_MR59;
homingSize = 7;
break;
case MR515:
homing = dhf_MR515;
homingSize = 7;
break;
case MR475:
homing = dhf_MR475;
homingSize = 7;
break;
default:
homing = NULL;
homingSize = 0;
break;
}
for ( i = 0; i < homingSize; i++ ) {
resetFlag = prm[i] ^ homing[i];
if ( resetFlag )
break;
}
}
if ( ( resetFlag == 0 ) && ( s->reset_flag_old != 0 ) ) {
for ( i = 0; i < 160; i++ ) {
synth[i] = EHF_MASK;
}
}
else
Speech_Decode_Frame( s->decoder_State, mode, prm, frame_type, synth );
if ( s->reset_flag_old == 0 ) {
/* check whole frame */
switch ( mode ) {
case MR122:
homing = dhf_MR122;
homingSize = PRMNO_MR122;
break;
case MR102:
homing = dhf_MR102;
homingSize = PRMNO_MR102;
break;
case MR795:
homing = dhf_MR795;
homingSize = PRMNO_MR795;
break;
case MR74:
homing = dhf_MR74;
homingSize = PRMNO_MR74;
break;
case MR67:
homing = dhf_MR67;
homingSize = PRMNO_MR67;
break;
case MR59:
homing = dhf_MR59;
homingSize = PRMNO_MR59;
break;
case MR515:
homing = dhf_MR515;
homingSize = PRMNO_MR515;
break;
case MR475:
homing = dhf_MR475;
homingSize = PRMNO_MR475;
break;
default:
homing = NULL;
homingSize = 0;
}
for ( i = 0; i < homingSize; i++ ) {
resetFlag = prm[i] ^ homing[i];
if ( resetFlag )
break;
}
}
/* reset decoder if current frame is a homing frame */
if ( resetFlag == 0 ) {
Speech_Decode_Frame_reset( s->decoder_State );
}
s->reset_flag_old = !resetFlag;
s->prev_ft = frame_type;
s->prev_mode = mode;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -