【转码】RGB24 转 YUV420 出错

wlcshh 2015-04-25 10:35:10
代码如下

int ConvertRGB2YUV(int w,int h,unsigned char *bmp,unsigned int *yuv){
unsigned int *u,*v,*y,*uu,*vv;
unsigned int *pu1,*pu2,*pu3,*pu4;
unsigned int *pv1,*pv2,*pv3,*pv4;
unsigned char *r,*g,*b;
int i,j;

uu=new unsigned int[w*h];
vv=new unsigned int[w*h];

if(uu==NULL || vv==NULL)
return 0;

y=yuv;
u=uu;
v=vv;

// Get r,g,b pointers from bmp image data....
r=bmp;
g=bmp+1;
b=bmp+2;

//Get YUV values for rgb values...
for(i=0;i<h;i++){
for(j=0;j<w;j++){
*(y++) = ( RGB2YUV_YR[*r] + RGB2YUV_YG[*g] + RGB2YUV_YB[*b] + 1048576) >> 16;////调试运行到此处就中断了///////////////////////////////////////////////////
*(u++) = (-RGB2YUV_UR[*r] - RGB2YUV_UG[*g] + RGB2YUV_UBVR[*b] + 8388608) >> 16;
*(v++) = ( RGB2YUV_UBVR[*r] - RGB2YUV_VG[*g] - RGB2YUV_VB[*b] + 8388608) >> 16;
r += 3;
g += 3;
b += 3;
}
}
// Now sample the U & V to obtain YUV 4:2:0 format
// Sampling mechanism...

// Get the right pointers...
u=yuv+w*h;
v=u+(w*h)/4;

// For U
pu1=uu;
pu2=pu1+1;
pu3=pu1+w;
pu4=pu3+1;

// For V
pv1=vv;
pv2=pv1+1;
pv3=pv1+w;
pv4=pv3+1;

// Do sampling....
for(i=0;i<h;i+=2){
for(j=0;j<w;j+=2){
*u++=(*pu1+*pu2+*pu3+*pu4)>>2;
*v++=(*pv1+*pv2+*pv3+*pv4)>>2;
pu1+=2;
pu2+=2;
pu3+=2;
pu4+=2;
pv1+=2;
pv2+=2;
pv3+=2;
pv4+=2;
}
pu1+=w;
pu2+=w;
pu3+=w;
pu4+=w;

pv1+=w;
pv2+=w;
pv3+=w;
pv4+=w;
}
delete uu;
delete vv;
return 1;
}
...全文
302 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
伪装者1982 2015-06-03
  • 打赏
  • 举报
回复
转换直接用swscale吧,谁还自己写啊,要嫌库大了把代码直接拷出来把
wlcshh 2015-04-25
  • 打赏
  • 举报
回复
运行到26行:

*(y++) = ( RGB2YUV_YR[*r]   + RGB2YUV_YG[*g] + RGB2YUV_YB[*b]   + 1048576) >> 16;//调试到这里就中断了
这到底是为什么

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