作者| fish.xu
Comake社区技术问题汇总,第20231103期,本期将介绍SSR910Q/920G/921G sdk使用注意事项。
MI_VIF篇
vif没有channel概念,只有device。每个device都只有一个channel Id0, 通过 MI_SYS 和后端绑定时只能用channel id0。
3DNR只能吃bayer格式数据,所以如果要走3DNR,vif输出格式要设置成bayer格式,比如42(RG)或44(BG);bayer格式更省带宽和内存,每个pixel占用1个byte,yuv422的话会占2个bytes。
标清(960H,隔行扫描相机)输出MI_VIF_DevAttr_t eFiled要设为BOTH,输出只能用yuv格式,因此也无法做3DNR。
vif port0不支持crop和缩放,port1支持crop和缩小(倍数无限制);Port1 height有做 缩小时,输出width最大等于960。标清只支持port0输出,因为deinterlace是软件做的,固定在port0做。
vif不支持input crop,即MI_VIF_SetDevAttr(MI_VIF_DEV u32VifDev, MI_VIF_DevAttr_t *pstDevAttr)时,pstDevAttr→stInputRect需填入实际采集的数据宽高(x/y坐标为0)。
vif bt656/bt1120 input数据宽要求4 pixel对齐,否则会采集不到数据,这个是硬件限制。
MI_VENC篇
Venc编码bByFrame为FALSE则会按包编码,默认按每帧2个package的方式去编码,MI_VENC_SetH265SliceSplit/MI_VENC_SetH264SliceSplit可以设置每帧slice个数;bByFrame设为TRUE才是按帧编码。
MI_VENC_AllocCustomMap/MI_VENC_ApplyCustomMap需要按顺序执行;要保证AllocCustomMap成功后,再去修改这块buf内容,然后执行ApplyCustomMap,否则可能导致马赛克之类的问题。
MI_VDEC篇
MI_VDEC_CreateDev无需调用,只有需要支持B帧解码才调用,并设置stInitParam.bDisableLowLatency = TRUE, 目前910/920还不支持B帧解码。
VDEC不支持jpeg解码,有单独的模块JPD用来解码JPEG。
VDEC只支持缩小(宽或高最大8倍),不支持放大。
关于参考帧的设置最好通过参数eDpbBufMode,一个参考帧设置E_MI_VDEC_DBP_MODE_INPLACE_ONE_BUF,两个参考帧设置E_MI_VDEC_DBP_MODE_INPLACE_TWO_BUF,这样会更加节省内存。
对于多slice码流,需要拼成完整一帧送给vdec,不能单slice送下去,vdec不会做拼帧处理。
MI_SYS篇
bind时src/dst参数设置,比如vif->isp不做帧率控制,就一定要设置成30:30或者25:25,isp->scl 不做帧率控制就可以设置为0:0,这种源头的帧率scr/dst一定要设置准确,否则后面的帧率控制可能都不准。
MI_SYS_ChnOutputPortGetBuf,需要设完userdepth才能获取到buffer;最好通过select方式获取,可以通过MI_SYS_GetFd拿到句柄;无需get buf后需要将userdepth设为0,否则会一直占用内存。
MI_SYS_Mmap申请的cache内存,一定要记得MI_SYS_FlushInvCache。
realtime mode bind注意事项
Realtime mode就是硬件直连,最大的好处就是可以节省内存和带宽,数据无需经过DDR;ISP与SCL之间一般使用realtime mode绑定;但是使用上也会有一些限制。
两个模块device之间Frame mode与realtime mode 只能选择1种方式绑定。
同一模块的所有input 只能有一种绑定方式,如果是realtime mode绑定,前级module和device必须一样。
同一模块 device的所有output x只能有一种绑定方式,如果realtime mode绑定,后级module和device必须一样。
同一个dev A outputport可以同时通过frame mode与realtime mode方式绑定到不同的devB/devC上,必须保证 dev A的所有output Port x 只能有一种绑定方式。
Example: ISP dev0 output port0 通过 realtime mode绑定到 scl dev0,同时可以让ISP dev0 output port1通过frame mode 绑定到scl dev1。
当模块dev output port 0 通过realtime mode绑定后端,那么不允许设置模块dev ouput port0的user depth, user depth必须为0;而且也无法dump output buffer。
MI_SCL篇
MI_SCL_StretchBuf只支持dev3 scl5。
MI_SCL_SetInputPortCrop只有输入端口是从 DRAM 读取数据(与前级framemode绑定)时,该设置才能生效,realtime mode和前级绑定是不生效的。
MI_SCL_SetOutputPortParam,在输出端口已经启用的情况下,需要改变输出参数, 需要先调用 MI_SCL_DisableOutputPort 禁用端口,再来设置参数,然后再启用输出端口。
MI_ISP篇
ISP port0只支持realtime mode与SCL绑定,port1只支持frame mode与后级绑定。
MI_ISP_IQ_SetNR3D前需要设置3dnr等级,只支持bayer格式,需要在ISP有数据进来后再调用,否则会报错。
MI_HDMI篇
用户层最好注册MI_HDMI_EventCallBack回调处理热插拔事件,因为如果没有读到edid的情况下,默认会走DVI mode,颜色空间会设置成RGB,正常接入hdmi的情况下一般会设置颜色空间为YCBCR444,两种颜色空间显示效果不一样。在未接入hdmi启动应用(默认走DVI mode,颜色空间RGB)后再插入hdmi的场景,颜色空间需要上层在回调函数做切换。
MI_FB篇
FB_WIDTH(对应参数MI_FB_DisplayLayerAttr_t.u32DisplayWidth ) 要 16/BytesPrePixel 向下对齐,FB模块只可以放大不能缩小。BytesPrePixel取决于格式,比如ARGB1555格式,那BytesPrePixel=2;ARGB8888格式,则BytesPrePixel=4。
MI_DISP篇
disp input 只支持E_MI_SYS_PIXEL_FRAME_YUV_SEMIPLANAR_420(YUV420SP)这一种格式。
disp只支持放大(宽或高最大16倍),不支持缩小。
调用MI_DISP_EnableVideoLayer接口前须先call HDMI相关API,否则可能会卡很久。原因:MI_DISP_EnableVideoLayer里面需要等中断,这个中断需要HDMI那边设置好才会产生。
insmod ko参数篇
insmod mi_ai.ko TriggerInterval=70
单位是ms,代表硬件定时器触发DMA read的时间间隔,一般只要比送流时间间隔短一些即可,这样可以节省cpu。
计算方法:TriggerInterval <= 1000/(采样率/u32PtNumPerFrm)
如果会有采样率或u32PtNumPerFrm动态变化的情况,TriggerInterval取计算出来的最小值。
insmod mhal.ko VenMiuPChn=16 VdeMiuPChn=8
代表总的venc和vdec的chn数,用来做内存保护;注意通道数量不要填多,会多消耗内存。
insmod mi_sys.ko cmdQBufSize=3072 logBufSize=4 bEnableMmuPool=1
buf单位是KB,cmdQBufSize需要请FAE帮忙计算,一般用公版默认值即可;bEnableMmuPool=1可以节省内存和cpu,建议带上。
insmod mi_venc.ko max_jpe_task=1
max_jpe_task默认是2,只有IMI mode(realtime/frame mode同时存在)才会用到,所以可以设置为1,会影响output buf,2占用内存为wxh,1的话占用内存为wxh/2。
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路。
》》原帖地址
End.
往期回顾
iperf3工具支持及常用测试指令说明
UVC使用指南(上)
如何单独编译kernel以及替换升级kernel image?
如何针对CPU和内存进行压测,确认数据一致性
SSD21X/22X如何支持USB转Ethernet?
扫码进入论坛
原厂答疑|产品选型|官方资源
扫码咨询客服
SDK下载|芯片、开发板购买