一.海思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中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

Python视频处理库VidGear使用小结

《Python视频处理库VidGear使用小结》VidGear是一个高性能的Python视频处理库,本文主要介绍了Python视频处理库VidGear使用小结,文中通过示例代码介绍的非常详细,对大家的... 目录一、VidGear的安装二、VidGear的主要功能三、VidGear的使用示例四、VidGea

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

Python结合requests和Cheerio处理网页内容的操作步骤

《Python结合requests和Cheerio处理网页内容的操作步骤》Python因其简洁明了的语法和强大的库支持,成为了编写爬虫程序的首选语言之一,requests库是Python中用于发送HT... 目录一、前言二、环境搭建三、requests库的基本使用四、Cheerio库的基本使用五、结合req

多模块的springboot项目发布指定模块的脚本方式

《多模块的springboot项目发布指定模块的脚本方式》该文章主要介绍了如何在多模块的SpringBoot项目中发布指定模块的脚本,作者原先的脚本会清理并编译所有模块,导致发布时间过长,通过简化脚本... 目录多模块的springboot项目发布指定模块的脚本1、不计成本地全部发布2、指定模块发布总结多模

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2