📄 interf_dec.c
字号:
/*
* ===================================================================
* TS 26.104
* REL-5 V5.4.0 2004-03
* REL-6 V6.1.0 2004-03
* 3GPP AMR Floating-point Speech Codec
* ===================================================================
*
*/
/*
* interf_dec.c
*
*
* Project:
* AMR Floating-Point Codec
*
* Contains:
* This module provides means to conversion from 3GPP or ETSI
* bitstream to AMR parameters
*/
/*
* include files
*/
#include <stdlib.h>
#include <stdio.h>
#include <memory.h>
#include "typedef.h"
#include "sp_dec.h"
#include "interf_rom.h"
#include "rom_dec.h"
/*
* definition of constants
*/
#define EHF_MASK 0x0008 /* encoder homing frame pattern */
typedef
struct
{
int reset_flag_old; /* previous was homing frame */
enum RXFrameType prev_ft; /* previous frame type */
enum Mode prev_mode; /* previous mode */
void *decoder_State; /* Points decoder state */
}dec_interface_State;
#ifdef ETSI
/*
* Bin2Int
*
*
* Parameters:
* no_of_bits I: number of bits associated with value
* bits O: address where bits are written
*
* Function:
* Read nuber of bits from the array and convert to integer.
*
* Returns:
* value
*/
static Word16 Bin2Int( Word16 no_of_bits, Word16 *bitstream )
{
Word32 value, i, bit;
value = 0;
for ( i = 0; i < no_of_bits; i++ ) {
value = value << 1;
bit = *bitstream++;
if ( bit == 0x1 )
value = value + 1;
}
return( Word16 )( value );
}
/*
* Bits2Prm
*
*
* Parameters:
* mode I: AMR mode
* bits I: serial bits
* param O: AMR parameters
*
* Function:
* Retrieves the vector of encoder parameters from
* the received serial bits in a frame.
*
* Returns:
* void
*/
static void Bits2Prm( enum Mode mode, Word16 bits[], Word16 prm[] )
{
Word32 i;
switch ( mode ) {
case MR122:
for ( i = 0; i < PRMNO_MR122; i++ ) {
prm[i] = Bin2Int( bitno_MR122[i], bits );
bits += bitno_MR122[i];
}
break;
case MR102:
for ( i = 0; i < PRMNO_MR102; i++ ) {
prm[i] = Bin2Int( bitno_MR102[i], bits );
bits += bitno_MR102[i];
}
break;
case MR795:
for ( i = 0; i < PRMNO_MR795; i++ ) {
prm[i] = Bin2Int( bitno_MR795[i], bits );
bits += bitno_MR795[i];
}
break;
case MR74:
for ( i = 0; i < PRMNO_MR74; i++ ) {
prm[i] = Bin2Int( bitno_MR74[i], bits );
bits += bitno_MR74[i];
}
break;
case MR67:
for ( i = 0; i < PRMNO_MR67; i++ ) {
prm[i] = Bin2Int( bitno_MR67[i], bits );
bits += bitno_MR67[i];
}
break;
case MR59:
for ( i = 0; i < PRMNO_MR59; i++ ) {
prm[i] = Bin2Int( bitno_MR59[i], bits );
bits += bitno_MR59[i];
}
break;
case MR515:
for ( i = 0; i < PRMNO_MR515; i++ ) {
prm[i] = Bin2Int( bitno_MR515[i], bits );
bits += bitno_MR515[i];
}
break;
case MR475:
for ( i = 0; i < PRMNO_MR475; i++ ) {
prm[i] = Bin2Int( bitno_MR475[i], bits );
bits += bitno_MR475[i];
}
break;
case MRDTX:
for ( i = 0; i < PRMNO_MRDTX; i++ ) {
prm[i] = Bin2Int( bitno_MRDTX[i], bits );
bits += bitno_MRDTX[i];
}
break;
}
return;
}
#else
#ifndef IF2
/*
* DecoderMMS
*
*
* Parameters:
* param O: AMR parameters
* stream I: input bitstream
* frame_type O: frame type
* speech_mode O: speech mode in DTX
*
* Function:
* AMR file storage format frame to decoder parameters
*
* Returns:
* mode used mode
*/
enum Mode DecoderMMS( Word16 *param, UWord8 *stream, enum RXFrameType
*frame_type, enum Mode *speech_mode, Word16 *q_bit )
{
enum Mode mode;
Word32 j;
Word16 *mask;
memset( param, 0, PRMNO_MR122 <<1 );
*q_bit = 0x01 & (*stream >> 2);
mode = 0x0F & (*stream >> 3);
stream++;
if ( mode == MRDTX ) {
mask = order_MRDTX;
for ( j = 1; j < 36; j++ ) {
if ( *stream & 0x80 )
param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
mask += 2;
if ( j % 8 )
*stream <<= 1;
else
stream++;
}
/* get SID type bit */
*frame_type = RX_SID_FIRST;
if (*stream & 0x80)
*frame_type = RX_SID_UPDATE;
/* since there is update, use it */
/* *frame_type = RX_SID_UPDATE; */
/* speech mode indicator */
*speech_mode = (*stream >> 4) && 0x07;
}
else if ( mode == 15 ) {
*frame_type = RX_NO_DATA;
}
else if ( mode == MR475 ) {
mask = order_MR475;
for ( j = 1; j < 96; j++ ) {
if ( *stream & 0x80 )
param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
mask += 2;
if ( j % 8 )
*stream <<= 1;
else
stream++;
}
*frame_type = RX_SPEECH_GOOD;
}
else if ( mode == MR515 ) {
mask = order_MR515;
for ( j = 1; j < 104; j++ ) {
if ( *stream & 0x80 )
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 = 1; j < 119; j++ ) {
if ( *stream & 0x80 )
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 = 1; j < 135; j++ ) {
if ( *stream & 0x80 )
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 = 1; j < 149; j++ ) {
if ( *stream & 0x80 )
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 = 1; j < 160; j++ ) {
if ( *stream & 0x80 )
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 = 1; j < 205; j++ ) {
if ( *stream & 0x80 )
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 = 1; j < 245; j++ ) {
if ( *stream & 0x80 )
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;
}
#else
/*
* Decoder3GPP
*
*
* Parameters:
* param O: AMR parameters
* stream I: input bitstream
* frame_type O: frame type
* speech_mode O: speech mode in DTX
*
* Function:
* Resets state memory
*
* Returns:
* mode used mode
*/
enum Mode Decoder3GPP( Word16 *param, UWord8 *stream, enum RXFrameType
*frame_type, enum Mode *speech_mode )
{
enum Mode mode;
Word32 j;
Word16 *mask;
memset( param, 0, PRMNO_MR122 <<1 );
mode = 0xF & *stream;
*stream >>= 4;
if ( mode == MRDTX ) {
mask = order_MRDTX;
for ( j = 5; j < 40; j++ ) {
if ( *stream & 0x1 )
param[ * mask] = ( short )( param[ * mask] + *( mask + 1 ) );
mask += 2;
if ( j % 8 )
*stream >>= 1;
else
stream++;
}
/* get SID type bit */
*frame_type = RX_SID_FIRST;
if (*stream)
*frame_type = RX_SID_UPDATE;
/* since there is update, use it */
/* *frame_type = RX_SID_UPDATE; */
stream++;
/* speech mode indicator */
*speech_mode = *stream;
}
else if ( mode == 15 ) {
*frame_type = RX_NO_DATA;
}
else if ( mode == MR475 ) {
mask = order_MR475;
for ( j = 5; j < 100; 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 == MR515 ) {
mask = order_MR515;
for ( j = 5; j < 108; j++ ) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -