海思35XX系列HiMPP框架开发参考之VI模块

date
May 26, 2020
slug
2020-05-26-hisilicon-35xx-himpp-framework-vi
status
Published
tags
音视频
海思
ISP
summary
本文基于对海思35xx处理器相关文档的学习,总结了35xx HiMPP框架下VI模块开发中的一些基础知识。
type
Post
主要参考文件:《HiMPP V3.0媒体处理软件开发参考》。
文档版本:21.
文档发布日期:2019-09-30.
本文档基于对海思官方SDK提供的HiMPP开发参考文件的学习,整理了该平台下视频输入接口VI模块在开发过程中流程以及主要概念。

VI模块的主要功能

VI模块能够支持从BT656/BT601/BT1120以及Digital Camera接口上接收外部传过来的YUV格式视频数据,保存在内部的指定内存区域中。
除以上简单的接收YUV视频数据以为,VI能够实现的额外功能:
  • 对接收到的原始视频图像进行裁剪Crop;
  • 水平/垂直缩小处理Scale down;
  • 水平/垂直反转操作(Mirror,Flip);
  • 可以把输入的一路或者多路原始视频图像,合并/分割为一路/多路视频图像。

接口/设备/通道

海思35XX系列的各个芯片对于VI模块的支持情况不同,需要参考具体芯片的配置。
总的来讲,HI35xx芯片的VI接口和设备均以8bit为单位进行组织和编号,1个8bit接口就对应一个VI设备。
两个8bit的VI可以合并组成一个16bit BT1120接口,所以一个芯片上有n组16bit的BT1120接口,就会有2*n个8bit的VI设备。
  • 当两个8bit接口拼接在一起作为一个16bit接口使用的时候,这两个8bit接口对应的VI设备就只有1个设备可用;
此外,每个VI接口和设备固定对应包含4个VI通道,可以把VI接口通过时分复用方式接收到的数据映射到不同的通道进行单独处理。因此对于VI模块的后级处理而言,就是从各个通道上读取数据。
Hi3520DV400和HI3521DV100的接口/设备/通道的对应情况:
  • Hi3520DV400有两组8bit接口VI0和VI1,也就分别对应两个VI设备,也就是dev0和dev1;
    • 两组8bit接口可以合并为一个16bit BT1120接口使用,此时就只有dev0可以使用;
    • Dev0对应的通道是Chn0,Chn1,Chn2,Chn3;
    • Dev1对应的通道是Chn4,Chn5,Chn6,Chn7;
  • HI3521DV100包含有4组8bit接口:VI0,VI1,VI2,VI3,也就是dev0,dev1,dev2,dev3;
    • VI0+VI1以及VI2+VI3分别可以合并起来作为一个独立的16bit BT1120接口使用,此时就只有dev0和dev2可以使用;
    • Dev0对应的通道是Chn0,Chn1,Chn2,Chn3;
    • Dev1对应的通道是Chn4,Chn5,Chn6,Chn7;
    • Dev2对应的通道是Chn8,Chn9,Chn10,Chn11;
    • Dev3对应的通道是Chn12,Chn13,Chn14,Chn15;

接口与设备的接收能力

当VI接口和设备配置为8bit模式使用时,可以支持:
  • 可以支持1/2/4路D1、960H复合模式输入;
    • 即1路8bit VI接口可以通过分时的方式支持最多4路D1和960H的视频;
    • 因此一个芯片的VI模块有N路8bit VI接口,最多就可以支持4*N路D1和960H分辨率图像的复合模式输入;
  • 可以支持2路720P复合模式输入;
    • 即1路8bit VI接口可以通过分时的方式支持最多2路720P的视频;
    • 因此一个芯片的VI模块有N路8bit VI接口,最多就可以支持2*N路720P分辨率图像的复合模式输入;
  • 可以支持1路1080P30输入;
    • 每个1080P30摄像头连接1路8bit接口(即YC复用模式),使用BT1120 148.5MHz时钟;(单路接口不复用,每个8bit接口只接入1路1080P30视频输入)
    • 配置为这种模式下,一个芯片的VI模块有N路8bit VI接口,就可以支持N路1080P30分辨率图像的输入;
  • 通过双沿采样方式支持2路1080P30输入;
    • 每个1080P30摄像头连接1路8bit接口(即YC复用模式),使用BT1120 148.5MHz时钟,在上升沿和下降沿同时进行采样可以支持两路1080P30视频的同时输入;
    • 因此一个芯片的VI模块有N路8bit VI接口,最多就可以支持2*N路1080P分辨率图像的复合模式输入;
  • 还可以支持1路4M 30fps输入;
    • 1个4M 30fps摄像头连接1路8bit接口,设置为BT1120 148.5MHz时钟+双沿采样方式;
    • 因此一个芯片的VI模块有N路8bit VI接口,最多就可以支持N路4M 30fps分辨率图像的输入;
