5.9. 区域处理 - OSD

5.9.1. 模块描述

OSD( On-Screen Display )模块一个重要图像处理工具,通过配置操作区域 Region,并将 Region 在图像进行叠加操作,如填色、绘制、马赛克等。其主要应用场景包括:

  • 视频图像增强:对实时视频静态图像叠加特定区域标注、信息展示。

  • 隐私保护:通过叠加马赛克遮挡区域,对特定区域进行模糊处理遮盖,保护敏感信息。

因为 OSD 属于 VSE 的辅助功能,所以 OSD 无法单独使用,使用需要调用 hbn_rgn_attach_to_chn 接口 attach 到 VSE 的输出通道使用。

5.9.1.1. 基础规格

  • OSD 支持填色、绘制线文字、马赛克功能

  • 绘制文字支持点阵 16x16 的 HZK16 中文字库 和 点阵 16x8 的 ASC16 英文 字库

  • OSD 中叠加 Region 的宽度为 32 的倍数 , 高度偶数 , 最小 size 为 32x2

  • 支持叠加区域数据格式 VGA_8 , colormap 支持 16 种

  • 每个 OSD 支持 8 个面积大小 2x2 到 256x256 直方图统计区域

  • VSE 硬件支持 OSD 功能 , 除通道 4 外 , 其他通道支持 OSD, 最大支持 4 个区域 , 软件 OSD 最支持 255 个区域

  • OSD 使用需要与 VSE 输出通道绑定,每路 VSE 输出通道对应 OSD 功能支持情况如下:

vse 输出通道编号 硬件 OSD 叠加功能 软件 OSD 叠加功能
0 支持 支持
1 支持 支持
2 支持 支持
3 支持 支持
4 支持 支持
5 支持 支持

备注: VSE 通道 4 默认采用软件 使用 NEON 指令集 实现 OSD 叠加功能。

image-20241224-211604

  1. VSE 的输入通道( Ichn0 )的数据源来自两种方式,一种 VFLOW 的方式,另一种回灌方式。

  2. region buf 通过 hbn_rgn_create 创建,使用 hbn_rgn_attach_to_chn创建的 region buf 绑定到 VSE 的指定通道上。

  3. OSD 绑定到 VSE 的指定输出通道( Ochnx)以后, OSD 硬件自动把 region buf 的数据叠加经过 VSE 的视频上。

  4. VSE 的输出通道 4 ( Ochn4 ) 不支持 OSD,默认使用 NEON 实现 OSD 叠加功能。

  5. VSE 的输出通道超过 4 个 Region 时,超出 4 个 Region 的部分使用软件 NEON 指令集 操作图像数据完成。

5.9.1.2. 注意事项

区域限制: 硬件每路 VSE 通道支持 4 个重叠的 OSD 区域(即 4 个 Region 在垂直方向不能互相重叠)。以下示例图:

左图展示支持的 OSD 区域叠加方式 ,右图展示支持叠加方式。

image-20241224-115426

OSD 支持叠加类型如下:

  • OVERLAY: 叠加区域 , 可以矩形区域自行填充内容 , 例如字画线。

  • COVER: 遮挡区域 , 纯色块 , 支持矩形多边形,不支持圆形。

  • MOSAIC: 马赛克区域 , 矩形区域马赛克形式遮挡。

5.9.2. 参考示例

  • OSD 部分示例代码可以参考 sample_osd 章节

5.9.3. API 参考

API 接口 接口功能
hbn_rgn_create 区域创建
hbn_rgn_destroy 区域销毁
hbn_rgn_getattr 获取区域属性
hbn_rgn_setattr 设置区域属性
hbn_rgn_setbitmap 设置区域 buffer
hbn_rgn_attach_to_chn 叠加区域通道
hbn_rgn_detach_from_chn 解除叠加区域通道
hbn_rgn_set_displayattr 设置显示属性
hbn_rgn_get_displayattr 获取显示属性
hbn_rgn_draw_word 在 buffer 中写入字符串
hbn_rgn_draw_line 在 buffer 中绘制线条
hbn_rgn_set_colormap 设置 osd 颜色索引对应
hbn_rgn_get_sta 获取亮度区域
hbn_rgn_set_sta 设置获取亮度区域

5.9.3.1. hbn_rgn_create()

【函数声明】

int32_t hbn_rgn_create(hbn_rgn_handle_t handle, const hbn_rgn_attr_t *region)

【参数描述】

  • [IN] hbn_rgn_handle_t handle: region handle,是 region 的唯一标识,最大值不能超过 255 。

  • [IN] hbn_rgn_attr_t region: region 区域属性。

