第8季3:使用字库字符实现区域显示

news2024/11/15 14:01:19

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

 

一、代码框架分析

在第8季2:OSD实验演示与代码分析中,我们分析了SAMPLE_RGN_CreateVideoRegion函数,该函数完成了左下角的logo区域显示、右下角的时间区域显示,基于直接的bmp图片来显示。

接下来我们将分析左上角、右上角的区域,这两个区域都是利用字库字符来实现显示的。其本质是目前没有现成的bmp图片,需要先通过字库,生成对应文字内容的bmp文件(新的内容),然后再将bmp文件在区域里显示(这和之前的一样)。

这涉及HH_OSD_Init、while循环与HH_OSD_All_Refresh函数,它们的调用关系如下。

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的字符,更新字符相关属性
            HI_OSD_Get_BmpSize //根据视频源的大小来配置区域的字模宽高、xy坐标等
                HI_OSD_Get_ImaSize//获取视频源的宽与高,这个值在ipc_conf全局变量中配置
            HI_Create_Osd_Reg //创建区域
                HI_MPI_RGN_Create
                HI_MPI_RGN_AttachToChn
            HI_OSD_Create_Bitmap //根据pOsdlogo记录的要显示的内容,创建bmp文件,然后调用HI_MPI_RGN_SetBitMap来显示
                HI_OSD_CreateBMP //用字库来生成bmp文件
                HI_MPI_RGN_SetBitMap //真正设置osd显示的API,另外的一种方法见本季1博文
            HI_OSD_Set_Show //根据传参来决定osd区域的显示或者关闭
                HI_MPI_RGN_GetDisplayAttr
                HI_MPI_RGN_SetDisplayAttr

while{
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
                HI_OSD_Get_BmpSize
                HI_OSD_Create_Bitmap
                    HI_OSD_CreateBMP
                    HI_MPI_RGN_SetBitMap
                HH_OSD_Show_Refresh
                    HH_OSD_GetLogoHandle
                    HH_OSD_GetShow
                    HI_OSD_Set_Show
    HH_OSD_AllName_Refresh//刷新左上角的内容显示
        HH_OSD_ChnAllName_Refresh
            HH_OSD_ChName_Refresh
                //和上面的一样   
}

从调用函数关系可知,如果只把while循环部分注释掉,由于HH_OSD_Init完成了一些区域显示相关的设置,此时左上角、右上角依然存在区域内容,但是因为没有while循环刷新,因此右上角的区域内容不会刷新。如下图所示。

二、利用字库字符实现区域显示的源码解析

1、相关文件概述

在mpp/sample/osd目录下有许多文件:

root@ubuntu:/home/xjh/iot/hisi_development/Hi3518E_SDK/Hi3518E_SDK_V1.0.3.0/mpp/sample/osd# ls
hh_hz16lib.c  hh_hz16lib.h  hh_osd_api.c  hh_osd_api.h  hh_osd.c  hh_osd.h
root@ubuntu:/home/xjh/iot/hisi_development/Hi3518E_SDK/Hi3518E_SDK_V1.0.3.0/mpp/sample/osd# 

(1)hh_hz16lib.c 文件

该文件是字库文件,如下所示。可知其包括16点阵的字库、12点阵的字库、8点阵的字库,这些不同点阵(这里表现为字体大小不同)的字库,主要为了适应不同尺寸的屏幕。比如屏幕是1080的,那么区域的文字可以大一些,因为太小的话看起来就不清晰;如果屏幕是320*240的,那么区域的文字就应该小一些,因为文字太大的话看起来比例就不协调了。另外,这些字库与字体类型(楷体、黑体等)也有关,不同字体类型的字符文件是不一样的。

(2)hh_osd.c 文件、hh_osd_api.c 文件

其中 hh_osd.c 文件是上层文件,比如HH_OSD_Init函数位于该文件中。而 hh_osd_api.c 文件是下层文件,比如HH_OSD_Init函数所调用的、以HI开头的函数就位于该文件中。

(3)hh_osd_api.h 文件

该文件定义了一些数据结构与函数声明。其中比较重要结构体有:

