糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > 第8季1:海思平台OSD的理论基础

第8季1:海思平台OSD的理论基础

时间:2023-02-12 02:22:05

相关推荐

第8季1:海思平台OSD的理论基础

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。

一、OSD概述

1、区域管理模块

“OSD”是“on screen display”的缩写,即在屏幕上播放。

用户需要在视频中叠加OSD或者色块,来显示一些特定信息,比如通道号、时间戳等。这些叠加在视频上的OSD或者色块统称为区域

区域管理模块,可以实现区域的创建,并叠加到视频中或对视频进行遮挡。

在实际应用中,用户首先创建一个区域,然后通过 HI_MPI_RGN_AttachToChn,将该区域叠加到某个通道(如VENC通道),之后在通道进行调度时,会将OSD叠加在视频中。通过设置通道显示属性,可以将一个区域指定到多个通道中(如多个VENC通道,多个VI通道,甚至多个VENC和VI通道中),且支持在每个通道的显示属性(如位置、层次、透明度等)都不同。

2、重要的概念

(1)区域类型

主要包括以下四种区域类型:

Overlay:视频叠加区域,其中区域支持位图的加载、背景色更新等功能。

OverlayEx:扩展视频叠加区域,功能与 Overlay 类似,支持位图加载、背景色更新等。

Cover:视频遮挡区域,其中区域支持纯色块遮挡。

CoverEx:扩展视频遮挡区域,功能与 Cover 类似,支持纯色块遮挡。

OverlayEx/ CoverEx与 Overlay/Cover的功能类似,但是会引入额外的系统带宽,OverlayEx/ CoverEx 由 VGS 叠加到图像上 ,OverlayEx/CoverEx 区域越大,占用 VGS 的性能就越大,当 VGS 性能不足时,会导致帧率降低。建议只有当 Overlay/Cover 不支持,或者数量无法满足需求时再使用。

(2)区域层次

区域层次表示区域的叠加级别,层次值越大,表示区域的显示级别越高。当发生重叠时,层次值大的将会覆盖层次值小的。如果是同一级别,则根据区域叠加的先后顺序,后叠加的将显示在上层。

将多个区域叠加到 VPSS 的同一 GROUP时,要求每个区域的层次值不能与叠加到该 GROUP 的其他区域层次值相同,否则区域层次值相同的多个区域中,只能将最后一个叠加的区域叠加到 VPSS 的GROUP 上。将多个层次值相同的区域叠加到同一个 VENC 的通道上时,没有此限制,都能叠加成功。

(3)位图填充

位图填充是指将位图的内存值填充到区域内存空间中,位图将会从区域的左上角开始填充。当位图小于区域时,只能填充一部分内存,剩余部分保持原有值;位图大小等于区域时,将刚好全部填充;当位图大于区域时,位图只能将自身和区域一样大小的内存信息填充到区域中。

位图填充支持两种实现方式:

其一、用户通过 HI_MPI_RGN_SetBitMap 接口将位图数据拷贝至内部显示画布

其二、用户通过 HI_MPI_RGN_GetCanvasInfo 获取内部备份显示画布的地址,直接对该地址数据进行更新,然后调用HI_MPI_RGN_UpdateCanvas 接口将内部备份显示画布更新为待显示画布,达到实现更新位图数据的目的。

(4)区域属性

用户创建一个区域时,需要设置该区域的属性信息,它包含公共的资源信息。例如,Overlay 包含像素格式,大小和背景色。

(5)通道显示属性

通道显示属性表明区域在某通道的显示特征。例如,Overlay 的通道显示属性包含显示位置,层次,前景 Alpha,背景 Alpha,还有编码用到的 QP 信息。当通道显示属性中的区域是否显示(bShow)为 TRUE 时,表示显示在该通道中;反之,表示在该通道中存在,但处于隐藏状态。

(6)区域反色

当区域叠加到视频上显示时,如果视频背景与叠加区域的亮度色度相近,往往会导致背景与区域很难进行区分。区域反色功能即针对这种场景,自适应背景的变化,对区域的亮度色度进行调整,实现区域清晰可见。

区域反色功能支持实现方式如下:通过 VPSS 提供的区域亮度和统计功能。用户可实时获取视频序列中每个待叠加区域背景的亮度统计,然后利用 TDE 的 ROP功能,对区域进行手动的反色处理,最后通过 VPSS 将该反色后的区域叠加到视频上。

(7)区域QP保护

