量化

// 快速除法
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;        
    }
}

posted @ 2017-01-04 21:12  半颜千面  Views(170)  Comments(0Edit  收藏  举报