嵌入式Linux下高清机顶盒SI模块优化设计与实现
2011-06-06许莹莹刘贤华
许莹莹,刘贤华
(重庆邮电大学 通信与信息工程学院,重庆 400065)
0 引言
在世界范围内,伴随着数字化、网络化的广播电视技术迅速发展,各式各样的电视节目也应运而生。同时与之而来的众多附加服务,三网融合的网络趋势,也使得建立在高清数字电视广播系统上的终端承载体——高清机顶盒,面临着用户更多的需求[1]。其中SI(Service Infor⁃mation)模块是高清机顶盒中最具核心的基本模块之一,是数字电视解析数据、EPG应用功能的基础,并且完成了对PSI/SI节目特定信息的接收、解析、存储、维护和检索等功能的实现。因此根据当前主流嵌入式机顶盒的设计向模块化及层次化方向发展,对SI模块进行结构优化设计,不仅能够缩短机顶盒新产品的开发和调试周期,同时也能提高节目接收完整性与高效性[2],给用户交互使用留下良好的印象。
1 SI模块优化设计方案
1.1 采用多模块划分
由于高清机顶盒数据量需求很大,除了提高硬件本身解码的速度外,还要对软件模块进行重新划分,以提高代码的运行效率,降低CPU的负荷[2]。SI模块的软件架构与在各模块的划分如图1所示。图中虚线中所包含的Demux/Filter,Data Analysis,Section Management,Builder即为机顶盒软件SI模块所包含的部分。
其中Demux/Filter中定义了驱动接口,并对解复用时Channel(通道)管理以及过滤器Filter的设置。它与硬件平台相关性有关,属于直接调用系统函数及硬件接口部分。Data Analysis与Section Management是两个独立的模块,Data Analysis负责解析数据包Section,而Section Management负责Section包的管理,它们之间不相互通信,而是通过OtherModule里面的数据库将信息进行交互[3]。Builder模块是数据搜索模块,当上层UI用户发出请求时,通过Builder模块,得到程序起始调用接口,搜索到音视频和其他节目有关信息。
1.2 数据解析处理方式
在SI数据解析过程中,即对Section包的过滤和接收,并得到PSI/SI各种信息表,依次解析出每个表中的内容,并存入数据库,供上层调用。在传统的解析处理中,采用的是主动式接收。主动式接收是在接收表的过程中,当回调函数发出用户使用的Request时,解析模块根据Table_id去请求此表的Section,直至一张表接收完整,才存入SI数据库中。在用户不断调用请求下,解析模块主动地去请求所要使用的表。但这种主动式的处理方式,容易造成数据存入数据库缓慢,延迟用户使用请求。
在本文中采用一种新型的被动式接收方法。被动式接收的方法是采用添加Capture(捕获)的方式。在解析模块将数据返回给用户时,当消息驱动到来,Demux将接收的Section存入管理后,就在解析过程中添加一个Cap⁃ture,将所得到的全部的捕获项进行接收,存储到数据库中。若有用户Request时,则访问数据库即可获得。若有更新时,则根据版本号的比较,删除过期的Capture即可。图2为被动式接收添加捕获数据流程图。
2 数据库的设计
2.1 数据库的存储
SI数据库中表的种类繁多,数据量大且关系比较复杂。但是机顶盒的CPU资源有限,传统的方法是使用链表来处理数据,由于处理过程复杂,导致系统响应时间过长,影响用户的使用[2]。在本文中,笔者对高清机顶盒引入新型嵌入式数据库SQLite3,能很好地解决上述问题,并提高对数据进行各种操作的速度。综合考虑SI数据库与PSI/SI信息格式匹配,以及建立索引管理的好处,设计了一种将索引管理与树状链表相结合的存储方式。
如图3所示,在索引管理中,线性索引表不包含其他的SI信息,只包含Service的3个标识信息(Original_Net⁃work_Id,Transport_Stream_Id,Service_Id),分别是指向复用流(TS流)、业务(service)的指针。这3个节目标识符,用于在SI数据库初始化索引表时,定位节目信息的位置。3个信息指针,有利于快速找到TS流信息、Service信息、节目事件信息。从而利用索引表,可以快速实现节目信息的编排、删除及更改。并且SI信息内容是按照Net⁃work(网络)、Transport Stream(传输流)、Service(业务)、Event(事件)的顺序进行分层描述。
2.2 数据库的管理
引入的SQLite数据库,具有轻巧、操作方便的特点,是一个对所有应用程序可用,且功能强劲的轻型关系型数据库引擎。对于业务信息中的图片和文字其都是以“0”和“1”的形式存到Flash中,因此文件存储采取二进制形式的优点是操作方便、快捷,且占用较小的内存空间。另外,在SQLite3中定义了操作二进制的内部接口函数,更利于对SI数据库的各种操作。
在加载内存Flash数据时,可以通过预先读取TS信息和Service信息,得知占用内存的大小[3],然后根据此信息创建一个稍大的内存缓冲池,用于保存数据库信息。当内存缓冲池空间不足时,再去动态申请内存。这种内存分配方式可以尽量避免内存碎片[4],同时也避免内存缓冲池容量大小不足的问题。
3 SI模块优化设计实验结果
本课题是高清机顶盒DEMO项目中的一部分,笔者课题研究所在的公司是重庆市指定的高清数字电视机顶盒开发商。该SI模块的优化设计是在该公司自主研发的高清解码芯片SIC8008的平台上测试实现的。基于本文提出的嵌入式Linux下的高清机顶盒SI模块优化设计的架构,笔者完成了部分模块的设计与实现。实验结果证明其优化效果较好,性能稳定。
在图4可以看出,在搜索节目时有手动、网络搜索方式,当用户终端使用时,使用该模块开始搜索节目信息。
图5为根据主网所发送的频点及数据流,经过SI模块接收、解析、存储后,将接收的节目加以统计,考虑接收的数据完整性(接收节目数与接收时间的比值),得出的结果比较图。由图5可以看出,由于高清频道主要集中在403~503 MHz频段中,可以看出优化后接收的高清节目的完整性,达到98%以上,明显高于优化前1个百分点。同时,在实验过程中,内存的占用非常合理,在节目信息量大的情况下,内存占用会比较大,但不会影响机顶盒等正常运行。
4 小结
在介绍了嵌入式Linux下高清机顶盒SI模块的系统架构的前提下,分析了SI模块设计要求。优化设计方案克服了传统SI模块开发时的复杂度,接口调用的不统一、不开放、代码模块划分不清、效率较低的弱点,在实际应用项目中取得良好的效果,具有适应性好,稳定,效率高的优点。
[1] 闫书元.数字高清技术与高清机顶盒设计浅谈[C]//2005国际有线电视技术研讨会论文集.杭州:[s.n.],2005:45-56.
[2] 徐登,郑世宝,金荐.一种优化的机顶盒SI引擎的设计与实现[J].电视技术,2005,29(5):13-15.
[3] 韩锐,邓浩江,曾学文.一种可移植的机顶盒SI模块的设计与实现[J].微计算机信息,2009(27):9-11.
[4]彭锐,于鸿祥,张萍.嵌入式Linux下高清数字机顶盒软件设计[J].电视技术,2010,34(9):52-53.