在HiMPP手册中都会有这么一张图
1、VI部分
视频输入设备
视频输入设备支持标准 BT.656、标准 BT.1120、自定义时序等若干种时序输入,负责对时序进行解析。
视频物理通道
视频物理通道负责将输入设备解析后得到的视频数据输出到 DDR。在真正将数据输出到 DDR 之前,它可以实现裁剪、遮挡、水平垂直缩小和水平垂直翻转等功能,具体功能见各芯片的详细描述。
掩码
掩码用于指示 VI 设备的视频数据来源。
有的可以进行级联
级联指芯片的视频输出端通过 BT1120 时序或其他时序将视频数据传送到另一颗芯片的视频输入端。
根据上面那张图,AD这里就代表了一些传感器sensor,比如摄像头等,vi(video input)就是从sensor获取图像数据的一个功能模块,Hi3521DV100 芯片有 2 个 BT.1120 接口,每个 BT.1120 接口依次对应两个 VI 设备,即第一个 BT.1120 口对应 VI 的 Dev0 和 Dev1,第二个 BT.1120 口对应 VI 的 Dev2 和Dev3。所以使用两个接口时,基本用dev0和dev2。
for(int i = 0; i < 2; i++) // vi两个通道
{
ViDev = i * 2;
}
2、VPSS
VPSS(Video Process Sub-System)支持对一幅输入图像进行统一预处理,如去噪、去隔行等,然后再对各通道分别进行缩放、锐化等处理,最后输出多种不同分辨率的图像。
VPSS有组(GRP)的概念,最大可用数为 256 个,各 GROUP 分时复用 VPSS 硬件。每个 VPSS GROUP 包含多个通道,VPSS的GROUP 只能绑定一个输入。
VPSS的GROUP 和VI的通道进行绑定,分为在线和离线模式,离线模式时VI将从摄像头读取的视频数据放入到DDR内存中,VPSS去内存中读取,在线模式时VI将从摄像头读取的视频数据直接传递给VPSS,中间没有了内存复制等的操作,节省带宽和内存,性能更好,但是在线模式,因为VI没有将数据写入到DDR,无法进行coverEx,OverlayEx,Retate,LDC等操作,需要在VPSS各通道输出后再进行处理,而且有的功能还只能在离线使用,比如DIS
VPSS的GROUP 和VI的通道进行绑定:
HI_S32 SAMPLE_COMM_VI_BindVpss(SAMPLE_VI_MODE_E enViMode)
{
HI_S32 j, s32Ret;
VPSS_GRP VpssGrp;
MPP_CHN_S stSrcChn;
MPP_CHN_S stDestChn;
SAMPLE_VI_PARAM_S stViParam;
VI_CHN ViChn;
// 获取VI的一些参数
s32Ret = SAMPLE_COMM_VI_Mode2Param(enViMode, &stViParam);
if (HI_SUCCESS !=s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_VI_Mode2Param failed!\n");
return HI_FAILURE;
}
VpssGrp = 0;
for (j=0; j<stViParam.s32ViChnCnt; j++) //s32ViChnCnt代表VI设备的个数为1
{
ViChn = j * stViParam.s32ViChnInterval;
//将VpssGrp和VI的通道进行绑定
stSrcChn.enModId = HI_ID_VIU;
stSrcChn.s32DevId = 0;
stSrcChn.s32ChnId = ViChn;
stDestChn.enModId = HI_ID_VPSS;
stDestChn.s32DevId = VpssGrp;
stDestChn.s32ChnId = 0;
s32Ret = HI_MPI_SYS_Bind(&stSrcChn, &stDestChn); //源通道就是VI模块,目的通道就是VPSS的Group,绑定后,VI的视频数据就会自动流转到VPSS
if (s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("failed with %#x!\n", s32Ret);
return HI_FAILURE;
}
VpssGrp ++;
}
return HI_SUCCESS;
}
可以看到叠加OSD等可以在VPSS的离线模式进行
VPSS的group虽然只能绑定一个输入,但是可以有多个输出通道,这样可以获取多路不同分辨率的视频流。比如vi采集的是1080P的数据,但是有的时候不需要这么高的分辨率,想要最终获取三个不同分辨率的视频,1080P用于显示,720P用于存储,480P行车记录仪存储,这三路视频,那么VPSS就可以输出三个通道的视频数据,这个时候就可以创建3个chn
3、VENC
venc的chn绑定vpss某个group的chn
s32Ret = SAMPLE_COMM_VENC_BindVpss(VencChn, VpssGrp, VpssChn); //venc的chn绑定vpss的chn
终上所述:VI、VPSS、VENC之间的关系
VI dev的chn-》VPSS某个GRP-》VPSS某个GRP的某个chn-》VENC的某个chn
VPSS的GROUP绑定VI的chn,VENC的chn绑定VPSS某个GROUP的chn