海思3518E开发笔记2.5——海思VI(video input)模块详解
目录
- 海思video input模块架构介绍
- 海思video input模块功能介绍
- 结构体说明
- 函数调用关系
- 流程分析
- step 1: mipi configure
- step 2: configure sensor and ISP(include WDR mode)
- step 3: run isp thread
- step 4 : config & start vicap dev
- Step 5: config & start vicap chn (max 1)
海思3518的sample中,创建好视频缓存池及初始化完毕后,就进入第三步,开启vedio in device和channel
海思video input模块架构介绍
海思的3518E的内部ISP单元是隶属于VI模块的,海思的video input模块包含三大部分
- 和sensor的接口对接
- ISP
- device,用来采集图像的硬件单元,也是视频通道的入口
海思video input模块功能介绍
有的sensor内部有AD转换,数字信号出来之后,就到device,也就是海思VI的第三部分
有的sensor没有内置AD转换器,需要外界一个AD转换
主要实现的功能
将sensor采集到的数字视频信号进行isp处理,再进行镜头畸变矫正(LDC)、动态对比度调节(DCI)、DIS(消抖)模块处理,最后通过dev将处理好的视频丢进通道,和其他模块进行交互
结构体说明
/******************************************step 3: start vi dev & chn to capture******************************************/stViConfig.enViMode = SENSOR_TYPE;stViConfig.enRotate = ROTATE_NONE;stViConfig.enNorm = VIDEO_ENCODING_MODE_AUTO;stViConfig.enViChnSet = VI_CHN_SET_NORMAL;stViConfig.enWDRMode = WDR_MODE_NONE;s32Ret = SAMPLE_COMM_VI_StartVi(&stViConfig);if (HI_SUCCESS != s32Ret){SAMPLE_PRT("start vi failed!\n");goto END_VENC_1080P_CLASSIC_1;}
主要的结构体为
SAMPLE_VI_CONFIG_S stViConfig
SAMPLE_VI_CONFIG_S如下
其中
- stViConfig.enViMode为makefile中配置的sensor
- stViConfig.enRotate为NULL即不旋转
- stViConfig.enNorm为自动选择编码制式
- stViConfig.enViChnSet为无翻转
- stViConfig.enWDRMode为不选用WDR
函数调用关系
完整函数关系图
流程分析
SAMPLE_COMM_VI_StartVi
函数中,首先执行的是IsSensorInput
,此函数的功能为判断输入的视频是否是由sensor采集的,输入参数为makefile中配置的sensor类型
HI_BOOL IsSensorInput(SAMPLE_VI_MODE_E enViMode)
{HI_BOOL bRet = HI_TRUE;switch(enViMode){case SAMPLE_VI_MODE_1_D1:case SAMPLE_VI_MODE_BT1120_1080P:case SAMPLE_VI_MODE_BT1120_720P:bRet = HI_FALSE;break;default:break;}return bRet;
}
如代码所示,若makefile中配置的是D1、BT1120,则判定为不是sensor采集的视频,这两个是老式电视的标准。
enViMode = pstViConfig->enViMode;if(!IsSensorInput(enViMode)){s32Ret = SAMPLE_COMM_VI_StartBT656(pstViConfig);}else{s32Ret = SAMPLE_COMM_VI_StartIspAndVi(pstViConfig);}
如果是传统的电视标准,则走的是startBT656这一条,若是用sensor采集的,就用startIspAndVi这一路。
显然,我们要研究的是走sensor的这条路
于是进入SAMPLE_COMM_VI_StartIspAndVi
函数
step 1: mipi configure
mipi是sensor和3518e的接口
常用Sensor的接口有三种:
- MIPI
- LVDS
- DC
/******************************************step 1: mipi configure******************************************/s32Ret = SAMPLE_COMM_VI_StartMIPI(pstViConfig);if (HI_SUCCESS != s32Ret){SAMPLE_PRT("%s: MIPI init failed!\n", __FUNCTION__);return HI_FAILURE;}
这部分只有一个SAMPLE_COMM_VI_StartMIPI
函数,这个函数中有一个SAMPLE_COMM_VI_SetMipiAttr
,作用是设置sensor的一些属性
SAMPLE_COMM_VI_SetMipiAttr
中,首先打开mipi驱动加载进去后/dev底下生成的文件
接着根据不同的sensor为SAMPLE_COMM_VI_SetMipiAttr
填充不同的参数
最后通过ioctl
将参数设置给sensor
step 2: configure sensor and ISP(include WDR mode)
这一步也可以跳过,就看你要不要用3518处理你的图像
/******************************************step 2: configure sensor and ISP (include WDR mode).note: you can jump over this step, if you do not use Hi3516A interal isp. ******************************************/s32Ret = SAMPLE_COMM_ISP_Init(pstViConfig->enWDRMode);if (HI_SUCCESS != s32Ret){SAMPLE_PRT("%s: Sensor init failed!\n", __FUNCTION__);return HI_FAILURE;}
第一步先注册sensor的回调,为什么这么做,需要结合sensor和isp处理来看
第二部注册AE(自动曝光),进行自动曝光
第三步初测AWB,进行自动白平衡
第四步注册AF,自动对焦
第五步申请isp单元所用内存
第六步设置WDR宽动态相关属性,属性由参数传入
第七步设置sensor的pub属性,不同sensor的阵列不同,参考详解相机的sensor工作原理,设置完毕后,由HI_MPI_ISP_SetPubAttr
将属性写入
第八步最终初始化,将上面设置好的属性进行落实
step 3: run isp thread
- SAMPLE_COMM_ISP_Run();
- pthread_create(&gs_IspPid, &attr, (void* ()(void))
- Test_ISP_Run, NULL)
- Test_ISP_Run(HI_VOID *param)
- HI_MPI_ISP_Run(IspDev);
上一步所有isp相关的属性设置完毕后,将isp放在一个线程里面跑
思考:为什么海思不把isp全部做好? 因为它支持多种sensor,每个sensor参数不同,所以需要用户自己配置。海思方案是做好算法,做好数据结构,让用户进行填充。
工作中,有一种情况是可以和厂商沟通,定好sensor后isp部分由厂商完成
这一部分是isp相关操作,isp方向需要重点研究
step 4 : config & start vicap dev
isp在线程中跑起来之后,进入这一步start device
device,用来采集图像的硬件单元,也是视频通道的入口
首先HI_MPI_VI_SetDevAttr
,将sensor采集图像的起始点、图像尺寸进行设置
然后HI_MPI_ISP_GetWDRMode
获取WDR模式
获取之后HI_MPI_VI_SetWDRAttr
进行设置
最后将HI_MPI_VI_EnableDev
VI enable
Step 5: config & start vicap chn (max 1)
在之前通过sensor判断已经定好了通道的数量
这边就依次将通道打开
在函数SAMPLE_COMM_VI_StartChn
中,通过SDK提供的API可以对channel的属性、旋转进行设置,最后将通道enable
至此,海思VI模块完毕,后续的操作都是对通道进行操作
海思3518E开发笔记2.5——海思VI(video input)模块详解相关推荐
- 海思3518E开发笔记2.7——海思VENC(Video Encode)模块详解
目录 海思Video Encode模块架构介绍 海思Video Encode相关概念 码率控制 海思Video Encode模块功能介绍 编码通道 ROI 裁剪编码 函数调用关系 相关数据结构 流程分 ...
- 海思3518E开发笔记1.6——rootfs及其启动流程分析
3518E的根文件系统 /etc/fstab fs-version group profile udev init rcS S00devs S01udev S80network S90hibernat ...
- 海思3518E开发笔记1.5——flash分区及uboot、kernel、rootfs烧写并部署
目录 规划分区 烧写流程 tftp更新并重新烧写uboot的命令序列 tftp更新并重新烧写kernel的命令序列 tftp更新并重新烧写rootfs的命令序列: 裸机烧录uboot 什么是裸机 烧录 ...
- 海思3518E开发笔记1.1——HI3518E方案整体架构介绍
目录 前言 硬件 软件 前言 在做一个项目之前,需要对这个项目在一个比较高的高度进行了解. 如,硬件构成.软件是裸机的还是带操作系统的,带操作系统的是怎么样一个开发流程. 得对项目由打到校进行了解,知 ...
- 海思3518E开发笔记4.2——sensor数据交互接口(MIPI、LVDS、DVP并口),以AR0130和OV9712为例
目录 前言 DVP(并口) LVDS MIPI(MIPI-CSI2) 总结 前言 摄像头是一个独立的芯片,和主控芯片是弧线独立的,两者通过接口进行交互,交互的信息有控制信号和数据信号 控制信号常用I2 ...
- 【Android游戏开发十二】(保存游戏数据 [上文])详解SharedPreference 与 FIleInputStream/FileOutputStream将数据存储到SD卡中!
李华明Himi 原创,转载务必在明显处注明: 转载自 [黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/327.html 很多童鞋说 ...
- 海康摄像头开发笔记(一):连接防爆摄像头、配置摄像头网段、设置rtsp码流、播放rtsp流、获取rtsp流、调优rtsp流播放延迟以及录像存储
文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/131679108 红胖子(红模仿)的博文大全:开发技术集合( ...
- [Java入门笔记] 面向对象编程基础(二):方法详解
2019独角兽企业重金招聘Python工程师标准>>> 什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能 ...
- Java web 开发的概念、环境配置、创建项目过程详解(Eclipse)
Java Web 开发 Java Web 开发概念 搭建过程 详解 在eclipse创建Dynamic Web Project 创建时选择Tomcat的版本 创建项目成功 eclipse环境下如何配置 ...
最新文章
- 无人值守u盘安装linux,从U盘无人值守安装linux操作系统(纯实践笔记)
- Python基础语法06--文件
- input type 属性
- python_day6.2
- 1108轮播图和定时器this问题
- Deploying Kubernetes with CoreDNS using kubeadm
- Android和JS之间互相调用方法并传递参数
- [Android] DownloadManager下载管理类2.3新增API介绍
- python bind sock_python SOCKET编程详细介绍
- 数据库面试 - 如何设计才可以让系统从未分库分表动态切换到分库分表上?
- 5.2.1 标准原子类型
- #上位机开发大师之路# 串口控制模块开发
- springmvc学习一初始化源码
- MATLAB求解夏普利值
- 小米手机计算机usb连接,小米5手机怎么连接电脑 USB调试方法教程
- CKeditor 3.1 精简版带SyntaxHighlighter插件
- OpenGL基本图元
- GSI计算机,DAT或者GSI水准数据用科傻(COSA)软件平差
- Ubuntu下mentohust的配置
- 算法设计与分析基础知识点