📄 yuv2rgb.c
字号:
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 + -