概述
目录
- 一、VI部分详解
- 1、学习方法:绘制调用关系图谱
- 2、绘制VI部分调用关系
- 3、理解这些函数需要了解的一些知识
- 二、VPSS部分详解
- 1、VPSS的手册部分解读
- 2、VPSS的函数调用关系图谱
- 3、VPSS的Grp和Chn
- 4、VPSS部分代码详解
一、VI部分详解
1、学习方法:绘制调用关系图谱
(1)简单浏览VI部分的调用层次,发现很复杂
(2)有些函数是sample写的,有些是调用MPP的,数据结构也是2种都有
(3)学习重点1:全局把控熟悉整个过程全景视图
(4)学习重点2:掌握细节数据结构元素含义,和遇到的概念
(5)学习重点3:知道某些关键操作在哪里定义,哪里设置,将来需要改的时候能找到地方
2、绘制VI部分调用关系
参考学习:https://blog.csdn.net/qq_33894122/article/details/82961219
海思SDK sample例程函数调用:
main 主函数
SAMPLE_VENC_1080P_CLASSIC 视频采集函数
SAMPLE_COMM_VI_GetSizeBySensor(step1)得到sensor的相关参数,得到mmp系统所需的一些参数
SAMPLE_COMM_SYS_CalcPicVbBlkSize 得到缓存块的大小
SAMPLE_COMM_SYS_GetPicSize 得到图片的尺寸
SAMPLE_COMM_SYS_Init(step2)MMP系统初始化
HI_MPI_SYS_Exit();去初始化 MPP 系统。
HI_MPI_VB_Exit();去初始化 MPP 视频缓存池
HI_MPI_VB_SetConf 设置 MPP 视频缓存池属性
HI_MPI_VB_Init 初始化 MPP 视频缓存池
HI_MPI_SYS_SetConf 配置系统控制参数
HI_MPI_SYS_Init 去初始化 MPP 系统。
SAMPLE_COMM_VI_StartVi(step3) 开启视频视频输入设备并进行采集
IsSensorInput 判断是否传统还是现在的sensor
SAMPLE_COMM_VI_StartIspAndVi
SAMPLE_COMM_VI_StartMIPI(1) mipi接口配置
SAMPLE_COMM_VI_SetMipiAttr
fd = open("/dev/hi_mipi", O_RDWR);
ioctl(fd, HI_MIPI_SET_DEV_ATTR, pstcomboDevAttr)
SAMPLE_COMM_ISP_Init(2)配置传感器并且进行信号处理,包括宽动态模式
sensor_register_callback 注册回调函数
HI_MPI_AE_Register 向 ISP 注册 AE 库。
HI_MPI_AWB_Register 向 ISP 注册 AWB 库。
HI_MPI_AF_Register 向 ISP 注册 AF 库。
HI_MPI_ISP_MemInit 初始化 ISP 外部寄存器
HI_MPI_ISP_SetWDRMode 设置 ISP 宽动态模式
HI_MPI_ISP_SetPubAttr 设置 ISP 公共属性
HI_MPI_ISP_Init 初始化 ISP firmware
SAMPLE_COMM_ISP_Run(3)
pthread_create(&gs_IspPid, &attr, (void* (*)(void*))Test_ISP_Run, NULL) 创建一个线程让isp执行
Test_ISP_Run
HI_MPI_ISP_Run 运行 ISP firmware
SAMPLE_COMM_VI_StartDev(4) 设备
HI_MPI_VI_SetDevAttr 设置 VI 设备属性
HI_MPI_ISP_GetWDRMode 获取 ISP 宽动态模式。
HI_MPI_VI_SetWDRAttr 设置 WDR 工作属性
HI_MPI_VI_EnableDev 启用 VI 设备
SAMPLE_COMM_VI_StartChn(5)通道
HI_MPI_VI_SetChnAttr
HI_MPI_VI_SetRotate
HI_MPI_VI_EnableChn
SAMPLE_COMM_SYS_GetPicSize(step4)
SAMPLE_COMM_VPSS_StartGroup
SAMPLE_COMM_VI_BindVpss
SAMPLE_COMM_VPSS_EnableChn
SAMPLE_COMM_VENC_Start(step5)
SAMPLE_COMM_VENC_BindVpss
SAMPLE_COMM_VENC_StartGetStream(step6)
SAMPLE_COMM_VENC_StopGetStream(step7)
3、理解这些函数需要了解的一些知识
(1)常用Sensor的接口有三种:MIPI、LVDS、DC
MIPI(移动产业处理器接口)是MIPI联盟发起的为移动应用处理器制定的开放标准和
一个规范。
LVDS(Low-Voltage Differential Signaling)低电压差分信号,是一种低功耗、
低误码率、低串扰和低辐射的差分信号技术,这种传输技术可以达到155Mbps以上.
DC接口是一种与专用电源相配的插口,给使用设备提供直流供电。也就是直流电接口。
DC是直流电的意思。
(2)WDR宽动态
宽动态:宽动态技术是在非常强烈的对比下让摄像机看到影像的特色而运用的一种技术。
(3)isp就是image signal process,图像信号处理。
Bayer即是rawRGB
若想细究海思的isp处理,可参考以下几个文档:
Hi3518E V200R001C01SPC030 1.softwareboarddocument_cnISP_3A开发指南.pdf
Hi3518E V200R001C01SPC030 1.softwareboarddocument_cnHiISP 开发参考.pdf
Hi3518E V200R001C01SPC030 1.softwareboarddocument_cnHiISP FAQ.pdf
(4)HI3518E内部的ISP单元是隶属于VI模块的。VI模块就包含3大部分:第一部分是和Sensor对接的部分,第二部分就是ISP,第三部分就是VI dev和channel
(5)MPP 提供系统绑定接口( HI_MPI_SYS_Bind),即通过数据接收者绑定数据源来建立两者之间的关联关系(只允许数据接收者绑定数据源)。绑定后,数据源生成的数据将自动发送给接收者。
(6)VI/VPSS 离/在线模式
Hi3518E_SDK_V1.0.3.0/mpp/ko/load3518e
VI 和 VPSS 的协作模式分为以下 2 种(模式切换由 load 脚本参数控制,对应 sys 模块参数 vi_vpss_online):
VI/VPSS 离线模式是指 VI 进行时序解析后将图像数据写出到 DDR, VPSS 从DDR 中载入 VI 采集的数据进行图像处理,是传统 Hi3518/Hi3520D 等芯片的VI/VPSS 的协作模式。
VI/VPSS 在线模式是指 VI 进行时序解析后直接在芯片内部将数据传递到 VPSS,中间无 DDR 写出的过程。在线模式可以省一定的带宽和内存,降低端到端的延时。需要注意的是,在线模式时,因为 VI 不写出数据到 DDR,无法进行
CoverEx、 OverlayEx、 Rotate、 LDC 等操作,需要在 VPSS 各通道写出后再进行Rotate/LDC 等处理,而且有些功能只在离线下能支持,比如DIS处理。
二、VPSS部分详解
1、VPSS的手册部分解读
(1)基本概念描述
GROUP
VPSS 对用户提供组( GROUP)的概念。最大可用数为 VPSS_MAX_GRP_NUM个,各芯片的最大组数目有所不同,各 GROUP 分时复用 VPSS 硬件。每个 VPSSGROUP 包含多个通道,通道数目视方案实现有所不同,具体描述请参见CHANNEL。
CHANNEL
VPSS 组的通道。通道分为 2 种:物理通道和扩展通道。 VPSS 硬件提供多个物理通道,每个通道具有缩放、裁剪等功能。扩展通道具备缩放功能,它通过绑定物理通道,将物理通道输出作为自己的输入,把图像缩放成用户设置的目标分辨率输出。
FRC
帧率控制,分为 2 种: group 帧率控制和 chn 帧率控制。
Group 帧率控制:用于控制各 group 对输入图像的接收,只应用在 VI—VPSS的离线方案中。
Chn 帧率控制:用于控制各个物理通道图像的处理,应用在离线和在线方案中。
Crop
裁剪,分为 3 种: group 的裁剪和物理通道的裁剪以及扩展通道的裁剪。
Group 的裁剪, VPSS 对输入图像进行裁剪。
物理通道的裁剪, VPSS 对各个物理通道的输出图像进行裁剪。
扩展通道的裁剪, VPSS 调用 VGS 对扩展通道的输出图像进行裁剪。
DEI
De-interlace,去隔行。将交错的隔行视频源还原成逐行视频源。
NR
去噪。通过参数配置,把图像中的高斯噪声去除,使得图像变得平滑,有助于降低编码码率。
Scale
缩放,对图像进行缩小放大。
LDC
Lens Distortion Correction,镜头畸变校正,一些低端镜头容易产生图像畸变,需要根据畸变程度对其图像进行校正。
Cover
视频遮挡区域,对 VPSS 的输出图像填充纯色块。
Overlay
视频叠加区域,在 GROUP 上进行位图的加载和背景色更新,支持 ARGB4444、ARGB1555、 ARGB8888 三种格式的位图。
Border
边框, VPSS 在输出图像上加边框。
备份节点
原始图像的备份节点。每个 GROUP 都有一个备份节点,用于备份即将提交硬件处理的那帧原始图像。 VPSS 在以下情况会将缓存队列队头节点的图像放入备份节点:
当队头节点的图像要经过 VPSS 硬件处理时, VPSS 会将其放入备份节点,并替换掉原有图像。
当后端绑定的接收模块要求 VPSS 将队头图像放入备份节点时, VPSS 也会替换备份节点中的图像,即使该图像不经过硬件处理。
低延时
在 VI—VPSS 的在线方案中,编码器性能足够的情况下, VPSS 支持按照,以行为单位,边采集边发送的方式,将图像发送给编码模块进行编码,用来减少 VPSS处理完整帧图像再发送给编码模块过程中的数据的延时时间。这样的方式即为低延时方案。
(1)VPSS 上下文关系
2、VPSS的函数调用关系图谱
SAMPLE_COMM_SYS_GetPicSize(step4)进行视频处理,并将视频输入与视频处理建立连接
SAMPLE_COMM_VPSS_StartGroup
HI_MPI_VPSS_CreateGrp 创建一个 VPSS GROUP
HI_MPI_VPSS_GetNRParam 获取 vpss 3DNR 参数
HI_MPI_VPSS_SetNRParam 设置 vpss 3DNR 参数
HI_MPI_VPSS_StartGrp 启用 VPSS GROUP
SAMPLE_COMM_VI_BindVpss 视频输入通道与视频处理的组建立连接
SAMPLE_COMM_VI_Mode2Param
HI_MPI_SYS_Bind 绑定VI
SAMPLE_COMM_VPSS_EnableChn
HI_MPI_VPSS_SetChnAttr 设置 VPSS 通道属性。
HI_MPI_VPSS_SetChnMode 设置 VPSS 通道工作模式
HI_MPI_VPSS_EnableChn 启用 VPSS 通道
SAMPLE_COMM_VENC_Start(step5) 开始视频编码
HI_MPI_SYS_Bind 绑定VI
SAMPLE_COMM_VENC_BindVpss
SAMPLE_COMM_VENC_StartGetStream(step6)进行视频处理,传输视频流,
pthread_create(&gs_VencPid, 0, SAMPLE_COMM_VENC_GetVencStreamProc, (HI_VOID*)&gs_stPara);
SAMPLE_COMM_VENC_StopGetStream(step7) 退出并进行清理工作
3、VPSS的Grp和Chn
(1)VPSS的Grp中有很多个Chn
(2)VI有Chn和Dev,Dev中有很多个Chn
(3)VI中的Chn和VPSS中的Chn是不同的Chn,不论在硬件还是在软件编程上都是如此。
我们的HI3518E只使用一个通道,根据代码执行条件可以判断出来。
4、VPSS部分代码详解
/*****************************************************************************
* function : Vi chn bind vpss group
*****************************************************************************/
HI_S32 SAMPLE_COMM_VI_BindVpss(SAMPLE_VI_MODE_E enViMode)
{
HI_S32 j, s32Ret;
VPSS_GRP VpssGrp;
MPP_CHN_S stSrcChn;
MPP_CHN_S stDestChn;
SAMPLE_VI_PARAM_S stViParam;
VI_CHN ViChn;
s32Ret = SAMPLE_COMM_VI_Mode2Param(enViMode, &stViParam);
if (HI_SUCCESS !=s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_VI_Mode2Param failed!n");
return HI_FAILURE;
}
VpssGrp = 0;
for (j=0; j<stViParam.s32ViChnCnt; j++)
{
ViChn = j * stViParam.s32ViChnInterval;
stSrcChn.enModId = HI_ID_VIU;//源是VI单元
stSrcChn.s32DevId = 0;
stSrcChn.s32ChnId = ViChn;
stDestChn.enModId = HI_ID_VPSS;//目的是VPSS单元
stDestChn.s32DevId = VpssGrp;
stDestChn.s32ChnId = 0;
s32Ret = HI_MPI_SYS_Bind(&stSrcChn, &stDestChn);//
绑定后即进入在线模式
if (s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("failed with %#x!n", s32Ret);
return HI_FAILURE;
}
VpssGrp ++;
}
return HI_SUCCESS;
}
注:本资料大部分由朱老师物联网大讲堂课程笔记整理而来、参考了华为海思SDK中提供的开发手册,并且引用了部分他人博客的内容,如有侵权,联系删除!水平有限,如有错误,欢迎各位在评论区交流。
最后
以上就是花痴蜜粉为你收集整理的从官方例程深度学习海思SDK及API(3)一、VI部分详解二、VPSS部分详解的全部内容,希望文章能够帮你解决从官方例程深度学习海思SDK及API(3)一、VI部分详解二、VPSS部分详解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复