📄 interf_dec.c
字号:
/* * =================================================================== * TS 26.104 * R99 V3.5.0 2003-03 * REL-4 V4.4.0 2003-03 * REL-5 V5.1.0 2003-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 */typedefstruct{ 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 + -