📄 iquant_idct.c
字号:
//*****************************************
//File name: idct.c
//Author: Anna
//Date:
//*****************************************
#define C2 118 //473//118//30//1.847759065 Q4 Q6 Q8
#define C4 91 //362//91//23//1.414213562
#define C6 49 //196//49//12//0.765366864
#define Q 69 //277//69//18//C2-C6
#define R 167 //669//167//42//C2+C6
static int quant_idct_matrix[64]={131044,90862,85749,77106,65522,51404,35476,18100,
90862,63001,59487,53463,45431,35642,24589,12550,
85794,59487,56169,50481,42897,33654,23226,11850,
77106,53463,50481,45369,38553,30246,20874,10650,
65522,45431,42897,38553,32761,25702,17738,9050,
51404,35642,33654,30246,25702,20164,13916,7100,
35476,24598,23226,20874,17738,13916,9604,4900,
18100,12550,11850,10650,9050,7100,4900,2500};
static void idct_hor();
static void idct_ver();
extern int quantizer;
void idct(dct_buf1)
short dct_buf1[64];//dct_out[8][8];
{
int i;
// short xs[8]={362,251,237,213,181,142,98,50}; //Q6
int dct_buf[64];
int *xs;
int q_scale = quantizer;
// int q_scale =quantizer;
int q_2scale = q_scale << 1;
int q_add = (q_scale & 1) ? q_scale : (q_scale - 1);
xs=quant_idct_matrix;
//xs[0]=xs[0]>>12;
dct_buf[0]=(int)((dct_buf1[0]*xs[0])>>12);
for (i = 1; i < 64; i++)
{
//_iquant_h263(dct_buf1[i], xs_scale[i], xs_add[i]);
if (dct_buf1[i]>0)
{
// dct_buf[i]=(int)((xs_2scale[i]*dct_buf1[i]+xs_add[i])>>12);
// dct_buf[i]=(int)((dct_buf1[i]*xs[i])>>12);
dct_buf[i]=(int)(((q_2scale*dct_buf1[i]+q_add)*xs[i])>>12);
}
else if(dct_buf1[i]<0)
{
dct_buf1[i]*=-1;
dct_buf[i]=(int)(((q_2scale*dct_buf1[i]+q_add)*xs[i])>>12);
dct_buf[i]*=-1;
// dct_buf[i]=(int)((dct_buf1[i]*xs[i])>>12);
// dct_buf[i]=dct_buf[i]>>12;
}
else dct_buf[i]=0;
// dct_buf[i]=(int)((dct_buf1[i]*xs[i])>>12);
}
for (i=0; i<8; i++)
idct_ver(dct_buf+i);
for (i=0; i<8; i++)
idct_hor(dct_buf+8*i);
for(i=0;i<64;i++)
{
// dct_buf1[i][j]=(short)((dct_buf[i][j]+128)>>8);
dct_buf1[i]=(short)((dct_buf[i]+32)>>6);
//dct_buf1[i][j]=(short)(dct_buf[i][j]);
}
}
static void idct_ver(int *blk)
{
int a0,a1,a2,a3,a4,a5,a6,a7,tmp1,tmp2,tmp3,tmp4;
//step1
a0=blk[0]>>1;
a1=blk[4*8];
a2=(blk[2*8]-blk[6*8]);
a3=(blk[2*8]+blk[6*8]);
a4=(blk[5*8]-blk[3*8]);
tmp1=(blk[1*8]+blk[7*8]);
tmp2=(blk[3*8]+blk[5*8]);
a5=tmp1-tmp2;
a6=(blk[1*8]-blk[7*8]);
a7=tmp1+tmp2;
tmp4=(C6*(a4+a6))>>6;
//step2
a2=(a2*C4)>>6;
a4=((-(Q*a4))>>6)-tmp4;
a5=(a5*C4)>>6;
a6=((R*a6)>>6)-tmp4;
//step3
tmp3=a6-a7;
a6=a3;
a2=a2-a3;
a3=a0+a1;
a1=a0-a1;
a0=tmp3-a5;
a5=a4;
a4=tmp3;
//step4
tmp1=a0;
tmp2=a4;
a0=a7;
a4=a3+a6;
a6=a3-a6;
a7=a5-tmp1;
a3=a1+a2;
a5=a1-a2;
a2=tmp2;
a1=tmp1;
//step 5
blk[0]=a4+a0;
blk[1*8]=a3+a2;
blk[2*8]=a5-a1;
blk[3*8]=a6-a7;
blk[4*8]=a6+a7;
blk[5*8]=a5+a1;
blk[6*8]=a3-a2;
blk[7*8]=a4-a0;
// return;
}
static void idct_hor(int *blk)
{
int a0,a1,a2,a3,a4,a5,a6,a7,tmp1,tmp2,tmp3,tmp4;
//step1
a0=blk[0]>>1;
a1=blk[4];
a2=blk[2]-blk[6];
a3=blk[2]+blk[6];
a4=blk[5]-blk[3];
tmp1=blk[1]+blk[7];
tmp2=blk[3]+blk[5];
a5=tmp1-tmp2;
a6=blk[1]-blk[7];
a7=tmp1+tmp2;
tmp4=(C6*(a4+a6))>>6;
//step2
a2=(a2*C4)>>6;
a4=((-(Q*a4))>>6)-tmp4;
a5=(a5*C4)>>6;
a6=((R*a6)>>6)-tmp4;
//step3
tmp3=a6-a7;
a6=a3;
a2=a2-a3;
a3=a0+a1;
a1=a0-a1;
a0=tmp3-a5;
a5=a4;
a4=tmp3;
//step4
tmp1=a0;
tmp2=a4;
a0=a7;
a4=a3+a6;
a6=a3-a6;
a7=a5-tmp1;
a3=a1+a2;
a5=a1-a2;
a2=tmp2;
a1=tmp1;
//step 5
blk[0]=(a4+a0);
blk[1]=(a3+a2);
blk[2]=(a5-a1);
blk[3]=(a6-a7);
blk[4]=(a6+a7);
blk[5]=(a5+a1);
blk[6]=(a3-a2);
blk[7]=(a4-a0);
// return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -