海思平台OSD的实现
1.海思平台OSD理论学习
1.1 OSD概述
用户一般都需要在视频中叠加 OSD 用于显示一些特定的信息(如:通道号、时间戳等),必要时还会填充色块。这些叠加在视频上的 OSD 和遮挡在视频上的色块统称为区域。 REGION 模块,用于统一管理这些区域资源。区域管理可以实现区域的创建,并叠加到视频中或对视频进行遮挡。例如,实际应用中,用户通过创建一个区域,通过 HI_MPI_RGN_AttachToChn ,将该区域叠加到某个通道(如 VENC 通道)中。在通道进行调度时,则会将 OSD 叠加在视频中。一个区域支持通过设置通道显示属性接口指定到多个通道中(如:多个 VENC 通道,多个 VI 通道,甚至多个 VENC 和 VI 通道),且支持在每个通道的显示属性(如位置、层次、透明度等)都不同。
1.2 海思OSD的4种类型
区域类型(位图和纯色块)
− Overlay:视频叠加区域,其中区域支持位图的加载、背景色更新等功能。
− OverlayEx:扩展视频叠加区域,功能与 Overlay 类似,支持位图加载、背景色更新等。
− Cover:视频遮挡区域,其中区域支持纯色块遮挡。
− CoverEx:扩展视频遮挡区域,功能与 Cover 类似,支持纯色块遮挡。
− OverlayEx/ CoverEx,分别相对于 Overlay/Cover,功能上类似,但是会引入额外的系统带宽,OverlayEx/ CoverEx 由 VGS 叠加到图像上 ,OverlayEx/ CoverEx 区域越大,占用 VGS 的性能就越大,当 VGS 性能不足时,会导致帧率降低。
建议只有当 Overlay/Cover 不支持,或者数量无法满足需求时,再使用。
1.3 海思OSD的几个重要概念
区域层次(区域叠加等级)
区域层次表示区域的叠加级别,层次值越大,表示区域的显示级别越高。
当发生重叠时,层次值大的将会覆盖层次值小的。
如果是同一级别,则根据区域叠加的先后顺序,后叠加的将显示在上层。
层次叠加示意图
位图填充(针对 Overlay 和 OverlayEx 有效)(位图填充是填充到REGION 模块的显存中)
位图填充是指将位图的内存值填充到REGION 模块的显存中,位图将会从区域的左上角开始填充。
当位图小于区域时,只能填充一部分内存,剩余部分保持原有值;
位图大小等于区域时,将刚好全部填充;当位图大于区域时,位图只能将自身和区域一样大小的内存信息填充到区域中。
位图填充支持两种实现方式:其一、用户通过 HI_MPI_RGN_SetBitMap 接口将位图数据拷贝至内部显示画布;
其二、用户通过 HI_MPI_RGN_GetCanvasInfo 获取内部备份显示画布的地址,直接对该地址数据进行更新,
然后调用HI_MPI_RGN_UpdateCanvas 接口将备份显示画布更新为待显示画布,达到实现更新位图数据的目的。
区域公共属性(这是每个绑定了的通道所共有的属性)
用户创建一个区域时,需要设置该属性信息,它包含公共的资源信息。
例如,Overlay 包含像素格式,大小和背景色。
通道显示属性(RGN_CHN_ATTR_S) (区域在各个通道又有不同的属性)
通道显示属性表明区域在某通道的显示特征。
例如,Overlay 的通道显示属性包含显示位置,层次,前景 Alpha,背景 Alpha,还有编码用到的 QP 信息。
当通道显示属性中的区域是否显示(bShow)为 TRUE 时,表示显示在该通道中;反之,表示在该通道中存在,但处于隐藏状态。
区域反色(解决区域和视频背景色相似的问题)
当区域叠加到视频上显示时,如果视频背景与叠加区域的亮度色度相近,往往会导致背景与区域很难进行区分。
区域反色功能即针对这种场景,自适应背景的变化,对区域的亮度色度进行调整,实现区域清晰可见。
区域反色功能支持实现方式如下:通过 VPSS 提供的区域亮度和统计功能。
用户可实时获取视频序列中每个待叠加区域背景的亮度统计,然后利用 TDE 的 ROP功能,对区域进行手动的反色处理,最后通过 VPSS 将该反色后的区域叠加到视频上。
区域 QP 保护(解决由于压缩编码导致区域被叠加到视频上不清晰的问题)
当区域叠加到视频上进行压缩编码时,为了保证叠加区域的清晰度不因为数据压缩而变模糊,可以单独设定叠加区域部分的压缩特性,即设定 QP 保护功能参数。QP 保护功能是 Overlay 特有的功能,且仅针对 H.264/H.265 类型编码通道有效,对其它类型无效。
1.4 海思平台OSD使用方法
(1)用户填充区域属性并创建区域
(2)将该区域指定到具体通道中(如 VENC)
以上步骤完成区域的创建和使用。用户还可以通过以下操作来控制区域属性以及在某
通道的通道显示属性。
(3)通过 HI_MPI_RGN_GetAttr、 HI_MPI_RGN_SetAttr 获取和设置区域属性,譬如修改区域大小、背景色
(4)通过 HI_MPI_RGN_SetBitMap(仅针对 Overlay)设置区域的位图信息
(5)通过 HI_MPI_RGN_GetDisplayAttr 和 HI_MPI_RGN_SetDisplayAttr 获取和设置区
域在某通道(如 VENC 通道)的通道显示属性。
(6)最后用户可以将该区域从通道中撤出(非必须操作),再销毁区域
1.5 海思平台OSD的API和关键数据结构
API参考
OVERLAY_INVERT_COLOR_S 【说明】定义 OSD 反色相关属性。
OVERLAY_ATTR_S 【说明】定义 VENC 通道叠加区域属性结构体。
OVERLAY_CHN_ATTR_S 【说明】定义 VENC 通道叠加区域的通道显示属性。
2.使用海思接口实现OSD—-代码框架
2.1 函数调用层次
SAMPLE_RGN_CreateVideoRegion
SAMPLE_RGN_CreateOverlayForVenc
HI_MPI_RGN_Create //创建一块REGION(区域)并设置属性
HI_MPI_RGN_AttachToChn //将REGION和VENC的chn绑定起来并设置chn属性
//此时区域部分已经完成,接下来就是加载bmp文件进来
SAMPLE_RGN_Add
HI_MPI_RGN_GetAttr //获取REGION的属性
HI_MPI_RGN_GetCanvasInfo //获取画布的信息
SAMPLE_RGN_UpdateCanvas //将要显示的内容丢到备份画布
SAMPLE_RGN_CreateSurfaceByCanvas //读取bmp文件到备份显存
SAMPLE_RGN_LoadCanvasEx
SAMPLE_RGN_LoadBMPCanvas_Logo //加载bmp文件
GetBmpInfo //读取bmp文件的信息
fopen //打开bmp文件
fread //判断是不是bmp文件
fread //读取bmp文件头
fread //读取bmp文件信息
fclose //关闭bmp文件
fopen //打开bmp文件
malloc //申请空间320*3*320
fseek //跳过bmp文件头部分,到真实图片数据部分
fread //将真实图片数据读到malloc申请的空间中
for
for
OSD_MAKECOLOR_U16 //逐个像素处理,将RGB888转成RGB1555,并写到显存中
free //释放malloc申请的空间
fclose //关闭文件
HI_MPI_RGN_UpdateCanvas //将备份画布的内容更新到真正的画布
SAMPLE_RGN_CreateOverlayForVenc //同上
SAMPLE_RGN_AddVideoTimestamp
while(1)
time //Linux的API,获取当前系统时间
localtime //转换时间
SAMPLE_RGN_Add
(2)RGN画布尺寸计算:以像素为单位。原始图像是bpp24的,每个像素3字节。而画布的图像是ARGB1555的,所以每个像素是2字节。所以画布每一行的像素数是图像宽度*3/2
(3)整个图像的坐标系是左上角是(0,0)点,宽度方向是x,高度方向是y
2.2 前\背景透明度、背景颜色
(1)前景透明度:图片中显示的内容部分,背景透明度:图片中没有内容的部分
前景和背景的透明度范围是0-128,其中0代表全透明,128代表全不透明
前景和背景透明度可以同时设置,各自起作用,互不影响。
(2)stRgnAttr.unAttr.stOverlay.u32BgColor是REGION的画布(canvas,等同于LCD显示时的显存fb)的背景颜色。也就是画布中没有被填充的部分默认显示的颜色。
(3)BMP图片中存储图像的像素顺序,和RGN的canvas里像素顺序是不同的。
3.使用字库字符实现OSD—-代码框架
字库字符实现OSD的本质原理是:先由字库生成对应文字内容的bmp文件,然后将bmp文件显示在osd中。
3.1 函数调用关系层次
HH_OSD_Init //初始化这一套
HH_OSD_SetOsdPosDefault
HH_OSD_GetOrg //获取显示的坐标
HH_OSD_GetColor //获取显示的背景颜色
HH_OSD_GetTitle //获取显示的内容
HI_Create_Osd //实例化一个HH_OSD_LOGO结构体变量,然后进行填充
HI_OSD_Build
HI_OSD_Parse_OsdTitle //通过解析osd的字符,填充HH_OSD_LOGO结构体中两个成员变量数组nOsdTitleLen和nOsdTitleFlag
HI_OSD_Get_BmpSize //实际是设置OSD区域的宽高和左上角坐标
HI_OSD_Get_ImaSize //获取视频源的分辨率
HI_Create_Osd_Reg //创建区域,并为bmp图片申请一片内存
HI_MPI_RGN_Create //创建一块REGION(区域)并设置属性
HI_MPI_RGN_AttachToChn //将REGION和VENC的chn绑定起来并设置chn属性
HI_OSD_Create_Bitmap
//根据pOsdLogo记录的OSD要显示的内容,逐行填充到给OSD区域的内存中去,然后调用海思APIHI_MPI_RGN_SetBitMap显示
HI_OSD_CreateBMP //将OSD要显示的每一行的内容szTitle,逐行填充到OSD区域的内存中
HI_MPI_RGN_SetBitMap //真正设置OSD显示的API
HI_OSD_Set_Show //根据传参show的设置为ture或者flase,来开启OSD的开启或关闭OSD的显示
HI_MPI_RGN_GetDisplayAttr //获取通道显示属性
HI_MPI_RGN_SetDisplayAttr //设置通道显示属性
HH_OSD_All_Refresh
HH_OSD_AllTime_Refresh
HH_OSD_ChnTime_Refresh
HH_OSD_ChName_Refresh
HH_OSD_GetLogoHandle //获取区域的句柄
HH_OSD_GetTitle //获取显示的内容
HI_OSD_Parse_OsdTitle //通过解析osd的字符,填充HH_OSD_LOGO结构体中两个成员变量数组nOsdTitleLen和nOsdTitleFlag
HI_OSD_Get_BmpSize //获取视频源的分辨率
HI_OSD_Create_Bitmap
//根据pOsdLogo记录的OSD要显示的内容,逐行填充到给OSD区域的内存中去,然后调用海思APIHI_MPI_RGN_SetBitMap显示
HI_OSD_CreateBMP //将OSD要显示的每一行的内容szTitle,逐行填充到OSD区域的内存中
HI_MPI_RGN_SetBitMap //真正设置OSD显示的API
HH_OSD_Show_Refresh
HH_OSD_GetLogoHandle //获取OSD的handle号
HH_OSD_GetShow //获取参数显示设置:是否显示日期、时间、星期等
HI_OSD_Set_Show //根据传参show的设置为ture或者flase,来开启OSD的开启或关闭OSD的显示
HH_OSD_AllName_Refresh
文章来源csdn,如有侵权请联系删除:https://blog.csdn.net/weixin_53762042/article/details/131478411?spm=1001.2014.3001.5502
- 分享
- 举报
-
浏览量:1009次2024-01-19 17:52:40
-
浏览量:717次2024-01-11 15:05:58
-
浏览量:3763次2019-12-31 16:26:54
-
浏览量:2344次2020-09-21 19:06:02
-
浏览量:1399次2024-03-05 17:10:43
-
浏览量:6750次2020-09-27 14:15:09
-
浏览量:1244次2024-01-19 17:57:59
-
浏览量:5795次2020-08-03 18:36:13
-
浏览量:7308次2021-03-18 08:54:25
-
浏览量:1456次2023-12-29 16:51:41
-
浏览量:801次2024-01-24 15:46:44
-
浏览量:2443次2020-08-04 20:15:40
-
浏览量:1032次2024-01-24 18:44:43
-
浏览量:1643次2022-12-17 11:50:11
-
浏览量:4317次2020-09-04 15:36:49
-
浏览量:1683次2023-10-12 16:48:04
-
浏览量:2508次2019-12-31 16:23:45
-
浏览量:3111次2020-07-29 10:00:03
-
浏览量:1268次2023-10-12 14:39:21
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
技术不加糖
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明