📄 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 + -