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

📄 basic_prediction.c

📁 代码实现了基于ARM7的MPEG-4视频解码器
💻 C
📖 第 1 页 / 共 2 页
字号:
//**********************************************
//File name:  basic_prediction.c
//Author:     Anna
//Date:
//**********************************************

extern int width;
extern int height;

// Purpose: specialized basic motion compensation routines
void CopyBlock(unsigned char *Src, unsigned char *Dst, int Stride,
			   int xint,int yint,int orgx,int orgy )
{
//	int dy;
	int y;
	int x;
    int new_x,new_y;
#ifndef BIG_ENDIAN
//	char *lpSrc = (char *) Src;
//	char *lpDst = (char *) Dst;
//	int lpStride = Stride;
    int w,h;
//	w=352;h=240;
	w=width;
	h=height;
//	if(Stride<=300) {h=mp4_state->hdr.height>>1;w=mp4_state->hdr.width>>1;}
	
	for (y = 0; y < 8; y++)
	{
		for(x=0;x<8;x++)
		{
			new_x=xint+x+orgx;
			new_y=yint+y+orgy;
			if(new_x<0) 
			    new_x=0;
			else if(new_x>=w) 
				new_x=w-1;
			if(new_y<0) 
				new_y=0;
	        else if(new_y>=h) 
			    new_y=h-1;
			Dst[(orgy+y)*Stride+orgx+x]=Src[new_y*Stride+new_x];
		}
	}

	
#else
	long *lpSrc = (long *) Src;
	long *lpDst = (long *) Dst;
	int lpStride = Stride >> 2;

	for (dy = 0; dy < 8; dy++) {
		lpDst[0] = lpSrc[0];
		lpDst[1] = lpSrc[1];
		lpSrc += lpStride;
		lpDst += lpStride;
	}
#endif
}
/**/
void CopyBlockHor(unsigned char * Src, unsigned char * Dst, int Stride,
				  int xint,int yint,int orgx,int orgy)
{
//	int dy, dx;
	int y;
	int x;
	int new_x,new_y;
	int w,h;

	w=width;
	h=height;
//	if(Stride<=300) {h=mp4_state->hdr.height>>1;w=mp4_state->hdr.width>>1;}

	for (y = 0; y < 8; y++) {
		for (x = 0; x< 8; x++) {
			new_x=xint+x+orgx;
			new_y=yint+y+orgy;

			if(new_x<0)
				new_x=0;
		//	else if(new_x>=w-1)
		//		new_x=w-2;
			if(new_y<0)
				new_y=0;
			else if(new_y>=h)
				new_y=h-1;
		//	Dst[dx] = (Src[dx] + Src[dx+1]+1) >> 1; // hor interpolation with rounding
 if(new_x<w-1)
Dst[(orgy+y)*Stride+orgx+x]=(Src[new_y*Stride+new_x]+
	                          Src[new_y*Stride+new_x+1]+1)>>1;
 else if(new_x>=w-1)
 {
	 new_x=w-1;
Dst[(orgy+y)*Stride+orgx+x]=(Src[new_y*Stride+new_x]+
	                          Src[new_y*Stride+new_x]+1)>>1;
 }
		}
	//	Src += Stride;
	//	Dst += Stride;
	}
}
/**/
void CopyBlockVer(unsigned char * Src, unsigned char * Dst, int Stride,
				  int xint,int yint,int orgx,int orgy)
{
//int dy, dx;
	int y;
	int x;
	int new_x,new_y;
	int w,h;

	w=width;
	h=height;
//	if(Stride<=300) {h=mp4_state->hdr.height>>1;w=mp4_state->hdr.width>>1;}


	for (y = 0; y < 8; y++) {
		for (x = 0; x < 8; x++) {
			new_x=xint+x+orgx;
			new_y=yint+y+orgy;

			if(new_x<0)
				new_x=0;
			else if(new_x>=w)
				new_x=w-1;
			if(new_y<0)
				new_y=0;
		//	else if(new_y>=h-1)
		//		new_y=h-2;
		//	Dst[dx] = (Src[dx] + Src[dx+Stride] +1) >> 1; // ver interpolation with rounding
if(new_y<h-1) 
Dst[(orgy+y)*Stride+orgx+x]=(Src[new_y*Stride+new_x]+
	                       Src[(new_y+1)*Stride+new_x]+1)>>1;
else if(new_y>=h-1)
{
	new_y=h-1;
   Dst[(orgy+y)*Stride+orgx+x]=(Src[new_y*Stride+new_x]+
	                       Src[new_y*Stride+new_x]+1)>>1;
}
		}
	//	Src += Stride;
	//	Dst += Stride;
	}
}

