量化
// 快速除法
int DIVIDE_BY(double a, double b){
if (a >= b)
return (int)(a/b);
else
return 0;
}
/**
* 对FDCT变换产生的数据进行量化处理
* @param coef 待量化的数据,384bit长度
* @param iBlock 对哪一个像块进行量化 Y: 0,1,2,3; Cb: 4; Cr: 5
*/
void CompressEncode::Quantize(
int* coef,
int iBlock,
unsigned short *m_qtblY, // 亮度量化表
unsigned short *m_qtblCbCr // 色度量化表
){
int temp;
unsigned short qval, *pQuant;
// 对亮度和色度使用不同的量化表
if( iBlock < 4 )
pQuant = m_qtblY;
else
pQuant = m_qtblCbCr;
for (int i = 0; i < 64; i++)
{
qval = pQuant[i];
temp = coef[i];
if ( temp < 0)
{
temp = -temp;
temp += qval>>1; // 加上量化系数的一半, 目的是进行四舍五入
temp = DIVIDE_BY(temp, qval);
temp = -temp;
}
else
{
temp += qval>>1; // 加上量化系数的一半, 目的是进行四舍五入
temp = DIVIDE_BY(temp, qval);
}
coef[i] = temp;
}
}