【返回值】

  • 成功: HBN_STATUS_SUCESS 0 。

  • 失败:异常负值错误码,参考 返回值说明

【功能描述】

用于创建一块 region 区域。

【注意事项】

5.9.3.2. hbn_rgn_destroy

【函数声明】

int32_t hbn_rgn_destroy(hbn_rgn_handle_t handle)

【参数描述】

  • [IN] hbn_rgn_handle_t handle: region handle,是 region 的唯一标识,最大值不能超过 255 。

【返回值】

  • 成功: HBN_STATUS_SUCESS 0 。

  • 失败:异常负值错误码,参考 返回值说明

【功能描述】

用于销毁一块 region 区域。

【注意事项】

5.9.3.3. hbn_rgn_getattr

【函数声明】

int32_t hbn_rgn_getattr(hbn_rgn_handle_t handle, hbn_rgn_attr_t *region)

【参数描述】

  • [IN] hbn_rgn_handle_t handle: region handle,是 region 的唯一标识,最大值不能超过 255 。

  • [IN] hbn_rgn_attr_t *region: region 区域属性。

【返回值】

  • 成功: HBN_STATUS_SUCESS 0 。

  • 失败:异常负值错误码,参考 返回值说明

【功能描述】

用于创建区域后,获取一块 region 区域属性。

【注意事项】

5.9.3.4. hbn_rgn_setattr

【函数声明】

int32_t hbn_rgn_setattr(hbn_rgn_handle_t handle, const hbn_rgn_attr_t *region)

【参数描述】

  • [IN] hbn_rgn_handle_t handle: region handle,是 region 的唯一标识,最大值不能超过 255 。

  • [IN] hbn_rgn_attr_t *region:区域属性。

【返回值】

  • 成功: HBN_STATUS_SUCESS 0 。

  • 失败:异常负值错误码,参考 返回值说明

【功能描述】

用于创建区域后,设置一块 region 区域属性。

【注意事项】

5.9.3.5. hbn_rgn_setbitmap

【函数声明】

int32_t hbn_rgn_setbitmap(hbn_rgn_handle_t handle, const hbn_rgn_bitmap_t *bitmap_attr)

【参数描述】

  • [IN] hbn_rgn_handle_t handle: region handle,是 region 的唯一标识,最大值不能超过 255 。

  • [IN] hbn_rgn_bitmap_t *bitmap_attr:区域 buffer 属性。

【返回值】

  • 成功: HBN_STATUS_SUCESS 0 。

  • 失败:异常负值错误码,参考 返回值说明

【功能描述】

创建一个 region 区域之后,用户可以自己申请一块 buffer 作画,然后设置区域的 buffer。

【注意事项】

5.9.3.6. hbn_rgn_attach_to_chn

【函数声明】

int32_t hbn_rgn_attach_to_chn(hbn_rgn_handle_t handle,hbn_vnode_handle_t vnode_fd, int32_t chnid, const hbn_rgn_chn_attr_t *rgn_chn)

【参数描述】

  • [IN] hbn_rgn_handle_t handle: region handle,是 region 的唯一标识,最大值不能超过 255 。

  • [IN] hbn_vnode_handle_t vnode_fd:要绑定的 VSE handle,通过 hbn_vflow_get_vnode_handle() 获取。

  • [IN] int32_t chnid:要绑定的 VSE 的 channel id。

  • [IN] hbn_rgn_chn_attr_t *rgn_chn:区域叠加通道显示属性。

【返回值】

  • 成功: HBN_STATUS_SUCESS 0 。

  • 失败:异常负值错误码,参考 返回值说明 。。

【功能描述】

用于创建的 region 区域叠加到 VSE 的某个通道上。

【注意事项】

VSE 的通道 4 不具备硬件 OSD 功能,会使用软件处理图像方式。其他通道支持 4 个硬件 OSD 的叠加,且叠加不能重叠,不能硬件处理部分,由软件实现。

5.9.3.7. hbn_rgn_detach_from_chn

【函数声明】

int32_t hbn_rgn_detach_from_chn(hbn_rgn_handle_t handle,hbn_vnode_handle_t vnode_fd, int32_t chnid)

【参数描述】

  • [IN] hbn_rgn_handle_t handle: region handle,是 region 的唯一标识,最大值不能超过 255 。

  • [IN] hbn_vnode_handle_t vnode_fd:要解的 VSE handle,通过 hbn_vflow_get_vnode_handle() 获取。

  • [IN] int32_t chnid:要解的 VSE 的 channel id。

【返回值】

  • 成功: HBN_STATUS_SUCESS 0 。

  • 失败:异常负值错误码,参考 返回值说明

