一.海思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 logging模块详解及其日志定时清理方式

《pythonlogging模块详解及其日志定时清理方式》:本文主要介绍pythonlogging模块详解及其日志定时清理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录python logging模块及日志定时清理1.创建logger对象2.logging.basicCo

深入理解Apache Kafka(分布式流处理平台)

《深入理解ApacheKafka(分布式流处理平台)》ApacheKafka作为现代分布式系统中的核心中间件,为构建高吞吐量、低延迟的数据管道提供了强大支持,本文将深入探讨Kafka的核心概念、架构... 目录引言一、Apache Kafka概述1.1 什么是Kafka?1.2 Kafka的核心概念二、Ka

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.

基于Python和MoviePy实现照片管理和视频合成工具

《基于Python和MoviePy实现照片管理和视频合成工具》在这篇博客中,我们将详细剖析一个基于Python的图形界面应用程序,该程序使用wxPython构建用户界面,并结合MoviePy、Pill... 目录引言项目概述代码结构分析1. 导入和依赖2. 主类:PhotoManager初始化方法:__in

使用Python实现一键隐藏屏幕并锁定输入

《使用Python实现一键隐藏屏幕并锁定输入》本文主要介绍了使用Python编写一个一键隐藏屏幕并锁定输入的黑科技程序,能够在指定热键触发后立即遮挡屏幕,并禁止一切键盘鼠标输入,这样就再也不用担心自己... 目录1. 概述2. 功能亮点3.代码实现4.使用方法5. 展示效果6. 代码优化与拓展7. 总结1.

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

Python使用date模块进行日期处理的终极指南

《Python使用date模块进行日期处理的终极指南》在处理与时间相关的数据时,Python的date模块是开发者最趁手的工具之一,本文将用通俗的语言,结合真实案例,带您掌握date模块的六大核心功能... 目录引言一、date模块的核心功能1.1 日期表示1.2 日期计算1.3 日期比较二、六大常用方法详

python中time模块的常用方法及应用详解

《python中time模块的常用方法及应用详解》在Python开发中,时间处理是绕不开的刚需场景,从性能计时到定时任务,从日志记录到数据同步,时间模块始终是开发者最得力的工具之一,本文将通过真实案例... 目录一、时间基石:time.time()典型场景:程序性能分析进阶技巧:结合上下文管理器实现自动计时