海思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);

猜你喜欢

转载自blog.csdn.net/qq_39048131/article/details/122679651