首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

基于DM6446的P2P数字电视机顶盒OSD研究与实现(2)

基于DM6446的P2P数字电视机顶盒OSD研究与实现(2)

(2)Alpha通道。
OSD图像混合中,为了实现图像的透明效果,采取在图像文件的处理与存储中附加上另一个8位信息的方法,这个附加的通道代表图像中各个像素点透明度的信息就叫做Alpha通道。Alpha通道使用8位二进制数,最多可以表示2^8=256级灰度,256级的透明度。这样一来,一幅完整的全信息图像应该是24RGB彩色加8256级的透明信息,一共是32位。Alpha通道通常白色值为255,用以定义完全不透明的像素,而黑色值为0,用以定义完全透明像素,介于黑白之间的灰度(值为0-255)Alpha像素用以定义从完全透明到完全不透明之间的过渡像素。
计算机图形学中总是把[0-255]映射到[0-1]区间上,Alpha值为0-1之间的数值,这样一个完成的图像分量信号就由RGBA组成(其中A就是Alpha),并且每幅图像的输出等于{R*AG*AB*A},图像混合后的输出就是
Output=Alpha*foreground+(1-Alpha)*background
其中Output为输出混合后的图像,foreground为“混合层”图像,background为“基层”图像。调整这个Alpha值便可以得到不同的混合效果。当Alpha0,只显示“基层”图像;Alpha值为1,只显示“混合层”图像,当取其它介于0-1之间的值可取得按照一定比率混合的图像,这样就可以按照一定的方式实现文字叠加、图片混合等效果,可以调整Alpha值直到符合要求。
(3)DM6446中的具体实现。
DaVinci DM6446平台中,TI公司把视频输出硬件抽象成一个帧缓冲设备,这样在linux操作系统下,可以直接对其执行像操作一般文件一样打开、读、写和关闭等操作,因此可以直接在其上进行快速OSD开发。在OSD体系结构图2,OSDWIN1是用于配制混合图像属性的窗口(例如透明度),OSDWIN0是用于显示图像的窗口。由于DM6446支持RGB565或位图数据两种格式,又由于RGB图像格式表达的色彩种类可达64k,因此这里选用RGB565格式,但是RGB数据是原始未压缩数据,不包含常用于图像编辑器识别图像的头信息,且种类众多,没有可以利用的图像编辑器直接生成RGB565图像文件。BMP位图数据也是未压缩的,但它在每个位图数据后面附有文件格式头信息,且当每像素使用相同的位数表示时,位图数据格式和RGB565数据格式本质上是一样的。这样在实际应用中,就需要对BMP位图文件进行转换,使之生成RGB16图像文件。由于BMP图像是24位的,且其位图信息在文件中是按照颜色顺序为BGR (24,每种颜色分量为8)的顺序存放的,读出来后分别取RGB分量的高5,6,5位的颜色信息,并丢弃低3(R)2(G)3( B)位的颜色信息,将之转换为16位的,且颜色顺序为RGB(5 6 5)RGB565数据,然后再存放到文件中去。使用fread()库函数从位图文件流中分别读取蓝、绿、红的图像色彩分量,然后作为OSD数据写入RGB16数据中,这样就可以得到所需要的RGB565格式图像文件。将该图像文件拷贝到OSD数据缓冲区中,即可查看图像输出效果,调整OSDWIN1中的图像混合属性配制,修改其中的Alpha通道值,使其图像的混合输出达到满意效果。
1.3
P2P
数字电视机顶盒OSD菜单设计
OSD菜单作为直接关系到用户体验的满意度,要求必须具有良好的人性化设计,还要能够实现强大的操作功能,因此我们对此进行了合理的规划与设计。
OSD菜单主要包括四个组成部分:
1)本地节目(LocalWindow):该菜单读取本地硬盘上存取节目的列表,并对之进行播放、删除、上传、下载等操作等。
2)P2P网络(NetworkWindow):该菜单与EPGClient交互,读取EPGServer服务器上的当前频道列表以及节目信息并对之进行相应操作等。
3)系统设置(Setup):该菜单主要实现服务器IP和用户名、密码还有上传速度以及下载速度,同时允许连接数、端口等的设置。
4)工具(Tools):该菜单主要实现第三方软件的安装、使用以及升级,如浏览器、游戏等。
在本OSD菜单中,采用双向动态链表进行导航操作,实现父子窗口、父子控件以及同屏翻页、同屏滚动等事件的操作,数据结构如下:
typedef struct osd_ui_t
{
struct osd_ui_t * prev;
struct osd_ui_t * next;
osd_item_t * head;
osd_item_t * focus;
OSD_UI_FUNCTION next_focus;
OSD_UI_FUNCTION prev_focus;
}osd_ui_t;
当窗口链的状态发生变化时,必须动态分配和撤销这些存储区。窗口的创建、撤销、关闭等OSD内部函数及消息提供了很好的内存管理方法,它是整个OSD系统能否稳定运行的基础。
继承事业,薪火相传
返回列表