⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iquant_idct.c

📁 代码实现了基于ARM7的MPEG-4视频解码器
💻 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 + -