問題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分配成功:
其它類似的內存分配問題也可以此來調試