unsigned char encode(short pcm);
short decode(unsigned char alaw);
/** 个人理解
- bitsize 应该为16, pBuffer(pcm数据) 两个char 合成一个 short ,长度自然就是原来的一半(nBufferSize/2),
-
通过编码后short类型的数据变为char类型,让后复制给pCodecBits
/
int g711_encode(unsigned char pCodecBits, const char* pBuffer, int nBufferSize)
{
short* buffer = (short*)pBuffer;
int i;
for(i=0; i<nBufferSize/2; i++)
{
pCodecBits[i] = encode(buffer[i]);
}return nBufferSize/2;
}
/** 个人理解
- bitsize 应该为16, pcm 数组的宽度变为原来两倍(short out_data = (short)pRawData;),
-
通过对pBuffer(g711数据)中char解码转为两个字节的short ,后复制给out_data数组, 在使用的时候又转为char类型, 则 解码后的数据就是原来的两倍(nBufferSize*2)
/
int g711_decode(char pRawData, const unsigned char* pBuffer, int nBufferSize)
{
short out_data = (short)pRawData;
int i;
for(i=0; i<nBufferSize; i++)
{
out_data[i] = decode(pBuffer[i]);
}return nBufferSize*2;
}
#define MAX 32635
unsigned char encode(short pcm)
{
int sign = (pcm & 0x8000) >> 8;
if (sign != 0)
pcm = -pcm;
if (pcm > MAX) pcm = MAX;
int exponent = 7;
int expMask;
for (expMask = 0x4000; (pcm & expMask) == 0
&& exponent>0; exponent--, expMask >>= 1) { }
int mantissa = (pcm >> ((exponent == 0) ? 4 : (exponent + 3))) & 0x0f;
unsigned char alaw = (unsigned char)(sign | exponent << 4 | mantissa);
return (unsigned char)(alaw^0xD5);
}
short decode(unsigned char alaw)
{
alaw ^= 0xD5;
int sign = alaw & 0x80;
int exponent = (alaw & 0x70) >> 4;
int data = alaw & 0x0f;
data <<= 4;
data += 8;
if (exponent != 0)
data += 0x100;
if (exponent > 1)
data <<= (exponent - 1);
return (short)(sign == 0 ? data : -data);
}