海思平台OSD的实现

news2024/10/6 6:42:27

目录

1.海思平台OSD理论学习

1.1、OSD概述

1.2、海思OSD的4种类型

1.3、海思OSD的几个重要概念

1.4、海思平台OSD使用方法

1.5、海思平台OSD的API和关键数据结构

2.使用海思接口实现OSD---代码框架

2.1、函数调用层次

2.2、前\背景透明度、背景颜色

3.使用字库字符实现OSD---代码框架

3.1、函数调用关系层次


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和关键数据结构

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

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

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

相关文章

Jmeter远程服务模式运行时引用csv文件的路径配置

目录 前言: 问题 解决方法 前言: 在JMeter远程服务模式下运行时,你可以通过配置CSV文件的路径来引用该文件。CSV文件经常用于存储测试数据,可以在测试中进行参数化。 问题 在使用jmeter过程中,本机的内存等配置不…

掌握GDB调试工具,轻松排除bug!

一、什么是GDB gdb是GNU debugger的缩写,是编程调试工具。 GDB官网: https://www.gnu.org/software/gdb/GDB适用的编程语言: Ada / C / C / objective-c / Pascal 等。GDB的工作方式: 本地调试和远程调试。 目前release的最新版…

RRT* 算法研究(附 MATLAB 和 Python 实现)

RRT* 算法研究 参考 机器人路径规划、轨迹优化课程-第六讲-RRT*算法原理和代码讲解 路径规划 | 随机采样算法:PRM、RRT、RRT-Connect、RRT* 基于采样的运动规划算法-RRT(Rapidly-exploring Random Trees) 《改进RRT算法在移动机器人路径规划中的应用研究》 理论基础…

全网超全,pytest自动化测试框架pytest.ini配置文件详细(实战)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 pytest配置文件可…

Java 实现word、excel、ppt、txt等办公文件在线预览功能!

如何用 Java 实现word、excel、ppt、txt等办公文件在线预览功能?本文告诉你答案! java 实现办公文件在线预览功能是一个大家在工作中也许会遇到的需求,网上些公司专门提供这样的服务,不过需要收费。 如果想要免费的,…

【ISO26262】汽车功能安全:以汽车安全完整性等级为导向和以安全为导向的分析

关于 ASIL剪裁的要求分解 表 A.1 以汽车安全完整性等级为导向和以安全为导向的分析的概览

Android Binder通信原理(五):Java 端的service 注册和获取

源码基于:Android R 0. 前言 在阐述相关的知识点,先整理个框架图,后面带着框架图来分析过程: Java 端对于binder 使用大致分为: Java client Java serviceJava client native service Java 端service 的注册使用 Se…

前端如何进行页面优化_如何优化前端页面

优化前端页面 1 .前期准备 1.1 首页命名为index.html / index.htm / index.php等。 1.2 需要制作404页面。 1.3 文件夹结构合理。 1.4 命名使用英文且有语义性的单词,并提供参考文档。 2 .结构 2.1 文件头部分 2.1.1 需要提供文档声明 2.1.2 设置utf-8的编…

虚拟机创建linux系统并使用SSH工具连接

安装VMware Workstation 创建新的虚拟机或从别人那里拷贝虚拟机文件,下面是我从别人那里拷贝的 虚拟机存在后,点击播放按钮启动虚拟机 启动成功后,长这个样子 虚拟机启动成功后,不想用linux指令操作,而是用windows的可…

报错:Information:java: javacTask: 源发行版 8 需要目标发行版 1.8

1.背景 编译项目或启动项目报错 2.解决方法 设置为对应的版本 3.完美

DOM编程实现动态时钟

文章目录 第一种&#xff1a;第二种&#xff1a;第三种&#xff1a; 以下是一个使用 JavaScript 和 DOM 编程实现的动态实时的时钟应用&#xff1a; 第一种&#xff1a; HTML&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"…

想知道PDF转高清图片软件哪个好?

张琳是一名设计师&#xff0c;她经常需要将自己的设计作品整理成PDF文档&#xff0c;以便向客户展示和交付。然而&#xff0c;有时客户需要对设计进行更详细的审查&#xff0c;而PDF格式的文件并不方便进行缩放和查看细节。这一问题让张琳感到非常困扰&#xff0c;她希望能够找…

HttpWatch用于界面单页性能测试

HttpWatch是强大的网页数据分析工具&#xff0c;作为插件可集成在IE工具栏&#xff0c;包括网页摘要、Cookies管理、缓存管理、消息头发送/接受、字符查询、POST 数据和目录管理功能、以及报告的输出。今天笔者就介绍HttpWatch的安装及使用。一、HttpWatch的安装 1、在百度下载…

UNI-APP前端项目开发实战

一、创建项目 1.创建项目分为通过HBuilderX可视化界面和vue-cli命令行两种方式创建 2.官方推荐使用HBuilderX可视化界面方式创建,主要是编译器跟随开发工具升级,vue-cli是跟在项目中的,需要手动通过 npx @dcloudio/uvm 命令升级。 3.使用HBuilderX有一个弊端就是无…

【雕爷学编程】Arduino动手做(135)---W5100 网络扩展板模块

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

中小企业怎么轻松搭建产品发行说明文档?

发行说明是产品上线必备的文档&#xff0c;它包含了项目进度的跟踪和产品版本的基础信息以及新增功能的介绍。 以下是为什么您需要发行说明的几个原因&#xff1a; 1.通知用户新功能&#xff1a;发行说明是向用户传达团队正在进行的工作和产品更新的重要途径。定期更新发行说明…

Selenium系列(三) - 详细解读针对元素常见的简单操作

针对元素有哪些常见的简单操作&#xff1f; 点击输入内容、清除内容返回元素尺寸、坐标获取元素标签文本获取元素属性值检查元素&#xff1a;是否可见、是否可点击、是否已被选择表单提交 点击右边目录即可跳转哦&#xff01; -------------->>>>>>>>…

服务器压力测试

目录 一、磁盘性能测试安装fio磁盘性能测试工具测试内容为顺序读、随机读、顺序写、随机写、随机读写结果分析 二、CPU性能测试安装sysbench性能测试工具结果分析 三、内存性能测试结果分析 四、网络性能测试测试iperf3工具测试结果分析1.测试TCP吞吐量2 . 测试UDP丢包和延迟 此…

EasyExcel读文件详解和源码分析

读取文件导入的话&#xff0c;我们经常看到下面这些方法。 //同步的返回&#xff0c;不推荐使用 EasyExcel.read(file).sheet(sheetNo).head(Class.class).headRowNumber(headRowNum)..doReadSync(); //异步的&#xff0c;通过监听器处理读到的数据。 EasyExcel.read(file).sh…

VMware Tools安装“保熟“技巧

网上关于如何安装VMware Tools也有很多帖子,但是基本很难对症下药。下面笔者给出两种情况&#xff0c;读者可根据自己概况定位自己的问题&#xff0c;从而进行解决。 如果读者安装操作系统时是如笔者如下截图 那么读者可参考这个解决方案 安装VMware Tools选项显示灰色的正确解…