当区域叠加到视频上进行压缩编码时,为了保证叠加区域的清晰度不因为数据压缩而变模糊,可以单独设定叠加区域部分的压缩特性,即设定 QP 保护功能参数。QP 保护功能是 Overlay 特有的功能,且仅针对 H.264/H.265 类型编码通道有效,对其它类型无效。

3、四种区域类型支持的模块和功能

由上面的描述可知一共支持四种区域类型,即OVERLEAY、OverlayEx、Cover和CoverEx。这四种区域类型支持的模块与功能如下,从中可知OVERLAY区域类型只能绑定VENC模块,而我们实验提供的sample,就是将OVERLAY类型的区域与VENC模块进行绑定。

二、海思平台OSD使用方法

(1)用户首先填充区域属性,并创建区域。

(2)将该区域绑定到具体通道中(如VENC通道)。在绑定时,需要输入通道的显示属性。

以上步骤完成区域的创建和使用,用户还可以通过以下操作来控制区域属性、通道显示属性(上面的(4)(5)点)。

(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)最后用户可以将该区域从通道中撤出(非必须操作),再销毁区域。

三、关键API和数据结构

上面第一节提到的“区域管理模块”,主要提供区域资源的控制管理功能,包括区域的创建、销毁,获取与设置区域属性,获取与设置区域的通道显示属性等。

1、区域管理模块的关键API

HI_MPI_RGN_Create:创建区域。HI_MPI_RGN_Destroy:销毁区域。HI_MPI_RGN_GetAttr:获取区域属性HI_MPI_RGN_SetAttr:设置区域属性。HI_MPI_RGN_SetBitMap:设置区域位图。HI_MPI_RGN_SetAttachField:设置区域要叠加到的帧/场标志。HI_MPI_RGN_GetAttachField:获取区域要叠加到的帧/场标志。HI_MPI_RGN_AttachToChn:将区域叠加到通道上。HI_MPI_RGN_DetachFromChn:将区域从通道中撤出。HI_MPI_RGN_SetDisplayAttr:设置区域的通道显示属性。HI_MPI_RGN_GetDisplayAttr:获取区域的通道显示属性。HI_MPI_RGN_GetCanvasInfo:获取区域画布(画布与显存是同一个概念)信息。HI_MPI_RGN_UpdateCanvas:更新区域画布信息。

2、区域管理模块的关键数据结构

(1)定义(VENC 通道)叠加区域(即OVERLAY类型)的属性

typedef struct hiOVERLAY_ATTR_S { PIXEL_FORMAT_E enPixelFmt; //表示像素格式HI_U32 u32BgColor; //区域背景色,动态属性SIZE_S stSize; //区域的高宽}OVERLAY_ATTR_S;//当 overlay 绑定到 VENC 通道时/*像素的格式,支持:PIXEL_FORMAT_RGB_1555;当透明度字节设置为1时表示不支持透明。PIXEL_FORMAT_RGB_4444。*//*区域的高宽,其取值范围宽度:[2, RGN_OVERLAY_MAX_WIDTH],要求以 2 对齐。高度:[2, RGN_OVERLAY_MAX_HEIGHT],要求以 2 对齐。*/

(2)定义(VENC 通道)叠加区域(即OVERLAY类型)的通道显示属性

typedef struct hiOVERLAY_CHN_ATTR_S { POINT_S stPoint; //表示区域位置,其取值范围://水平位置 X:[0, 8190],要求以 2 对齐。//水平位置 Y:[0, 8190],要求以 2 对齐。HI_U32 u32FgAlpha; //表示Alpha位为1时的像素点的透明度,即前景Alpha//取值范围[0, 128]。0表示全透明,128表示不透明,取值越小,越透明。HI_U32 u32BgAlpha; //表示Alpha位为0的像素点的透明度,即背景Alpha//取值范围[0, 128]。0表示全透明,128表示不透明,取值越小,越透明。HI_U32 u32Layer; //表示区域层次,取值范围是[0, 7],值越大,层次越高。OVERLAY_QP_INFO_S stQpInfo; //表示此区域编码时使用的QP值 OVERLAY_INVERT_COLOR_S stInvertColor; //表示区域反色配置信息}OVERLAY_CHN_ATTR_S;//区域内存信息为 PIXEL_FORMAT_RGB_1555 格式时,芯片将会扩展 Alpha 值。//当 Alpha 位为 1 时,芯片使用 u32FgAlpha 进行透明度叠加;//当 Alpha 位为 0 时,芯片使用 u32BgAlpha 进行透明度叠加。//区域位置,根据经验,应该是区域的左上角的坐标。

如果觉得《第8季1:海思平台OSD的理论基础》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。