一.海思Hi3516ev100视频输入(VI)模块--结合例程理解

2023-11-10 11:30

本文主要是介绍一.海思Hi3516ev100视频输入(VI)模块--结合例程理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一.海思Hi3516ev100视频输入(VI)模块*

1. vi简介
视频输入(VI)模块实现的功能:通过 ITU-R BT656/601/1120 接口或 Digital Camera接口、 MIPI Rx(含 MIPI 接口、 LVDS 接口和 HISPI 接口)接收视频数据。
两种工作模式:
当工作在离线模式时,将接收到的数据存入到指定的内存区域。(DDR)
当工作在在线模式时, VI 会将数据直接送给 VPSS。在此过程中, VI 可以对接收到的原始视频图像数据进行裁剪(Crop)等处理,并实现一路原始视频图像输入,输出一路视频图像功能。

2. 重要概念

视频输入设备

 视频输入设备支持若干种时序输入,负责对时序进行解析。

在线模式与离线模式

离线模式:是指 VI 写出数据到 DDR,然后与之绑定的模块从 DDR 读取数据。
在线模式:在线是指 VI 与 VPSS 之间的在线数据流传输,在此模式下 VI 不会写出到 DDR,而是直接把数据流送给 VPSS。

视频物理通道

视频物理通道负责将输入设备解析后得到的视频数据输出到 DDR。在真正将
数据输出到 DDR 之前,它可以实现裁剪等功能,具体功能见各芯片的详细描述。

掩码

掩码用于指示 VI 设备的视频数据来源。

镜头畸变校正(LDC)

镜头畸变校正,一些低端镜头容易产生图像畸变,需要根据畸变程度对其图像进
行校正。

DCI

Dynamic Contrast Improvement,动态对比度调节。对图像进行动态的对比度调
节,即在增强图像暗区亮度时而不使亮区过亮,或降低亮区亮度时而不使暗区过暗。

DIS

DIS 模块通过比较当前图像与前两帧图像采用不同自由度的防抖算法计算出当前图
像在各个轴方向上的抖动偏移向量,然后根据抖动偏移向量对当前图像进行校正,
从而起到防抖的效果。

视频输入硬件单元的功能图

在这里插入图片描述

通道功能框图

Hi3516A VI 通道功能框图
在这里插入图片描述

Hi3518EV200 VI 通道功能框图
在这里插入图片描述
Hi3519V100 VI 通道功能框图
在这里插入图片描述

视频输入设备
Hi3516A/Hi3518EV200/Hi3519V100 芯片只有一个 VI 设备,即 Dev0。 Dev0 支持BT.656、 BT.601、 DC、 MIPI Rx(MIPI、 LVDS、 HISPI 接口)输入。 Dev0 不支持非连续 pixel clock 时序。

视频物理通道
Hi3516A/Hi3518EV200/Hi3519V100 VI 硬件单元仅包含 1 个 VI 视频物理通道,即Chn0。不存在次通道,但支持扩展通道。

Hi3516A 物理通道支持的典型分辨率如 720p@30、 1080p@30、 1080p@60、20481536@30、 25921944@30 等。
Hi3518EV200 物理通道支持的典型分辨率如 720p@30、 1080p@30。
Hi3519V100 物理通道支持的典型分辨率如 1080P@120、 20481536@60、25921944@60、 38402160@30、 46083456@15。
视频扩展通道
扩展通道是物理通道的扩展,主要实现缩放功能,其数据来源于物理通道。Hi3516A/Hi3518EV200/Hi3519V100 最多支持 16 个扩展通道。

绑定关系
Hi3516A/Hi3518EV200/Hi3519V100 VI 的物理通道与所对应的设备固定绑定,不允许改变它们的绑定关系。

掩码配置
掩码的高 12bit 对应着硬件线路的 12 个 pin 脚连接(D0 到 D15 之间的任意连续 12 个pin 脚即可,例如 D4~D15),用户需要根据实际连接情况设置恰当的掩码配置,掩码的最高比特位对应的 pin 为 D15,例如 10bit 输入的 Sensor 连接的 pin 为 D6~D15,掩码配置为 0xFFC00000;同理如果是 14bit 输入时,对应的掩码配置为 0xFFFC0000。

1 路 5M 或 1080p 图像输入场景(12bit 输入)
1 路 5M 或 1080p 图像输入场景下,设置 VI 设备属性时,可根据表 3-1 配置掩码。
1 路 5M 或 1080p 场景下的掩码配置( 12bit)
在这里插入图片描述
设备号 掩码 0 掩码 1
0 0xFFF00000 0x0
1 路 BT.1120 高清输入场景(16bit 输入)
1 路 BT.1120 高清图像输入场景下,设置 VI 设备属性时,可根据表 3-2 配置掩码。
1 路 BT.1120 图像输入场景下的掩码配置( 16bit)
在这里插入图片描述
设备号 掩码 0 掩码 1
0 0xFF000000 0x00FF0000
1 路 D1 图像输入场景(8bit 输入)
1 路图像输入场景下,设置 VI 设备属性时,可根据表配置掩码。
1 路 D1 图像输入场景下的掩码配置( 8bit)
在这里插入图片描述
设备号 掩码 0 掩码 1
0 0xFF000000 0x0
DIS 软件流程
调用 DIS 接口前必须使能 VI 通道。 DIS 的使用流程如图所示:=
Hi3519V100 DIS 使用流程
在这里插入图片描述
DIS 只支持离线模式,只支持在物理通道上运行。
当前 DIS 支持的典型分辨率有 38402160@30、 1080p@60、 720p@120;其他分辨率(如 32642448、 4608*3456 等)效果暂未验证。
DIS 视频输入图像格式只支持 Semiplanar420,单分量,只支持非压缩图像。
为了保证 DIS 的性能,请使用 Hi3519V100 的 big-little 环境,如果要运行多业务场景,建议将 A17 CPU 升频到 1.15GHz,且将 DIS 线程绑定到 A17 上运行。
另外 DIS 处理过程中需要使用 VGS/FishEye 模块,如果多个模块调用 VGS、鱼眼功能,可能因 VGS、鱼眼性能不足而导致 DIS 出现丢帧的现象。

主要做了下面的工作:
设置了mipi,摄像头用的是MIPI,应用层只需要用open打开MIPI,用ioctl设置
注册sensor和isp,和设置3A
运行isp线程
设置VI的属性,并使能VI
设置通道属性,和开启通道

调用图谱

SAMPLE_COMM_VI_StartVi(step3)//start vi dev & chn to captureIsSensorInputSAMPLE_COMM_VI_StartIspAndViSAMPLE_COMM_VI_StartMIPI(1)//mipi configureSAMPLE_COMM_VI_SetMipiAttrfd = open("/dev/hi_mipi", O_RDWR);ioctl(fd, HI_MIPI_SET_DEV_ATTR, pstcomboDevAttr)SAMPLE_COMM_ISP_Init(2)sensor_register_callbackHI_MPI_AE_RegisterHI_MPI_AWB_RegisterHI_MPI_AF_RegisterHI_MPI_ISP_MemInitHI_MPI_ISP_SetWDRModeHI_MPI_ISP_SetPubAttrHI_MPI_ISP_InitSAMPLE_COMM_ISP_Run(3)pthread_create(&gs_IspPid, &attr, (void* (*)(void*))Test_ISP_Run, NULL)Test_ISP_RunHI_MPI_ISP_RunSAMPLE_COMM_VI_StartDev(4)HI_MPI_VI_SetDevAttrHI_MPI_ISP_GetWDRModeHI_MPI_VI_SetWDRAttrHI_MPI_VI_EnableDevSAMPLE_COMM_VI_StartChn(5)HI_MPI_VI_SetChnAttrHI_MPI_VI_SetRotateHI_MPI_VI_EnableChn	

``

sample:

stViConfig.enViMode   = SENSOR_TYPE;  //APTINA_AR0130_DC_720P_30FPS
stViConfig.enRotate   = ROTATE_NONE;  //旋转多少度
stViConfig.enNorm     = VIDEO_ENCODING_MODE_AUTO;  //编码模式自动
stViConfig.enViChnSet = VI_CHN_SET_NORMAL; //是否开启镜像
stViConfig.enWDRMode  = WDR_MODE_NONE; //没有WDR
/******************************************step 1: 配置mipi
******************************************/
HI_S32 fd;
combo_dev_attr_t *pstcomboDevAttr = NULL;/* mipi reset unrest */
fd = open("/dev/hi_mipi", O_RDWR);
if (fd < 0)
{printf("warning: open hi_mipi dev failed\n");return -1;
}
pstcomboDevAttr = &MIPI_CMOS3V3_ATTR;
if (ioctl(fd, HI_MIPI_SET_DEV_ATTR, pstcomboDevAttr))
{printf("set mipi attr failed\n");close(fd);return HI_FAILURE;
}
close(fd);/*****************************************
*step 2: 注册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;
}
/******************************************
*step 3: run isp thread 
*note: you can jump over this step, if you do not use Hi3516A interal isp.
******************************************/
s32Ret = SAMPLE_COMM_ISP_Run();
if (HI_SUCCESS != s32Ret)
{SAMPLE_PRT("%s: ISP init failed!\n", __FUNCTION__);/* disable videv */return HI_FAILURE;
}
/******************************************
*step 3: run isp thread 
*note: you can jump over this step, if you do not use Hi3516A interal isp.
******************************************/
s32Ret = SAMPLE_COMM_ISP_Run();
if (HI_SUCCESS != s32Ret)
{SAMPLE_PRT("%s: ISP init failed!\n", __FUNCTION__);/* disable videv */return HI_FAILURE;
}
/******************************************************
*step 4 : config & start vicap dev
******************************************************/
s32Ret = SAMPLE_COMM_VI_StartDev(0, enViMode);
if (HI_SUCCESS != s32Ret)
{SAMPLE_PRT("%s: start vi dev[%d] failed!\n", __FUNCTION__, i);return HI_FAILURE;
}
/******************************************************
* Step 5: config & start vicap chn (max 1) 
******************************************************/
RECT_S stCapRect;
SIZE_S stTargetSize;
ViChn = 0;
stCapRect.s32X = 0;
stCapRect.s32Y = 0;
stCapRect.u32Width = 1280;
stCapRect.u32Height = 720;stTargetSize.u32Width = stCapRect.u32Width;
stTargetSize.u32Height = stCapRect.u32Height;
//通道使能
s32Ret = SAMPLE_COMM_VI_StartChn(ViChn, &stCapRect, &stTargetSize, pstViConfig);
if (HI_SUCCESS != s32Ret)
{SAMPLE_COMM_ISP_Stop();return HI_FAILURE;
}

