以前一直有开个博客的想法,却因总总原因,始终没有去实现。今天开个胡,并且决定以后咬咬牙坚持着写下去。知识在于积累,这是真理,尤其在IT这一行。以前觉得自己很厉害,以为那些接触过的概念,一些代码的构思,解决过的bug都能记得住。可现在想想,还是笔杆子比较靠谱,脑袋用来想问题就好,至于记忆方面的事情还是靠其他手段辅助比较好,没必要和自己过不去嘛。
前两周的工作任务是整理 DVB teletext模块。刚接到这活的时候,觉得真没啥干劲,在互联网如此发达的年代,teletext这功能在电视上总觉得有些鸡肋。不过没办法,拿人工资,替人卖命嘛。经过一个月的奋战总算顺利完成任务,而且这次整理感觉让自己收获不小。
1.1 Teletext简介
Teletext是上世纪7O年代在英国发展起来的一种信息广播系统,它主要利用电视信号场消隐期(VBI)中的某几行(也可以占用电视信号的全部有效行)传送图文和数据信息。由于图文电视广播业务能以低廉的费用,向大众传播即时的新闻、体育、天气、电视节目预告和字幕(subtitle)等信息。由于它提供的信息丰富多彩,而且还有图形,Teletext甚至被认为是互联网的前身。它与互联网相比也有自身的优势,如用户数量庞大,用户数量增加不会影响接收速度,廉价的接受终端。30多年来,图文电视技术与业务已在世界许多国家和地区得到了普及和推广,尤其在欧洲应用更是非常普及。目前出口到欧洲的机顶盒都具有VBI Teletext功能,有部分机顶盒还具有OSDTeletext功能。基本的Teletext是由一组页组成,每页由3位数字做编号,每页是由24行40列的字符及图形组成。这些页不停地被循环发送到用户端。
1.2 Teletext的特性
(1)24X40的文本字符显示,也支持简单的图象信息的显示.
(2)支持多页码,应用程序可以自由切换到任意选定的页.
(3)支持多语言,可以在teletext中指定所使用的语言.
(4)文本支持自定义背景色,自定义前景色.支持长度,宽度加倍(double width,double height)
(5)所有数据采用了奇偶校验和汉明码编码,具有比较强的错误处理功能.
(6)格式基本兼容模拟TTX,支持VBI插入teletext数据.
2 数据组织元素
根据en_300706(Teletxt)的文档,我们知道,teletext的数据组织元素分为以下3种:magazine,page和packet
Magazine: Teletext通常采用杂志(Magazine)方式组织信息,至多有8种不同杂志,100-199(M=1),200-299(M=2),300-399(M=3),400-499(M=4),500-599(M=5),600-699(M=6),700-799(M=7),800-899(M=0),每个杂志可有至多100页的页码,每一页叉可有若干子页(sub-page),从而使每个杂志可以有几百页信息。例如从100页至199页,它的杂志号是1,它的内容是新闻;从200页至299页,它的杂志号是2,它的内容是体育。
Page:每一页对应一个屏幕的图文信息,每页图文最多显示包含25行,每行至多有40个字母、数字或图形符号,而且也有字符颜色、闪烁、倍高等属性控制。
Packet: 每包数据固定是45字节,包有3种基本类型:页头包、普通行包和扩展包。
页头包(包地址Y=0):包含页号和控制信息,加上32个包括时间的显示字符。它对应显示的第一行
直接显示的普通行包(包地址Y=l-25):包含40 Byte(625行电视信号)对应一行的40个显示字符。包地址对应行的垂直位置
扩展包(包地址Y=26-31):这些包并不直接显示,它们用于为高级的解码器提供增强性能,或者提供特殊数据服务。
3.1 Teletext 级别
ETS300706技术规范中定义了以下4级图文电视级别:
级别1: 镶嵌字符,空属性,固定调色板,24行x40字符等特点;
级别1.5: 在级别1基础上扩充了字符集;
级别2.5扩充语言种类,增加可重定义颜色的调色板,引入非空格属性.允许许多简单重定义字符,提供增加文字和图形的嵌板;
级别3.5扩充重定义字符的数量及复杂度,引人不同的字体类型和相称的空格.
以上不同级别的表示及应用特性是向下兼容的,从而使采用低级协议及解码器的用户,不受发送方图文标准升级的影响.从而维护了数千万早期用户的利益。
3.2 字符图形集
3.2.1 字符集
teletext的字符集有G0, G2字符集和13个国家的选项子集,还包括G1,G3图形集一些G0,G2的一些变种.级别 1是严格以G0基本字符集加上13组国家选项子集来传输的. 图形集支持G1.G2字符集和G3图形集以及根据G0, G2 改进的字符集出现在级别1.5以上,由一些拓展包来控制,这些控制比较复杂.具体的要仔细阅读300706标准.
下面将对级别1的本文档标准的字符集和图形集以及显示做一些介绍。G0 基本字符集一共包含96个字符, 支持latin,Cyrillic,greek,Arabic, hebrew一共5个语种,除了cyrillic有3个G0表之外,其它的语种有且只有一个G0表(详见300706标准). 其中latin语种又支持13组国家选项子集.现以Latin语种为例.
Figure 4.2.1 latin_table
Figure 4.2.1,是latin G0字符表(只截图一部分,完整图见300706标准) , 一个16row* 6colomn 的表, 一共96个字符. 具体选择哪一个字符由Packet X/1-X/25 中的后40个字节来决定,一个字节可以指定一个字符(有效字符数据范围0x20-0x7f). 比如有一个字节是 0x34, 换成二进制即: 00110100 , 查表即可知道是B7B6B5 = 011 B4B3B2B1 =0100 ,即 表中的 字符 ’ 4’.所谓latin 的13 组国家选项子集,如下图(引用300706)
Figure 4.2.2latin 国家选项子集
这个是用来代替G0表中的带阴影的13个字符的. 一共有13组.每一组刚好13个字符. 其中表头中的2/3代表图1-1中的B7B6B5 = 2 (即010) B4B3B2B1 = 3(即 0011) . 而具体选择13组(行)中的哪一组(行), 是由C12C13C14(具体含义见300706标准)控制字符来决定的.
3.2.2 图形集
下图是G1 图形集
图1-3 G1 图形集(部分截图)
G1的有效数据范围也是0x20-0x7f, 我们可以看到中间两列有些地方写着(1), 这个是需要用G0表中的字符填充的.
4.1 颜色控制
Teletext支持自定义前景色和背景色.就在每一行数据的40个字节中.作为控制字的数据范围是0x00-0x1f.在teletext中称为spacing 属性.(见300706 12.2章节).0x00-0x07:设置前景色,颜色分别是黑,红,绿,黄,蓝,洋青,洋蓝,白(设置后生效,也就是说,显示程序遇到这些代码,在随后的显示中必须改变前景色到对应的颜色)
0x08:开始闪烁功能,设置后生效.
0x09:结束闪烁功能,设置后生效
0x0a:BOX结束,设置后生效.
0x0b:BOX开始,设置后生效.
……
上述主要参考300706标准的Tabel 26, 这里就不一一列出了. 注意, 马赛克, 即G1 字符也是由此引入
4.2 显示控制
Teletext的单个字符的大小经 300706 介绍应该是12pixels长, 10 pixels高(见15.6章节). 但从同方留下来的代码来看,我们单个文本字符大小却是按照 14pixel长, 20pixels 高来处理的, 而masaic , 即 G1字符是按照.
Teletext的显示是以页为单位的, 一页的显示包括页包头,和1-24行正文. 而正文部分则可以看成是一个24行*40列的一个矩阵. 24行对应Packet x/1 – x/24, 即一行对应一个包, 40列对应包中的除了前面5个字节的控制字之外的40个字节(当然, 40 列不一定会全部是字符显示,也有可能是颜色控制字符. 可显示的字符的 ASCII的范围是0x20~0x7f). 字符与字符挨个显示,便组成了页, 既然字符组成了页,那么单个字符本身又是如何显示的呢.
我们会先到字符集数组里面取出我们所要显示的字符的点阵.即上诉代码中的CharAddr. 字符集数组详见teletext char_set.c . 我们通过函数ttx_source_draw_point 确定一个字符点阵中的一个点的颜色. 字符点阵是14*20的点阵, 点为1的地方用前景色填充,点为0的地方则以背景色填充