SYS Q&A

Q1:Vdec模块通过接口MI_SYS_ChnOutputPortGetBuf可以手动获取解码后的数据吗?还是必须绑定后级?

可以,不过需要通过接口MI_S32 MI_SYS_SetChnOutputPortDepth(MI_U16 u16SocId, MI_SYS_ChnPort_t *pstChnPort, MI_U32 u32UserFrameDepth, MI_U32 u32BufQueueDepth)设置u32UserFrameDepth;

u32UserFrameDepth设置该 output 用户可以拿到的 buf 最大数量,u32BufQueueDepth设置该 output 系统 buf 最大数量;不设置的情况下默认u32UserFrameDepth=0,u32BufQueueDepth=4。

比如设置MI_SYS_SetChnOutputPortDepth(0, &stVdecOutputPort, 1, 4);

另外要注意的就是如果不用再取数据,u32UserFrameDepth要设回0,否则会有内存浪费。

Q2:运行报错MHAL_CMDQ_GetSysCmdqService CmdqServiceAllocBuf fail(1)

这个是因为cmdqbuf不够用了所以报错;一般都是因为cmdqbuf配太小导致,加载sys ko时会带参数配置cmdqbuf,可以加大cmdqbuf试试。比如:

insmod /config/modules/4.9.227/mi_sys.ko cmdQBufSize=768 logBufSize=256 改成

insmod /config/modules/4.9.227/mi_sys.ko cmdQBufSize=3072 logBufSize=256,这里单位为KB。

正式值可以参考公版设置。

Q3:1GB DDR板子开机启动失败

1. 确认内存配置是否ok,看mmap.ini和bootargs是否对的上。

2. bootargs跟公版对比

问题板子:LX_MEM=0x3ffe0000 mma_heap=mma_heap_name0,miu=0,sz=0x30600000

公版:LX_MEM=0x3ffe0000 mma_heap=mma_heap_name0,miu=0,sz=0x1F000000

sz改成跟公版一样0x1F000000就可以正常;但是公版改sz=0x30600000也是正常的

3. 看这个预留内存超过768M了,怀疑是高端内存问题。kernel config开highmem配置后OK。

CONFIG_HIGHMEM=y

Q4:接口MI_SYS_ChnOutputPortGetBuf是否可以适用于所有模块?

MI_SYS_ChnOutputPortGetBuf接口可以用来抓模块对应的buff数据(YUV格式),使用时候需要确保:

1. 模块不是realtime mode bind的,通过MI_SYS_ChnOutputPortGetBuf 拿buf时,其对应output port在绑定的情况下只能是frame mode。

2. 模块有output port

适用的模块(frame mode下):VIF, ISP, SCL, VDEC, WBC;

不适用模块:VENC, JPE(VENC,JPE没有output,但可以使用MI_VENC_GetStream来抓图), DISP, VDF, JPD。

Q5:MI_SYS_ChnOutputPortGetBuf拿到buf想要直接注入venc编码,而不用bind方式,需要调用什么接口注入数据?

参考MI_SYS_ChnInputPortGetBuf接口,先获取对应模块的input buffer,再送数据进去。示例:

while(1)
{
    stBufConf.eBufType = E_MI_SYS_BUFDATA_FRAME;
    gettimeofday(&stTv, NULL);
    stBufConf.u64TargetPts = stTv.tv_sec*1000000 + stTv.tv_usec;
    stBufConf.stFrameCfg.eFormat = E_MI_SYS_PIXEL_FRAME_YUV422_YUYV;
    stBufConf.stFrameCfg.eFrameScanMode = E_MI_SYS_FRAME_SCAN_MODE_PROGRESSIVE;
    stBufConf.stFrameCfg.u16Width = u16Width;
    stBufConf.stFrameCfg.u16Height = u16Height;
    if(MI_SUCCESS == MI_SYS_ChnInputPortGetBuf(&stIspChnInput,&stBufConf,&stBufInfo,&hHandle,0))
    {
        if(fread(stBufInfo.stFrameData.pVirAddr[0], u16Width*u16Height*2, 1, fp) <= 0)
        {
            fseek(fp, 0, SEEK_SET);
        }
        MI_SYS_ChnInputPortPutBuf(hHandle,&stBufInfo, FALSE);
    }
}

Q6:partition_layout.txt文件是干什么用的?

方便看分区信息,实际系统不会load(partition_layout.txt位于project/image/output/images路径下),升级时候有没有这个文件都不影响

Q7:当系统内存太小时,会影响整体帧率,导致掉帧,这是什么原理?

当系统内存太小,只要存在申请内存不够,就会触发内存回收机制,频率太高的话,就会影响系统调度,导致掉帧。

内存回收会把进程不用的内存,比如代码段、有一些cache、匿名页等进行回收。