int YUV422To420(unsigned char *pYUV, unsigned int *yuv, int lWidth, int lHeight)
{
int i,j;
unsigned int *pY = yuv;
unsigned int *pU = yuv + lWidth*lHeight;
unsigned int *pV = pU + (lWidth*lHeight)/4;
unsigned char *pYUVTemp = pYUV;
unsigned char *pYUVTempNext = pYUV+lWidth*2;
unsigned char *pYUV2 = pYUVTempNext + lWidth*2;
unsigned char *pYUV3 = pYUVTempNext + lWidth*4;
for(i=0; i<lHeight; i+=4)
{
for(j=0; j<lWidth; j+=4)
{
// Y0
pY[j] = *pYUVTemp++;
pY[j+lWidth] = *pYUVTempNext++;
pY[j+lWidth*2] = *pYUV2++;
pY[j+lWidth*3] = *pYUV3++;
// U
pU[j/2] = (3*pYUVTemp[j] + pYUV2[j])/4;
pU[j/2+lWidth/2] = (pYUVTempNext[j] + 3*pYUV3[j])/4;
// Y1
pY[j+1] = *pYUVTemp++;
pY[j+lWidth+1] = *pYUVTempNext++;
pY[j+lWidth*2+1] = *pYUV2++;
pY[j+lWidth*3+1] = *pYUV3++;
// V
pV[j/2] = (3*pYUVTemp[j] + pYUV2[j])/4;
pV[j/2+lWidth/2] = (pYUVTempNext[j] + 3*pYUV3[j])/4;
}
pYUVTemp+=lWidth*2*4;
pYUVTempNext+=lWidth*2*4;
pYUV2+=lWidth*2*4;
pYUV3+=lWidth*2*4;
pY+=lWidth*4;
pU+=lWidth;
pV+=lWidth;
}
return 1;
}
{
int i,j;
unsigned int *pY = yuv;
unsigned int *pU = yuv + lWidth*lHeight;
unsigned int *pV = pU + (lWidth*lHeight)/4;
unsigned char *pYUVTemp = pYUV;
unsigned char *pYUVTempNext = pYUV+lWidth*2;
unsigned char *pYUV2 = pYUVTempNext + lWidth*2;
unsigned char *pYUV3 = pYUVTempNext + lWidth*4;
for(i=0; i<lHeight; i+=4)
{
for(j=0; j<lWidth; j+=4)
{
// Y0
pY[j] = *pYUVTemp++;
pY[j+lWidth] = *pYUVTempNext++;
pY[j+lWidth*2] = *pYUV2++;
pY[j+lWidth*3] = *pYUV3++;
// U
pU[j/2] = (3*pYUVTemp[j] + pYUV2[j])/4;
pU[j/2+lWidth/2] = (pYUVTempNext[j] + 3*pYUV3[j])/4;
// Y1
pY[j+1] = *pYUVTemp++;
pY[j+lWidth+1] = *pYUVTempNext++;
pY[j+lWidth*2+1] = *pYUV2++;
pY[j+lWidth*3+1] = *pYUV3++;
// V
pV[j/2] = (3*pYUVTemp[j] + pYUV2[j])/4;
pV[j/2+lWidth/2] = (pYUVTempNext[j] + 3*pYUV3[j])/4;
}
pYUVTemp+=lWidth*2*4;
pYUVTempNext+=lWidth*2*4;
pYUV2+=lWidth*2*4;
pYUV3+=lWidth*2*4;
pY+=lWidth*4;
pU+=lWidth;
pV+=lWidth;
}
return 1;
}