按照手册中的说明,使用区域管理功能需要做如下几步
1.用户填充区域属性并创建区域
2.将该区域指定到具体通道中(如VENC)。在指定到具体通道时,需要输入通道的显示属性
之后用户可以通过以下操作来控制区域属性,以及在某通道的通道显示属性
2.1通过 HI_MPI_RGN_GetAttr、 HI_MPI_RGN_SetAttr 获取和设置区域属性
2.2通过 HI_MPI_RGN_SetBitMap(仅针对 Overlay)设置区域的位图信息
2.3通过 HI_MPI_RGN_GetDisplayAttr 和 HI_MPI_RGN_SetDisplayAttr 获取和设置区域在某通道(如 VENC 通道)的通道显示属性。
2.4最后用户可以将该区域从通道中撤出(非必须操作),再销毁区域。
接下来我们看看每一步应该怎么做
第一步:用户填充区域属性并创建区域
想要创建区域,可以调用函数
HI_MPI_RGN_Create
来创建一个region区域,函数原型如下
HI_S32 HI_MPI_RGN_Create(
RGN_HANDLE Handle, //区域句柄号
const RGN_ATTR_S *pstRegion //区域属性指针
);
每一个区域对应一个句柄,和一个具体的属性RGN_ATTR_S,属性结构体定义如下
typedef struct hiRGN_ATTR_S
{
RGN_TYPE_E enType; //区域类型
RGN_ATTR_U unAttr; //区域属性
} RGN_ATTR_S;
区域类型有以下几种
- OVERLAY_RGN //VENC通道视频叠加区域
- COVER_RGN //VI通道视频叠加区域
- COVEREX_RGN //扩展视频遮挡区域
- OVERLAYEX_RGN //扩展视频叠加区域
对应的区域属性就有两种
- OVERLAY_ATTR_S stOverlay //VENC通道叠加区域属性
- OVERLAYEX_ATTR_S stOverlayEx //扩展叠加区域属性
这两个属性的结构体其实是一样的,以OVERLAY_ATTR_S举例,结构体定义如下
typedef struct hiOVERLAY_ATTR_S
{
PIXEL_FORMAT_E enPixelFmt; //OSD的像素格式,目前只支持ARGB1555,ARGB4444,ARGB8888这三种
HI_U32 u32BgColor; //区域的背景色
SIZE_S stSize; //区域的高宽
}OVERLAY_ATTR_S;
将这些属性填充好,调用HI_MPI_RGN_Create函数后,区域就创建好了,之后我们就可以通过区域句柄号进行管理
第二步:将该区域指定到具体通道中
想要指定到具体通道,可以调用函数
HI_MPI_RGN_AttachToChn
将区域叠加到通道上,该函数原型为
HI_S32 HI_MPI_RGN_AttachToChn(
RGN_HANDLE Handle, //区域句柄号
const MPP_CHN_S *pstChn, //通道结构体指针
const RGN_CHN_ATTR_S *pstChnAttr //区域通道显示属性指针
);
区域句柄我们已经有了,通道结构体指针定义如下
typedef struct hiMPP_CHN_S
{
MOD_ID_E enModId; //模块号
HI_S32 s32DevId; //设备号
HI_S32 s32ChnId; //通道号
} MPP_CHN_S;
其实意思就是告诉系统,这个区域是叠加在哪个模块的哪个设备的哪个通道上面的
区域通道显示属性指针就是用来设定区域显示属性的,结构体定义如下
typedef str