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