📄 dct.c
字号:
#include "dct.h"
#define USE_ACCURATE_ROUNDING
#define RIGHT_SHIFT(x, shft) ((x) >> (shft))
#ifdef USE_ACCURATE_ROUNDING
#define ONE ((short) 1)
#define DESCALE(x, n) RIGHT_SHIFT((x) + (ONE << ((n) - 1)), n)
#else
#define DESCALE(x, n) RIGHT_SHIFT(x, n)
#endif
#define CONST_BITS 13
#define BITS2 2
#define CONST029 ((int) 2446) /* FIX(0.298631336) */
#define CONST039 ((int) 3196) /* FIX(0.390180644) */
#define CONST054 ((int) 4433) /* FIX(0.541196100) */
#define CONST076 ((int) 6270) /* FIX(0.765366865) */
#define CONST089 ((int) 7373) /* FIX(0.899976223) */
#define CONST117 ((int) 9633) /* FIX(1.175875602) */
#define CONST150 ((int) 12299) /* FIX(1.501321110) */
#define CONST184 ((int) 15137) /* FIX(1.847759065) */
#define CONST196 ((int) 16069) /* FIX(1.961570560) */
#define CONST205 ((int) 16819) /* FIX(2.053119869) */
#define CONST256 ((int) 20995) /* FIX(2.562915447) */
#define CONST307 ((int) 25172) /* FIX(3.072711026) */
/*
#pragma CODE_SECTION(fdct,".internal_code1");
void fdct(short* dct, short* pixel)
{
int Dct0, Dct1, Dct2, Dct3, Dct4, Dct5, Dct6, Dct7;
int Dct10, Dct11, Dct12, Dct13;
int z1, z2, z3, z4, z5;
short *temp;
int *dataptr;
int data[64];
int i;
dataptr = data;
temp = pixel;
for (i = 0; i < 8; i++)
{
Dct0 = temp[0] + temp[7];
Dct7 = temp[0] - temp[7];
Dct1 = temp[1] + temp[6];
Dct6 = temp[1] - temp[6];
Dct2 = temp[2] + temp[5];
Dct5 = temp[2] - temp[5];
Dct3 = temp[3] + temp[4];
Dct4 = temp[3] - temp[4];
Dct10 = Dct0 + Dct3;
Dct13 = Dct0 - Dct3;
Dct11 = Dct1 + Dct2;
Dct12 = Dct1 - Dct2;
dataptr[0] = (Dct10 + Dct11) << BITS2;
dataptr[4] = (Dct10 - Dct11) << BITS2;
z1 = (Dct12 + Dct13) * CONST054;
dataptr[2] =
DESCALE(z1 + Dct13 * CONST076, CONST_BITS - BITS2);
dataptr[6] =
DESCALE(z1 + Dct12 * (-CONST184), CONST_BITS - BITS2);
z1 = Dct4 + Dct7;
z2 = Dct5 + Dct6;
z3 = Dct4 + Dct6;
z4 = Dct5 + Dct7;
z5 = (z3 + z4) * CONST117;
Dct4 *= CONST029;
Dct5 *= CONST205;
Dct6 *= CONST307;
Dct7 *= CONST150;
z1 *= -CONST089;
z2 *= -CONST256;
z3 *= -CONST196;
z4 *= -CONST039;
z3 += z5;
z4 += z5;
dataptr[7] = DESCALE(Dct4 + z1 + z3, CONST_BITS - BITS2);
dataptr[5] = DESCALE(Dct5 + z2 + z4, CONST_BITS - BITS2);
dataptr[3] = DESCALE(Dct6 + z2 + z3, CONST_BITS - BITS2);
dataptr[1] = DESCALE(Dct7 + z1 + z4, CONST_BITS - BITS2);
dataptr += 8;
temp += 8;
}
dataptr = data;
for (i = 0; i < 8; i++)
{
Dct0 = dataptr[0] + dataptr[56];
Dct7 = dataptr[0] - dataptr[56];
Dct1 = dataptr[8] + dataptr[48];
Dct6 = dataptr[8] - dataptr[48];
Dct2 = dataptr[16] + dataptr[40];
Dct5 = dataptr[16] - dataptr[40];
Dct3 = dataptr[24] + dataptr[32];
Dct4 = dataptr[24] - dataptr[32];
Dct10 = Dct0 + Dct3;
Dct13 = Dct0 - Dct3;
Dct11 = Dct1 + Dct2;
Dct12 = Dct1 - Dct2;
dataptr[0] = DESCALE(Dct10 + Dct11, BITS2);
dataptr[32] = DESCALE(Dct10 - Dct11, BITS2);
z1 = (Dct12 + Dct13) * CONST054;
dataptr[16] =
DESCALE(z1 + Dct13 * CONST076, CONST_BITS + BITS2);
dataptr[48] =
DESCALE(z1 + Dct12 * (-CONST184), CONST_BITS + BITS2);
z1 = Dct4 + Dct7;
z2 = Dct5 + Dct6;
z3 = Dct4 + Dct6;
z4 = Dct5 + Dct7;
z5 = (z3 + z4) * CONST117;
Dct4 *= CONST029;
Dct5 *= CONST205;
Dct6 *= CONST307;
Dct7 *= CONST150;
z1 *= -CONST089;
z2 *= -CONST256;
z3 *= -CONST196;
z4 *= -CONST039;
z3 += z5;
z4 += z5;
dataptr[56] = DESCALE(Dct4 + z1 + z3, CONST_BITS + BITS2);
dataptr[40] = DESCALE(Dct5 + z2 + z4, CONST_BITS + BITS2);
dataptr[24] = DESCALE(Dct6 + z2 + z3, CONST_BITS + BITS2);
dataptr[8] = DESCALE(Dct7 + z1 + z4, CONST_BITS + BITS2);
dataptr++;
}
for (i = 0; i < 64; i++)
dct[i] = (short int) DESCALE(data[i], 3);
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -