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

📄 yuv2rgb.c

📁 PocketMVP V0.8082503 source for Pocket 的程序源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	int we;
	//unsigned char* LimitValue=&LimitValues[256];
	int xStart=0,xEnd=width_y,xStep=1;//,lastpel=318;
	if ((height_y<<1)>VisibleHeight) height_y=VisibleHeight>>1;
	if ((width_y<<1)>VisibleWidth) width_y=VisibleWidth>>1;

	if (nExtra<0)
	{
		nExtra=0;
	}
	else
	{
		if (invert)
		{
			puc_y += (height_y - 1) * stride_y ; 
			puc_u += (height_y/2 - 1) * stride_uv; 
			puc_v += (height_y/2 - 1) * stride_uv; 
			puc_yp += (height_y - 1) * stride_y ; 
			puc_up += (height_y/2 - 1) * stride_uv; 
			puc_vp += (height_y/2 - 1) * stride_uv; 
			stride_y = -stride_y; 
			stride_uv = -stride_uv; 
			xStart=width_y;
			xEnd=0;
			//lastpel=238;
			xStep=-1;
		}
		else
		{
			xEnd=width_y;
		}
	}
	if (Dither)
	{
		yuv2rgb_565ZD(puc_y, stride_y, puc_u, puc_v, stride_uv, puc_out, width_y, height_y,nExtra, Dither,Brightness, puc_yp,puc_up,puc_vp,slowopt,xStart,xEnd,xStep);
		return;
	}
	Brightness-=16;
	we=width_y+nExtra;
	pus_out = (unsigned int *) puc_out; 
	for (y=0; y<height_y; y++) 
	{ 
		for (x=xStart;x!=xEnd;x+=xStep)
		{ 
			int x2=x>>1;//add tolerance of 1 
			if ((!slowopt)||(puc_y[x]!=puc_yp[x]||(puc_u[x2]!=puc_up[x2])||(puc_v[x2]!=puc_vp[x2])))
			{
				unsigned int hvalue,hvalue2,hvalue3,hvalue4;
				 
				temp_y=9576*(puc_y[x]+Brightness);
				temp_Guv=-3218*(puc_u[x2]-128)-6686*(puc_v[x2]-128);
				r = _S(((temp_y+13123*(puc_u[x2]-128))>>13)); 
				g = _S(((temp_y+temp_Guv)>>13)); 
				b = _S(((temp_y+16591*(puc_v[x2]-128))>>13)); 
				hvalue=(unsigned short) _Ps565(r,g,b);
				
				temp_y=9576*(puc_y[x+stride_y]+Brightness);

				if (y<<31) 
				{ 
					temp_Guv=-3218*(puc_u[stride_uv+x2]-128)-6686*(puc_v[stride_uv+x2]-128);
					r+= _S(((temp_y+13123*(puc_u[stride_uv+x2]-128))>>13)); 
					g+= _S(((temp_y+temp_Guv)>>13)); 
					b+= _S(((temp_y+16591*(puc_v[stride_uv+x2]-128))>>13)); 
				}
				else
				{
					r+= _S(((temp_y+13123*(puc_u[x2]-128))>>13)); 
					g+= _S(((temp_y+temp_Guv)>>13)); 
					b+= _S(((temp_y+16591*(puc_v[x2]-128))>>13)); 
				}
				r = (r>>1);
				g = (g>>1);
				b = (b>>1);
				hvalue2=(unsigned short) _Ps565(r,g,b);

				if (x+xStep!=width_y)
				{
					temp_y=9576*(puc_y[x+xStep]+Brightness);
					temp_Guv=-3218*(puc_u[(x+xStep)>>1]-128)-6686*(puc_v[(x+xStep)>>1]-128);
					r += _S(((temp_y+13123*(puc_u[(x+xStep)>>1]-128))>>13)); 
					g += _S(((temp_y+temp_Guv)>>13)); 
					b += _S(((temp_y+16591*(puc_v[(x+xStep)>>1]-128))>>13)); 
					r = (r>>1);
					g = (g>>1);
					b = (b>>1);
					hvalue3=(unsigned short)_Ps565(r,g,b);
					next_y=9576*(puc_y[x+xStep+stride_y]-16);

					if (y<<31) 
					{ 
						next_Guv=-3218*(puc_v[stride_uv+((x+xStep)>>1)]-128)-6686*(puc_u[stride_uv+((x+xStep)>>1)]-128);
						r += _S(((next_y+13123*(puc_u[stride_uv+((x+xStep)>>1)]-128))>>13)); 
						g += _S(((next_y+next_Guv)>>13)); 
						b += _S(((next_y+16591*(puc_v[stride_uv+((x+xStep)>>1)]-128))>>13)); 
					}
					else
					{
						r += _S(((next_y+13123*(puc_u[((x+xStep)>>1)]-128))>>13)); 
						g += _S(((next_y+temp_Guv)>>13)); 
						b += _S(((next_y+16591*(puc_v[((x+xStep)>>1)]-128))>>13)); 
					}
					r = (r>>1);
					g = (g>>1);
					b = (b>>1);
					hvalue4=(unsigned short) _Ps565(r,g,b);
				}
				else
				{
					hvalue2=hvalue;
				}
				pus_out[0] =hvalue|(hvalue3<<16);
				pus_out[we>>1]=hvalue2|(hvalue4<<16);
			}
			pus_out++;
		} 
		pus_out+=nExtra;
		puc_y += stride_y; 
		puc_yp += stride_y; 
		if (y<<31) 
		{ 
			puc_u += stride_uv; 
			puc_v += stride_uv; 
			puc_up += stride_uv; 
			puc_vp += stride_uv; 
		} 
	}
/*	for (y=0; y<height_y; y++) 
	{ 
//		if (y==119) width_y-=1;
		for (x=xStart;x!=xEnd;x+=xStep)
		{ 
			unsigned int hvalue,hvalue2,hvalue1,hvalue3;
			int x2=x>>1;
			if ((!slowopt)||(puc_y[x]!=puc_yp[x]||(puc_u[x2]!=puc_up[x2])||(puc_v[x2]!=puc_vp[x2])))
			{
			 
				temp=puc_y[x]-144+Brightness; 
				r = _S(temp+puc_u[x2]); 
				g = _S(temp+128); 
				b = _S(temp+puc_v[x2]); 
				hvalue=(unsigned short) _Ps565(r,g,b);
				tempnexty=puc_y[x+stride_y]+Brightness; 
				if (y<<31) 
				{ 
					r = _S((temp+puc_u[x2]+tempnexty+puc_u[stride_uv+x2])/2); 
					g = _S((temp+tempnexty+256)/2); 
					b = _S((temp+puc_v[x2]+tempnexty+puc_v[stride_uv+x2])/2); 
				}
				else
				{
					r = _S((temp+puc_u[x2]+tempnexty+puc_u[x2])/2); 
					g = _S((temp+tempnexty+256)/2); 
					b = _S((temp+puc_v[x2]+tempnexty+puc_v[x2])/2); 
				}
				hvalue1=(unsigned short) _Ps565(r,g,b);
				if ((x+xStep!=width_y))
				{
					tempnextx=puc_y[x+xStep]+Brightness; 
					r = _S((temp+puc_u[x2]+tempnextx+puc_u[x2])/2); 
					g = _S((temp+tempnextx+256)/2); 
					b = _S((temp+puc_v[x2]+tempnextx+puc_v[x2])/2); 
					hvalue2=(unsigned short) _Ps565(r,g,b);
					tempnextxy=puc_y[x+xStep+stride_y]+Brightness; 

					if (y<<31) 
					{ 
						r = _S((temp+puc_u[x2]+tempnextxy+puc_u[stride_uv+x2])/2); 
						g = _S((temp+tempnextxy+256)/2); 
						b = _S((temp+puc_v[x2]+tempnextxy+puc_v[stride_uv+x2])/2); 
					}
					else
					{
						r = _S((temp+puc_u[x2]+tempnextxy+puc_u[x2])/2); 
						g = _S((temp+tempnextxy+256)/2); 
						b = _S((temp+puc_v[x2]+tempnextxy+puc_v[x2])/2); 
					}
					hvalue3=(unsigned short) _Ps565(r,g,b);
				}
				else
				{
					hvalue2=hvalue3=hvalue;
				}
				pus_out[0] = hvalue|(hvalue2<<16);
				pus_out[we>>1]=hvalue1|(hvalue3<<16);
			}
			pus_out++;
		} 
		pus_out+=nExtra;
		puc_y += stride_y; 
		puc_yp += stride_y; 

		if (y<<31) 
		{ 
			puc_u += stride_uv; 
			puc_v += stride_uv; 
			puc_up += stride_uv; 
			puc_vp += stride_uv; 
		} 
	}*/
//	memcpy(puc_out,hold,320*(height_y<<2));
} 
#else
void yuv2rgb_420(uint8_t *puc_y, int stride_y, 
uint8_t *puc_u, uint8_t *puc_v, int stride_uv, 
uint8_t *puc_out, int width_y, int height_y,int stride_out, int Dither,int Brightness,uint8_t *puc_yp,uint8_t *puc_up,uint8_t *puc_vp, int slowopt, int invert) 
{ 
	int i;
	unsigned char * pauc_out_y,*pauc_out_u,*pauc_out_v;

	if (!invert)
	{
		if (width_y>VisibleWidth)
		{
			puc_y+=(width_y-VisibleWidth)>>1;
			puc_u+=(width_y-VisibleWidth)>>2;
			puc_v+=(width_y-VisibleWidth)>>2;
			stride_out=width_y=VisibleWidth;
		}
		if (height_y>VisibleHeight)
		{
			puc_y+=(height_y-VisibleHeight)*(stride_y>>1);
			puc_u+=(height_y-VisibleHeight)*(stride_uv>>2);
			puc_v+=(height_y-VisibleHeight)*(stride_uv>>2);
			height_y=VisibleHeight;
		}

	}

	pauc_out_y = (unsigned char *)puc_out;
	if (!invert)
	{
		pauc_out_u = (unsigned char *)(puc_out + stride_out * height_y);
		pauc_out_v = (unsigned char *)(puc_out + stride_out * height_y * 5 / 4);
	}
	else if (invert==2)
	{
		pauc_out_u = (unsigned char *)(puc_out);
		pauc_out_v = (unsigned char *)(puc_out + (stride_out>>1) * (height_y>>1));
	}

	if (invert!=2)
	{

		for (i=0; i<height_y; i++) 
		{
			if (!Brightness)
				memcpy(pauc_out_y, puc_y, width_y);
			else
			{
				int y;
				for (y=0;y<width_y;y+=4)
				{
					unsigned int c0,c1,c2,c3;
					c0=_S(puc_y[y]+Brightness);
					c1=_S(puc_y[y+1]+Brightness);
					c2=_S(puc_y[y+2]+Brightness);
					c3=_S(puc_y[y+3]+Brightness);
					((unsigned int*)pauc_out_y)[y>>2]=(unsigned int)(c0|(c1<<8)|(c2<<16)|(c3<<24));
					//((unsigned int*)pauc_out_y)[y>>2]=(unsigned int)((((unsigned int)_S(puc_y[y]+Brightness)))|(((unsigned int)_S(puc_y[y+1]+Brightness))<<8)|(((unsigned int)_S(puc_y[y+2]+Brightness))<<16)|(((unsigned int)_S(puc_y[y+3]+Brightness))<<24));
				}
			}

			pauc_out_y += stride_out;
			puc_y += stride_y;
				
		}
		if (invert==1) return;
	}
	for (i=0; i<height_y>>1; i++) {
			int y;
			for (y=0;y<width_y>>1;y+=4)
			{
//			memcpy(pauc_out_u, puc_u, width_y>>1); // U and V buffer must be inverted
				((unsigned int*)pauc_out_u)[y>>2]=(unsigned int)(puc_u[y]|(puc_u[y+1]<<8)|(puc_u[y+2]<<16)|(puc_u[y+3]<<24));
			}
			pauc_out_u += stride_out>>1;
			puc_u += stride_uv;
	}
	for (i=0; i<height_y>>1; i++) {
			int y;
			for (y=0;y<width_y>>1;y+=4)
			{
				((unsigned int*)pauc_out_v)[y>>2]=(unsigned int)(puc_v[y]|(puc_v[y+1]<<8)|(puc_v[y+2]<<16)|(puc_v[y+3]<<24));
			}
//			memcpy(pauc_out_v, puc_v, width_y>>1);
			pauc_out_v += stride_out>>1;
			puc_v += stride_uv;
	}
}

#ifndef ATI

