rockit 学习、开发笔记(四)(VI)

这里开始讲解VI模块相关内容,本人VI模块的接触较晚一些,因为我接手的时候VI已经可以跑起来了,所以就先搞了VO,RGN等等其他模块,虽然接触VI晚一些,但是基于有其他模块的学习基础,理解起来倒也不难,有些理解不对的地方还请多多指教。

通过官方文档我们可以了解一些重要概念以及一些处理流程。

基本概念:
视频输入(VI)模块实现的功能:通过 MIPI Rx(含 MIPI 接口、LVDS 接口),BT.1120,BT.656,BT.601,DC 等接口接收视频数据。VI 将接收到的数据存入到指定的内存区域,实现视频数据的采集。

其中一些重要概念:
DEV设备 —— 视频输入设备支持若干种时序输入,负责对时序进行解析。
PIPE管道 —— 视频输入 PIPE 绑定在设备后端,负责设备解析后的数据再处理 。(目前暂未实现内容,采用直通方式,同dev相同id设置即可)。
CHANNEL通道 —— 视频输入最后一级的获取通道,如dev为isp时输出有四个channel。

VI的处理流程框图:(具体不同芯片处理流程可能不一样)
在这里插入图片描述
我们首先进行VI模块的初始化,初始化可以参考RK提供的demo程序,基本上初始化的函数调用顺序就下面的函数顺序。

初始化

RK_MPI_VI_GetDevAttr

这个函数用于获取VI设备的属性,如果配置过了就会返回成功,没配置过就返回失败。一般对一个设备来说配置过了就可以不用再去配置了,也就初始化的时候配置一次就可以了。
在这里插入图片描述

RK_MPI_VI_SetDevAttr

这个函数用于设置设备属性,如上所说,配置过了就一般就不需要在配置,也是初始化一次即可。一般与RK_MPI_VI_GetDevAttr成对使用。

在这里插入图片描述

RK_MPI_VI_GetDevIsEnable

用于查看设备是否使能。
在这里插入图片描述

RK_MPI_VI_EnableDev

若没有使能就使能设备,需要先配置好设备属性。
在这里插入图片描述

RK_MPI_VI_SetDevBindPipe

设置VI设备的PIPE,这个PIPE目前官方说还未使用到,不知道有什么用,那就先照抄吧
在这里插入图片描述

RK_MPI_VI_SetChnAttr

设置VI通道属性,VI_CHN_ATTR_S属性的结构体中,需要设置很多东西。
在这里插入图片描述
首先是通道的图像大小需要设置成信号源的输出图像大小,像素格式也要保持一致,否则v4l2获取会超时,还有目标图像的压缩格式,如果传输图像的格式是没有经过VPSS等一些模块压缩过的,就是没有压缩,如果压缩过就需要设置16x16的压缩格式,对于队列深度这个成员变量,了解不多,可能是用于缓存的也说不定( •̀ ω •́ ),帧率控制的话没有性能需求的话就直接设置成-1就行了,图像内存的申请类型如果是mmap方式的话就得设置成外部申请。

在这里插入图片描述

接下来是对于ISP处理的设置一般是得使能v4l2,和设置它的最大图像大小,以及buff的大小,数量,和一些内存类型,设备名字,对于buff的话的是给到其他模块或者用户使用的,可以理解有多少个buff用来缓存图像,设备名字是信号源在该设备的节点一般为/dev/videox,x为数字;内存类型根据需求做调整,一般是VI_V4L2_MEMORY_TYPE_MMAP。
RK3588平台,因底层硬件需要做缓存处理,u32Bufcount 至少需要3个或以上bufer才能获取到满足帧率需求的帧数。
RV1126平台,因底层驱动已有做缓存处理,u32Bufcount 可以配置更少的个数即可满足帧率需求,建议最少配置2个。

在这里插入图片描述

RK_MPI_VI_RegChnEventCallback

在demo中调用完RK_MPI_VI_SetChnAttr后就调用了该函数,该函数用于VI事件回调,回调函数有个参数是函数指针,一般是实现该函数指针指向的函数,该函数一般不做阻塞以及耗时操作,可以使用信号量或者条件变量等等实现通知其他线程进行函数处理。在demo中有实现好的部分函数,可以用来参考。

在这里插入图片描述

RK_MPI_VI_EnableChn

该函数用于使能VI通道,使能之后,通道的配置就可以生效了
在这里插入图片描述
在这里插入图片描述

至此基本上VI的初始化就完成了,如果配置不错的话,VI已经可以正常获取数据流了,在RK提供的demo中vi的使用往往是绑定了其他模块的然后进行使用的如VO,VPSS,VENC等等,这样相当于把VI的数据送到其他模块进行处理,至于怎么处理就是后级模块的事,VI的事到这里就基本结束了;当然不绑定后级,也可以获取到VI的数据。

使用

RK_MPI_VI_GetChnFrame

该函数可以从通道中获取当前帧,可以使用RK_MPI_MB_Handle2VirAddr把地址转换成用户空间的虚拟地址,然后去读取里面的数据。当然也可以直接使用VO模块的RK_MPI_VO_SendFrame函数将其发送出去,前提是有初始化VO模块,具体可以参考我的另外一篇笔记
在这里插入图片描述
在这里插入图片描述

RK_MPI_VI_ReleaseChnFrame

该函数就是在RK_MPI_VI_GetChnFrame获取帧后,在用户使用完毕后就必须使用的函数,用于释放通道帧(buff),基本上与RK_MPI_VI_GetChnFrame是成对出现的。这里的不释放的话,buff是不会重新回到VI输出的buff队列中,这里的buff就是上面初始化提到的通道中isp成员变量中的buff,也就是说如果你的buffcount设置为7,那你就算有一次不释放buff,程序也可以正常运行,只是少一个buff,如果buff为0就跑不了了,所以得注意一下这个地方,及时去释放掉。
在这里插入图片描述

对于VI模块的初始化和简单的使用大概就是这些了,对于VI模块其他函数的使用,可以参考RK提供的官方文档,里面有很详细的解析。
还有一些要注意的点是在使用VI模块的时候,有一个成员变量是是否使用v4l2,(目前的话只能选择是)如果选择是的话,那么在同一时刻下v4l2的相关命令或者相关库就不能被使用了,如果使用的话可能VI模块的获取视频流就会超时timeout。
以及信号源输出像素格式必须与rockit的通道像素格式一致,否则无法获取图像流,对于不同像素格式,如果不单单输出到VO模块或者其他模块,而是想要做预览或者截屏处理的话,就需要对图像进行图像格式转换以及一些音视频处理的相关技术了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值