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

📄 mp4_recon.c

📁 基于MPEG4的DIVX解码模块
💻 C
📖 第 1 页 / 共 2 页
字号:
		"sdr	$10,0($5);"
		"move	$10,$12;"

		"daddu	$11,$11,$13;"
		"daddu	$11,$11,$15;"
		"sdr	$11,8($5);"
		"move	$11,$13;"
		
		"add	$5,$5,$6;" 


"bgtz $2,bucle13;");
} 

static void CopyMBlockHorVer(unsigned char * Src, unsigned char * Dst, int Stride) 
{ 

__asm (	"addi	$2,$0,+16;" 
	  // 0x0101 0101 0101 0101

		"li		$24,0x01010101;"
		"dsll	$24,$24,32;"
		"dsrl	$10,$24,32;"
		"or		$24,$24,$10;"

		// 0xFEFE FEFE FEFE FEFE

		"nor	$25,$24,$0;"

		//first line preprocessing
		
		"uld	$7,0($4);" 
		"uld	$9,1($4);"
		"uld	$10,8($4);" 
		"uld	$11,9($4);"

		"and	$7,$7,$25;" 
		"and	$9,$9,$25;" 
		"and	$10,$10,$25;" 
		"and	$11,$11,$25;" 

		"dsrl	$7,$7,1;" 
		"dsrl	$9,$9,1;" 
		"dsrl	$10,$10,1;" 
		"dsrl	$11,$11,1;" 

		"daddu	$7,$7,$9;"
		"daddu	$10,$10,$11;"

		"and	$7,$7,$25;"
		"and	$10,$10,$25;" 

		"dsrl	$7,$7,1;"
		"dsrl	$10,$10,1;" 

"bucle14:addu	$4,$4,$6;"
	
		"uld	$12,0($4);" 
		"uld	$13,1($4);"
		"uld	$14,8($4);" 
		"uld	$15,9($4);"

		"and	$12,$12,$25;"
		"and	$13,$13,$25;"
		"and	$14,$14,$25;"
		"and	$15,$15,$25;"

		"dsrl	$12,$12,1;"
		"dsrl	$13,$13,1;"
		"dsrl	$14,$14,1;"
		"dsrl	$15,$15,1;"

		".set noreorder;"
		"cache	13,0($5);"
		".set reorder;"

		"daddu	$12,$12,$13;"
		"daddu	$14,$14,$15;"	

		"and	$12,$12,$25;" 
		"and	$14,$14,$25;" 

		"dsrl	$12,$12,1;" 
		"dsrl	$14,$14,1;"

		"daddu	$7,$7,$12;"
		"daddu	$7,$7,$24;"//add 1
		"sdr	$7,0($5);"
		"move	$7,$12;"

		"daddu	$10,$10,$14;"
		"daddu	$10,$10,$24;"//add 1
		"sdr	$10,8($5);"
		"move	$10,$14;"

		"addi	$2,$2,-1;" 
		"add	$5,$5,$6;" 

"bgtz	$2,bucle14;");  

} 

static void CopyMBlockHorVerRound(unsigned char * Src, unsigned char * Dst, int Stride) 
{ 

__asm (	"addi	$2,$0,+16;" 

	  // 0x0101 0101 0101 0101

		"li		$24,0x01010101;"
		"dsll	$24,$24,32;"
		"dsrl	$10,$24,32;"
		"or		$24,$24,$10;"

		// 0xFEFE FEFE FEFE FEFE

		"nor	$25,$24,$0;"

		//line preprocessing

		"uld	$7,0($4);" 
		"uld	$9,1($4);"
		"uld	$10,8($4);" 
		"uld	$11,9($4);"

		"and	$7,$7,$25;" 
		"and	$9,$9,$25;" 
		"and	$10,$10,$25;" 
		"and	$11,$11,$25;" 

		"dsrl	$7,$7,1;" 
		"dsrl	$9,$9,1;"
		"dsrl	$10,$10,1;" 
		"dsrl	$11,$11,1;" 

		"daddu	$7,$7,$9;"
		"daddu	$7,$7,$24;"
		"daddu	$10,$10,$11;"
		"daddu	$10,$10,$24;"
	
		"and	$7,$7,$25;" 
		"and	$10,$10,$25;" 

		"dsrl	$7,$7,1;"
		"dsrl	$10,$10,1;"

"bucle15:add	$4,$4,$6;" 
		"uld	$12,0($4);" 
		"uld	$13,1($4);"
		"uld	$14,8($4);" 
		"uld	$15,9($4);"
		
		"and	$12,$12,$25;"
		"and	$13,$13,$25;"
		"and	$14,$14,$25;"
		"and	$15,$15,$25;"

		"dsrl	$12,$12,1;"
		"dsrl	$13,$13,1;"
		"dsrl	$14,$14,1;"
		"dsrl	$15,$15,1;"

		"daddu	$12,$12,$13;"
		"daddu	$12,$12,$24;"
		"daddu	$14,$14,$15;"
		"daddu	$14,$14,$24;"
		
		"and	$12,$12,$25;" 
		"and	$14,$14,$25;"

		".set noreorder;"
		"cache	13,0($5);"
		".set reorder;"

		"dsrl	$12,$12,1;" 
		"dsrl	$14,$14,1;"

		"daddu	$7,$7,$12;"
		"sdr	$7,0($5);"
		"move	$7,$12;"

		"daddu	$10,$10,$14;"
		"sdr	$10,8($5);"
		"move	$10,$14;"

		"addi	$2,$2,-1;" 
		"add	$5,$5,$6;" 

"bgtz	$2,bucle15;");  

  }


