SDK使用注意事项


1. Insmod参数

insmod mi_sys.ko cmdQBufSize=8192 logBufSize=256 bEnableMmuPool=1

配置cmdQBuf和logBuf用量,buf单位是KB,参考公版配置即可。bEnableMmuPool=1可以节省内存和cpu。

insmod mhal.ko RC_BITRATE_TOLERANCE=15

或者

echo 15 > /sys/module/mhal/parameters/drv_venc_wrapper.RC_BITRATE_TOLERANCE

设置允许码率波动范围; CBR下,静态画面突然转入动态可能会出现马赛克现象,需要允许超部分码率。

insmod mi_ipu.ko fw_heap_size=524288

跟IPU路数有关,每路0.5M,如果要开多路,加大size即可,不设置默认分4M,即最大可到8路。

insmod mi_vdisp.ko vdisp_bufq_depth=4

vdisp_bufq_depth代表vdisp 模块对输入通道帧率均匀的容忍度。主要针对vdisp各个input port帧率相近的情况,解决帧率抖动的问题;帧率稳定时这个值可以调低,以节省内存,取值范围 [1,4]。

2. MI 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那边设置好才会产生。

3. MI FB

FB_WIDTH(对应参数MI_FB_DisplayLayerAttr_t.u32DisplayWidth )要 16/BytesPrePixel 向下对齐(1366x768分辨率容易出问题),FB模块只可以放大不能缩小。

4. MI HDMI

用户层最好注册MI_HDMI_EventCallBack回调处理热插拔事件,因为如果没有读到edid的情况下,默认会走DVI mode,颜色空间会设置成RGB,正常接入hdmi的情况下一般会设置颜色空间为YCBCR444,两种颜色空间显示效果不一样。在未接入hdmi启动应用(默认走DVI mode,颜色空间RGB)后再插入hdmi的场景,颜色空间需要上层在回调函数做切换。

5. MI ISP

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

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

6. MI SCL

  1. MI_SCL_StretchBuf只支持dev1 scl6。

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

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

7. MI 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。

8. MI VDEC

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

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

  3. 关于参考帧的设置最好通过参数eDpbBufMode,一个参考帧设置E_MI_VDEC_DBP_MODE_INPLACE_ONE_BUF,两个参考帧设置E_MI_VDEC_DBP_MODE_INPLACE_TWO_BUF,这样会更加节省内存。

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

9. MI 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,否则可能导致马赛克之类的问题。

10. MI 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格式。

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

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