``

注意点总结:

根据sensor型号,设置MIPI接口。

   /* 1. reset mipi */ioctl(fd, HI_MIPI_RESET_MIPI, &stcomboDevAttr.devno);/* 2. reset sensor */ioctl(fd, HI_MIPI_RESET_SENSOR, &stcomboDevAttr.devno);/* 3. set mipi attr */if (ioctl(fd, HI_MIPI_SET_DEV_ATTR, &stcomboDevAttr)){printf("set mipi attr failed\n");close(fd);return HI_FAILURE;}/* 4. unreset mipi */ioctl(fd, HI_MIPI_UNRESET_MIPI, &stcomboDevAttr.devno);/* 5. unreset sensor */ioctl(fd, HI_MIPI_UNRESET_SENSOR, &stcomboDevAttr.devno);close(fd);

配置vi dev时注意的参数:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
这里采用的是DC模式

这篇关于一.海思Hi3516ev100视频输入(VI)模块--结合例程理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/382384

相关文章

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基

Python使用pynput模拟实现键盘自动输入工具

《Python使用pynput模拟实现键盘自动输入工具》在日常办公和软件开发中,我们经常需要处理大量重复的文本输入工作,所以本文就来和大家介绍一款使用Python的PyQt5库结合pynput键盘控制... 目录概述:当自动化遇上可视化功能全景图核心功能矩阵技术栈深度效果展示使用教程四步操作指南核心代码解析

Python logging模块使用示例详解

《Pythonlogging模块使用示例详解》Python的logging模块是一个灵活且强大的日志记录工具,广泛应用于应用程序的调试、运行监控和问题排查,下面给大家介绍Pythonlogging模... 目录一、为什么使用 logging 模块?二、核心组件三、日志级别四、基本使用步骤五、快速配置(bas

使用Python自动化生成PPT并结合LLM生成内容的代码解析

《使用Python自动化生成PPT并结合LLM生成内容的代码解析》PowerPoint是常用的文档工具,但手动设计和排版耗时耗力,本文将展示如何通过Python自动化提取PPT样式并生成新PPT,同时... 目录核心代码解析1. 提取 PPT 样式到 jsON关键步骤:代码片段:2. 应用 JSON 样式到

Python datetime 模块概述及应用场景

《Pythondatetime模块概述及应用场景》Python的datetime模块是标准库中用于处理日期和时间的核心模块,本文给大家介绍Pythondatetime模块概述及应用场景,感兴趣的朋... 目录一、python datetime 模块概述二、datetime 模块核心类解析三、日期时间格式化与

spring IOC的理解之原理和实现过程

《springIOC的理解之原理和实现过程》:本文主要介绍springIOC的理解之原理和实现过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、IoC 核心概念二、核心原理1. 容器架构2. 核心组件3. 工作流程三、关键实现机制1. Bean生命周期2.

Python如何调用指定路径的模块

《Python如何调用指定路径的模块》要在Python中调用指定路径的模块,可以使用sys.path.append,importlib.util.spec_from_file_location和exe... 目录一、sys.path.append() 方法1. 方法简介2. 使用示例3. 注意事项二、imp

Python中模块graphviz使用入门

《Python中模块graphviz使用入门》graphviz是一个用于创建和操作图形的Python库,本文主要介绍了Python中模块graphviz使用入门,具有一定的参考价值,感兴趣的可以了解一... 目录1.安装2. 基本用法2.1 输出图像格式2.2 图像style设置2.3 属性2.4 子图和聚

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中