void yuv2rgb_565Z(uint8_t *puc_y, int stride_y, 
uint8_t *puc_u, uint8_t *puc_v, int stride_uv, 
uint8_t *puc_out, int width_y, int height_y, int nExtra, int Dither,int Brightness,uint8_t *puc_yp,uint8_t *puc_up,uint8_t *puc_vp, int slowopt, int invert) 
{ 
	register int x,y; 
	register signed int temp,tempnextx,tempnexty,tempnextxy; 
	unsigned short *pus_out; 
	register unsigned int r,g,b; 
//	unsigned char* LimitValue=&LimitValues[256];
	int we;
	if ((height_y<<1)>VisibleHeight) height_y=VisibleHeight>>1;
	if ((width_y<<1)>VisibleWidth) width_y=VisibleWidth>>1;
	if (nExtra<0) nExtra=0;
	if (Dither) 
	{
		yuv2rgb_565ZD(puc_y, stride_y, puc_u, puc_v, stride_uv, puc_out, width_y, height_y,nExtra, Dither,Brightness,puc_yp,puc_up,puc_vp,slowopt,0,width_y,1);
		return;
	}
	Brightness-=144;
	we=width_y+nExtra;
	pus_out = (unsigned short *) puc_out; 
	for (y=0; y<height_y; y++) 
	{ 
		for (x=0;x<width_y;x++)
		{ 
			unsigned short hvalue,hvalue2,hvalue1,hvalue3;
			int x2=x>>1;
			if ((!slowopt)||(puc_y[x]!=puc_yp[x]||(puc_u[x2]!=puc_up[x2])||(puc_v[x2]!=puc_vp[x2])))
			{
			 
				temp=puc_y[x]+Brightness; 
				r = _S(temp+puc_u[x2]); 
				g = _S(temp+128); 
				b = _S(temp+puc_v[x2]); 
				hvalue=(unsigned short) _Ps565(r,g,b);
				tempnexty=puc_y[x+stride_y]+Brightness; 
				if (y<<31) 
				{ 
					r = _S((temp+puc_u[x2]+tempnexty+puc_u[stride_uv+x2])/2); 
					g = _S((temp+tempnexty+256)/2); 
					b = _S((temp+puc_v[x2]+tempnexty+puc_v[stride_uv+x2])/2); 
				}
				else
				{
					r = _S((temp+puc_u[x2]+tempnexty+puc_u[x2])/2); 
					g = _S((temp+tempnexty+256)/2); 
					b = _S((temp+puc_v[x2]+tempnexty+puc_v[x2])/2); 
				}
				hvalue1=(unsigned short) _Ps565(r,g,b);
				if ((x+1!=width_y))
				{
					tempnextx=puc_y[x+1]+Brightness; 
					r = _S((temp+puc_u[x2]+tempnextx+puc_u[x2])/2); 
					g = _S((temp+tempnextx+256)/2); 
					b = _S((temp+puc_v[x2]+tempnextx+puc_v[x2])/2); 
					hvalue2=(unsigned short) _Ps565(r,g,b);
					tempnextxy=puc_y[x+1+stride_y]+Brightness; 

					if (y<<31) 
					{ 
						r = _S((temp+puc_u[x2]+tempnextxy+puc_u[stride_uv+x2])/2); 
						g = _S((temp+tempnextxy+256)/2); 
						b = _S((temp+puc_v[x2]+tempnextxy+puc_v[stride_uv+x2])/2); 
					}
					else
					{
						r = _S((temp+puc_u[x2]+tempnextxy+puc_u[x2])/2); 
						g = _S((temp+tempnextxy+256)/2); 
						b = _S((temp+puc_v[x2]+tempnextxy+puc_v[x2])/2); 
					}
					hvalue3=(unsigned short) _Ps565(r,g,b);
				}
				else
				{
					hvalue2=hvalue3=hvalue;
				}
				pus_out[0] = hvalue;
				pus_out[1] = hvalue2;
				pus_out[we]=hvalue1;
				pus_out[we+1]=hvalue3;
			}
			pus_out+=2;
		} 
		pus_out+=nExtra<<1;
		puc_y += stride_y; 
		puc_yp += stride_y; 

		if (y<<31) 
		{ 
			puc_u += stride_uv; 
			puc_v += stride_uv; 
			puc_up += stride_uv; 
			puc_vp += stride_uv; 
		} 
	}
} 
#endif
/*
void yuv2rgb_565(uint8_t *puc_y, int stride_y, 
uint8_t *puc_u, uint8_t *puc_v, int stride_uv, 
uint8_t *puc_out, int width_y, int height_y,int stride_dest, int Dither,int Brightness,uint8_t *puc_yp,uint8_t *puc_up,uint8_t *puc_vp, int slowopt) 
{ 
	register int x,y; 
	register signed int temp; 
	unsigned short *pus_out; 
	register unsigned int r,g,b; 
	if (height_y>VisibleHeight)
	{
		puc_y+=(height_y-VisibleHeight)*(stride_y>>1);
		puc_u+=(height_y-VisibleHeight)*(stride_uv>>2);
		puc_v+=(height_y-VisibleHeight)*(stride_uv>>2);
		puc_yp+=(height_y-VisibleHeight)*(stride_y>>1);
		puc_up+=(height_y-VisibleHeight)*(stride_uv>>2);
		puc_vp+=(height_y-VisibleHeight)*(stride_uv>>2);
		height_y=VisibleHeight;
	}
	if (width_y>VisibleWidth)
	{
		puc_y+=(width_y-VisibleWidth)>>1;
		puc_u+=(width_y-VisibleWidth)>>2;
		puc_v+=(width_y-VisibleWidth)>>2;
		puc_yp+=(width_y-VisibleWidth)>>1;
		puc_up+=(width_y-VisibleWidth)>>2;
		puc_vp+=(width_y-VisibleWidth)>>2;
		width_y=VisibleWidth;
	}
	pus_out = (unsigned short *) (puc_out); 

	for (y=0; y<height_y; y++)
	{ 
		for (x=0;x<width_y;x++)
		{ 
			int x2=x>>1;
			if ((!slowopt)||(puc_y[x]!=puc_yp[x]||(puc_u[x2]!=puc_up[x2])||(puc_v[x2]!=puc_vp[x2])))
			{
				temp=puc_y[x]-144; 
				r = _S(temp+puc_u[x2]); 
				g = _S(temp+128); 
				b = _S(temp+puc_v[x2]); 
				pus_out[0] = (unsigned short) _Ps565(r,g,b); 
			}
			pus_out++; 
		} 
		puc_y += stride_y; 
		puc_yp+=stride_y;
		pus_out+=stride_dest;
		if (y<<31)
		{
			puc_u += stride_uv; 
			puc_v += stride_uv; 
			puc_up += stride_uv; 
			puc_vp += stride_uv; 
		}
	} 
} 
*/

