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

📄 idct.c

📁 DM642的mpeg4编码
💻 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 + -