MI模块相关


1. DISP

  1. disp input 只支持E_MI_SYS_PIXEL_FRAME_YUV_SEMIPLANAR_420(YUV420SP)格式。

  2. disp只支持放大(宽或高最大16倍),不支持缩小。

  3. 调用MI_DISP_EnableVideoLayer接口前须先call HDMI相关API,否则卡顿时间较长。

    原因:MI_DISP_EnableVideoLayer里面需要等中断,这个中断需要HDMI那边设置好才会产生。


2. FB

  1. FB_WIDTH(对应参数MI_FB_DisplayLayerAttr_t.u32DisplayWidth ) 要 16/BytesPrePixel 向下对齐,FB模块只可以放大不能缩小。

3. HDMI

  1. 建议用户层注册MI_HDMI_EventCallBack回调处理热插拔事件。

    原因:在没有读到edid的情况下,默认DVI mode,颜色空间会设置成RGB,正常接入hdmi,一般设置颜色空间为YCBCR444,两种颜色空间显示效果不同。在未接入hdmi启动应用(默认DVI mode,颜色空间RGB) 后再插入hdmi的场景,颜色空间需要上层在回调函数做切换。


4. ISP

  1. ISP port0只支持realtime mode与SCL绑定,port1只支持frame mode与后级绑定。

  2. MI_ISP_IQ_SetNR3D前需要设置3dnr等级,只支持bayer格式,需要在ISP有数据进来后再调用,否则会报错。


5. SCL

  1. MI_SCL_StretchBuf只支持dev3 scl5。

  2. MI_SCL_SetInputPortCrop只有输入端口是从 DRAM 读取数据时,该设置才能生效,realtime mode和前级绑定不生效。

  3. MI_SCL_SetOutputPortParam在输出端口已经启用的情况下,需要改变输出参数,先调用 MI_SCL_DisableOutputPort 禁用端口,再设置参数,最后启用输出端口。


6. SYS

  1. bind时src/dst参数设置,如vif->isp不做帧率控制,必须设置成30:30或者25:25,isp->scl,不做帧率控制可以设置为0:0。源头的帧率scr/dst必须设置准确,否则会造成之后的帧率控制不准确。

  2. MI_SYS_ChnOutputPortGetBuf需要设完userdepth才能获取到buffer;建议通过select方式获取,可以通过MI_SYS_GetFd拿到句柄,无需get buf后需要将userdepth设为0,否则会一直占用内存。

  3. MI_SYS_Mmap申请的cache内存,请务必调用MI_SYS_FlushInvCache。

  4. realtime mode bind注意事项

    Realtime mode就是硬件直连,最大的优点是可节省内存和带宽,数据无需经过DDR;ISP与SCL之间一般使用realtime mode绑定;但是使用上也会有一些限制。

    1. 两个模块device之间Frame mode与realtime mode 只能选择1种方式绑定。

    2. 同一模块的所有input 只能有一种绑定方式,如果是realtime mode绑定,前级module和device必须一样。

    3. 同一模块 device的所有output x只能有一种绑定方式,如果realtime mode绑定,后级module和device必须一样。

    4. 同一个dev A outputport可以同时通过frame mode与realtime mode方式绑定到不同的devB/devC上,必须保证 dev A的所有output Port x 只能有一种绑定方式。

      示例: ISP dev0 output port0 通过 realtime mode绑定到 scl dev0,同时可以让ISP dev0 output port1通过frame mode 绑定倒scl dev1。

    5. 当模块dev output port 0 通过realtime mode绑定后端,那么不允许设置模块dev ouput port0的user depth, user depth必须为0;而且也无法dump output buffer。


7. VDEC

  1. MI_VDEC_CreateDev无需调用,只有需要支持B帧解码才调用,并设置stInitParam.bDisableLowLatency = TRUE,910/920芯片目前不支持B帧解码。

  2. VDEC不支持jpeg解码,有单独的模块JPD用来解码JPEG。

  3. VDEC只支持缩小(宽或高最大8倍),不支持放大。

  4. 建议通过参数eDpbBufMode设置参考帧,一个参考帧设置E_MI_VDEC_DBP_MODE_INPLACE_ONE_BUF,两个参考帧设置E_MI_VDEC_DBP_MODE_INPLACE_TWO_BUF,这样更加节省内存。

  5. 对于多slice码流,需要拼成完整一帧送给vdec,不能单slice送下去,vdec不会做拼帧处理。


8. VENC

  1. Venc编码bByFrame为FALSE则会按包编码,默认按每帧2个package的方式去编码,MI_VENC_SetH265SliceSplit/MI_VENC_SetH264SliceSplit可以设置每帧slice个数;设为TRUE才是按帧编码。

  2. MI_VENC_AllocCustomMap/MI_VENC_ApplyCustomMap需要按顺序执行;要保证AllocCustomMap成功后,再去修改这块buf内容,然后执行ApplyCustomMap,否则可能导致马赛克之类的问题。


9. VIF

  1. vif没有channel概念,只有device。每个device都只有一个channel Id0, 通过 MI_SYS 和后端绑定时只能用channel id0。

  2. 3DNR只能吃bayer格式数据,所以如果要走3DNR,vif输出格式要设置成bayer格式,比如42(RG)或44(BG);bayer格式更省带宽和内存,每个pixel占用1个byte,yuv422的话会占2个bytes。

  3. 标清(960H,隔行扫描相机)输出MI_VIF_DevAttr_t eFiled要设为BOTH,输出只能用yuv格式,因此也无法做3DNR。

  4. vif port0不支持crop和缩放,port1支持crop和缩小(倍数无限制);Port1 height有做 缩小时,输出width最大等于960。标清只支持port0输出,因为deinterlace是软件做的,固定在port0做。

  5. vif不支持input crop,即MI_VIF_SetDevAttr(MI_VIF_DEV u32VifDev, MI_VIF_DevAttr_t *pstDevAttr)时,pstDevAttr→stInputRect需填入实际采集的数据宽高(x/y坐标为0)。

  6. vif bt656/bt1120 input数据宽要求4 pixel对齐,否则会采集不到数据,这个是硬件限制。