/*------------------------
yuv422 to rgb565
转换公式:
R=Y+1.4075*(V-128)
G=Y-0.3455*(U-128) - 0.7169*(V-128)
B=Y+1.779*(U-128)
为了加快运算速度,采用下面的整形计算法:
u = YUVdata[UPOS] - 128;
v = YUVdata[VPOS] - 128;
rdif = v + ((v * 103) >> 8);
invgdif = ((u * 88) >> 8) +((v * 183) >> 8);
bdif = u +( (u*198) >> 8);
r = YUVdata[YPOS] + rdif;
g = YUVdata[YPOS] - invgdif;
b = YUVdata[YPOS] + bdif;
r=r>255?:255:(r<0:?0:r);
g=g>255?:255:(g<0:?0:g);
b=b>255?:255:(b<0:?0:b);
以上得到的是rgb888的数据,再将rgb888转为rgb555
RGBdata[1] =( (r & 0xF8) | ( g >> 5) );
RGBdata[0] =( ((g & 0x1C) << 3) | ( b >> 3) );
422 FORMAT size:
size=width*height*2;
YSIZE = size/2;
USIZE = size/4;
VSIZE = size/4;
YPOS=0;
UPOS=YPOS + size/2;
VPOS=UPOS + size/4;
--------------------------*/
int convertyuv422torgb565(unsigned char *inbuf,unsigned char *outbuf,int width,int height)
{
int rows,cols,rowwidth;
int y,u,v,r,g,b,rdif,invgdif,bdif;
int size;
unsigned char *YUVdata,*RGBdata;
int YPOS,UPOS,VPOS;
YUVdata = inbuf;
RGBdata = outbuf;
rowwidth = width>>1;
size=width*height*2;
YPOS=0;
UPOS=YPOS + size/2;
VPOS=UPOS + size/4;
for(rows=0;rows<height;rows++)
{
for(cols=0;cols<width;cols++)
{
u = YUVdata[UPOS] - 128;
v = YUVdata[VPOS] - 128;
rdif = v + ((v * 103) >> 8);
invgdif = ((u * 88) >> 8) +((v * 183) >> 8);
bdif = u +( (u*198) >> 8);
r = YUVdata[YPOS] + rdif;
g = YUVdata[YPOS] - invgdif;
b = YUVdata[YPOS] + bdif;
r=r>255?255:(r<0?0:r);
g=g>255?255:(g<0?0:g);
b=b>255?255:(b<0?0:b);
*(RGBdata++) =( ((g & 0x1C) << 3) | ( b >> 3) );
*(RGBdata++) =( (r & 0xF8) | ( g >> 5) );
YPOS++;
if(cols & 0x01)
{
UPOS++;
VPOS++;
}
}
if((rows & 0x01)== 0)
{
UPOS -= rowwidth;
VPOS -= rowwidth;
}
}
return 1;
}