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

news2024/10/9 14:18:04

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

一、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 进行透明度叠加。

//区域位置,根据经验,应该是区域的左上角的坐标。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/135702.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浅谈Java并发

Java并发是比较难的知识点,难于对并发的理解。并发要从操作系统和硬件层面去理解,才会比较深入,而不单单是从编程语言的逻辑去理解。 首先对于并发要清楚的几点: 线程可能在任何时刻被切换。 计算机只对硬件指令保证原子性。 CP…

关于一名资深Java程序员在移动端的进阶之路

目录 那年刚毕业 初识移动端 H5开始入门 微信小程序开发 未来的目标(唯有热爱,可抵这岁月漫长) 既然进来了,就帮我点亮五星好评吧,你的五星就是对我最大的支持和鼓励…… https://bbs.csdn.net/topics/611387335 今天呢,就借…

Prometheus配合 alertmanager 使用企业微信告警(坑已平!!!)

部署Prometheus 和 Alertmanager略 安装包部署prometheusGrafananode_exporter_争取不加班!的博客-CSDN博客 prometheus监控报警部署Alertmanager_争取不加班!的博客-CSDN博客 配置企业微信报警 首先使用企业微信创建一个企业 然后点击头像&#xff…

C++进阶 map和set

作者:小萌新 专栏:C进阶 作者简介:大二学生 希望能和大家一起进步! 本篇博客简介:简单介绍C中map和set容器 map和set关联式容器树形结构与哈希结构键值对setset的介绍set的定义方式方式一: 构造一个某类型的…

声纹图-声谱图-js之wavesurfer.js(配置、事件、方法中文版翻译)

配置信息 optiontypedefaultEnglish descriptiontranslateaudioRatefloat1Speed at which to play audio. Lower number is slower.播放音频的速度。数值越低,速度越慢。audioContextobjectnoneUse your own previously initialized AudioContext or leave blank.n…

挺进2023 年的JavaScript 框架

瞥见未来的美妙之处在于,道路永远不会完全清晰。我们可以观察趋势,观察创新并尝试规划路线。更好的是,我们可以成为这些创新的一部分来指导方向。但没有什么是确定的。 2022 年发布了大量推动 Web 开发的重大版本。我们看到了 Astro 和 Svel…

Jetson NX + yolov5 v5.0 + TensorRT加速+调用usb摄像头

上一篇笔记记录了如何使用yolov5使用usb摄像头使用权重进行测试,测试效果如下 本篇文章具体操作步骤如下就可以了,切记版本要对应 ,我产生这个错误的原因就是版本问题,成功转换但是还是卡顿,估计是硬件usb问题,加速以后…

2023年最值得学习的10大编程语言

作为一名程序员,我们的目标之一就是学习新技术和编程语言,但是你应该学习哪些语言呢?由于学习一门编程语言既需要时间又需要耐心,因此您应该学习一门值得付出努力的语言;我的意思是,它可以帮助你获得更好的…

2023前端必会手写面试题整理

实现一个compose函数 组合多个函数,从右到左,比如:compose(f, g, h) 最终得到这个结果 (...args) > f(g(h(...args))). 题目描述:实现一个 compose 函数 // 用法如下: function fn1(x) {return x 1; } function fn2(x) {return x 2; } …

UTF-8编码

阅读该文章之前,请阅读以下两篇文章,了解GBK编码和Unicode编码: GBK编码的理解_sgmcy的博客-CSDN博客 Unicode编码的理解_sgmcy的博客-CSDN博客 UTF的意思是:Unicode Transformation Format 。也就是Unicode 转换格式。可见&am…

python初级教程七 JSON 数据解析

JSON 数据解析 JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。 Python3 中可以使用 json 模块来对 JSON 数据进行编解码,它包含了两个函数: json.dumps(): 对数据进行编码。 json.loads(): 对数据进行解码。 在 json 的编解码过程…

【数据结构】C语言实现双链表

目录 前言 双链表节点定义 接口函数实现 初始化函数 创建节点 打印双链表 尾插节点 尾删节点 头插节点 头删节点 指定位置前插入 删除指定位置节点 改写插入删除 判断链表是否为空 计算链表长度 销毁链表 双链表完整代码 浅谈链表及顺序表 前言 前面我们已经实…

Speed and Memory Efficient Dense RGB-D SLAM in Dynamic Scenes论文笔记

Speed and Memory Efficient Dense RGB-D SLAM in Dynamic Scenes论文笔记 论文中的主要引用文献: [7:A coarse and relevant 3d representation for fast and lightweight rgb-d mapping] 超表元建图 [14: Fast optical flow using dense inverse search] 稠密光流…

后端Web开发框架(Java)

为什么使用Spring Boot 简化配置,无需编写太多的 xml 配置文件,效率很高;Spring 可以整合很多各式各样的框架,并能很好的集成;基于 Spring 构建,使开发者快速入门,门槛很低;Spring …

LabVIEW调用自己写的DLL

首先,我用的LabVIEW是8.5版本的,比较老但工作需要 先新建VI 程序框图中选择 互连接口 - 库与可执行程序 选择 调用库函数… 拖到面板 并右击它 选择配置 在库名或路径中选择写好的DLL方案中的DEBUG中dll文件 确定以后就要选择哪个函数,并…

【数字图像处理】毛笔字细化

源码链接:calligraphy.cpp 一、实验要求 附件是书法毛笔字,请将附件图片中“年少有为”四个字进行笔画细化。 二、实验内容 首先观察图片,是只将黑色的毛笔字部分进行细化,所以需要先把印章这类的区域去除。先通过将图片转到h…

Content Security Policy (CSP) 介绍

内容安全策略 (CSP) 是一个额外的安全层,用于检测并削弱某些特定类型的攻击,包括跨站脚本 (XSS) 和数据注入攻击等。无论是数据盗取、网站内容污染还是散发恶意软件,这些攻击都是主要的手段。 起因 当我不经意间在 Twitter 页面 view source…

JavaScript 简单类型与复杂类型

JavaScript 简单类型与复杂类型 目录JavaScript 简单类型与复杂类型1. 简单类型与复杂类型2. 堆和栈3. 简单类型的内存分配4.复杂类型的内存分配5. 简单类型传参6. 复杂类型传参7.下面是代码1、Math对象最大值2. 封装自己的数学对象3. Math绝对值和三个取整方法4.Math对象获取随…

WebSocket实现聊天室

需求 实现用户登录功能展示用户好友列表功能实现用户历史消息展示实现单聊信息和群聊信息 效果展示 用户登录 好友列表展示 历史消息展示 聊天 代码实现 说明&#xff1a;Springboot项目&#xff0c;页面是用 thymeleaf 整合的。 maven依赖 <dependencies><depen…

π122E31兼容ISO7221CD 200Mbps高速率 双通道数字隔离器

π122E31兼容ISO7221CD 200Mbps高速率 双通道数字隔离器&#xff0c;具有出色的性能特征和可靠性&#xff0c;整体性能优于光耦和基于其他原理的数字隔离器产品。 产品传输通道间彼此独立&#xff0c;可实现多种传输方向的配置&#xff0c;可实现 3.0kVrms 隔离耐压等级和 DC 到…