void yuv2rgb_565(uint8_t *puc_y, int stride_y, 
uint8_t *puc_u, uint8_t *puc_v, int stride_uv, 
uint8_t *puc_out, int width_y, int height_y,int stride_dest, int Dither,int Brightness,uint8_t *puc_yp,uint8_t *puc_up,uint8_t *puc_vp, int slowopt, int invert) 
{ 
	register int x,y; 
	unsigned int *pus_out; 
	register unsigned int r,g,b; 
//	unsigned char* LimitValue=&LimitValues[256];
	if (height_y>VisibleHeight)
	{
		puc_y+=(height_y-VisibleHeight)*(stride_y>>1);
		puc_u+=(height_y-VisibleHeight)*(stride_uv>>2);
		puc_v+=(height_y-VisibleHeight)*(stride_uv>>2);
		puc_yp+=(height_y-VisibleHeight)*(stride_y>>1);
		puc_up+=(height_y-VisibleHeight)*(stride_uv>>2);
		puc_vp+=(height_y-VisibleHeight)*(stride_uv>>2);
		height_y=VisibleHeight;
	}
	if (width_y>VisibleWidth)
	{
		puc_y+=(width_y-VisibleWidth)>>1;
		puc_u+=(width_y-VisibleWidth)>>2;
		puc_v+=(width_y-VisibleWidth)>>2;
		puc_yp+=(width_y-VisibleWidth)>>1;
		puc_up+=(width_y-VisibleWidth)>>2;
		puc_vp+=(width_y-VisibleWidth)>>2;
		width_y=VisibleWidth;
	}
#ifndef ATI
	if (Dither) 
	{
		yuv2rgb_565D(puc_y, stride_y, puc_u, puc_v, stride_uv, puc_out, width_y, height_y,stride_dest, Dither,Brightness,puc_yp,puc_up,puc_vp,slowopt,0,width_y,1);
		return;
	}
#endif
	pus_out = (unsigned int *) (puc_out); 
	Brightness-=16;
	for (y=0; y<height_y; y+=2)
	{ 		
//		if (y==lastpel) width_y-=2;
		for (x=0;x!=width_y;x+=2)
		{ 
			int x2=x>>1;
			if ((!slowopt)||(puc_y[x]-puc_yp[x]||(puc_y[x+stride_y]-puc_yp[x+stride_y])||(puc_u[x>>1]-puc_up[x>>1])||(puc_v[x>>1]-puc_vp[x>>1])))
			{
				unsigned int hvalue;
				int y,u,v;
				y = (puc_y[x] + Brightness)*0x2568;
				u = puc_u[x2] - 128;
				v = puc_v[x2] - 128;
				r = _S(_R(y,u,v));
				g= _S(_G(y,u,v));
				b=_S(_B(y,u,v));

				hvalue = (unsign

⌨️ 快捷键说明

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