#else
#define _ALIGNEDLOAD(a)  ((Src[a]>>Right_Shift)|(Src[a+1]<<Left_Shift))
/*
void CopyBlock(unsigned int *Src, unsigned int *Dst, int Stride)
{
	int dy;
	int Right_Shift;
	int Left_Shift;
	Right_Shift=((unsigned int)Src)&3;
	Stride>>=2;
	if (!Right_Shift)
	{
		for (dy = 0; dy < 8; dy++) 
		{
			Dst[0] = Src[0];
			Dst[1] = Src[1];
		
			Dst += Stride;
			Src += Stride;
		}
	}
	else
	{
		Left_Shift=4-Right_Shift;
		Right_Shift<<=3;
		Left_Shift<<=3;
		Src= (unsigned int*)(((unsigned int)Src)&0xFFFFFFFC);
		for (dy = 0; dy < 8; dy++) 
		{
			Dst[0] = _ALIGNEDLOAD(0) ;
			Dst[1] = _ALIGNEDLOAD(1) ;
		
			Dst += Stride;
			Src += Stride;
		}
	}
}

void CopyMBlock(unsigned int * Src, unsigned int * Dst, int Stride)
{
	int dy, Right_Shift, Left_Shift;
	Right_Shift=((unsigned int)Src)&3;
	Stride>>=2;
	if (!Right_Shift)
	{
		for (dy = 0; dy < 16; dy++) 
		{
			Dst[0] = Src[0];
			Dst[1] = Src[1];
			Dst[2] = Src[2];
			Dst[3] = Src[3];

			Dst += Stride;
			Src += Stride;
		}
	}
	else
	{
		Left_Shift=4-Right_Shift;
		Right_Shift<<=3;
		Left_Shift<<=3;
		Src= (unsigned int*)(((unsigned int)Src)&0xFFFFFFFC);
		for (dy = 0; dy < 16; dy++) 
		{
			Dst[0] = _ALIGNEDLOAD(0);
			Dst[1] = _ALIGNEDLOAD(1);
			Dst[2] = _ALIGNEDLOAD(2);
			Dst[3] = _ALIGNEDLOAD(3);
		
			Dst += Stride;
			Src += Stride;
		}
	}
} 
void CopyBlockHorVerRound(unsigned char * Src, unsigned char * Dst, int Stride)
{
	int dy, dx;
	unsigned char * D=Dst;
	unsigned char * S=Src;
	int last;
	for (dx = 0; dx <8; dx++) {
		S=Src;
		D=Dst;
		last=S[dx] + S[dx+1];
		for (dy = 0; dy < 8; dy++) {
			int next=S[dx+Stride] + S[dx+Stride+1];
			D[dx] = (last + next+1) >> 2; // horver interpolation with rounding
			last=next;
			S += Stride;
			D += Stride;
		}
	}
}
*/
#ifndef ARM_ASM
void CopyBlock(unsigned char * Src, unsigned char * Dst, int Stride)
{
	int dy;
	for (dy = 0; dy < 8; dy++) 
	{
		Dst[0] = Src[0];
		Dst[1] = Src[1];
		Dst[2] = Src[2];
		Dst[3] = Src[3];
		Dst[4] = Src[4];
		Dst[5] = Src[5];
		Dst[6] = Src[6];
		Dst[7] = Src[7];

		Dst += Stride;
		Src += Stride;
	}
}

/**/
void CopyBlockHor(unsigned char * Src,unsigned char * Dst, int Stride)
{
	int dy, dx;

	for (dy = 8; dy != 0; dy--) {
		for (dx = 0; dx < 8; dx++) {
			Dst[dx] = (Src[dx] + Src[dx+1]+1) >> 1; // hor interpolation with rounding
		}
		Src += Stride;
		Dst += Stride;
	}
}
/**/
void CopyBlockVer(unsigned char * Src, unsigned char * Dst, int Stride)
{
	int dy, dx;

	for (dy = 8; dy != 0; dy--) {
		for (dx = 0; dx < 8; dx++) {
			Dst[dx] = (Src[dx] + Src[dx+Stride] +1) >> 1; // ver interpolation with rounding
		}
		Src += Stride;
		Dst += Stride;
	}
}
/**/
void CopyBlockHorVer(unsigned char * Src, unsigned char * Dst, int Stride)
{
	int dy, dx;

	for (dy = 8; dy != 0; dy--) {
		for (dx = 0; dx < 8; dx++) {
			Dst[dx] = (Src[dx] + Src[dx+1] + 
								Src[dx+Stride] + Src[dx+Stride+1] +2) >> 2; // horver interpolation with rounding
		}
		Src += Stride;
		Dst += Stride;
	}
}
/**/
void CopyBlockHorRound(unsigned char * Src, unsigned char * Dst, int Stride)
{
	int dy, dx;

	for (dy = 8; dy != 0; dy--) {
		for (dx = 0; dx < 8; dx++) {
			Dst[dx] = (Src[dx] + Src[dx+1]) >> 1; // hor interpolation with rounding
		}
		Src += Stride;
		Dst += Stride;
	}
}
/**/
void CopyBlockVerRound(unsigned char * Src, unsigned char * Dst, int Stride)
{
	int dy, dx;

	for (dy = 8; dy != 0; dy--) {
		for (dx = 0; dx < 8; dx++) {
			Dst[dx] = (Src[dx] + Src[dx+Stride]) >> 1; // ver interpolation with rounding
		}
		Src += Stride;
		Dst += Stride;
	}
}
void CopyBlockHorVerRound(unsigned char * Src, unsigned char * Dst, int Stride)
{
	int dy, dx;

	for (dy = 8; dy != 0; dy--) {
		for (dx = 0; dx < 8; dx++) {
			Dst[dx] = (Src[dx] + Src[dx+1] + 
								Src[dx+Stride] + Src[dx+Stride+1] +1) >> 2; // horver interpolation with rounding
		}
		Src += Stride;
		Dst += Stride;
	}
}

/**/
/** *** **/
// this routine now in CopyMBlock.obj (asm)
void CopyMBlock(unsigned char * Src, unsigned char * Dst, int Stride)
{
	int dy;

	for (dy = 0; dy < 16; dy++) {
		Dst[0] = Src[0];
		Dst[1] = Src[1];
		Dst[2] = Src[2];
		Dst[3] = Src[3];
		Dst[4] = Src[4];
		Dst[5] = Src[5];
		Dst[6] = Src[6];
		Dst[7] = Src[7];
		Dst[8] = Src[8];
		Dst[9] = Src[9];
		Dst[10] = Src[10];
		Dst[11] = Src[11];
		Dst[12] = Src[12];
		Dst[13] = Src[13];
		Dst[14] = Src[14];
		Dst[15] = Src[15];

		Dst += Stride;
		Src += Stride;
	}
} 
/**/
void CopyMBlockHor(unsigned char * Src, unsigned char * Dst, int Stride)
{
	int dy, dx;

	for (dy = 16; dy != 0; dy--) {
		for (dx = 0; dx < 16; dx++) {
			Dst[dx] = (Src[dx] + Src[dx+1]+1) >> 1; // hor interpolation with rounding
		}
		Src += Stride;
		Dst += Stride;
	}
}
/**/
void CopyMBlockVer(unsigned char * Src, unsigned char * Dst, int Stride)
{
	int dy, dx;

	for (dy = 16; dy != 0; dy--) {
		for (dx = 0; dx < 16; dx++) {
			Dst[dx] = (Src[dx] + Src[dx+Stride] +1) >> 1; // ver interpolation with rounding
		}
		Src += Stride;
		Dst += Stride;
	}
}

void CopyMBlockHorRound(unsigned char * Src, unsigned char * Dst, int Stride)
{
	int dy, dx;

	for (dy = 16; dy != 0; dy--) {
		for (dx = 0; dx < 16; dx++) {
			Dst[dx] = (Src[dx] + Src[dx+1]) >> 1; // hor interpolation with rounding
		}
		Src += Stride;
		Dst += Stride;
	}
}
/**/
void CopyMBlockVerRound(unsigned char * Src, unsigned char * Dst, int Stride)
{
	int dy, dx;

	for (dy = 16; dy != 0; dy--) {
		for (dx = 0; dx < 16; dx++) {
			Dst[dx] = (Src[dx] + Src[dx+Stride]) >> 1; // ver interpolation with rounding
		}
		Src += Stride;
		Dst += Stride;
	}
}
void CopyMBlockHorVer(unsigned char * Src, unsigned char * Dst, int Stride)
{
	int dy, dx;

	for (dy = 16; dy != 0; dy--) {
		for (dx = 0; dx < 16; dx++) {
			Dst[dx] = (Src[dx] + Src[dx+1] + 
								Src[dx+Stride] + Src[dx+Stride+1] +2) >> 2; // horver interpolation with rounding
		}
		Src += Stride;
		Dst += Stride;
	}
}
void CopyMBlockHorVerRound(unsigned char * Src, unsigned char * Dst, int Stride)
{
	int dy, dx;

	for (dy = 16; dy != 0; dy--) {
		for (dx = 0; dx < 16; dx++) {
			Dst[dx] = (Src[dx] + Src[dx+1] + 
								Src[dx+Stride] + Src[dx+Stride+1] +1) >> 2; // horver interpolation with rounding
		}
		Src += Stride;
		Dst += Stride;
	}
}
#endif
#endif