void CopyBlockHorVer(unsigned char * Src, unsigned char * Dst, int Stride,
					 int xint,int yint,int orgx,int orgy)
{
	//int dy, dx;
	int y;
	int x;
	int new_x,new_y;
	int w,h;

	w=width;
	h=height;
//	if(Stride<=300) {h=mp4_state->hdr.height>>1;w=mp4_state->hdr.width>>1;}

	for (y = 0; y < 8; y++) {
		for (x = 0; x < 8; x++) {
            new_x=xint+x+orgx;
			new_y=yint+y+orgy;

			if(new_x<0)
				new_x=0;
		//	else if(new_x>=w-1)
		//		new_x=w-2;
			if(new_y<0)
				new_y=0;
		//	else if(new_y>=h-1)                                                      
		//		new_y=h-2;

		//	Dst[dx] = (Src[dx] + Src[dx+1] + 
		//		Src[dx+Stride] + Src[dx+Stride+1] +2) >> 2; // horver interpolation with rounding
if((new_x<w-1)&&(new_y<h-1))
Dst[(orgy+y)*Stride+orgx+x]=(Src[new_y*Stride+new_x]+Src[new_y*Stride+new_x+1]+
	                   Src[(new_y+1)*Stride+new_x]+Src[(new_y+1)*Stride+new_x+1]+2)>>2;
else if((new_x>=w-1)&&(new_y>=h-1))
{
	new_x=w-1;
	new_y=h-1;
Dst[(orgy+y)*Stride+orgx+x]=(Src[new_y*Stride+new_x]+Src[new_y*Stride+new_x]+
	                   Src[new_y*Stride+new_x]+Src[new_y*Stride+new_x]+2)>>2;

}
else if ((new_x<w-1)&&(new_y>=h-1))
{
	new_y=h-1;
Dst[(orgy+y)*Stride+orgx+x]=(Src[new_y*Stride+new_x]+Src[new_y*Stride+new_x+1]+
	                   Src[new_y*Stride+new_x]+Src[new_y*Stride+new_x+1]+2)>>2;

}
else if((new_x>=w-1)&&(new_y<h-1))
{
	new_x=x-1;
Dst[(orgy+y)*Stride+orgx+x]=(Src[new_y*Stride+new_x]+Src[new_y*Stride+new_x]+
	                   Src[(new_y+1)*Stride+new_x]+Src[(new_y+1)*Stride+new_x]+2)>>2;
}
		}
	//	Src += Stride;
	//	Dst += Stride;
	}
}
/**/
void CopyBlockHorRound(unsigned char * Src, unsigned char * Dst, int Stride,
					   int xint,int yint,int orgx,int orgy)
{
//int dy, dx;
	int y;
	int x;
	int new_x,new_y;
	int w,h;

	w=width;
	h=height;
//	if(Stride<=300) {h=mp4_state->hdr.height>>1;w=mp4_state->hdr.width>>1;}

	for (y = 0; y < 8; y++) {
		for (x = 0; x < 8; x++) {

			new_x=xint+x+orgx;
			new_y=yint+y+orgy;

			if(new_x<0)
				new_x=0;
		//	else if(new_x>=w-1)
		//		new_x=w-2;
			if(new_y<0)
				new_y=0;
			else if(new_y>=h)
				new_y=h-1;

		//	Dst[dx] = (Src[dx] + Src[dx+1]) >> 1; // hor interpolation with rounding
   if(new_x<w-1) 
	Dst[(orgy+y)*Stride+orgx+x]=(Src[new_y*Stride+new_x]+
	                                 Src[new_y*Stride+new_x+1])>>1;
   else if(new_x>=w-1)
   {
	 new_x=w-1;
	 Dst[(orgy+y)*Stride+orgx+x]=(Src[new_y*Stride+new_x]+
	                                 Src[new_y*Stride+new_x])>>1;

   }
		}
	//	Src += Stride;
	//	Dst += Stride;
	}
}
/**/
void CopyBlockVerRound(unsigned char * Src, unsigned char * Dst, int Stride,
					   int xint,int yint,int orgx,int orgy)
{
	//int dy, dx;
	int y;
	int x;
	int new_x,new_y;
	int w,h;

	w=width;
	h=height;
//	if(Stride<=300) {h=mp4_state->hdr.height>>1;w=mp4_state->hdr.width>>1;}

    for (y = 0;y < 8; y++) {
		for (x = 0; x < 8; x++) {
		new_x=xint+x+orgx;
			new_y=yint+y+orgy;

			if(new_x<0)
				new_x=0;
			else if(new_x>=w)
				new_x=w-1;
			if(new_y<0)
				new_y=0;
		//	else if(new_y>=h-1)
		//		new_y=h-2;

		//	Dst[dx] = (Src[dx] + Src[dx+Stride]) >> 1; // ver interpolation with rounding
	if (new_y<h-1)
	Dst[(orgy+y)*Stride+orgx+x]=(Src[new_y*Stride+new_x]+
	                                 Src[(new_y+1)*Stride+new_x])>>1;
	else if(new_y>=h-1)
	{
		new_y=h-1;
    Dst[(orgy+y)*Stride+orgx+x]=(Src[new_y*Stride+new_x]+
	                                 Src[new_y*Stride+new_x])>>1;
	}

		}
		//Src += Stride;
		//Dst += Stride;
	}
}
/**/
void CopyBlockHorVerRound(unsigned char * Src, unsigned char * Dst, int Stride,
						 int xint,int yint,int orgx,int orgy)
{
//	int dy, dx;
	int y;
	int x;
	int new_x;
	int new_y;
	int w,h;

    w=width;
	h=height;
//	if(Stride<=300) {h=mp4_state->hdr.height>>1;w=mp4_state->hdr.width>>1;}

	for (y = 0; y < 8; y++) {
		for (x = 0; x < 8; x++) {

			new_x=xint+x+orgx;
			new_y=yint+y+orgy;

			if(new_x<0)
				new_x=0;
		//	else if(new_x>=w-1)
		//		new_x=w-2;
			if(new_y<0)
				new_y=0;
		//	else if(new_y>=h-1)
		//		new_y=h-2;

		//	Dst[dx] = (Src[dx] + Src[dx+1] + 
		//						Src[dx+Stride] + Src[dx+Stride+1] +1) >> 2; // horver interpolation with rounding
if ((new_x<w-1)&&(new_y<h-1))
Dst[(orgy+y)*Stride+orgx+x]=(Src[new_y*Stride+new_x]+Src[new_y*Stride+new_x+1]+
	                          Src[(new_y+1)*Stride+new_x]+Src[(new_y+1)*Stride+new_x+1])>>2;
else if((new_x>=w-1)&&(new_y>=h-1))	
{
	new_x=w-1;
	new_y=h-1;
Dst[(orgy+y)*Stride+orgx+x]=(Src[new_y*Stride+new_x]+Src[new_y*Stride+new_x]+
	                          Src[new_y*Stride+new_x]+Src[new_y*Stride+new_x])>>2;

}
else if ((new_x>=w-1)&&(new_y<h-1))	
{
	new_x=w-1;
Dst[(orgy+y)*Stride+orgx+x]=(Src[new_y*Stride+new_x]+Src[new_y*Stride+new_x]+
	                          Src[(new_y+1)*Stride+new_x]+Src[(new_y+1)*Stride+new_x])>>2;

}
else if ((new_x<w-1)&&(new_y>=h-1))	
{
	new_y=h-1;
Dst[(orgy+y)*Stride+orgx+x]=(Src[new_y*Stride+new_x]+Src[new_y*Stride+new_x+1]+
	                          Src[new_y*Stride+new_x]+Src[new_y*Stride+new_x+1])>>2;
}
		}
	//	Src += Stride;
	//	Dst += Stride;
	}

⌨️ 快捷键说明

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