【功能描述】

用于创建的 region 区域某个 VSE 通道解绑。

【注意事项】

5.9.3.8. hbn_rgn_set_displayattr

【函数声明】

int32_t hbn_rgn_set_displayattr(hbn_rgn_handle_t handle, hbn_vnode_handle_t vnode_fd, int32_t chnid, const hbn_rgn_chn_attr_t *rgn_chn)

【参数描述】

  • [IN] hbn_rgn_handle_t handle: region handle,是 region 的唯一标识,最大值不能超过 255 。

  • [IN] hbn_vnode_handle_t vnode_fd:要操作的 VSE handle,通过 hbn_vflow_get_vnode_handle() 获取。

  • [IN] int32_t chnid:要操作的 VSE 的 channel id。

  • [IN] hbn_rgn_chn_attr_t *rgn_chn:区域叠加通道显示属性。

【返回值】

  • 成功: HBN_STATUS_SUCESS 0 。

  • 失败:异常负值错误码,参考 返回值说明

【功能描述】

某个 region 区域绑定通道后,通过函数修改设置绑定属性。

【注意事项】

5.9.3.9. hbn_rgn_get_displayattr

【函数声明】

int32_t hbn_rgn_get_displayattr(hbn_rgn_handle_t handle, hbn_vnode_handle_t vnode_fd, int32_t chnid, const hbn_rgn_chn_attr_t *rgn_chn)

【参数描述】

  • [IN] hbn_rgn_handle_t handle: region handle,是 region 的唯一标识,最大值不能超过 255 。

  • [IN] hbn_vnode_handle_t vnode_fd:要操作的 VSE handle,通过 hbn_vflow_get_vnode_handle() 获取。

  • [IN] int32_t chnid:要操作的 VSE 的 channel id。

  • [IN] hbn_rgn_chn_attr_t *rgn_chn:区域叠加通道显示属性。

【返回值】

  • 成功: HBN_STATUS_SUCESS 0 。

  • 失败:异常负值错误码,参考 返回值说明

【功能描述】

某个 region 区域绑定通道后,通过函数获取绑定属性。

【注意事项】

5.9.3.10. hbn_rgn_draw_word

【函数声明】

int32_t hbn_rgn_draw_word(const hbn_rgn_draw_word_t *draw_word)

【参数描述】

  • [IN] hbn_rgn_draw_word_t *draw_word:画属性。

【返回值】

  • 成功: HBN_STATUS_SUCESS 0 。

  • 失败:异常负值错误码,参考 返回值说明

【功能描述】

用户申请的 buffer 上画字,配合 hbn_rgn_setbitmap() 函数,可以这块 buffer 设置某个 region 区域。

【注意事项】

5.9.3.11. hbn_rgn_draw_line

【函数声明】

int32_t hbn_rgn_draw_line(const hbn_rgn_draw_line_t \*draw_line)

【参数描述】

  • [IN] hbn_rgn_draw_line_t *draw_line:画线属性。

【返回值】

  • 成功: HBN_STATUS_SUCESS 0 。

  • 失败:异常负值错误码,参考 返回值说明

【功能描述】

用户申请的 buffer 上画线,配和 hbn_rgn_setbitmap() 函数,可以这块 buffer 设置某个 region 区域。

【注意事项】

5.9.3.12. hbn_rgn_set_colormap

【函数声明】

int32_t hbn_rgn_set_colormap(uint32_t color_map[16])

【参数描述】

  • [IN] uint32_t color_map[16]:要设置的 color_map。

【返回值】

  • 成功: HBN_STATUS_SUCESS 0 。

  • 失败:异常负值错误码,参考 返回值说明

【功能描述】

设置全局的 color_map。 color_map 需要遵循规则: R 分量在 16-23bit, G 分量在 8-15bit, B 分量在 0-7bit。

【注意事项】

设置的 color_map 会一直生效,直到重启系统。

5.9.3.13. hbn_rgn_set_sta

【函数声明】

int32_t hbn_rgn_set_sta(hbn_vnode_handle_t vnode_fd, int32_t chnid,uint8_t sta_level[3], hbn_rgn_sta_t sta_attr[8]);

【参数描述】

  • [IN] hbn_vnode_handle_t vnode_fd:要操作的 VSE handle,通过 hbn_vflow_get_vnode_handle() 获取。

  • [IN] int32_t chnid:要操作的 VSE 的 channel id。

  • [IN] uint8_t sta_level[3]:统计阈值,需要按照从小到大顺序配置 3 个参数,参数范围为 1 到 254 。

  • [IN] hbn_rgn_sta_t sta_attr[8]:统计区域属性,为区域位置信息。

