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

📄 basic_prediction.c

📁 代码实现了基于ARM7的MPEG-4视频解码器
💻 C
📖 第 1 页 / 共 2 页
字号:
}
/** *** **/
void CopyMBlock(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;
	int w,h;

#ifndef BIG_ENDIAN
//	char *lpSrc = (char *) Src;
//	char *lpDst = (char *) Dst;
//	int lpStride = Stride;
	w=width;
	h=height;
//	if(Stride<=300) {h=mp4_state->hdr.height>>1;w=mp4_state->hdr.width>>1;}
	
		for (y = 0; y < 16; y++)
	{
		for(x=0;x<16;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 < 16; dy++) {
		lpDst[0] = lpSrc[0];
		lpDst[1] = lpSrc[1];
		lpDst[2] = lpSrc[2];
		lpDst[3] = lpSrc[3];
		lpSrc += lpStride;
		lpDst += lpStride;
	}
#endif
}
/**/
void CopyMBlockHor(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 < 16; y++) {
		for (x = 0; x < 16; 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;
		
			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 ;
			}

         //  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 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 < 16; y++) {
		for (x = 0; x < 16; 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 CopyMBlockHorVer(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 < 16; y++) {
		for (x = 0; x < 16; 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=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)>>2 ;
}

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

/**/
void CopyMBlockHorRound(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 < 16; y++) {
		for (x = 0; x < 16; 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 CopyMBlockVerRound(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 < 16; y++) {
		for (x = 0; x < 16; 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 CopyMBlockHorVerRound(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 < 16; y++) {
		for (x = 0; x < 16; 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]+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]+1)>>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]+1)>>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]+1)>>2 ;		

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

⌨️ 快捷键说明

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