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 | 失败,参见错误码。 |
【注意事项】
- 区域必须已创建;
- 支持位图的大小和区域的大小不一致;
- 位图从区域的(0,0)开始加载,位图比区域大时自动裁剪;
- 像素格式必须和区域像素格式一致;
- 位图属性指针不能为空;
- 支持多次调用;
- 此接口只对Overlay类型区域有效;
- 调用了HB_RGN_GetCanvasInfo之后,调用本接口无效,除非调用HB_RGN_UpdateCanvas更新画布生效;
【参考代码】
RGN_HANDLE handle = 0;
RGN_ATTR_S stRegion;
int ret;
RGN_BITMAP_S stBitmapAttr;
stBitmapAttr.enPixelFormat = PIXEL_FORMAT_VGA_4;
stBitmapAttr.stSize.u32Width = 640;
stBitmapAttr.stSize.u32Height = 128;
stBitmapAttr.pAddr = malloc(640 * 64);
memset(stBitmapAttr.pAddr, 0xff, 640 * 64);
RGN_CHN_S stChn;
stChn.s32PipelineId = 0;
stChn.enChnId = CHN_US;
RGN_DRAW_WORD_S stDrawWord;
stDrawWord.enFontSize = FONT_SIZE_MEDIUM;
stDrawWord.enFontColor = FONT_COLOR_WHITE;
stDrawWord.stPoint.u32X = 0;
stDrawWord.stPoint.u32Y = 0;
time_t tt = time(0);
char str[32];
strftime(str, sizeof(str), "%Y-%m-%d %H:%M:%S", localtime(&tt));
stDrawWord.pu8Str = str;
stDrawWord.bFlushEn = false;
stDrawWord.pAddr = stBitmapAttr.pAddr;
stDrawWord.stSize = stBitmapAttr.stSize;
RGN_DRAW_LINE_S stDrawLine[2];
stDrawLine[0].stStartPoint.u32X = 400;
stDrawLine[0].stStartPoint.u32Y = 0;
stDrawLine[0].stEndPoint.u32X = 500;
stDrawLine[0].stEndPoint.u32Y = 100;
stDrawLine[0].bFlushEn = false;
stDrawLine[0].pAddr = stBitmapAttr.pAddr;
stDrawLine[0].stSize = stBitmapAttr.stSize;
stDrawLine[0].u32Color = FONT_COLOR_WHITE;
stDrawLine[0].u32Thick = 4;
memcpy(&stDrawLine[1], &stDrawLine[0], sizeof(RGN_DRAW_LINE_S));
stDrawLine[1].stEndPoint.u32Y = 200;
ret = HB_RGN_DrawWord(handle, &stDrawWord);
if (ret < 0) {
return ret;
}
ret = HB_RGN_DrawLine(handle, &stDrawLine[0]);
if (ret < 0) {
return ret;
}
ret = HB_RGN_DrawLineArray(handle, stDrawLine, 2);
if (ret < 0) {
return ret;
}
ret = HB_RGN_SetBitMap(handle, &stBitmapAttr);
if (ret < 0) {
return ret;
}
HB_RGN_AttachToChn/HB_RGN_DetachFromChn
【函数声明】
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);
【功能描述】
将区域叠加到通道或从通道中撤出;
【参数描述】
| 参数名称 | 描述 |
|---|---|
| Handle | 区域句柄号。取值范围:[0, RGN_HANDLE_MAX)。 |
| pstChn | 通道结构体指针。 |
| pstChnAttr | 区域通道显示属性指针。 |
【返回值】
| 返回值 | 描述 |
|---|---|
| 0 | 成功 |
| 非0 | 失败,参见错误码。 |
【注意事项】 HB_RGN_AttachToChn:
- 区域必须已创建;
- 通道结构体指针及显示属性结构体指针不能为空;
- 每个通道最多叠加32个区域;
- 叠加到通道上的区域大小范围不能超过通道分辨率;
HB_RGN_DetachFromChn:
- 区域必须已创建;
- 通道结构体指针不能为空;
【参考代码】
RGN_HANDLE handle = 0;
int ret;
int osd_level = 0;
RGN_CHN_ATTR_S stChnAttr;
stChnAttr.bShow = true;
stChnAttr. bInvertEn = false;
stChnAttr.unChnAttr.stOverlayChn.stPoint.u32X = 0;
stChnAttr.unChnAttr.stOverlayChn.stPoint.u32Y = 0;
RGN_CHN_S stChn;
stChn.s32PipelineId = 0;
stChn.enChnId = CHN_US;
ret = HB_RGN_AttachToChn(handle, &stChn, &stChnAttr);
if (ret < 0) {
return ret;
}
HB_RGN_GetDisplayAttr(handle, &stChn, &stChnAttr);
if (ret < 0) {
return ret;
}
stChnAttr.unChnAttr.stOverlayChn.stPoint.u32X = 20;
stChnAttr.unChnAttr.stOverlayChn.stPoint.u32Y = 20;
HB_RGN_SetDisplayAttr(handle, &stChn, &stChnAttr);
if (ret < 0) {
return ret;
}
HB_RGN_SetDisplayLevel(handle, &stChn, osd_level);
if (ret < 0) {
return ret;
}
HB_RGN_DetachFromChn(handle, &stChn);
if (ret < 0) {
return ret;
}
HB_RGN_SetDisplayAttr/HB_RGN_GetDisplayAttr
【函数声明】
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);
【功能描述】
获取或设置区域在通道的显示属性;
【参数描述】
| 参数名称 | 描述 |
|---|---|
| Handle | 区域句柄号。取值范围:[0, RGN_HANDLE_MAX)。 |
| pstChn | 通道结构体指针。 |
| pstChnAttr | 区域通道显示属性指针。 |
【返回值】
| 返回值 | 描述 |
|---|---|
| 0 | 成功 |
| 非0 | 失败,参见错误码。 |
【注意事项】 HB_RGN_SetDisplayAttr:
- 区域必须已创建;
- 建议先获取属性再设置;
- 通道结构体指针及显示属性结构体指针不能为空;
- 区域需先叠加到通道上;
- Cover类型的区域大小不可修改;
HB_RGN_GetDisplayAttr:
- 区域必须已创建;
- 通道结构体指针及显示属性结构体指针不能为空;
【参考代码】
请参见HB_RGN_AttachToChn/HB_RGN_DetachFromChn举例
HB_RGN_GetCanvasInfo/HB_RGN_UpdateCanvas
【函数声明】
int32_t HB_RGN_GetCanvasInfo(RGN_HANDLE Handle, RGN_CANVAS_S *pstCanvasInfo);
int32_t HB_RGN_UpdateCanvas(RGN_HANDLE Handle);
【功能描述】
获取或更新显示画布;
【参数描述】
| 参数名称 | 描述 |
|---|---|
| Handle | 区域句柄号。取值范围:[0, RGN_HANDLE_MAX)。 |
| pstCanvasInfo | 区域显示画布信息。 |
【返回值】
| 返回值 | 描述 |
|---|---|
| 0 | 成功 |
| 非0 | 失败,参见错误码。 |
【注意事项】 HB_RGN_GetCanvasInfo:
- 区域必须已创建;
- 与HB_RGN_SetBitMap类似,用于更新Overlay类型区域位图数 据;此接口可以直接操作内部buffer节省一次内存拷贝;
- 此接口与HB_RGN_SetBitMap接口互斥。如果已经使用了本接口,那么在调用HB_RGN_UpdateCanvas前,调用HB_RGN_SetBitMap不生效;
HB_RGN_UpdateCanvas:
- 区域必须已创建;
- 此接口配合HB_RGN_GetCanvasInfo使用,用于更新数据之后切换buffer显示;
- 每次使用此接口之前,都需要调用HB_RGN_GetCanvasInfo获取信息; 【参考代码】
RGN_HANDLE handle = 0;
RGN_ATTR_S stRegion;
RGN_CANVAS_S stCanvasInfo;
int ret;
stRegion.enType = OVERLAY_RGN;
stRegion.stOverlayAttr.stSize.u32Width = 640;
stRegion.stOverlayAttr.stSize.u32Height = 128;
stRegion.stOverlayAttr.enPixelFmt = PIXEL_FORMAT_VGA_4;
ret = HB_RGN_Create(handle, &stRegion);
if (ret < 0) {
return ret;
}
ret = HB_RGN_GetCanvasInfo(handle, &stCanvasInfo);
if (ret < 0) {
return ret;
}
ret = HB_RGN_UpdateCanvas(handle);
if (ret < 0) {
return ret;
}
HB_RGN_DrawWord
【函数声明】
int32_t HB_RGN_DrawWord(RGN_HANDLE Handle, const RGN_DRAW_WORD_S *pstRgnDrawWord);
【功能描述】
从给定的字符串和地址生成位图;
【参数描述】
| 参数名称 | 描述 |
|---|---|
| Handle | 区域句柄号。取值范围:[0, RGN_HANDLE_MAX)。 |
| pstRgnDrawWord | 绘制文字参数指针。 |
【返回值】
| 返回值 | 描述 |
|---|---|
| 0 | 成功 |
| 非0 | 失败,参见错误码。 |
【注意事项】
- 区域必须已创建;
- 属性信息结构体指针及地址指针不能为空;
- 属性信息值需要合法;
- 写入格式为PIXEL_FORMAT_VGA_4格式;
【参考代码】
请参见HB_RGN_SetBitMap举例
HB_RGN_DrawLine/HB_RGN_DrawLineArray
【函数声明】
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);
【功能描述】
画线或批量画线;
【参数描述】
| 参数名称 | 描述 |
|---|---|
| Handle | 区域句柄号。取值范围:[0, RGN_HANDLE_MAX)。 |
| pstRgnDrawLine | 绘制线条参数指针或数组。 |
| u32ArraySize | 绘制线条数量。 |
【返回值】
| 返回值 | 描述 |
|---|---|
| 0 | 成功 |
| 非0 | 失败,参见错误码。 |
【注意事项】
- 区域必须已创建;
- 属性信息结构体指针及地址指针不能为空;
- HB_RGN_DrawLineArray接口中数组元素个数必须与数组匹配;
- 写入格式为PIXEL_FORMAT_VGA_4格式;
【参考代码】
请参见HB_RGN_SetBitMap举例
HB_RGN_BatchBegin/HB_RGN_BatchEnd
【函数声明】
int32_t HB_RGN_BatchBegin(RGN_HANDLEGROUP *pu32Group, uint32_t u32Num, const RGN_HANDLE handle[]);
int32_t HB_RGN_BatchEnd(RGN_HANDLEGROUP u32Group);
【功能描述】
批量更新区域;
【参数描述】
| 参数名称 | 描述 |
|---|---|
| pu32Group | 批处理组号。 取值范围:[0, RGN_GROUP_MAX)。 |
| u32Num | 批处理的区域数量。 |
| handle | 批处理的区域句柄数组。 |
【返回值】
| 返回值 | 描述 |
|---|---|
| 0 | 成功 |
| 非0 | 失败,参见错误码。 |
【注意事项】
- 区域必须已创建;
- HB_RGN_BatchBegin设置的句柄个数一定要等于数组的长度,且不超过最大值;
- 区域类型一定要是Overlay类型;
- HB_RGN_BatchBegin必须与 HB_RGN_BatchEnd成对出现;
【参考代码】
RGN_HANDLE handle_batch[3];
int ret = 0;
RGN_HANDLEGROUP group = 0;
for (int i = 0; i < 3; i++) {
handle_batch[i] = i;
}
ret = HB_RGN_BatchBegin(&group, 3, handle_batch);
if (ret < 0) {
return ret;
}
ret = HB_RGN_GetCanvasInfo(handle_batch[0], &stCanvasInfo);
if (ret < 0) {
return ret;
}
ret = HB_RGN_GetCanvasInfo(handle_batch[1], &stCanvasInfo);
if (ret < 0) {
return ret;
}
ret = HB_RGN_GetCanvasInfo(handle_batch[2], &stCanvasInfo);
if (ret < 0) {
return ret;
}
ret = HB_RGN_BatchEnd(group);
if (ret < 0) {
return ret;
}
HB_RGN_SetColorMap
【函数声明】
int32_t HB_RGN_SetColorMap(const RGN_CHN_S *pstChn, uint32_t aColorMap[15]);
【功能描述】
设置使用颜色的调色板,使用后RGN_FONT_COLOR_E枚举失效,需要区域attach到通道后使用;
【参数描述】
| 参数名称 | 描述 |
|---|---|
| pstChn | 通道结构体指针。 |
| aColorMap | 设置的调色板,设定的颜色值为RGB格式。 |
【返回值】
| 返回值 | 描述 |
|---|---|
| 0 | 成功 |
| 非0 | 失败,参见错误码。 |
【注意事项】
- 通道结构体指针不能为空;
- 通道在vps模块中对用通道需要使能;
- 设置一次即可所有通道共享;
- 输入颜色值为RGB颜色空间;
- 参数不能传CHN_GRP;
【参考代码】
RGN_CHN_S stChn;
stChn.s32PipelineId = 0;
stChn.enChnId = CHN_US;
uint32_t aColorMap[15] = {0xFFFFFF, 0x000000, 0x808000, 0x00BFFF, 0x00FF00,
0xFFFF00, 0x8B4513, 0xFF8C00, 0x800080, 0xFFC0CB,
0xFF0000, 0x98F898, 0x00008B, 0x006400, 0x8B0000};
int ret;
ret = HB_RGN_SetColorMap(&stChn, aColorMap);
if (ret < 0) {
return ret;
}
HB_RGN_SetSta/HB_RGN_GetSta
【函数声明】
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]);
【功能描述】
设置指定最多8块区域,获取指定区域的亮度总和,需要区域attach到通道后使用;
【参数描述】
| 参数名称 | 描述 |
|---|---|
| pstChn | 通道结构体指针。 |
| astStaLevel | 设置的亮度等级(0, 255)。 |
| astStaAttr | 设置的要获取亮度区域的属性。 |
| astStaValue | 获取到的落在指定区间内的像素个数。 |
【返回值】
| 返回值 | 描述 |
|---|---|
| 0 | 成功 |
| 非0 | 失败,参见错误码。 |
【注意事项】
- 通道结构体不能为空;
- HB_RGN_SetSta与HB_RGN_GetSta需要成对出现;
- HB_RGN_SetSta用于设置最多8块区域信息,HB_RGN_GetSta获取指定区域亮度信息;
【参考代码】
RGN_CHN_S stChn;
stChn.s32PipelineId = 0;
stChn.enChnId = CHN_US;
uint16_t aOsdStaBinValue[8][4];
RGN_STA_S aOsdSta[8];
uint8_t aStaLevel[3];
int ret;
aStaLevel[0] = 60;
aStaLevel[1] = 120;
aStaLevel[2] = 180;
memset(aOsdStaBinValue, 0, 8 * 4 * sizeof(uint16_t));
for (int i = 0; i < 8; i++) {
aOsdSta[i].u8StaEn = true;
aOsdSta[i].u16StartX = i * 50;
aOsdSta[i].u16StartY = 0;
aOsdSta[i].u16Width = 50;
aOsdSta[i].u16Height = 50;
}
ret = HB_RGN_SetSta(&stChn, aStaLevel, aOsdSta);
if (ret < 0) {
return ret;
}
ret = HB_RGN_GetSta(&stChn, aOsdStaBinValue);
if (ret < 0) {
return ret;
}
HB_RGN_AddToYUV
【函数声明】
int32_t HB_RGN_AddToYUV(RGN_HANDLE Handle, hb_vio_buffer_t *vio_buffer, const RGN_CHN_ATTR_S *pstChnAttr);
【功能描述】
将区域叠加到一张yuv420格式的图片上;
【参数描述】
| 参数名称 | 描述 |
|---|---|
| Handle | 区域句柄号。取值范围:[0, RGN_HANDLE_MAX)。 |
| vio_buffer | yuv图片的buffer指针。 |
| pstChnAttr | 区域通道显示属性指针。 |
【返回值】
| 返回值 | 描述 |
|---|---|
| 0 | 成功 |
| 非0 | 失败,参见错误码。 |
【注意事项】
- 区域必须已创建;
- 图片buffer结构体指针及显示属性结构体指针不能为空;
【参考代码】
RGN_HANDLE handle;
int ret;
hb_vio_buffer_t vio_buffer;
RGN_CHN_ATTR_S stChnAttr;
stChnAttr.bShow = true;
stChnAttr.bInvertEn = false;
stChnAttr.unChnAttr.stOverlayChn.stPoint.u32X = 0;
stChnAttr.unChnAttr.stOverlayChn.stPoint.u32Y = 0;
ret = HB_RGN_AddToYUV(handle, &vio_buffer, &stChnAttr);
if (ret < 0) {
return ret;
}
HB_RGN_SetDisplayLevel
【函数声明】
int32_t HB_RGN_SetDisplayLevel(RGN_HANDLE Handle, const RGN_CHN_S *pstChn, uint32_t osd_level);
【功能描述】
设置区域的显示层级;
【参数描述】
| 参数名称 | 描述 |
|---|---|
| Handle | 区域句柄号。取值范围:[0, RGN_HANDLE_MAX)。 |
| pstChn | 通道结构体指针。 |
| osd_level | 区域在通道上的显示层级[0, 3]。 |
【返回值】
| 返回值 | 描述 |
|---|---|
| 0 | 成功 |
| 非0 | 失败 |
【注意事项】
- 区域必须已创建;
- 通道结构体指针不能为空;
- 设置等级范围为0-3,其中0默认硬件处理,如果超出硬件处理的个数或通道不支持则改为软件处理,1-3由软件处理;
- 同一通道上不同区域可设置不同显示等级;
【参考代码】
请参见HB_RGN_AttachToChn/HB_RGN_DetachFromChn举例
数据结构
RGN_SIZE_S
【结构定义】
typedef struct HB_RGN_SIZE_ATTR_S{
uint32_t u32Width;
uint32_t u32Height;
} RGN_SIZE_S;
【功能描述】
定义大小信息的结构体
【成员说明】
| 成员 | 含义 |
|---|---|
| u32Width | 宽度 |
| u32Height | 高度 |
RGN_POINT_S
【结构定义】
typedef struct HB_RGN_POINT_ATTR_S {
uint32_t u32X;
uint32_t u32Y;
} RGN_POINT_S;
【功能描述】
定义坐标信息的结构体
【成员说明】
| 成员 | 含义 |
|---|---|
| u32X | 横坐标 |
| u32Y | 纵坐标 |