void Rgb2Yuv(unsigned srcWidth,unsigned srcHeight,const BYTE* rgb,BYTE* yuv);
#define rgbtoy(b, g, r, y) y=(BYTE)(((int)30*r +(int)59*g +(int)11*b)/100)
#define rgbtoyuv(b, g, r, y, u, v) \
rgbtoy(b, g, r, y); \
u=(BYTE)(((int)-17*r -(int)33*g +(int)50*b+12800)/100); \
v=(BYTE)(((int)50*r -(int)42*g -(int)8*b+12800)/100)
void Rgb2Yuv ( unsigned srcWidth,unsigned srcHeight,const BYTE * rgb,BYTE * yuv )
{
const unsigned planeSize = srcWidth*srcHeight;
const unsigned halfWidth = srcWidth >> 1;
BYTE * yplane = yuv;
BYTE * uplane = yuv + planeSize;
BYTE * vplane = yuv + planeSize + (planeSize >> 2);
const BYTE * rgbIndex = rgb;
for (unsigned y = 0; y < srcHeight; y++)
{
BYTE * yline = yplane + (y * srcWidth);
BYTE * uline = uplane + ((y >> 1) * halfWidth);
BYTE * vline = vplane + ((y >> 1) * halfWidth);
rgbIndex = rgb + (srcWidth*(srcHeight-1-y)*3);
for (unsigned x = 0; x < srcWidth; x+=2)
{
rgbtoy(rgbIndex[0], rgbIndex[1], rgbIndex[2],*yline);
rgbIndex += 3;
yline++;
rgbtoyuv(rgbIndex[0], rgbIndex[1],
rgbIndex[2],*yline, *uline, *vline);
rgbIndex += 3;
yline++;
uline++;
vline++;
}
}
}