/**/

static void recon_comp (unsigned char *src, unsigned char *dst, int lx, int w, int x, int y, int dx, int dy);

/**/

void reconstruct (int x, int y, int mode)
{
	int dx, dy;
	unsigned char comp;
	unsigned short px, py;
	int acc_x=0,acc_y=0;
		
	// Luma
	
	px = x << 4;
	py = y << 4;
	if (mode == INTER4V)
	{
		for (comp = 0; comp < 4; comp++)
		{
			dx = MV[x][comp];
			dy = dx>>16;
			dx = (dx<<16)>>16;
			
			acc_x+=dx;
			acc_y+=dy;

			recon_comp (frame_for[0], frame_ref[0], mp4_hdr.coded_picture_width, 8, px + ((comp & 1) << 3), py + ((comp & 2) << 2), dx, dy);
		}
	} else
	{
		dx = MV[x][0];
		dy = dx>>16;
		dx = (dx<<16)>>16;

		recon_comp (frame_for[0], frame_ref[0], mp4_hdr.coded_picture_width, 16, px, py, dx, dy);
	}

	// Chr
	px = x << 3;
	py = y << 3;
	if (mode == INTER4V)
	{
		if (acc_x == 0) dx = 0;
		else
			dx = sign (acc_x) * (roundtab[abs (acc_x) & 0xF] + ((abs (acc_x) >> 4) <<1));
		
		if (acc_y == 0)	dy = 0;
		else
			dy = sign (acc_y) * (roundtab[abs (acc_y) & 0xF] + ((abs (acc_y) >> 4) <<1));
	} else
	{
		// chroma rounding 
		dx = ((dx & 0x3) == 0 ? dx >> 1 : (dx >> 1) | 1);
		dy = ((dy & 0x3) == 0 ? dy >> 1 : (dy >> 1) | 1);
	}

	recon_comp (frame_for[1], frame_ref[1], mp4_hdr.coded_picture_width>>1, 8, px, py, dx, dy);
	recon_comp (frame_for[2], frame_ref[2], mp4_hdr.coded_picture_width>>1, 8, px, py, dx, dy);
}

/**/
int total;
static void recon_comp (unsigned char *src, unsigned char *dst, 
                        int lx, int w, int x, 
                        int y, int dx, int dy)
{
	unsigned char *s, *d;
	int mc_driver;
	//int t=GetTickCount();
	// origins 
	s = src + lx * (y + (dy >> 1)) + x + (dx >> 1);
	d = dst + lx * y + x;

	mc_driver = ((w!=8)<<3) | (mp4_hdr.rounding_type<<2) | ((dy & 1)<<1) | (dx & 1);

	switch (mc_driver)
		{
			// block
			// no round
			case 0: case 4:
 				CopyBlock(s, d, lx);
				break;
			case 1:
				CopyBlockHor(s, d, lx);
				break;
			case 2:
				CopyBlockVer(s, d, lx);
				break;
			case 3:
				CopyBlockHorVer(s, d, lx);
				break;
				// round
			case 5:
				CopyBlockHorRound(s, d, lx);
				break;
			case 6:
				CopyBlockVerRound(s, d, lx);
				break;
			case 7:
				CopyBlockHorVerRound(s, d, lx);
				break;
		// macroblock
			// no round
			case 8: case 12:
				CopyMBlock(s, d, lx);
				break;
			case 9:
				CopyMBlockHor(s, d, lx);
				break;
			case 10:
				CopyMBlockVer(s, d, lx);
				break;
			case 11:
				CopyMBlockHorVer(s, d, lx);
				break;
			// round
			case 13:
				CopyMBlockHorRound(s, d, lx);
				return;
			case 14:
				CopyMBlockVerRound(s, d, lx);
				break;
			default : //15
				CopyMBlockHorVerRound(s, d, lx);
				break;
		}
		//total+=GetTickCount()-t;
}

⌨️ 快捷键说明

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