问题1:HI_MPI_VB_Init失败返回0xA001800C(HI_ERR_VENC_NOMEM)
调试思路:查看系统内存容量以及VB分配设置
<1> cat /proc/media-mem
信息显示MMZ内存足够,保留仍有32MB
<2>查看VB配置的情况:
信息显示MMZ内存总计32768KB = 32MB,而此时的我试图为两路码流分配VB:
主码流1080P: u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\ PIC_HD1080, PIXEL_FORMAT_YUV_SEMIPLANAR_420, SAMPLE_SYS_ALIGN_WIDTH); stVbConf.astCommPool[0].u32BlkSize = u32BlkSize; stVbConf.astCommPool[0].u32BlkCnt = 10; 主码流需要分配VB空间:(1920*1080*2*10)/1024/1024约39MB |
子码流VGA: u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm,\ PIC_VGA, PIXEL_FORMAT_YUV_SEMIPLANAR_420, SAMPLE_SYS_ALIGN_WIDTH); stVbConf.astCommPool[1].u32BlkSize = u32BlkSize; stVbConf.astCommPool[1].u32BlkCnt = 3; 主码流需要分配VB空间:(640*480*2*3)/1024/1024约1MB |
相加显然超过了MMZ内存总和32MB
<3>图像的大小
一帧1080P YUV420格式的图像大小应当是1920*1080*2 = 3145728B
但是从打印信息看,实际1080P图像的u32BlkSize是3159360B
实际VGA图像的u32BlkSize是503040B
原因是通过宏VB_PIC_HEADER_SIZE在每个VB块内加入了头部信息
<4>修改与执行结果:
将1080P的u32BlkCnt改为5,VGA的u32BlkCnt改为3。
对应分配空间则是:3159360B * 5 = 15426KB 503040B * 3 = 1473KB
在此cat /pro/media-mem,发现VB分配成功:
其它类似的内存分配问题也可以此来调试