码迷,mamicode.com
首页 > 其他好文 > 详细

格式转换至yuv422转 yuv420

时间:2014-11-17 00:14:09      阅读:328      评论:0      收藏:0      [点我收藏+]

标签:http   ar   sp   for   div   on   代码   bs   ef   

大意了,每四行计算时,牵引错误,试试下面的代码吧,不过这种代码很有优化的余地
书籍可以参考“视频技术手册”,上面有YUV422到YUV420采样转换的讲解

C/C++ code
 


int YUV422To420(unsigned char *pYUV, unsigned int *yuv, int lWidth, int lHeight)
{ //sp
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[j];
pY[j+lWidth] = pYUVTempNext[j];
pY[j+lWidth*2] = pYUV2[j];
pY[j+lWidth*3] = pYUV3[j];
// U
pU[j/2] = (3*pYUVTemp[j+1] + pYUV2[j+1])/4;
pU[j/2+lWidth/2] = (pYUVTempNext[j+1] + 3*pYUV3[j+1])/4;
// Y1
pY[j+1] = pYUVTemp[j+2];
pY[j+lWidth+1] = pYUVTempNext[j+2];
pY[j+lWidth*2+1] = pYUV2[j+2];
pY[j+lWidth*3+1] = pYUV3[j+2];
// V
pV[j/2] = (3*pYUVTemp[j+3] + pYUV2[j+3])/4;
pV[j/2+lWidth/2] = (pYUVTempNext[j+3] + 3*pYUV3[j+3])/4;

}
// 分别加四行
pYUVTemp+=lWidth*2*4;
pYUVTempNext+=lWidth*2*4;
pYUV2+=lWidth*2*4;
pYUV3+=lWidth*2*4;
// Y加上四行
pY+=lWidth*4;
// UV加两行
pU+=lWidth;
pV+=lWidth;
}

return 1;
}


http://bbs.csdn.net/topics/370045077

格式转换至yuv422转 yuv420

标签:http   ar   sp   for   div   on   代码   bs   ef   

原文地址:http://www.cnblogs.com/pengkunfan/p/4102632.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!