您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 海思OSD开发文档1.0版--yh
海思OSD开发文档*L版本信息版本号时间内容作者1.02016.01.20OSD叠加生成的逻辑和OSD反色效果的实现闫辉1概述1.1OSD概述OSD是OnScreenDisplay的缩写,是应用在CRT/LCD显示器上,在显示器的荧幕中产生一些特殊的字形或图形,让使用者得到一些讯息。常见于家用电视机或个人PC电脑之显示荧幕上,当使用者操作电视机换台或调整音量、画质等,电视荧幕就会显示目前状态让使用者知道,因此它也成为人机界面上重要的讯息产生装置。1.2海思OSD开发概述在海思平台上,一般开发者在视频中叠加OSD显示通道号或时间戳等信息,这些叠加在视频上的OSD统称为区域,海思提供了REGION模块用于统一管理这些区域资源。实际应用中,用户创建一个区域HI_MPI_RGN_Create,通过HI_MPI_RGN_AttachToChn接口,将该区域叠加到某个通道中。在通道进行调度时,则会将OSD叠加在视频中。1.3OSD与REGION模块1.3.1功能描述1.3.2使用示意概念了解Overlay:视频叠加区域,实现在GROUP通道进行位图的加载和背景色更新。Cover:视频遮挡区域,实现在VI通道填充纯色块,由VI硬件自身完成。CoverEx:扩展视频遮挡区域,实现在绑定通道填充纯色块,当Cover个数不能满足用户需求时,可以使用此扩展Cover。OverlayEx:扩展视频叠加区域,实现在绑定通道进行位图的加载和背景色更新。区域属性:创建一个区域时,需要设置该属性信息,它包含公共的资源信息,如像素格式、大小和背景色。位图填充(针对Overlay和OverlayEx):将位图的内存值填充到区域内存空间中,位图将会从区域的左上角开始填充。通道显示属性(RGN_CHN_ATTR_S):表明区域在某通道的显示特征,如区域是否显示(bShow)为TRUE时,表示显示在通道中,否则处于隐藏状态。OSD反色(仅针对Overlay):叠加在视频上的OSD可能会随着视频背景的变化而变得不清晰,osd反色功能会自适应背景变化做出调整,达到清晰可见的目的。Region支持的模块:根据对应SDK中海思MPP开发文档区域管理中的region支持的模块信息进行查看,注意支持和不支持的信息。操作步骤#填充区域属性并创建区域。#将该区域指定到具体通道中。在指定到具体通道时,需要输入通道的显示属性。以上步骤完成区域创建和使用。还可以通过以下操作来控制区域的属性以及某通道的通道显示属性。#通过HI_MPI_RGN_GetAttr、HI_MPI_RGN_SetAttr获取和设置区域属性。#通过HI_MPI_RGN_SetBitMap(仅针对Overlay)设置区域的位图信息。#通过HI_MPI_RGN_GetDisplayAttr、HI_MPI_RGN_SetDisplayAttr获取和设置区域在某通道(如GROUP通道)的通道显示属性。#可以将该区域从通道中撤出(非必须操作),再销毁区域。2流程图描述参看时间OSD章节iCamera-武汉2016-01-2111:28:31点阵库文件创建区域附加到通道字符点阵数据数组设置区域位图流程图描述参看文本OSD章节3文本OSD3.1点阵概述什么是点阵库?#它是一个数据文件,在这个数据文件里面保存了所有字符的点阵数据。什么是点阵字体?#把每一个字符分成A*B个点,然后用每个点的虚实来表示字符的轮廓。如何在字库中寻址某个字的点阵数据?#首先需要了解字在计算机中是如何表示的。在计算机中英文可以使用ASCII码来表示,而汉字使用的是扩展ASCII码。所谓扩展ASCII码,也就是把ASCII码的最高位由0变为1的ASCII码,简单的说就是码值大于等于128的ASCII码。一个汉字有两个扩展ASCII码组成,第一个扩展ASCII码用来存放区码,第二个扩展ASCII码用来存放位码。在GB2312-80标准中,将所有的汉字分为94个区,每个区有94个位可以存放94个汉字,形成了人们常说的区位码,这样总共就有94*94=8836个汉字。在点阵字库中,汉字点阵数据就是按照这个区位的顺序来存放的,也就是最先存放的是第一个区的汉字点阵数据,在每一个区中又是按照位的顺序来存放的。在汉字的机内码中,汉字区位码的存放是在扩展ASCII码的基础上进行的,存放时将区码和位码都加上了32,然后分别存放在两个扩展ASCII码中。具体说就是:第一个扩展ASCII码=128+32+汉字区码第二个扩展ASCII码=128+32+汉字位码如果用charhz[2]来表示一个汉字,那么可以计算出这个汉字的区位码为:区码=hz[0]-128-32=hz[0]-0xA0位码=hz[1]-128-32=hz[1]-0xA0这样,我们就可以根据区位码在文件中进行寻址了,寻址公式如下:汉字点阵数据在字库文件中的偏移=((区码-1)*94+位码)*一个点阵字符占用的字节数在寻址以后,便可以读取汉字的点阵数据到缓冲区进行显示了。由以上可知英文和中文单个字符的存放方式是一样的,英文使用ASCII码,其值0到127,寻址如下:英文点阵数据在字库文件中的偏移=英文的ASCII码*一个英文字符占用的字节数比如左图的”啊”是汉字区第一个汉字,对应的数据为:0x00,0x00,0x0E,0xFC,0xEA,0x08,0xAA,0x08,0xAA,0xE8,0xAA,0xA8,0xAC,0xA8,0xAA,0xA8,0xAA,0xA8,0xAA,0xA8,0xEA,0xE8,0xAA,0xA8,0x0C,0x08,0x08,0x08,0x08,0x28,0x08,0x103.2核心代码分析这里主要是从配置对象中获取相关信息来完成后续的初始化工作上面做的事情:1、从配置对象中获取用户设置的操作,比如我们要操作的通道名和坐标索引等信息。2、从通道名中截取汉字和字符保存3、将点阵库拷贝到系统内存,获取点阵库中的信息下面做的事情:1、从点阵库中寻址与通道名中对应的ASCII码(英文)和扩展ASCII码(中文)。2、通道名中单个字符或汉字对应的点阵数据十六进制转换为0和1组成的下面的二进制例子图。3、将保存好的由0和1组成的12*24或者24*24的点阵再转换为十六进制的点阵数据进行保存,不过此时12*24实际上变成了16*24了,是不是感觉很奇怪,不过与上面的16*24不同的是,这次多的4位是有数据的哦...我在这...注意:这里是把之前的12*24(英文)或者24*24(中文)中存储的数据进行转换,生成有0和1组成的12*24或者24*24个字节,由于计算机最小存储单位是字节,因此我们的12*24点阵实际上是16*24点阵,多余的4位实际为0。//ASCII码寻址//扩展ASCII码寻址计算机存储的最小单位是字节每次右移1位与0x01相与操作,将每一位变成一个字节用0和1来表示并将其保存起来......这里采用的是以CIF标清图像格式进行存储的,早期的监控要求视频码流不能太高,视频传输带宽也有限制。模拟视频摄像机能提供的最高分辨率是40W像素。由于技术和成本的制约,这些系统的图像在存储时像素被进一步降低到了1/4,即10W像素,相当于352*288=101000(10W)像素的CIF格式图像了,由于CIF图像叠加OSD应用在高清分辨率的设备下会出现模糊失真的现象,所以前辈们想到了在CIF图像上实现DI的像素效果(704*576)也即是我们通常所说的4CIF效果了,也就因此才有了接下来我们下面要介绍的横向和纵向各*2的代码了。OSD时间设置...OSD文本设置...OSD显示隐藏...时间和文本OSD的显示或隐藏OSD文本坐标的索引获取主、子码流文本OSD的宽高获取字符个数及单个字符的宽高信息根据主码流图像格式、坐标索引设置主码流文本OSD坐标位置根据子码流图像格式、坐标索引设置子码流文本OSD坐标位置坐标索引分别对应用户操作的6个方位:上靠左、上居中、上靠右底部靠左、底部居中、底部靠右如果此时文本区域已创建,则将该区域从通道中撤出,然后再销毁该区域.主、子码流文本位图的空间分配根据上面的主子码流位图的空间分配,得出结论如下:(注意:假设通道名为iCamera,7个字符,每一个字符占12位总共84位,计算机存储最小单位是字节因此有84经过运算转换变为能被8整除的数88,也就是我们整个通道名的宽了)例如:由两个字节分别为0x10,0x02,则如下16个位,每一排88个位(也就是横向88个点),但是下面又填充了一层从88*2=176开始,这样就分成了2个位,每一位占4个字节。最后1*88*2*4=704每一层704个字节.有24层(纵向24个点)所以就有了上面的24*88*2*4的位图空间大小了,上面的由一个点变成4个点的效果分析如下所示(其中下面的地址0表示白点、1表示黑点):文本区域未创建时,则填充区域属性并创建区域,将该区域指定到具体通道中主、子码流文本OSD转换后的显示设置,由1个像素点变成4个像素点组成,使其在高分辨率下的设备OSD的显示更清晰可见一些----具体请看下面的分析0123451761771781791801811821831841851861870x80000x80000x80000x80000x80000x80000x00000x00000x80000x80000x80000x8000678910111881891901911921931941951961971981990x80000x80000x80000x80000x80000x80000x80000x80000x80000x80000x80000x8000121314152002012022032042052062070x80000x80000x80000x80000x00000x00000x80000x8000012345012345678910110x80000x80000x80000x80000x80000x80000x00000x00000x80000x80000x80000x8000678910111213141516171819202121230x80000x80000x80000x80000x80000x80000x80000x80000x80000x80000x80000x80001213141524252627282930310x80000x80000x80000x80000x00000x00000x80000x8000这里大部分的属性设置都是OSD反色相关的,为了不影响我后面的OSD反色的实现,因此我将它先注释掉由之前的总字符宽高而创建同等大小的区域完成了上面的创建区域及叠加到通道后,实际图像上会有一块区域在上面叠加着的,这个区域所在的位置就是之前通过我们的索引坐标而设置的位置,区域大小为我们最后生成的所有字符所占的总大小了。4时间OSD4.1核心代码分析将下面数组中设定的所有各字符数据在宽8高16的基础上都扩展一倍这里主要是时间信息的初始化工作主、子码流时间OSD的前期裁剪工作:将所有的时间点阵转换为short类型的黑白点阵对应每个字节中各位的0和1,并参照对应的位,以每位short类型保存在上面分配的空间中。此处子码流时间OSD这一块同上......子码流OSD坐标设置获取主子码流的图像格式并根据时间OSD坐标索引设置不同方位的坐标起点主码流OSD坐标设置完成主子码流OSD时间位图的空间分配及位图最后生成的点阵数据,以及区域的销毁或创建并指定到通道,最后设置位图生成时间信息的工作。根据上面主子码流位图分配的空间,再由之前生成的点阵数据,下面则和之前文本位图做的事一样4.2叠加逻辑首先将存放在数组中的15个字符的点阵数据(‘0’-’9’、’A’、’P’、’M’、’:’、’-’),按short类型8*16的点阵大小进行转换存储,然后获取当前时间戳,根据时制及显示模式设置时间OSD显示模板,再将时间模板上的19或22个字符,按照之前生成的short类型的8*16的字符点阵对应的字符所在的地址
本文标题:海思OSD开发文档1.0版--yh
链接地址:https://www.777doc.com/doc-4506536 .html