📄 prm2bits.c
字号:
#include "prm2bits.h"
#include "AmrCode_Comm.h"
#include "basic_op.h"
#include "bitno_tab.h"
#define MASK 0x0001
const static unsigned char bytemask_1[8]=
{
0x80, 0x40,0x20, 0x10, 0x08, 0x04, 0x02, 0x01
};
const static unsigned char bytemask_0[8] =
{
0x7f, 0xbf, 0xdf,0xef, 0xf7, 0xfb, 0xfd, 0xfe
};
/********************************************************************************** LOCAL PROGRAM CODE*********************************************************************************//************************************************************************* * * FUNCTION: Int2bin * * PURPOSE: convert integer to binary and write the bits to the array * bitstream[]. The most significant bits are written first. * *************************************************************************/static void Int2bin ( Word16 value, /* input : value to be converted to binary */
Word16 no_of_bits, /* input : number of bits associated with value */
Word16 *bitstream /* output: address where bits are written */){ Word16 *pt_bitstream, i, bit; pt_bitstream = &bitstream[no_of_bits];
for (i = 0; i < no_of_bits; i++) { bit = value & MASK;
if (bit == 0) { *--pt_bitstream = BIT_0;
} else { *--pt_bitstream = BIT_1;
} value = value>> 1;
}}
/************************************************************************* * * FUNCTION: Prm2bits * * PURPOSE: converts the encoder parameter vector into a vector of serial * bits. * * DESCRIPTION: depending on the mode, different numbers of parameters * (with differing numbers of bits) are processed. Details * are found in bitno.tab * *************************************************************************/
void Prm2bits (Mode usedmode, Mode mode ,TXFrameType tx_ftype,Word16 prm[], unsigned char bits[] )
{ Word16 i,j;
/*前4比特为发送帧类型信息*/
short bitoffset = 4;
short byteoffset = 0;
/*输出的比特统计信息*/
short bitcount = 4;
short value, bitnum, prmbitcnt;
unsigned char* pbits = bits;
// transfer frame type info: 4bits
pbits[0] = 0;
pbits[0] |= (tx_ftype<<4)&0x00f0;
for (i = 0; i < prmno[usedmode]; i++)
{
// Int2bin (prm[i], bitno[mode][i], bits);
value = prm[i];
bitnum = bitno[usedmode][i];
prmbitcnt = bitnum - 1;
for( j = 0; j < bitnum ;j ++)
{
if( (value>>prmbitcnt) & 0x0001 )
{
pbits[byteoffset] |= bytemask_1[bitoffset];
}
else
{
pbits[byteoffset] &= bytemask_0[bitoffset];
}
bitcount ++;
bitoffset = bitcount & 0x07;
byteoffset = bitcount >> 3;
prmbitcnt --;
}
}
//mode info : 4 bits
//value = mode;
//prmbitcnt = 3;
if (tx_ftype != TX_NO_DATA)
{
pbits[31] |= mode& 0x000f;
}
return;}
/************************************************************ Function: Bin2int Description : Reconstructed parameter Input: no_of_bits: number of bits associated with value Output: bitstream: address where bits are written Return: *************************************************************/static Word16 Bin2int ( Word16 no_of_bits, Word16 *bitstream ){ Word16 value, i, bit; value = 0; for (i = 0; i < no_of_bits; i++) { value <<= 1; bit = *bitstream++; if (bit ==BIT_1 ) value ++; } return (value);}
typedef struct { char *name; int id; } conv_table;/* * mode name <-> mode id conversion table */static const conv_table modetable[] = { {"MR475", MR475}, {"MR515", MR515}, {"MR59", MR59}, {"MR67", MR67}, {"MR74", MR74}, {"MR795", MR795}, {"MR102", MR102}, {"MR122", MR122}, {"MRDTX", MRDTX}, {NULL, -1}};/* * frame type name <-> frame type id conversion tabl */static const conv_table rxframetable[] = { {"RX_SPEECH_GOOD", RX_SPEECH_GOOD}, {"RX_SPEECH_DEGRADED", RX_SPEECH_DEGRADED}, {"RX_SPEECH_BAD", RX_SPEECH_BAD}, {"RX_SID_FIRST", RX_SID_FIRST}, {"RX_SID_UPDATE", RX_SID_UPDATE}, {"RX_SID_BAD", RX_SID_BAD}, {"RX_ONSET", RX_ONSET}, {"RX_NO_DATA", RX_NO_DATA}, {NULL, -1}};/** frame type name <-> frame type id conversion table*/static const conv_table txframetable[] = { {"TX_SPEECH_GOOD", TX_SPEECH_GOOD}, {"TX_SPEECH_DEGRADED", TX_SPEECH_DEGRADED}, {"TX_SPEECH_BAD", TX_SPEECH_BAD}, {"TX_SID_FIRST", TX_SID_FIRST}, {"TX_SID_UPDATE", TX_SID_UPDATE}, {"TX_SID_BAD", TX_SID_BAD}, {"TX_ONSET", TX_ONSET}, {"TX_NO_DATA", TX_NO_DATA}, {NULL, -1}};static int search_string(const conv_table *p, const char *str){ if (str == NULL) return -1; do { if (strcmp(p->name, str) == 0) return p->id; p++; } while (p->name != NULL); return -1;}int str2mode(const char* str, Mode *mode){ int m; if ((m = search_string(modetable, str)) == -1) return 1; *mode = ( Mode) m; return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -