TI DM368 YUV420之NV12转IYUV总结
最近折腾DM368 h264解码,解码出的流直接保存成单帧YUV420文件,然后在windows上查看解码是否成功(受调试条件限制,只能通过这个方式来确认解码效果)。
由于YUV420这个格式之前未实际深入调试过,忽视一些重要的知识点,导致困惑。上图,
上图色彩明显不对,这个截图后效果比原始显示要好,原始显示的图片,还有明显的竖条纹出现,感觉是每隔一列一个竖条纹。
开始思路一直怀疑是h264解码问题,查了两天无果。今早忽然灵感来,想到YUV420存储格式的问题。确认,dm368 解码后是NV12,而我用的工具显示是IYUV的,问题定位到。网上搜不到显示NV12的小工具,自己写个代码把NV12转换成IYUV,再显示,如下:
代码:
int ConvertNV12toIYUV(Uint8* pbuf,Uint32 imgw,Uint32 imgh)
{
Uint8* pPU = NULL;
Uint8* pPV = NULL;
Uint8* pPUV = NULL;
Uint8* pcache = NULL;
Uint32 i;
if (pbuf == NULL)
return -1;
pPUV = pbuf + imgw*imgh;
pcache = (Uint8*)malloc((imgw*imgh)>>1);
if (pcache == NULL)
return -1;
pPU = pcache;
pPV = pcache + ((imgw*imgh)>>2);
for (i=0;i<(imgw*imgh)>>1;i++)
{
if ((i % 2) == 0)
*pPV++ = *(pPUV+i);
else
*pPU++ = *(pPUV+i);
}
memcpy(pPUV,pcache,(imgw*imgh)>>1);
if (pcache)
free(pcache);
return 0;
}
TIPS:
a.时间允许还是做事前补充下相关背景知识。
b.dm365/dm368 YUV420 是XDM_YUV_420SP格式。
c.调试小工具很重要。