📄 idct.c
字号:
#include "idct.h"
/*
#define W1 2841
#define W2 2676
#define W3 2408
#define W5 1609
#define W6 1108
#define W7 565
*/
static short iclip[1024];
static short *iclp;
/*
#if 0
static void row_idct(blk)
short *blk;
{
int temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8;
if (!((temp1 = blk[4]<<11) | (temp2 = blk[6]) | (temp3 = blk[2]) |
(temp4 = blk[1]) | (temp5 = blk[7]) | (temp6 = blk[5]) | (temp7 = blk[3])))
{
blk[0]=blk[1]=blk[2]=blk[3]=blk[4]=blk[5]=blk[6]=blk[7]=blk[0]<<3;
return;
}
temp0 = (blk[0]<<11) + 128;
temp8 = W7*(temp4+temp5);
temp4 = temp8 + (W1-W7)*temp4;
temp5 = temp8 - (W1+W7)*temp5;
temp8 = W3*(temp6+temp7);
temp6 = temp8 - (W3-W5)*temp6;
temp7 = temp8 - (W3+W5)*temp7;
temp8 = temp0 + temp1;
temp0 -= temp1;
temp1 = W6*(temp3+temp2);
temp2 = temp1 - (W2+W6)*temp2;
temp3 = temp1 + (W2-W6)*temp3;
temp1 = temp4 + temp6;
temp4 -= temp6;
temp6 = temp5 + temp7;
temp5 -= temp7;
temp7 = temp8 + temp3;
temp8 -= temp3;
temp3 = temp0 + temp2;
temp0 -= temp2;
temp2 = (181*(temp4+temp5)+128)>>8;
temp4 = (181*(temp4-temp5)+128)>>8;
blk[0] = (temp7+temp1)>>8;
blk[1] = (temp3+temp2)>>8;
blk[2] = (temp0+temp4)>>8;
blk[3] = (temp8+temp6)>>8;
blk[4] = (temp8-temp6)>>8;
blk[5] = (temp0-temp4)>>8;
blk[6] = (temp3-temp2)>>8;
blk[7] = (temp7-temp1)>>8;
}
#endif
#if 0
static void col_idct(blk)
short *blk;
{
int temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8;
// shortcut
if (!((temp1 = (blk[8*4]<<8)) | (temp2 = blk[8*6]) | (temp3 = blk[8*2]) |
(temp4 = blk[8*1]) | (temp5 = blk[8*7]) | (temp6 = blk[8*5]) | (temp7 = blk[8*3])))
{
blk[8*0]=blk[8*1]=blk[8*2]=blk[8*3]=blk[8*4]=blk[8*5]=blk[8*6]=blk[8*7]=
iclp[(blk[8*0]+32)>>6];
return;
}
temp0 = (blk[8*0]<<8) + 8192;
temp8 = W7*(temp4+temp5) + 4;
temp4 = (temp8+(W1-W7)*temp4)>>3;
temp5 = (temp8-(W1+W7)*temp5)>>3;
temp8 = W3*(temp6+temp7) + 4;
temp6 = (temp8-(W3-W5)*temp6)>>3;
temp7 = (temp8-(W3+W5)*temp7)>>3;
temp8 = temp0 + temp1;
temp0 -= temp1;
temp1 = W6*(temp3+temp2) + 4;
temp2 = (temp1-(W2+W6)*temp2)>>3;
temp3 = (temp1+(W2-W6)*temp3)>>3;
temp1 = temp4 + temp6;
temp4 -= temp6;
temp6 = temp5 + temp7;
temp5 -= temp7;
temp7 = temp8 + temp3;
temp8 -= temp3;
temp3 = temp0 + temp2;
temp0 -= temp2;
temp2 = (181*(temp4+temp5)+128)>>8;
temp4 = (181*(temp4-temp5)+128)>>8;
blk[8*0] = iclp[(temp7+temp1)>>14];
blk[8*1] = iclp[(temp3+temp2)>>14];
blk[8*2] = iclp[(temp0+temp4)>>14];
blk[8*3] = iclp[(temp8+temp6)>>14];
blk[8*4] = iclp[(temp8-temp6)>>14];
blk[8*5] = iclp[(temp0-temp4)>>14];
blk[8*6] = iclp[(temp3-temp2)>>14];
blk[8*7] = iclp[(temp7-temp1)>>14];
}
#endif
#pragma CODE_SECTION(idct,".internal_code1");
void idct(short *const block)
{
#if 0
int i;
long i;
for (i=0; i<8; i++)
row_idct(block+8*i);
for (i=0; i<8; i++)
col_idct(block+i);
#endif
short *blk;
long i;
long temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8;
for (i = 0; i < 8; i++)
{
blk = block + (i << 3);
if (!((temp1 = blk[4] << 11) | (temp2 = blk[6]) | (temp3 = blk[2]) | (temp4 = blk[1]) |
(temp5 = blk[7]) | (temp6 = blk[5]) | (temp7 = blk[3])))
{
blk[0] = blk[1] = blk[2] = blk[3] = blk[4] = blk[5] = blk[6] =
blk[7] = blk[0] << 3;
continue;
}
temp0 = (blk[0] << 11) + 128;
temp8 = W7 * (temp4 + temp5);
temp4 = temp8 + (W1 - W7) * temp4;
temp5 = temp8 - (W1 + W7) * temp5;
temp8 = W3 * (temp6 + temp7);
temp6 = temp8 - (W3 - W5) * temp6;
temp7 = temp8 - (W3 + W5) * temp7;
temp8 = temp0 + temp1;
temp0 -= temp1;
temp1 = W6 * (temp3 + temp2);
temp2 = temp1 - (W2 + W6) * temp2;
temp3 = temp1 + (W2 - W6) * temp3;
temp1 = temp4 + temp6;
temp4 -= temp6;
temp6 = temp5 + temp7;
temp5 -= temp7;
temp7 = temp8 + temp3;
temp8 -= temp3;
temp3 = temp0 + temp2;
temp0 -= temp2;
temp2 = (181 * (temp4 + temp5) + 128) >> 8;
temp4 = (181 * (temp4 - temp5) + 128) >> 8;
blk[0] = (short) ((temp7 + temp1) >> 8);
blk[1] = (short) ((temp3 + temp2) >> 8);
blk[2] = (short) ((temp0 + temp4) >> 8);
blk[3] = (short) ((temp8 + temp6) >> 8);
blk[4] = (short) ((temp8 - temp6) >> 8);
blk[5] = (short) ((temp0 - temp4) >> 8);
blk[6] = (short) ((temp3 - temp2) >> 8);
blk[7] = (short) ((temp7 - temp1) >> 8);
}
for (i = 0; i < 8; i++)
{
blk = block + i;
if (!
((temp1 = (blk[8 * 4] << 8)) | (temp2 = blk[8 * 6]) | (temp3 = blk[8 *2])
| (temp4 = blk[8 * 1]) | (temp5 = blk[8 * 7]) | (temp6 = blk[8 * 5]) | (temp7 = blk[8 * 3]))) {
blk[8 * 0] = blk[8 * 1] = blk[8 * 2] = blk[8 * 3] = blk[8 * 4] =
blk[8 * 5] = blk[8 * 6] = blk[8 * 7] =
iclp[(blk[8 * 0] + 32) >> 6];
continue;
}
temp0 = (blk[8 * 0] << 8) + 8192;
temp8 = W7 * (temp4 + temp5) + 4;
temp4 = (temp8 + (W1 - W7) * temp4) >> 3;
temp5 = (temp8 - (W1 + W7) * temp5) >> 3;
temp8 = W3 * (temp6 + temp7) + 4;
temp6 = (temp8 - (W3 - W5) * temp6) >> 3;
temp7 = (temp8 - (W3 + W5) * temp7) >> 3;
temp8 = temp0 + temp1;
temp0 -= temp1;
temp1 = W6 * (temp3 + temp2) + 4;
temp2 = (temp1 - (W2 + W6) * temp2) >> 3;
temp3 = (temp1 + (W2 - W6) * temp3) >> 3;
temp1 = temp4 + temp6;
temp4 -= temp6;
temp6 = temp5 + temp7;
temp5 -= temp7;
temp7 = temp8 + temp3;
temp8 -= temp3;
temp3 = temp0 + temp2;
temp0 -= temp2;
temp2 = (181 * (temp4 + temp5) + 128) >> 8;
temp4 = (181 * (temp4 - temp5) + 128) >> 8;
blk[8 * 0] = iclp[(temp7 + temp1) >> 14];
blk[8 * 1] = iclp[(temp3 + temp2) >> 14];
blk[8 * 2] = iclp[(temp0 + temp4) >> 14];
blk[8 * 3] = iclp[(temp8 + temp6) >> 14];
blk[8 * 4] = iclp[(temp8 - temp6) >> 14];
blk[8 * 5] = iclp[(temp0 - temp4) >> 14];
blk[8 * 6] = iclp[(temp3 - temp2) >> 14];
blk[8 * 7] = iclp[(temp7 - temp1) >> 14];
}
}
*/
void InitIdct()
{
int i;
iclp = iclip + 512;
for (i = -512; i < 512; i++)
iclp[i] = (i < -256) ? -256 : ((i > 255) ? 255 : i);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -