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:接口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

Q3: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);
    }
}

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

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