【返回值】

  • 成功: HBN_STATUS_SUCESS 0 。

  • 失败:异常负值错误码,参考 返回值说明

【功能描述】

设置统计的 3 个阈值以及多 8 个区域位置信息,该区域独立于 region。需要与 hbn_rgn_get_sta() 配合使用。

【注意事项】

每次需要获取统计数据时,都需要调用一次函数重新设置。

5.9.3.14. hbn_rgn_get_sta

【函数声明】

int32_t hbn_rgn_get_sta(hbn_vnode_handle_t vnode_fd, int32_t chnid, uint16_t sta_value[8][4])

【参数描述】

  • [IN] hbn_vnode_handle_t vnode_fd:要操作的 VSE handle,通过 hbn_vflow_get_vnode_handle() 获取。

  • [IN] int32_t chnid:要操作的 VSE 的 channel id。

  • [OUT] uint16_t sta_value[8][4]:统计数据,获取区域使能位置统计值。

【返回值】

  • 成功: HBN_STATUS_SUCESS 0 。

  • 失败:异常负值错误码,参考 返回值说明

【功能描述】

获取多 8 个区域统计数据,该数据亮度直方图形式输出,配设置的 3 个阈值,输出 4 个区间像素个数。

【注意事项】

无。

5.9.4. 参数说明

typedef enum hbn_rgn_type_e hbn_rgn_type_t

名称 类型 最小值 最大值 默认值 含义 必选
OVERLAY_RGN - - - - 覆盖类型,将一个图像覆盖通道 -
COVER_RGN - - - - 遮盖类型,将颜色遮盖通道 -
MOSAIC_RGN - - - - 马赛克类型,将区域变为马赛克(暂时支持) -
RGN_TYPE_MAX - - - - 最大支持类型数量 -

typedef enum hbn_rgn_font_size_e hbn_rgn_font_size_t

名称 类型 最小值 最大值 默认值 含义 必选
FONT_SIZE_SMALL - - - - 小字 -
FONT_SIZE_MEDIUM - - - - 字号 -
FONT_SIZE_LARGE - - - - 字号 -
FONT_SIZE_EXTRA_LARGE - - - - 超大字号 -

typedef enum hbn_rgn_font_color_e hbn_rgn_font_color_t

名称 类型 最小值 最大值 默认值 含义 必选
FONT_COLOR_WHITE - - - - 白色 -
FONT_COLOR_BLACK - - - - 黑色 -
FONT_COLOR_GREY - - - - 灰色 -
FONT_COLOR_BLUE - - - - 蓝色 -
FONT_COLOR_GREEN - - - - 绿色 -
FONT_COLOR_RED - - - - 红色 -
FONT_COLOR_CYAN - - - - 青色 -
FONT_COLOR_PURPLE - - - - 紫色 -
FONT_COLOR_YELLOW - - - - 黄色 -
FONT_COLOR_ORANGE - - - - 橙色 -
FONT_COLOR_BROWN - - - - 棕色 -
FONT_COLOR_PINK - - - - 粉色 -
FONT_COLOR_DARKBLUE - - - - 深蓝色 -
FONT_COLOR_DARKGREEN - - - - 深绿色 -
FONT_COLOR_DARKRED - - - - 深红色 -
FONT_COLOR_DARKGRAY - - - - 深灰色 -
FONT_KEY_COLOR_NUM - - - - 颜色数量 -

typedef enum hbn_rgn_pixel_format_e hbn_rgn_pixel_format_t

名称 类型 最小值 最大值 默认值 含义 必选
PIXEL_FORMAT_VGA_8 - - - - 8bit 颜色 /alpha 数据格式 -
PIXEL_FORMAT_YUV420SP - - - - YUV420SP 数据格式(暂时支持) -

typedef enum hbn_rgn_cover_type_e hbn_rgn_cover_type_t

名称 类型 最小值 最大值 默认值 含义 必选
COVER_RECT - - - - 矩形 -
COVER_POLYGON - - - - 多边形 -

typedef struct hbn_rgn_size_s hbn_rgn_size_t

名称 类型 最小值 最大值 默认值 含义 必选
width uint32_t - - - -
height uint32_t - - - -

struct hbn_rgn_point_s hbn_rgn_point

名称 类型 最小值 最大值 默认值 含义 必选
x uint32_t - - - x 坐标 -
y uint32_t - - - y 坐标 -

typedef struct hbn_ren_overlay_s hbn_rgn_overlay_t

名称 类型 最小值 最大值 默认值 含义 必选
pixel_fmt hbn_rgn_pixel_format_t - - - 数据格式类型
size hbn_rgn_size_t - - - 尺寸大小,宽度为 32 的倍数,
高度为 2 的倍数

struct hbn_rgn_polygon_s hbn_rgn_polygon

名称 类型 最小值 最大值 默认值 含义 必选
side_num hbn_rgn_pixel_format_t 0 POLYGON_MAX_SIDE - 多边形个数
vertex[POLYGON_MAX_SIDE] hbn_rgn_point_t - - - 多边形坐标 , 不支持多边形

struct hbn_rgn_cover_attr_s hbn_rgn_cover

名称 类型 最小值 最大值 默认值 含义 必选
cover_type hbn_rgn_cover_type_t - - - 遮盖类型
- union( size polygon) - - - 矩形尺寸信息或者多边形坐标信息
矩形需要满足宽度为 32 的倍数,高度为 2 的倍数

struct hbn_rgn_mosaic_attr_s hbn_rgn_mosaic

名称 类型 最小值 最大值 默认值 含义 必选
size hbn_rgn_size_t - - - 需要满足宽度为 16 的倍数,高度为 2 的倍数
pixel_block uint32_t - - - 暂时无用

struct hbn_rgn_attr_s hbn_rgn_attr

名称 类型 最小值 最大值 默认值 含义 必选
type hbn_rgn_type_t OVERLAY_RGN MOSAIC_RGN - 区域类型
alpha uint32_t 0 15 - alpha 混合系数
color hbn_rgn_font_color_t FONT_COLOR_WHITE FONT_COLOR_DARKGRAY - 颜色
overlay_attr hbn_rgn_overlay_t - - - 叠加属性
cover_attr hbn_rgn_cover_t - - - 遮盖属性
mosaic_chn hbn_rgn_mosaic_t - - - 马赛克属性

struct hbn_rgn_chn_attr_s hbn_rgn_chn_attr

名称 类型 最小值 最大值 默认值 含义 必选
show bool - - - 是否显示
invert_en bool - - - 是否反色,暂时支持
display_level uint32_t 0 3 0 显示 level,硬件 osd 时需要为 0 ,软件为 1-3 ,
目前需要设置区分软硬件,暂时支持显示 level
point hbn_rgn_point_t - - - 坐标信息

struct hbn_rgn_bitmap_attr_s hbn_rgn_bitmap

名称 类型 最小值 最大值 默认值 含义 必选
pixel_fmt hbn_rgn_pixel_format_t - - - 数据格式类型
size hbn_rgn_size_t - - - 尺寸信息
*paddr void - - - 输入的 buffer 地址

struct hbn_rgn_draw_word_param_s hbn_rgn_draw_word

名称 类型 最小值 最大值 默认值 含义 必选
*paddr void - - - 画布的 buffer 地址
size hbn_rgn_size_t - - - 画布大小
*draw_string uint8_t - - - 字符串地址,需要以“\0”结尾,
支持中(简)英文字符,需注意中文字符编码格式应为 gbk
font_color hbn_rgn_font_color_t 0 FONT_COLOR_DARKGRAY - 字体颜色
bg_color uint32_t 0 FONT_COLOR_DARKGRAY - 背景颜色
alpha uint32_t 0 15 - alpha 混合 index, 0 为完全透明, 15 为完全透明,目前只有硬件支持
font_size hbn_rgn_font_size_t - - - 字体大小
flush_en bool - - - 是否刷新画布

typedef struct hbn_rgn_draw_line_param_s hbn_rgn_draw_line_t

名称 类型 最小值 最大值 默认值 含义 必选
*paddr void - - - 画线的 buffer 地址
size hbn_rgn_size_t - - - 画布大小
start_point hbn_rgn_point_t - - - 画线起始坐标
end_point hbn_rgn_point_t - - - 画线终止坐标
thick uint32_t - - - 线宽
color hbn_rgn_font_color_t FONT_COLOR_WHITE FONT_COLOR_DARKGRAY - 画线颜色
bg_color uint32_t FONT_COLOR_WHITE FONT_COLOR_DARKGRAY - 背景颜色
alpha uint32_t 0 15 - 背景透明度,线透明度默认为 15 ,硬件支持 背景半透明,软件目前支持背景完全透明
flush_en bool - - - 是否刷新画布

typedef struct hbn_rgn_sta_attr_s hbn_rgn_sta_t

名称 类型 最小值 最大值 默认值 含义 必选
sta_en uint8_t - - - 是否使能区域
start_x uint16_t - - - 起始坐标 x
start_y uint16_t - - - 起始坐标 y
width uint16_t 2 255 - 统计区域宽度
height uint16_t 2 255 - 统计区域高度