typedef struct _HH_OSD_LOGO
{
	VENC_GRP     vencGroup ;   //osd 区域叠加到的编码组
	HI_U8        nStatus   ;   //1显示,0隐藏
	HI_U8        nOsdLine  ;   //osd 字幕的行数
	HI_U8        nOsdFontH ;
	HI_U8        nOsdFontW ;
	HI_U16		 nWidth    ;   //osd 区域的宽度
	HI_U16		 nHeight   ;   //osd 区域的高度
	HI_U16       nImageWidth;
	HI_U16       nImageHeight;
	HI_S16       nFontInt  ;   //osd 字符间隔
	HI_U16       nVencFeild;
	HI_U8        nOsdTitleMaxLen; //标记最长的一行字符的个数
	HI_U8        nOsdTitleFlag[HH_MAX_TITLE_LINE]; //osd最大支持8行,标记每一行osd第一个字符在osdtitle中的位置
	HI_U8        nOsdTitleLen[HH_MAX_TITLE_LINE]; //标记每一行osd 的长度
	char         szOsdTitle[HH_MAX_TITLE_NUM]; //osd 叠加字幕信息
	HI_OSD_ORG   osdPos    ;
	HI_OSD_COLOR osdColor  ;
	HI_U8          *pBmpBuf;
	int			 regHdl    ;  //osd区域句柄
	int          nSelLine  ;  //标记当前行为选中行
}HH_OSD_LOGO, *PHH_OSD_LOGO;

2、分析hh_osd_api.c文件

(1)各函数的作用分析

(2)“ 汉字区位码 ” 的概念

汉字区位码,即为每个汉字编一个唯一的代码,以便计算机辨认、接收和处理。汉字区位码由区码和位码组成,有些类似于xy坐标系,区码是x轴,位码是y轴,两者确定一个汉字。

3、分析hh_osd.c 文件

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

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

相关文章

Ubuntu18.04安装教程

Ubuntu18.04安装教程# 阿里云源 deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-updates ma…

【Vue+Springboot】综合程序设计后端部分实现(含跨越访问)

文章目录1、功能展示2、前端部分:VueAPI3、后端部分:Springboot1、功能展示 大致分为用户管理,商品管理,收藏管理,购物车管理,订单管理五个模块。 2、前端部分:VueAPI Vue 使用 axios 库进行网…

如何在Unity中实现MVC模式?

MVC是什么? ​ MVC即Model View Controller,是模型(model)【数据层】-视图(view)【表现层】-控制器(controller)【逻辑层】的缩写。主要应用于网站开发,在游戏开发方面,因为不同游戏的需求、功能不尽相同&…

数字化转型迫在眉睫,企业应该如何面对?

火热的数字化转型,在国企、央企公布数字化转型规划后,进一步向各行各业开始扩散,吸引了很多对于数字化并不熟悉的企业。这些企业大多没有一个确定的目标,只是想要让企业完成转型改革,所以对于怎样做没有什么好的规划。…

Unity3d C#实现基于SocketIOUnity的与后端(node.js为例)Socket通信功能(含工程)

#前言 该功能主要是项目上的需求,按后端的需求就是我们通过SocketIO进行通信,之前游戏通信功能大多是基于原始的Socket进行封装,需要对包体进行设计,还需要粘包拆包等系列操作,属实有点麻烦。这次尝试了SocketIOUnity的…

Exynos_4412——RTC实验

目录 一、ADC小作业 二、RTC简介 三、Exynos_4412下的RTC控制器 四、RTC中的寄存器 五、RTC编程 六、RTC小作业 一、ADC小作业 电压在1501mv~1800mv时,LED2、LED3、LED4、LED5点亮 电压在1001mv~1500mv时,LED2、LED3、LED4点亮 电压在501mv~1000m…

什么是芯片老化测试?芯片老化测试系统NSAT-2000解决方案

随着半导体电子技术的进步,老化测试已成为保证产品质量的关键流程。除了半导体元件外,PCB、IC 和处理器部件也都需要在老化条件下进行测试。本篇文章纳米软件Namisoft小编将带大家分享一下关于芯片老化测试系统的相关知识。 一、什么是芯片老化测试&…

开发工具篇第十二讲:常用开发库 - Lombok工具库详解

开发工具篇第十二讲:常用开发库 - Lombok工具库详解 Lombok是一款非常实用Java工具,可用来帮助开发人员消除Java的冗长代码,尤其是对于简单的Java对象(POJO)。实际上我并不推荐使用Lombok(不主动使用它&…

CANoe测试TC8

OPEN联盟发布的TC8是目前行业内关于车载以太网的标准测试规范之一。 CANoe环境需要硬件和软件: 硬件是CANoe设备,用来连接电脑和DUT,TC8测试的是以太,那么CANoe设备必须支持以太才行,目前VN5640以上都是支持的。 软件需要安装CANo…

对git rebase 和git merge的理解

一、是什么 在使用 git 进行版本管理的项目中,当完成一个特性的开发并将其合并到 master 分支时,会有两种方式: git mergegit rebase git rebase 与 git merge都有相同的作用,都是将一个分支的提交合并到另一分支上,…

物联网技术在地下综合管廊智能化建设中的应用实例分析

摘 要:物联网是21世纪传感技术、通信技术、信息技术的应用大集成利用物联网技术实现地下综合管廊的智能化管理符合经济和城市规划发展的需要分析了物联网技术的特点及地下综合管廊建设中物联网技术的应用并结合物联网技术在地下综合管廊建设的应用实例对物联网技术在地下综合…

Qt扫盲-Windows任务栏使用总结

Qt扫盲-Windows任务栏使用总结一、概述二、覆盖图标和进度指示器三、跳转列表四、缩略图工具栏一、概述 任务栏为用户提供了访问桌面上打开的应用程序的权限。Windows自动在任务栏上创建用于访问应用程序窗口的按钮。 从 Windows 7到Windows10 都有效果。就是在任务栏上的一个…

基于springboot框架个人博客管理系统

一、项目简介 本项目是一套基于springboot框架实现的个人博客管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试&a…

头歌:UDP Ping程序实现 客户端创建UDP套接字

头歌平台:头歌实践教学平台 (educoder.net)创建数据包套接字套接字 Socket 实质上提供了主机间进程通信的连接点。进程通信之前,双方首先必须各自创建一个连接点,否则是没有办法建立联系并相互通信的。一个完整的 Socket {协议,本地地址,本地端口,远程地…

在 React 中使用 i18next

1. 安装依赖 npm i i18next react-i18next i18next-browser-languagedetectori18next 提供了翻译的基本能力。react-i18next 是 i18next 的一个插件,用来降低 react 的使用成本。i18next-browser-languagedetector 是用来检测浏览器语言的插件。 2. 在src下创建i18…

.net core 中使用confluent kafka构建生产者

创建.net 6 API安装依赖包 创建kafka生产者 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Confluent.Kafka; using Confluent.Kafka.Admin; using KafkaHelper.Config; using Microsoft.Exte…

Cuk拓扑产生负压

1、基础拓扑的输入输出电流连续情况 1>Buck电路 图中绿色波形为输入端的电流(测的图中MOS上的电流),蓝色的输出端的电流(图中电感L4的电流),可以看出输入端电流不连续,输出端电流连续。 2&…

Revit中项目特别大如何将项目完整的体现在图纸中?

一、Revit中项目特别大如何将项目完整的体现在图纸中? 遇到项目特别大,在一张图纸是放置不下时,如图1所示,怎样才能将项目完整的体现在图纸当中? 在遇到特别大的项目可能会在图纸中放不下,在这种情况下我们要用拼接线来处理。在…

【JavaEE】SSM框架

文章目录一、Spring1、Spring相关概念1.1 Spring Framework系统架构1.2 核心概念(lOC、lOC容器、Bean、DI)2、入门案例2.1 IOC入门案例2.2 DI入门案例3、lOC相关内容3.1 bean配置3.2 bean实例化3.3 bean的生命周期3.3.1 控制bean生命周期执行的方法3.3.2 bean销毁时机4、DI相关…

AI智能分析在智慧电厂的典型应用

电力供应是整个社会生产、人民生活的基本保证之一。智慧电力作为城市智能化发展的客观需求,是智慧城市的重要基础,也是智慧城市建设的一项重要内容。 智慧能源用最前沿技术淋漓尽致地表达着对未来能源发展趋势的理解与实践。智慧电力将多项创新成果应用于…