海思vpss前后绑定关系总结
Posted 天未及海宽
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了海思vpss前后绑定关系总结相关的知识,希望对你有一定的参考价值。
前言
工作中遇到一路码流(分辨率为384x288)从vi进入,通过vpss处理需要实现如下功能;(以3516,vi-vpss均离线模式为例)
(1) 需要将分辨率缩放为800x600;(vpss)
(2) 需要实现抓拍;(venc)
(3) 需要实现h264打包成mp4;(venc)
(4) 需要实现rtsp图传;(venc)
(5) 需要实现vo显示;(vo)
(6) 需要实现pip画中画;(vo)
那么vi/vpss/venc/vo间如何绑定呢?
绑定关系
文档中有:
(1) VI和VDEC作为数据源,是以通道为发送者,向其他模块发送数据,用户将设备号置为0,SDK不检查输入的设备号
(2) VPSS作为数据接收者时,是以GROUP为接收者,接收其他模块发过来的数据,用户将通道号置为0.
所以有绑定关系:
1. vi->vpss绑定关系
1.1 软件大致流程
1. 先开始mipi,设置离线模式;
2. HI_MPI_VI_SetDevAttr
3. HI_MPI_VI_EnableDev
4. HI_MPI_VI_SetDevBindPipe
5. HI_MPI_VI_CreatePipe
6. HI_MPI_VI_StartPipe
7. HI_MPI_VI_SetChnAttr
8. HI_MPI_VI_EnableChn
1.2 绑定关系
MPP_CHN_S stSrcChn;
MPP_CHN_S stDestChn;
stSrcChn.enModId = HI_ID_VI;
stSrcChn.s32DevId = ViPipe;//pipe号,不是设备号;
stSrcChn.s32ChnId = ViChn;//通道号
stDestChn.enModId = HI_ID_VPSS;
stDestChn.s32DevId = VpssGrp; //vpss grp
stDestChn.s32ChnId = 0; // 必须为0
HI_MPI_SYS_Bind(&stSrcChn, &stDestChn)
注意:vpss group一经绑定,那么该vpss group就有数据了;
那么对应的(物理+扩展)通道又如何获取数据呢?
1.3 vpss功能限制
文档有: Hi3516CV500/Hi3516AV300/Hi3516DV300/Hi3556V200/Hi3559V200/Hi3562V100/Hi3566V100/Hi3516EV200 VPSS 通道 0 只支持放大,其它通道只支持缩小
所以要放大图像,可以通过扩展通道放大;
物理通道获取数据:当vpss group有绑定时,只需使能对应物理通道即可;
HI_MPI_VPSS_SetChnAttr
HI_MPI_VPSS_EnableChn
扩展通道获取数据:
(1)文档有:扩展通道具备裁剪、 缩放功能,它通过绑定物理通道,将物理通道输出作为自己的输入,把图像裁剪、 缩放成用户设置的目标分辨率输出
(2)扩展通道需要绑定物理通道作为输入;
HI_MPI_VPSS_SetExtChnAttr
HI_MPI_VPSS_EnableChn
2. vpss group->vpss group 绑定关系
实质上是: vpss group绑定vpss group
为什么要vpss groupx绑定vpss groupy?
我的理解是:
(1) groupx通道不够用;
(2) groupx扩展通道有我们想要的数据时,需要多路处理; 因为不能gourpx 扩展通道回到 gourpx自身物理通道(目前没遇到过);
(3) 我乐意;
MPP_CHN_S stSrcChn;
MPP_CHN_S stDestChn;
stSrcChn.enModId = HI_ID_VPSS;
stSrcChn.s32DevId = VpssGrp;
stSrcChn.s32ChnId = VpssChn; //只要有数据(使能)通道都可以
stDestChn.enModId = HI_ID_VPSS;
stDestChn.s32DevId = VpssGrp1;
stDestChn.s32ChnId = 0; //只能是0;
HI_MPI_SYS_Bind(&stSrcChn, &stDestChn);
同理: 绑定vpss gorup1后,其他的通道只需要 设置属性+使能 即可使用;
3. vpss ->venc 绑定关系
文档有: VENC作为数据接收者时,是以通道号为接收者,接收其他模块发过来的数据,用户将设备号置为0,SDK不检查输入的设备号;
若VENC工作在VENC_PIC_RECEIVE_MULTI模式下,用户需要配置设备号;
绑定venc前需要如下操作:(大致流程)
HI_MPI_VENC_CreateChn
HI_MPI_VENC_GetChnAttr
HI_MPI_VENC_GetRcParam
HI_MPI_VENC_SetRcParam
HI_MPI_VENC_StartRecvFrame
绑定关系:
MPP_CHN_S stSrcChn;
MPP_CHN_S stDestChn;
stSrcChn.enModId = HI_ID_VPSS;
stSrcChn.s32DevId = VpssGrp;
stSrcChn.s32ChnId = VpssChn; //只要有数据(使能)通道都可以
stDestChn.enModId = HI_ID_VENC;
stDestChn.s32DevId = 0; //用户将设备号置0,SDK不检查输入的设备号;
stDestChn.s32ChnId = VencChn;
HI_MPI_SYS_Bind(&stSrcChn, &stDestChn;
4. vpss ->vo 绑定关系
文档有:
(1) SDK将通道归属于视频层管理,一个视频层上可以显示多个视频,每一个视频显示区域称为一个通道,视频被限制通道内,通道被限制在视频层内. 对于一个视频层,其上面的通道都是独立的. 同时,不同视频层上的通道也是独立的.
(2) 对于系统绑定,应该使用视频层号和通道号来进行绑定配置;
绑定前:
HI_MPI_VO_Disable
HI_MPI_VO_SetPubAttr
HI_MPI_VO_SetDevFrameRate
HI_MPI_VO_SetUserIntfSyncInfo //user
HI_MPI_VO_Enable
HI_MPI_VO_SetVideoLayerAttr
HI_MPI_VO_EnableVideoLayer
HI_MPI_VO_SetChnAttr
HI_MPI_VO_EnableChn
MPP_CHN_S stSrcChn;
MPP_CHN_S stDestChn;
stSrcChn.enModId = HI_ID_VPSS;
stSrcChn.s32DevId = VpssGrp;
stSrcChn.s32ChnId = VpssChn;
stDestChn.enModId = HI_ID_VO;
stDestChn.s32DevId = VoLayer; //视频层号
stDestChn.s32ChnId = VoChn; //通道号
HI_MPI_SYS_Bind(&stSrcChn, &stDestChn);
如何查看海思SDK的版本
以上是关于海思vpss前后绑定关系总结的主要内容,如果未能解决你的问题,请参考以下文章
视频编解码·学习笔记7. 熵编码算法:基础知识 & 哈夫曼编码