7.3.7 区域处理
概述
用户一般都需要在视频中叠加 OSD
用于显示一些特定的信息(如:通道号、时间戳等),必要时还会填充色块。这些叠加在视频上的 OSD
和遮挡在视频上的色块统称为区域。REGION
模块,用于统一管理这些区域资源。
区域管理可以实现区域的创建,并叠加到视频中或对视频进行遮挡。例如,实际应用中,用户通过HB_RGN_AttachToChn
创建一个区域,将该区域叠加到某个通道(如US通道)中。在通道进行调度时,则会将 OSD
叠加在视频中。一个区域支持通过调用设置通道显示属性接口指定到多个通道中(如:US通道
和DS通道
),且支持在每个通道的显示属性(如位置、是否显示等)都不同。
功能描述
基本概念
区域类型:
overlay
:视频叠加区域,绘制文字、线条等;cover
:视频遮挡区域,纯色块遮挡;
位图填充:
- 将区域位图叠加到区域内存中,使用
HB_RGN_SetBitMap
方式时如果位图的大小比设定的区域大的话,将会裁剪掉超出区域范围的部分; 使用HB_RGN_GetCanvasInfo
/HB_RGN_UpdateCanvas
方式时需要按照获取的画布大小写入。
区域属性:
- 创建区域时需要设置区域的一些基本信息,例如大小、区域类型等。
通道显 示属性:
- 将区域叠加到通道上时需要设定通道的显示属性,例如叠加的位置、是否显示等,如果设置
bShow
为false
,将叠加到通道但是不显示区域。
绘制文字:
- 可以使用
HB_RGN_DrawWord
绘制文字,支持四种字体大小以及15种字体颜色;
绘制线条:
- 可以使用
HB_RGN_DrawLine
/HB_RGN_DrawLineArray
绘制线条或同时多个线条,支持调整线条粗细以及线条颜色。
区域反色:
- 在通道显示属性中有反色开关,如果使能了反色,将会在叠加时使得区域的颜色反转。
使用示意
使用过程应该如下所示:
- 用户通过创建区域并设置区域属性;
- 用户将区域绑定到通道上;
- 通过
HB_RGN_GetAttr
/HB_RGN_SetAttr
获取或修改区域属性; - 使用
HB_RGN_SetBitMap
方式:- 使用
HB_RGN_DrawWord
或HB_RGN_DrawLine
/HB_RGN_DrawLineArray
绘制文字或线条到用户创建的位图中,然后调用HB_RGN_SetBitMap
将位图设置到区域中; - 使用
HB_RGN_GetCanvasInfo
/HB_RGN_UpdateCanvas
方式: - 使用
HB_RGN_GetCanvasInfo
获取地址,使用HB_RGN_DrawWord
或HB_RGN_DrawLine
/HB_RGN_DrawLineArray
绘制文字或线条到获取的地址中,再使用HB_RGN_UpdateCanvas
更新画布。
- 使用
- 通过
HB_RGN_SetDisplayAttr
/HB_RGN_GetDisplayAttr
获取或设置通道显示属性; - 最后用户再将区域从通道中撤出,销毁区 域;
API参考
int32_t HB_RGN_Create(RGN_HANDLE Handle, const RGN_ATTR_S *pstRegion);
int32_t HB_RGN_Destory(RGN_HANDLE Handle);
int32_t HB_RGN_GetAttr(RGN_HANDLE Handle, RGN_ATTR_S *pstRegion);
int32_t HB_RGN_SetAttr(RGN_HANDLE Handle, const RGN_ATTR_S *pstRegion);
int32_t HB_RGN_SetBitMap(RGN_HANDLE Handle, const RGN_BITMAP_S *pstBitmapAttr);
int32_t HB_RGN_AttachToChn(RGN_HANDLE Handle, const RGN_CHN_S *pstChn, const RGN_CHN_ATTR_S *pstChnAttr);
int32_t HB_RGN_DetachFromChn(RGN_HANDLE Handle, const RGN_CHN_S *pstChn);
int32_t HB_RGN_SetDisplayAttr(RGN_HANDLE Handle, const RGN_CHN_S *pstChn, const RGN_CHN_ATTR_S *pstChnAttr);
int32_t HB_RGN_GetDisplayAttr(RGN_HANDLE Handle, const RGN_CHN_S *pstChn, RGN_CHN_ATTR_S *pstChnAttr);
int32_t HB_RGN_GetCanvasInfo(RGN_HANDLE Handle, RGN_CANVAS_S *pstCanvasInfo);
int32_t HB_RGN_UpdateCanvas(RGN_HANDLE Handle);
int32_t HB_RGN_DrawWord(RGN_HANDLE Handle, const RGN_DRAW_WORD_S *pstRgnDrawWord);
int32_t HB_RGN_DrawLine(RGN_HANDLE Handle, const RGN_DRAW_LINE_S *pstRgnDrawLine);
int32_t HB_RGN_DrawLineArray(RGN_HANDLE Handle,const RGN_DRAW_LINE_S astRgnDrawLine[],uint32_t u32ArraySize);
int32_t HB_RGN_BatchBegin(RGN_HANDLEGROUP *pu32Group, uint32_t u32Num, const RGN_HANDLE handle[]);
int32_t HB_RGN_BatchEnd(RGN_HANDLEGROUP u32Group);
int32_t HB_RGN_SetColorMap(const RGN_CHN_S *pstChn, uint32_t color_map[15]);
int32_t HB_RGN_SetSta(const RGN_CHN_S *pstChn, uint8_t astStaLevel[3], RGN_STA_S astStaAttr[8]);
int32_t HB_RGN_GetSta(const RGN_CHN_S *pstChn, uint16_t astStaValue[8][4]);
int32_t HB_RGN_AddToYUV(RGN_HANDLE Handle, hb_vio_buffer_t *vio_buffer, const RGN_CHN_ATTR_S *pstChnAttr);
int32_t HB_RGN_SetDisplayLevel(RGN_HANDLE Handle, const RGN_CHN_S *pstChn, uint32_t osd_level);
HB_RGN_Create/HB_RGN_Destory
【函数声明】
int32_t HB_RGN_Create(RGN_HANDLE Handle, const RGN_ATTR_S *pstRegion);
int32_t HB_RGN_Destory(RGN_HANDLE Handle);
【功能描述】
创建或销毁一块区域;
【参数描述】
成员 | 含义 |
---|---|
Handle | 区域句柄号。取值范围:[0, RGN_HANDLE_MAX)。 |
pstRegion | 区域属性指针。 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,参见错误码。 |
【注意事项】 HB_RGN_Create:
- 句柄由用户指定,意义等同于ID号,句柄号需在指定范围内;
- 不支持重复创建;
- 区域属性不能为空且属性需合法;
- 创建Cover类型区域的时候只需指定区域类型,区域属性在调用HB_RGN_AttachToChn时指定;
- 创建区域时,会进行最大最小宽高等检查,具体支持像素格式请参考RGN_PIXEL_FORMAT_E;
HB_RGN_Destory:
- 区域必须已创建;
- 调用此接口之前区域需先调用HB_RGN_DetachFromChn接口;
- 调用该接口的过程中,不允许同时调用HB_RGN_SetAttr及HB_RGN_SetBitMap接口;
【参考代码】
RGN_HANDLE handle = 0;
RGN_ATTR_S stRegion;
int ret;
stRegion.enType = OVERLAY_RGN;
stRegion.stOverlayAttr.stSize.u32Width = 640;
stRegion.stOverlayAttr.stSize.u32Height = 128;
stRegion.stOverlayAttr.enBgColor = FONT_KEY_COLOR;
stRegion.stOverlayAttr.enPixelFmt = PIXEL_FORMAT_VGA_4;
ret = HB_RGN_Create(handle, &stRegion);
if (ret < 0) {
return ret;
}
ret = HB_RGN_GetAttr(handle, &stRegion);
if (ret < 0) {
return ret;
}
stRegion.stOverlayAttr.enBgColor = FONT_COLOR_WHITE;
ret = HB_RGN_SetAttr(handle, &stRegion);
if (ret < 0) {
return ret;
}
ret = HB_RGN_Destroy(handle);
if (ret < 0) {
return ret;
}
HB_RGN_GetAttr/HB_RGN_SetAttr
【函数声明】
int32_t HB_RGN_GetAttr(RGN_HANDLE Handle, RGN_ATTR_S *pstRegion);
int32_t HB_RGN_SetAttr(RGN_HANDLE Handle, const RGN_ATTR_S *pstRegion);
【功能描述】
获取或设置区域属性;
【参数描述】
参数名称 | 描述 |
---|---|
Handle | 区域句柄号。取值范围:[0, RGN_HANDLE_MAX)。 |
pstRegion | 区域属性指针。 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,参见错误码。 |
【注意事项】 HB_RGN_GetAttr:
- 区域必须已创建;
- 区域属性指针不能为空;
- 区域类型必须为Overlay,Cover属性在HB_RGN_AttachToChn时指定、HB_RGN_SetDisplayAttr时修改;
HB_RGN_SetAttr:
- 区域必须已创建;
- 区域属性指针不能为空;
- 区域类型必须为Overlay,Cover属性在HB_RGN_AttachToChn时指定、HB_RGN_SetDisplayAttr时修改;
- 在调用HB_RGN_AttachToChn之后不可修改区域大小;
【参考代码】
请参见HB_RGN_Create/HB_RGN_Destory举例
HB_RGN_SetBitMap
【函数声明】
int32_t HB_RGN_SetBitMap(RGN_HANDLE Handle, const RGN_BITMAP_S *pstBitmapAttr);
【功能描述】
设置位图,填充一块区域;
【参数描述】
参数名称 | 描述 |
---|---|
Handle | 区域句柄号。取值范围:[0, RGN_HANDLE_MAX)。 |
pstBitmap | 位图属性指针。 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,参见错误码。 |
【注意事项】
- 区域必须已创建;
- 支持位图的大小和区域的大小不一致;