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

📄 1.txt

📁 用于实现H.264中的DCT变换/量化/反DCT变换/反量化源码
💻 TXT
字号:
#include <stdio.h>
#include <math.h>

void main()
{
	int i,j;
	
	const double a=0.5;
	const double b=sqrt(0.4);
	
	int QP=4;	//

	int D[4][4];
	int W[4][4];
	int Z[4][4];
	float Wi[4][4];
	float Di[4][4];
	float Xi[4][4];
	
	int X[4][4]=
	{
		{5 , 11, 8 , 10},
		{9 , 8 , 4 , 12},
		{1 , 10, 11, 4 },
		{19, 6,  15, 7 }
		
	};
	
	int Cf[4][4]=
	{
		{1, 1,  1, 1},
		{2, 1, -1, -2},
		{1,-1, -1, 1},
		{1,-2,  2, -1}
	};
	
	int Cft[4][4]=
	{
		{1, 2,  1, 1 },
		{1, 1, -1, -2},
		{1,-1, -1, 2},
		{1,-2,  1, -1}
	};

	float Ci[4][4]=
	{
		{2,  2,  2, 1 },
		{2,  1, -2, -2},
		{2, -1, -2, 2 },
		{2, -2,  2, -1}
	};
	
	float Cit[4][4]=
	{
		{2 ,  2 ,  2,  2 },
		{2 ,  1 , -1, -2 },
		{2 , -2 , -2,  2 },
		{1 , -2 ,  2, -1 }
	};

	int MF[6][6]=
	{
		{13107, 5243, 8066},
		{11916, 4660, 7490},
		{10082, 4194, 6554},
		{9362,  3647, 5825},
		{8192,  3355, 5243},
		{7282,  2893, 4559}
	};

	int V[6][6]=
	{
		{10, 16, 13 },
		{11, 18, 14 },
		{13, 20, 16 },
		{14, 23, 18 },
		{16, 25, 20 },
		{18, 29, 23 }
	};
	
	int matrix_multiply(int a[4][4],int b[4][4],int c[4][4]);
	float  matrix_multiply_f(float a[4][4],float b[4][4],float c[4][4]);
	void matrix_display(int a[4][4]);
	void matrix_display_f(float a[4][4]);


	matrix_multiply(Cf,X,D);	//
	matrix_multiply(D,Cft,W);	//
	
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
		{
			int sign=1;
		//	int qbits=15+int(QP/6);
			int qbits=16;  //2005.6.21:: why the qbits is 16(H.264 white-paper) not 15?
			int mf,k;	//

			int f=(int)(pow(2,qbits)/3);
			
			if(W[i][j]<0)
			{
				sign=-1;
				W[i][j]*=-1;
			}

			if((i==0||i==2)&&(j==0||j==2))
				k=0;
			else
				if((i==1||i==3)&&(j==1||j==3))
					k=1;
				else
					k=2;

			mf=MF[QP][k];

			Z[i][j]=(W[i][j]*mf+f)>>qbits;
			Z[i][j]*=sign;
		}

	printf("\nDisplay the matrix Z[4][4]:\n");
	matrix_display(Z);

	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
		{
			int v,k,f,t;	//

			t=(int)((float)QP/6+0.5);		//
			f=(int)pow(2,t);		        //

			if((i==0||i==2)&&(j==0||j==2))
				k=0;
			else
				if((i==1||i==3)&&(j==1||j==3))
					k=1;
				else
					k=2;

			v=V[QP][k];
			Wi[i][j]=Z[i][j]*v*f;
		}
		
		printf("\nDisplay the matrix Wi[4][4]:\n");
		matrix_display_f(Wi);
		
		matrix_multiply_f(Ci,Wi,Di);	//
		matrix_multiply_f(Di,Cit,Xi);	//
		
		for(i=0;i<4;i++)
			for(j=0;j<4;j++)
				Xi[i][j]/=64;	
		matrix_display_f(Xi);
}

// multiply the matrix of a and b
int  matrix_multiply(int a[4][4],int b[4][4],int c[4][4])
{
	int i,j,k;
	
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
		{
			c[i][j]=0;
			for(k=0;k<4;k++)	
				c[i][j]+=a[i][k]*b[k][j];
		}
	return 0;
}

// multiply the matrix of a and b
float  matrix_multiply_f(float a[4][4],float b[4][4],float c[4][4])
{
	int i,j,k;
	
	for(i=0;i<4;i++)
		for(j=0;j<4;j++)
		{
			c[i][j]=0;
			for(k=0;k<4;k++)	
				c[i][j]+=a[i][k]*b[k][j];
		}
	return 0;
}

void matrix_display(int a[4][4])
{
	int i,j;
	printf("=====================================================\n");
    for(i=0;i<4;i++)
		for(j=0;j<4;j++)
		{
			printf("%d\t",(int)a[i][j]);
			if(j==3) 
				printf("\n");
		}
	printf("=====================================================\n");
}

void matrix_display_f(float a[4][4])
{
	int i,j;
	printf("=====================================================\n");
    for(i=0;i<4;i++)
		for(j=0;j<4;j++)
		{
			printf("%d\t",(int)a[i][j]);
			if(j==3) 
				printf("\n");
		}
	printf("=====================================================\n");
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -