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

📄 dct.c

📁 文件内包含H.263视频编码算法和解码算法2个文件
💻 C
📖 第 1 页 / 共 3 页
字号:
#include "macros.h"#include "sim.h"#include "global_e.h"
#include "TMConfig.h"
#include <math.h>#ifndef PI# ifdef M_PI#  define PI M_PI# else#  define PI 3.14159265358979323846# endif#endifint	zigzag[8][8] = 
{	{0, 1, 5, 6,14,15,27,28},	{2, 4, 7,13,16,26,29,42},	{3, 8,12,17,25,30,41,43},	{9,11,18,24,31,40,44,53},	{10,19,23,32,39,45,52,54},	{20,22,33,38,46,51,55,60},	{21,34,37,47,50,56,59,61},	{35,36,48,49,57,58,62,63},};
static short coef[8][4] = 
{
	0x2d41, 0x2d41, 0x2d41, 0x2d41,
		0x3ec5, 0x3537, 0x238e, 0xc7c,
		0x3b21, 0x187d,-0x187d,-0x3b21,
		0x3537,-0xc7c, -0x3ec5,-0x238e,
		0x2d41,-0x2d41,-0x2d41, 0x2d41,
		0x238e,-0x3ec5, 0xc7c,  0x3537,
		0x187d,-0x3b21, 0x3b21,-0x187d,
		0xc7c, -0x238e, 0x3537,-0x3ec5
};

static short icoef[8][4] =
{  
    0x2d41, 0x3b21, 0x2d41, 0x187e, 0x3ec5, 0x3537, 0x238e, 0xc7c,
		0x2d41, 0x187e,-0x2d41,-0x3b21, 0x3537,-0xc7c, -0x3ec5,-0x238e,
		0x2d41,-0x187e,-0x2d41, 0x3b21, 0x238e,-0x3ec5, 0xc7c,  0x3537,
		0x2d41,-0x3b21, 0x2d41,-0x187e, 0xc7c, -0x238e, 0x3537,-0x3ec5
};
int Dct( short int *block, short int *coeff){	int   j1, i, j, k;	float	b[8];	float b1[8];	float d[8][8];	float f0=(float).7071068;	float f1=(float).4903926;	float f2=(float).4619398;	float f3=(float).4157348;	float f4=(float).3535534;	float f5=(float).2777851;	float f6=(float).1913417;	float f7=(float).0975452;
		for (i = 0, k = 0; i < 8; i++, k += 8) 
	{		for (j = 0; j < 8; j++) 
		{			b[j] = (float)block[k+j];		}		/* Horizontal transform */		for (j = 0; j < 4; j++) 
		{			j1 = 7 - j;			b1[j] = b[j] + b[j1];			b1[j1] = b[j] - b[j1];		}		b[0] = b1[0] + b1[3];		b[1] = b1[1] + b1[2];		b[2] = b1[1] - b1[2];		b[3] = b1[0] - b1[3];		b[4] = b1[4];		b[5] = (b1[6] - b1[5]) * f0;		b[6] = (b1[6] + b1[5]) * f0;		b[7] = b1[7];		d[i][0] = (b[0] + b[1]) * f4;		d[i][4] = (b[0] - b[1]) * f4;		d[i][2] = b[2] * f6 + b[3] * f2;		d[i][6] = b[3] * f6 - b[2] * f2;		b1[4] = b[4] + b[5];		b1[7] = b[7] + b[6];		b1[5] = b[4] - b[5];		b1[6] = b[7] - b[6];		d[i][1] = b1[4] * f7 + b1[7] * f1;		d[i][5] = b1[5] * f3 + b1[6] * f5;		d[i][7] = b1[7] * f7 - b1[4] * f1;		d[i][3] = b1[6] * f3 - b1[5] * f5;	}	/* Vertical transform */	for (i = 0; i < 8; i++) 
	{		for (j = 0; j < 4; j++) 
		{			j1 = 7 - j;			b1[j] = d[j][i] + d[j1][i];			b1[j1] = d[j][i] - d[j1][i];		}		b[0] = b1[0] + b1[3];		b[1] = b1[1] + b1[2];		b[2] = b1[1] - b1[2];		b[3] = b1[0] - b1[3];		b[4] = b1[4];		b[5] = (b1[6] - b1[5]) * f0;		b[6] = (b1[6] + b1[5]) * f0;		b[7] = b1[7];		d[0][i] = (b[0] + b[1]) * f4;		d[4][i] = (b[0] - b[1]) * f4;		d[2][i] = b[2] * f6 + b[3] * f2;		d[6][i] = b[3] * f6 - b[2] * f2;		b1[4] = b[4] + b[5];		b1[7] = b[7] + b[6];		b1[5] = b[4] - b[5];		b1[6] = b[7] - b[6];		d[1][i] = b1[4] * f7 + b1[7] * f1;		d[5][i] = b1[5] * f3 + b1[6] * f5;		d[7][i] = b1[7] * f7 - b1[4] * f1;		d[3][i] = b1[6] * f3 - b1[5] * f5;	}	/* Zigzag - scanning */	for (i = 0; i < 8; i++) 
	{		for (j = 0; j < 8; j++) 
		{			*(coeff + zigzag[i][j]) = (int)(d[i][j]);		}	}
		return 0;}
int idct(short int *coeff,short int *block){	int    j1, i, j;	double b[8], b1[8], d[8][8];	double f0=.7071068;	double f1=.4903926;	double f2=.4619398;	double f3=.4157348;	double f4=.3535534;	double f5=.2777851;	double f6=.1913417;	double f7=.0975452;	double e, f, g, h;		/* Horizontal */		/* Descan coefficients first */
		for (i = 0; i < 8; i++) 
	{		for (j = 0; j < 8; j++) 
		{			b[j] = *( coeff + zigzag[i][j]);		}		e = b[1] * f7 - b[7] * f1;		h = b[7] * f7 + b[1] * f1;		f = b[5] * f3 - b[3] * f5;		g = b[3] * f3 + b[5] * f5;				b1[0] = (b[0] + b[4]) * f4;		b1[1] = (b[0] - b[4]) * f4;		b1[2] = b[2] * f6 - b[6] * f2;		b1[3] = b[6] * f6 + b[2] * f2;		b[4] = e + f;		b1[5] = e - f;		b1[6] = h - g;		b[7] = h + g;				b[5] = (b1[6] - b1[5]) * f0;		b[6] = (b1[6] + b1[5]) * f0;		b[0] = b1[0] + b1[3];		b[1] = b1[1] + b1[2];		b[2] = b1[1] - b1[2];		b[3] = b1[0] - b1[3];				for (j = 0; j < 4; j++)
		{			j1 = 7 - j;			d[i][j] = b[j] + b[j1];			d[i][j1] = b[j] - b[j1];		}	}		/* Vertical */		for (i = 0; i < 8; i++) 
	{		for (j = 0; j < 8; j++) 
		{			b[j] = d[j][i];		}		e = b[1] * f7 - b[7] * f1;		h = b[7] * f7 + b[1] * f1;		f = b[5] * f3 - b[3] * f5;		g = b[3] * f3 + b[5] * f5;				b1[0] = (b[0] + b[4]) * f4;		b1[1] = (b[0] - b[4]) * f4;		b1[2] = b[2] * f6 - b[6] * f2;		b1[3] = b[6] * f6 + b[2] * f2;		b[4] = e + f;		b1[5] = e - f;		b1[6] = h - g;		b[7] = h + g;				b[5] = (b1[6] - b1[5]) * f0;		b[6] = (b1[6] + b1[5]) * f0;		b[0] = b1[0] + b1[3];		b[1] = b1[1] + b1[2];		b[2] = b1[1] - b1[2];		b[3] = b1[0] - b1[3];				for (j = 0; j < 4; j++) 
		{			j1 = 7 - j;			d[j][i] = b[j] + b[j1];			d[j1][i] = b[j] - b[j1];		}	}		for (i = 0; i < 8; i++) 
	{		for (j = 0; j < 8; j++) 
		{			*(block + i * 8 + j) = mnint(d[i][j]);		}	}
		return 0;}
int Dct_MY(short *block, short *coeff)
{
	short sfb[8][8],*fbs,*blk;
	int *m,*fa,*fb,i,j,*c,*fs;
	int p0,  p1,  p2,  p3,  p4,  p5,  p6,  p7,
		p8,  p9,  p10, p11, p12, p13, p14, p15,
		p16, p17, p18, p19, p20, p21, p22, p23,
		p24, p25, p26, p27, p28, p29, p30, p31;
	int q0,  q1,  q2,  q3,  q4,  q5,  q6,  q7,
		q8,  q9,  q10, q11, q12, q13, q14, q15,
		q16, q17, q18, q19, q20, q21, q22, q23,
		q24, q25, q26, q27, q28, q29, q30, q31;
	int temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7;
	int add0, add1, add2, add3, add4, add5, add6, add7;
	
	m = (int *)block;
	fb = (int *)sfb; 
	c = (int *)coef;
	fbs = (short *)sfb;
	blk = coeff;
	
	m = (int *)block;
	p4 = PACK16MSB(m[4],m[0]);
	p0 = PACK16LSB(m[4],m[0]);
	p5 = PACK16MSB(m[5],m[1]);
	p1 = PACK16LSB(m[5],m[1]);
	p6 = PACK16MSB(m[6],m[2]);
	p2 = PACK16LSB(m[6],m[2]);
	p7 = PACK16MSB(m[7],m[3]);
	p3 = PACK16LSB(m[7],m[3]);
	p12 = PACK16MSB(m[12],m[8]);
	p8 = PACK16LSB(m[12],m[8]);
	p13 = PACK16MSB(m[13],m[9]);
	p9 = PACK16LSB(m[13],m[9]);
	p14 = PACK16MSB(m[14],m[10]);
	p10 = PACK16LSB(m[14],m[10]);
	p15 = PACK16MSB(m[15],m[11]);
	p11 = PACK16LSB(m[15],m[11]);
	p20 = PACK16MSB(m[20],m[16]);
	p16 = PACK16LSB(m[20],m[16]);
	p21 = PACK16MSB(m[21],m[17]);
	p17 = PACK16LSB(m[21],m[17]);
	p22 = PACK16MSB(m[22],m[18]);
	p18 = PACK16LSB(m[22],m[18]);
	p23 = PACK16MSB(m[23],m[19]);
	p19 = PACK16LSB(m[23],m[19]);
	p28 = PACK16MSB(m[28],m[24]);
	p24 = PACK16LSB(m[28],m[24]);
	p29 = PACK16MSB(m[29],m[25]);
	p25 = PACK16LSB(m[29],m[25]);
	p30 = PACK16MSB(m[30],m[26]);
	p26 = PACK16LSB(m[30],m[26]);
	p31 = PACK16MSB(m[31],m[27]);
	p27 = PACK16LSB(m[31],m[27]);	
	
	q1 = p8;   q8 = p1;
	q5 = p12;  q12 = p5;
	q2 = p16;  q16 = p2;
	q6 = p20;  q20 = p6;
	q3 = p24;  q24 = p3;
	q7 = p28;  q28 = p7;
	q10 = p17; q17 = p10;
	q14 = p21; q21 = p14;
	q11 = p25; q25 = p11;
	q15 = p29; q29 = p15;
	q19 = p26; q26 = p19;
	q23 = p30; q30 = p23;
	q0 = p0;   q4 = p4;
	q9 = p9;   q13 = p13;
	q18 = p18; q22 = p22;
	q27 = p27; q31 = p31;
	
	temp0 = ROL(q3,16);
	temp1 = ROL(q2,16);
	temp2 = ROL(q7,16);
	temp3 = ROL(q6,16);
	temp4 = ROL(q11,16);
	temp5 = ROL(q10,16);
	temp6 = ROL(q15,16);
	temp7 = ROL(q14,16);
	
	p0 = DSPIDUALADD(q0,temp0);
	p1 = DSPIDUALADD(q1,temp1);
	p2 = DSPIDUALADD(q4,temp2);
	p3 = DSPIDUALADD(q5,temp3);
	p4 = DSPIDUALADD(q8,temp4);
	p5 = DSPIDUALADD(q9,temp5);
	p6 = DSPIDUALADD(q12,temp6);
	p7 = DSPIDUALADD(q13,temp7);
	
	p16 = DSPIDUALSUB(q0,temp0);
	p17 = DSPIDUALSUB(q1,temp1);
	p18 = DSPIDUALSUB(q4,temp2);
	p19 = DSPIDUALSUB(q5,temp3);
	p20 = DSPIDUALSUB(q8,temp4);
	p21 = DSPIDUALSUB(q9,temp5);
	p22 = DSPIDUALSUB(q12,temp6);
	p23 = DSPIDUALSUB(q13,temp7);	
	
	temp0 = ROL(q19,16);
	temp1 = ROL(q18,16);
	temp2 = ROL(q23,16);
	temp3 = ROL(q22,16);
	temp4 = ROL(q27,16);
	temp5 = ROL(q26,16);
	temp6 = ROL(q31,16);
	temp7 = ROL(q30,16);
	
	p8 = DSPIDUALADD(q16,temp0);
	p9 = DSPIDUALADD(q17,temp1);
	p10 = DSPIDUALADD(q20,temp2);
	p11 = DSPIDUALADD(q21,temp3);
	p12 = DSPIDUALADD(q24,temp4);
	p13 = DSPIDUALADD(q25,temp5);
	p14 = DSPIDUALADD(q28,temp6);
	p15 = DSPIDUALADD(q29,temp7);
	
	p24 = DSPIDUALSUB(q16,temp0);
	p25 = DSPIDUALSUB(q17,temp1);
	p26 = DSPIDUALSUB(q20,temp2);
	p27 = DSPIDUALSUB(q21,temp3);
	p28 = DSPIDUALSUB(q24,temp4);
	p29 = DSPIDUALSUB(q25,temp5);
	p30 = DSPIDUALSUB(q28,temp6);
	p31 = DSPIDUALSUB(q29,temp7);
	
	q0 = IFIR16(c[0],p0);
	q1 = IFIR16(c[1],p1);
	q2 = IFIR16(c[0],p2);
	q3 = IFIR16(c[1],p3);
	q4 = IFIR16(c[0],p4);
	q5 = IFIR16(c[1],p5);
	q6 = IFIR16(c[0],p6);
	q7 = IFIR16(c[1],p7);
	
	q8 = IFIR16(c[0],p8);
	q9 = IFIR16(c[1],p9);
	q10 = IFIR16(c[0],p10);
	q11 = IFIR16(c[1],p11);
	q12 = IFIR16(c[0],p12);
	q13 = IFIR16(c[1],p13);
	q14 = IFIR16(c[0],p14);
	q15 = IFIR16(c[1],p15);
	
	add0 = q0+q1;
	add1 = q2+q3;
	add2 = q4+q5;
	add3 = q6+q7;
	add4 = q8+q9;
	add5 = q10+q11;
	add6 = q12+q13;
	add7 = q14+q15;
	
	fbs[0] = ASRI(15,add0);
	fbs[1] = ASRI(15,add1);
	fbs[2] = ASRI(15,add2);
	fbs[3] = ASRI(15,add3);
	fbs[4] = ASRI(15,add4);
	fbs[5] = ASRI(15,add5);
	fbs[6] = ASRI(15,add6);
	fbs[7] = ASRI(15,add7);
	
	q0 = IFIR16(c[4],p0);
	q1 = IFIR16(c[5],p1);
	q2 = IFIR16(c[4],p2);
	q3 = IFIR16(c[5],p3);
	q4 = IFIR16(c[4],p4);
	q5 = IFIR16(c[5],p5);
	q6 = IFIR16(c[4],p6);
	q7 = IFIR16(c[5],p7);
	
	q8 = IFIR16(c[4],p8);
	q9 = IFIR16(c[5],p9);
	q10 = IFIR16(c[4],p10);
	q11 = IFIR16(c[5],p11);
	q12 = IFIR16(c[4],p12);
	q13 = IFIR16(c[5],p13);
	q14 = IFIR16(c[4],p14);
	q15 = IFIR16(c[5],p15);
	
	add0 = q0+q1;
	add1 = q2+q3;
	add2 = q4+q5;
	add3 = q6+q7;
	add4 = q8+q9;
	add5 = q10+q11;
	add6 = q12+q13;
	add7 = q14+q15;
	
	fbs[16] = ASRI(15,add0);
	fbs[17] = ASRI(15,add1);
	fbs[18] = ASRI(15,add2);
	fbs[19] = ASRI(15,add3);
	fbs[20] = ASRI(15,add4);
	fbs[21] = ASRI(15,add5);
	fbs[22] = ASRI(15,add6);
	fbs[23] = ASRI(15,add7);
	
	q0 = IFIR16(c[8],p0);
	q1 = IFIR16(c[9],p1);
	q2 = IFIR16(c[8],p2);
	q3 = IFIR16(c[9],p3);
	q4 = IFIR16(c[8],p4);
	q5 = IFIR16(c[9],p5);
	q6 = IFIR16(c[8],p6);
	q7 = IFIR16(c[9],p7);
	
	q8 = IFIR16(c[8],p8);
	q9 = IFIR16(c[9],p9);
	q10 = IFIR16(c[8],p10);
	q11 = IFIR16(c[9],p11);
	q12 = IFIR16(c[8],p12);
	q13 = IFIR16(c[9],p13);
	q14 = IFIR16(c[8],p14);
	q15 = IFIR16(c[9],p15);
	
	add0 = q0+q1;
	add1 = q2+q3;
	add2 = q4+q5;
	add3 = q6+q7;
	add4 = q8+q9;
	add5 = q10+q11;
	add6 = q12+q13;
	add7 = q14+q15;
	
	fbs[32] = ASRI(15,add0);
	fbs[33] = ASRI(15,add1);
	fbs[34] = ASRI(15,add2);
	fbs[35] = ASRI(15,add3);
	fbs[36] = ASRI(15,add4);
	fbs[37] = ASRI(15,add5);
	fbs[38] = ASRI(15,add6);
	fbs[39] = ASRI(15,add7);
	
	q0 = IFIR16(c[12],p0);
	q1 = IFIR16(c[13],p1);
	q2 = IFIR16(c[12],p2);
	q3 = IFIR16(c[13],p3);
	q4 = IFIR16(c[12],p4);
	q5 = IFIR16(c[13],p5);
	q6 = IFIR16(c[12],p6);
	q7 = IFIR16(c[13],p7);
	
	q8 = IFIR16(c[12],p8);
	q9 = IFIR16(c[13],p9);
	q10 = IFIR16(c[12],p10);
	q11 = IFIR16(c[13],p11);
	q12 = IFIR16(c[12],p12);
	q13 = IFIR16(c[13],p13);
	q14 = IFIR16(c[12],p14);
	q15 = IFIR16(c[13],p15);
	
	add0 = q0+q1;
	add1 = q2+q3;
	add2 = q4+q5;
	add3 = q6+q7;
	add4 = q8+q9;
	add5 = q10+q11;
	add6 = q12+q13;
	add7 = q14+q15;
	
	fbs[48] = ASRI(15,add0);
	fbs[49] = ASRI(15,add1);
	fbs[50] = ASRI(15,add2);
	fbs[51] = ASRI(15,add3);
	fbs[52] = ASRI(15,add4);
	fbs[53] = ASRI(15,add5);
	fbs[54] = ASRI(15,add6);
	fbs[55] = ASRI(15,add7);
	
	c = (int *)coef[1];
	fbs = (short *)sfb[1];
	
	q0 = IFIR16(c[0],p16);
	q1 = IFIR16(c[1],p17);
	q2 = IFIR16(c[0],p18);
	q3 = IFIR16(c[1],p19);
	q4 = IFIR16(c[0],p20);
	q5 = IFIR16(c[1],p21);
	q6 = IFIR16(c[0],p22);
	q7 = IFIR16(c[1],p23);
	
	q8 = IFIR16(c[0],p24);
	q9 = IFIR16(c[1],p25);
	q10 = IFIR16(c[0],p26);
	q11 = IFIR16(c[1],p27);
	q12 = IFIR16(c[0],p28);
	q13 = IFIR16(c[1],p29);
	q14 = IFIR16(c[0],p30);
	q15 = IFIR16(c[1],p31);
	
	add0 = q0+q1;
	add1 = q2+q3;
	add2 = q4+q5;
	add3 = q6+q7;
	add4 = q8+q9;
	add5 = q10+q11;
	add6 = q12+q13;
	add7 = q14+q15;
	
	fbs[0] = ASRI(15,add0);
	fbs[1] = ASRI(15,add1);
	fbs[2] = ASRI(15,add2);
	fbs[3] = ASRI(15,add3);
	fbs[4] = ASRI(15,add4);
	fbs[5] = ASRI(15,add5);
	fbs[6] = ASRI(15,add6);
	fbs[7] = ASRI(15,add7);
	
	q0 = IFIR16(c[4],p16);
	q1 = IFIR16(c[5],p17);
	q2 = IFIR16(c[4],p18);
	q3 = IFIR16(c[5],p19);
	q4 = IFIR16(c[4],p20);
	q5 = IFIR16(c[5],p21);
	q6 = IFIR16(c[4],p22);
	q7 = IFIR16(c[5],p23);
	
	q8 = IFIR16(c[4],p24);
	q9 = IFIR16(c[5],p25);
	q10 = IFIR16(c[4],p26);
	q11 = IFIR16(c[5],p27);
	q12 = IFIR16(c[4],p28);
	q13 = IFIR16(c[5],p29);
	q14 = IFIR16(c[4],p30);
	q15 = IFIR16(c[5],p31);
	
	add0 = q0+q1;
	add1 = q2+q3;
	add2 = q4+q5;
	add3 = q6+q7;
	add4 = q8+q9;
	add5 = q10+q11;
	add6 = q12+q13;
	add7 = q14+q15;
	
	fbs[16] = ASRI(15,add0);
	fbs[17] = ASRI(15,add1);
	fbs[18] = ASRI(15,add2);
	fbs[19] = ASRI(15,add3);
	fbs[20] = ASRI(15,add4);
	fbs[21] = ASRI(15,add5);
	fbs[22] = ASRI(15,add6);
	fbs[23] = ASRI(15,add7);
	

⌨️ 快捷键说明

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