解析sample例程学习官方API:解析VIO Sample例程

先从比较常用的VIO Sample进行解析。

进入VIO模块可以看到,VIO的main函数文件。

        进入文件后首先看下VIO实现的功能,可以看到VIO示例的功能还是挺多的,并且支持HDMI与BT1120这两种输出接口,下面一个一个功能进行说明。

首先判断传给执行程序传入的参数个数是否正确,不正确则打印使用说明。

        上面设置了相应信号处理函数,SIGINT由Interrupt Key产生,通常是CTRL+C或者Delete,发送给所有ForeGround Group的进程。SIGTERM请求终止进程,Kill命令缺省发送。

当捕获到异常信号后触发的自定义函数如下,主要是对信号的重新定义以及系统退出资源的释放。

SAMPLE_VIO_MsgInit()与SAMPLE_VIO_MsgExit()分别为程序初始化与退出的桩函数,用户可以进行添加内容。

接着就是选择相应的功能,下面依次解析相关功能。

一、SAMPLE_VIO_ViOnlineVpssOnlineRoute

        在解析源码前你可能需要阅读一下《HiMPP V4.0 媒体处理软件开发参考》文档,大部分的内容文档中都已经描述的很清楚,当然涉及到一些专业术语就要我们自己去查了。

        前面一些都是关于VI、VPSS、VO以及VENC的配置,具体参数的信息可以在《HiMPP V4.0 媒体处理软件开发参考》查阅,这里是VI配置为单个Sensor,VI的配置为设备号0,使用PIPE与通道0,然后配置视频动态范围、线性模式、像素格式为YUV NV21、视频格式、不压缩等等,采用H265编码器对VPSS输出的视频流进行编码保存。

        因为很多sample需要调用同样的配置,所以海思将一些通用的接口都放在SAMPLE_COMM_XXX接口中,这里Sensor配置是使用I2C接口,Hi3519AV100的VI设备最多支持5个,不同的芯片型号支持的不一样,可以具体阅读《HiMPP V4.0 媒体处理软件开发参考》。

因为VPSS的工作模式设置为在线模式,可以简单的认为VPSS在线模式由VI_PROC将数据流直接发送给VPSS进行处理。

根据不同Sensor类型的图片大小分配缓存,这里配置VI写出RAW的缓存块为4块,YUV缓存块10块。

在启动各个模块之前必须需要MPP系统进行初始化。

为了防止其它进程已经使用MPP需要对其进行去初始化,然后根据之前VB的配置进行设置对系统进行初始化。

        启动VI模块需要先启动MIPI,接口根据hi_mipi驱动进行控制,根据VI的配置进行VI模块的参数设置以及创建,还需要启动ISP,ISP这块又涉及到许多内容,包括调试图像、可以使用自定义3A库开发等等。

根据VPSS的配置创建group并启动,设置并使能VPSS,这里因为配置为VI与VPSS在线模式所以不需要进行VI与VPSS的绑定。

        配置编码器并启动,这里接口可以根据配置切换为不同编码器,并绑定VPSS与VENC,自动将VPSS处理完的数据发送到VENC中进行编码。

最后配置VO并启动。

可以修改VO的输出接口时序为你需要的分辨率。

        SAMPLE_COMM_VO_StartVO函数中最后需要启动相应的输出接口,HDMI由系统接口实现,MipiTx海思有提供相应的驱动hi_mipi_tx。

绑定VPSS与VO自动将VPSS处理完的数据进行输出。

创建线程,通过Venc的fd判断是否有数据流编码完成进行保存到文件中。

不同异常进行资源释放的处理。

二、SAMPLE_VIO_ViOnlineVpssOfflineRoute

该函数实现VI在线VPSS离线功能,基本配置实现与上述相同,只有几处不同的地方。

需要配置模式为VI在线VPSS离线。

需要绑定VI与VPSS实现将VI捕获的内容自动发送到VPSS中处理。

按回车设置VI镜头畸变校正。

按回车启动防抖动设置。

        按回车开启VI通道展宽功能,展宽图像操作是为了使用户便于观察记录信息显示的细节情况而设立的,其功能与压缩图像相反,默认是最宽状态。

三、SAMPLE_VIO_ViDoublePipeRoute

改函数配置2个PIPE,并且配置2个VPSS。

        由于第0个PIPE配置为VI离线VPSS在线所以其他PIPE也必须配置为VI离线VPSS在线,在SAMPLE_COMM_VI_SetParam函数中可以看到该逻辑。

因为VPSS是在线模式所以不用绑定VI与VPSS,并且将VPSSGRP1绑定到编码器,VPSSGRP0绑定到VO输出。

四、SAMPLE_VIO_ViDoubleChnRoute

该函数配置双通道。

将VPSS设置为离线模式,并且将VI通道0与VPSS绑定。

VI通道1配置提前上报中断,并且将VI通道1与VO进行绑定直接输出图像。

五、SAMPLE_VIO_ViWdrSwitch

该函数只是在最后添加切换到2帧合成行WDR模式,需要设置两个PIPE。

再重新切换回线性模式,只需要一个PIPE。

六、SAMPLE_VIO_ViVpssLowDelay

        该函数只是增加设置VI镜头畸变校正并按回车设置低延时,低延时指图像写出指定的行数到 DDR 后,VI上报一个中断,把图像发给后端模块处理,可以减少延时,且硬件会有机制保证图像是先写后读,不会出现读图像错误。

小结:

        剩下的几个功能大体流程都相识,只是增加调用了几个关于像低延时、旋转这样的接口使用示例,虽然海思的sample例程比较粗糙,但上手的话还是可以基于sample进行开发,思路还是在sample了解与《HiMPP V4.0 媒体处理软件开发参考》查找相关说明。

发布了36 篇原创文章 · 获赞 4 · 访问量 2804

猜你喜欢

转载自blog.csdn.net/qq845699/article/details/104148754
今日推荐