两个8bit接口合并在一起组成一个16bit接口:
  • 可以支持1路1080P30输入;
    • 1个1080P30摄像头连接一个16bit接口,同时传输YC数据,使用BT1120 74.24MHz时钟;
    • 配置为这种模式下,一个芯片的VI模块有N路16bit VI接口,就可以支持N路1080P30分辨率图像的输入;
  • 从以上的总结来看,无论是接入标清还是高清分辨率视频,最简单灵活的方式就是把VI模块的接口按照8bit来进行配置就好,设置为16bit的意义不大。

VI模块的掩码设置

VI模块的掩码用于定义VI模块的各个设备所使用的外部接口;
每个VI设备对应两个掩码:掩码0和掩码1。
VI设备和接口按照8bit的模式进行配置的情况:
  • 只需要设置掩码0,把掩码1设置为0即可;
  • 设备号为0/2/4/6等偶数编号的情况下,掩码0设置为0x00FF0000;
  • 设备号为1/3/5/7等奇数编号的情况下,掩码0设置为0xFF000000;
VI设备和接口按照16bit的模式进行配置的情况:
  • 需要同时设置掩码0和掩码1;
  • 此时设备号为1/3/5/7等奇数编号的设备不可用,只能使用设备号为0/2/4/6等偶数编号的设备;
  • 所有设备号为0/2/4/6等偶数编号的设备,掩码0设置为0xFF000000,掩码1设置为0x00FF0000;

常用API总结

  • 设置和获取VI设备属性
    • HI_MPI_VI_SetDevAttr;
    • HI_MPI_VI_GetDevAttr;
  • 启用和禁用VI设备;
    • HI_MPI_VI_EnableDev;
    • HI_MPI_VI_DisableDev;
  • 设置和获取VI通道属性
    • HI_MPI_VI_SetChnAttr;
    • HI_MPI_VI_GetChnAttr;
  • 启用和禁用VI通道
    • HI_MPI_VI_EnableChn;
    • HI_MPI_VI_DisableChn;
    • 调用HI_MPI_VI_EnableChn之后实际上VI模块已经开始正常的接收接口进来的图像数据了;
  • 读取VI模块接收到的图像数据:
    • HI_MPI_VI_GetFrame;
    • 一般不需要直接调用这个接口来获取Frame,VI模块连接的后续模块会自动接收并处理,除非需要对VI模块接收到的图像数据做自定义的处理;
  • 释放VI图像数据所占的缓存
    • HI_MPI_VI_ReleaseFrame;
  • 绑定/解绑VI通道/获取当前通道绑定关系
    • HI_MPI_VI_BindChn;
    • HI_MPI_VI_UnBindChn;
    • HI_MPI_VI_GetChnBind;
    • 如果使用系统默认的设备与通道的绑定关系的话,系统启动的时候自动就绑定好了。除非需要修改默认的绑定关系,才需要调用这两个接口先解除之前的默认绑定关系,再重新绑定;

VI模块的基本工作流程:

  • 设置VI设备属性:HI_MPI_VI_SetDevAttr
  • 使能VI设备:HI_MPI_VI_EnableDev
  • 设置VI通道属性:HI_MPI_VI_SetChnAttr
  • 使能VI通道:HI_MPI_VI_EnableChn
  • 至此VI部分的图像流已经正常工作,pipeline的下游设备可以从对应的VI通道中读取到图像流。

© Pavel Han 2020 - 2022