📄 intlbt.cpp
字号:
*(data1+6) = *(data1+6) + (*(data1+5) >>2);
*(data1+5) = *(data1+5) - (*(data1+6) >>1);
*(data1+6) = *(data1+6) + (*(data1+5) >>2);
*(data1+7) = *(data1+7) + (*(data1+6) >>2) - (*(data1+6) >>5);
*(data1+6) = *(data1+6) - (*(data1+7) >>2) - (*(data1+7) >>3) -(*(data1+7) >>5);
*(data1+7) = *(data1+7) + (*(data1+6) >>2) - (*(data1+6) >>5);
}
void CIntLBT::I_IntLBT1D(int *data1, int *data2)
{
/// data1 + data2 ---------> data1
// 做一个 旋转逆变换
*(data1+7) = *(data1+7) - (*(data1+6) >>2) + (*(data1+6) >>5);
*(data1+6) = *(data1+6) + (*(data1+7) >>2) + (*(data1+7) >>3) + (*(data1+7) >>5);
*(data1+7) = *(data1+7) - (*(data1+6) >>2) + (*(data1+6) >>5);
*(data1+6) = *(data1+6) - (*(data1+5) >>2);
*(data1+5) = *(data1+5) + (*(data1+6) >>1);
*(data1+6) = *(data1+6) - (*(data1+5) >>2);
*(data1+5) = *(data1+5) - (*(data1+4) >>2) + (*(data1+4) >>5);
*(data1+4) = *(data1+4) + (*(data1+5) >>2) + (*(data1+5) >>3) + (*(data1+5) >>5);
*(data1+5) = *(data1+5) - (*(data1+4) >>2) + (*(data1+4) >>5);
*data1 = (*data1 - *(data1+4)) >>1;
*(data1+1) = (*(data1+1) - *(data1+5)) >>1;
*(data1+2) = (*(data1+2) - *(data1+6)) >>1;
*(data1+3) = (*(data1+3) - *(data1+7)) >>1;
// 做一个 旋转逆变换
*(data2+7) = *(data2+7) - (*(data2+6) >>2) + (*(data2+6) >>5);
*(data2+6) = *(data2+6) + (*(data2+7) >>2) + (*(data2+7) >>3) + (*(data2+7) >>5);
*(data2+7) = *(data2+7) - (*(data2+6) >>2) + (*(data2+6) >>5);
*(data2+6) = *(data2+6) - (*(data2+5) >>2);
*(data2+5) = *(data2+5) + (*(data2+6) >>1);
*(data2+6) = *(data2+6) - (*(data2+5) >>2);
*(data2+5) = *(data2+5) - (*(data2+4) >>2) + (*(data2+4) >>5);
*(data2+4) = *(data2+4) + (*(data2+5) >>2) + (*(data2+5) >>3) + (*(data2+5) >>5);
*(data2+5) = *(data2+5) - (*(data2+4) >>2) + (*(data2+4) >>5);
*(data1+4) = (*data2 + *(data2+4)) >>1;
*(data1+5) = (*(data2+1) + *(data2+5)) >>1;
*(data1+6) = (*(data2+2) + *(data2+6)) >>1;
*(data1+7) = (*(data2+3) + *(data2+7)) >>1;
// I_DCT_Butterfly(data1);
}
void CIntLBT::IntDCT1D(int *data)
{
//// input x0 x1 ... x7
//// output X0 X2 X4 X6 X1 X3 X5 X7
////
int *datatmp;
datatmp = new int [8];
*datatmp = *data + *(data + 7);
*(datatmp+1) = *(data+1) + *(data+6);
*(datatmp+2) = *(data+2) + *(data+5);
*(datatmp+3) = *(data+3) + *(data+4);
*(datatmp+4) = *(data+3) - *(data+4);
*(datatmp+5) = *(data+2) - *(data+5);
*(datatmp+6) = *(data+1) - *(data+6);
*(datatmp+7) = *data - *(data+7);
//蝶形运算结束
*data = *datatmp + *(datatmp+3);
*(data+1) = *(datatmp+1) + *(datatmp+2);
*(data+2) = *(datatmp+1) - *(datatmp+2);
*(data+3) = *datatmp - *(datatmp+3);
*data += *(data+1); //// *data = X0
*(data+1) = - *(data+1) + ((*data)>>1); /// *(data+1) = X4
*(data+3) = *(data+3) - (*(data+2) >>1) - (*(data+2) >>3);
*(data+2) += *(data+3);
*(data+3) = *(data+3) - (*(data+2) >>1) - (*(data+2) >>3);
// *(data+2) = X2 *(data+3) = X6
*(datatmp+5) = *(datatmp+5) - (*(datatmp+6) >>1) + (*(datatmp+6) >>4);
*(datatmp+6) = *(datatmp+6) + (*(datatmp+5) >>1) + (*(datatmp+5) >>2);
*(datatmp+5) = - *(datatmp+5) + (*(datatmp+6) >>1) - (*(datatmp+6) >>4);
*(data+4) = *(datatmp+4) + *(datatmp+5);
*(data+5) = *(datatmp+4) - *(datatmp+5);
*(data+6) = -*(datatmp+6) + *(datatmp+7);
*(data+7) = *(datatmp+6) + *(datatmp+7);
*(data+7) = *(data+7) - (*(data+4) >>1) -(*(data+4) >>2) -(*(data+4) >>4);
*(data+4) = *(data+4) + *(data+7);
*(data+7) = *(data+7) - (*(data+4) >>1) -(*(data+4) >>2) -(*(data+4) >>4);
// *(data+4) = X1 *(data+7) = X7
*(data+6) = *(data+6) - (*(data+5) >>2);
*(data+5) = *(data+5) + (*(data+6) >>1);
*(data+6) = *(data+6) - (*(data+5) >>2);
// *(data+5) = X3 *(data+7) = X5
*datatmp = *data; *(datatmp+1) = *(data+2);
*(datatmp+2) = *(data+1); *(datatmp+3) = *(data+3);
*(datatmp+4) = *(data+4); *(datatmp+5) = *(data+6);
*(datatmp+6) = *(data+5); *(datatmp+7) = *(data+7);
int i;
for (i=0; i<8; i++) *(data+i) = *(datatmp+i);
delete datatmp;
}
void CIntLBT::I_IntDCT1D(int *data)
{
///////
/// input X0, X2, X4, X6, X1, X3, X5, X7
//// output x0, x1,x2, ..., x7
int *datatmp;
datatmp = new int [8];
*(datatmp+1) = - *(data+2) + (*data>>1);
*datatmp = *data - *(datatmp+1);
*(datatmp+3) = *(data+3) + (*(data+1) >>1) +(*(data+1) >>3);
*(datatmp+2) = *(data+1) - *(datatmp+3);
*(datatmp+3) = *(datatmp+3) +(*(datatmp+2) >>1) +(*(datatmp+2) >>3);
*(datatmp+6) = *(data+5) + (*(data+6) >>2);
*(datatmp+5) = *(data+6) - (*(datatmp+6) >>1);
*(datatmp+6) = *(datatmp+6) + (*(datatmp+5) >>2);
*(datatmp+7) = *(data+7) + (*(data+4) >>1) + (*(data+4) >>2) + (*(data+4) >>4);
*(datatmp+4) = *(data+4) - *(datatmp+7);
*(datatmp+7) = *(datatmp+7) + (*(datatmp+4) >>1) + (*(datatmp+4) >>2) + (*(datatmp+4) >>4);
// four inverse lifting step
*data = (*datatmp + *(datatmp+3)) >>1;
*(data+3) = (*datatmp - *(datatmp+3)) >>1;
*(data+1) = (*(datatmp+1) + *(datatmp+2)) >>1;
*(data+2) = (*(datatmp+1) - *(datatmp+2)) >>1;
*(data+4) = (*(datatmp+4) + *(datatmp+5)) >>1;
*(data+5) = (*(datatmp+4) - *(datatmp+5)) >>1;
*(data+6) = (- *(datatmp+6) + *(datatmp+7)) >>1;
*(data+7) = (*(datatmp+6) + *(datatmp+7)) >>1;
// four inverse butterfly
*(data+5) = - *(data+5) + (*(data+6) >>1) - (*(data+6) >>4);
*(data+6) = *(data+6) - (*(data+5) >>1) - (*(data+5) >>2);
*(data+5) = *(data+5) + (*(data+6) >>1) - (*(data+6) >>4);
/////////////////
*datatmp = (*data + *(data+7)) >>1;
*(datatmp+1) = (*(data+1) + *(data+6)) >>1;
*(datatmp+2) = (*(data+2) + *(data+5)) >>1;
*(datatmp+3) = (*(data+3) + *(data+4)) >>1;
*(datatmp+4) = (*(data+3) - *(data+4)) >>1;
*(datatmp+5) = (*(data+2) - *(data+5)) >>1;
*(datatmp+6) = (*(data+1) - *(data+6)) >>1;
*(datatmp+7) = (*data - *(data+7)) >>1;
int i;
for(i=0; i<8; i++) *(data+i) = *(datatmp+i);
delete datatmp;
}
void CIntLBT::DCT_Butterfly1D(int *data)
{
int *datatmp;
datatmp = new int [8];
IntDCT1D(data);
//// 先做一个拉伸变换
*(data+4) = *(data+4) + *data;
*data = *data - (*(data+4) >>2) - (*(data+4) >>4);
*(data+4) = *(data+4) - *data - (*data >>2) - (*data >>3) -(*data >>5);
*data = *data + (*(data+4) >>2) - (*(data+4) >>5);
int i;
for (i=0; i<4; i++)
{
*(datatmp+i) = *(data+i) + *(data+i+4);
*(datatmp+i+4) = *(data+i) - *(data+i+4);
}
for (i=0; i<8; i++) *(data+i) = *(datatmp+i);
delete datatmp;
}
void CIntLBT::I_DCT_Butterfly(int *data)
{
int *datatmp;
datatmp = new int [8];
int i;
for (i=0; i<4; i++)
{
*(datatmp+i) = (*(data+i) + *(data+i+4)) >>1;
*(datatmp+i+4) = (*(data+i) - *(data+i+4)) >>1;
}
//// 做一个拉伸逆变换
*datatmp = *datatmp - (*(datatmp+4) >>2) + (*(datatmp+4) >>5);
*(datatmp+4) = *(datatmp+4) + *datatmp + (*datatmp >>2) + (*datatmp >>3) + (*datatmp >>5);
*datatmp = *datatmp + (*(datatmp+4) >>2) + (*(datatmp+4) >>4);
*(datatmp+4) = *(datatmp+4) - *datatmp;
for (i=0; i<8; i++) *(data+i) = *(datatmp+i);
I_IntDCT1D(data);
delete datatmp;
}
void CIntLBT::I_IntLBT_1to1(int *data)
{
// 做一个 旋转逆变换
int *data1;
data1 = new int [8];
int k;
for (k=0; k<8; k++) *(data1+k) = *(data+k);
*(data1+7) = *(data1+7) - (*(data1+6) >>2) + (*(data1+6) >>5);
*(data1+6) = *(data1+6) + (*(data1+7) >>2) + (*(data1+7) >>3) + (*(data1+7) >>5);
*(data1+7) = *(data1+7) - (*(data1+6) >>2) + (*(data1+6) >>5);
*(data1+6) = *(data1+6) - (*(data1+5) >>2);
*(data1+5) = *(data1+5) + (*(data1+6) >>1);
*(data1+6) = *(data1+6) - (*(data1+5) >>2);
*(data1+5) = *(data1+5) - (*(data1+4) >>2) + (*(data1+4) >>5);
*(data1+4) = *(data1+4) + (*(data1+5) >>2) + (*(data1+5) >>3) + (*(data1+5) >>5);
*(data1+5) = *(data1+5) - (*(data1+4) >>2) + (*(data1+4) >>5);
*data = (*data1 + *(data1+4)) >>1;
*(data+1) = (*(data1+1) + *(data1+5)) >>1;
*(data+2) = (*(data1+2) + *(data1+6)) >>1;
*(data+3) = (*(data1+3) + *(data1+7)) >>1;
*(data+4) = (*data1 - *(data1+4)) >>1;
*(data+5) = (*(data1+1) - *(data1+5)) >>1;
*(data+6) = (*(data1+2) - *(data1+6)) >>1;
*(data+7) = (*(data1+3) - *(data1+7)) >>1;
delete data1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -