?? quant.c
字號:
/************************************************************************ *量化器 * ************************************************************************/#include"sim.h"/**********************************************************************
*
* 函數名: Quant
* 功能: 量化器
*
* Input: 變換系數、量化系數、量化參數以及量化模式
*
*
***********************************************************************/
void Quant(int *coeff, int *qcoeff, int QP, int Mode)
{
int i;
int level;
//如果量化參數不為0,表示量化器有意義
if (QP) {
//量化器首先判斷當前幀是否為幀內圖像
if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q) {
qcoeff[0] = mmax(1,mmin(254,coeff[0]/8));
//量化編碼塊中的所有系數
for (i = 1; i < 64; i++) {
level = (abs(coeff[i])) / (2*QP);
qcoeff[i] = mmin(127,mmax(-127,sign(coeff[i]) * level));
}
}
//如果不是幀內圖像,則取系數差進行量化
else { /* non Intra */
for (i = 0; i < 64; i++) {
level = (abs(coeff[i])-QP/2) / (2*QP);
qcoeff[i] = mmin(127,mmax(-127,sign(coeff[i]) * level));
}
}
}
//量化參數為0,系數不量化
else {
for (i = 0; i < 64; i++) {
qcoeff[i] = coeff[i];
}
}
return;
}
/********************************************************************** * * Name: Dequant * 功能: 解量化 * 輸入: 重構系數、量化系數、量化參數以及量化模式 ***********************************************************************/void Dequant(int *qcoeff, int *rcoeff, int QP, int Mode)
{
int i;
//如果量化參數不為0,表明有量化
if (QP) {
for (i = 0; i < 64; i++) {
if (qcoeff[i]) {
//量化參數是奇數
if ((QP % 2) == 1)
rcoeff[i] = QP * (2*abs(qcoeff[i]) + 1);
else
//量化參數是偶數
rcoeff[i] = QP * (2*abs(qcoeff[i]) + 1) - 1;
rcoeff[i] = sign(qcoeff[i]) * rcoeff[i];
}
//量化系數為0,重構系數也為0
else
rcoeff[i] = 0;
}
//幀內系數的處理
if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q) {
rcoeff[0] = qcoeff[0]*8;
}
}
//沒有量化,直接賦值
else {
for (i = 0; i < 64; i++) {
rcoeff[i] = qcoeff[i];
}
}
return;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -