許瑩瑩,劉賢華
(重慶郵電大學 通信與信息工程學院,重慶 400065)
在世界范圍內,伴隨著數字化、網絡化的廣播電視技術迅速發展,各式各樣的電視節目也應運而生。同時與之而來的眾多附加服務,三網融合的網絡趨勢,也使得建立在高清數字電視廣播系統上的終端承載體——高清機頂盒,面臨著用戶更多的需求[1]。其中SI(Service Infor?mation)模塊是高清機頂盒中最具核心的基本模塊之一,是數字電視解析數據、EPG應用功能的基礎,并且完成了對PSI/SI節目特定信息的接收、解析、存儲、維護和檢索等功能的實現。因此根據當前主流嵌入式機頂盒的設計向模塊化及層次化方向發展,對SI模塊進行結構優化設計,不僅能夠縮短機頂盒新產品的開發和調試周期,同時也能提高節目接收完整性與高效性[2],給用戶交互使用留下良好的印象。
由于高清機頂盒數據量需求很大,除了提高硬件本身解碼的速度外,還要對軟件模塊進行重新劃分,以提高代碼的運行效率,降低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模塊,得到程序起始調用接口,搜索到音視頻和其他節目有關信息。
在SI數據解析過程中,即對Section包的過濾和接收,并得到PSI/SI各種信息表,依次解析出每個表中的內容,并存入數據庫,供上層調用。在傳統的解析處理中,采用的是主動式接收。主動式接收是在接收表的過程中,當回調函數發出用戶使用的Request時,解析模塊根據Table_id去請求此表的Section,直至一張表接收完整,才存入SI數據庫中。在用戶不斷調用請求下,解析模塊主動地去請求所要使用的表。但這種主動式的處理方式,容易造成數據存入數據庫緩慢,延遲用戶使用請求。
在本文中采用一種新型的被動式接收方法。被動式接收的方法是采用添加Capture(捕獲)的方式。在解析模塊將數據返回給用戶時,當消息驅動到來,Demux將接收的Section存入管理后,就在解析過程中添加一個Cap?ture,將所得到的全部的捕獲項進行接收,存儲到數據庫中。若有用戶Request時,則訪問數據庫即可獲得。若有更新時,則根據版本號的比較,刪除過期的Capture即可。圖2為被動式接收添加捕獲數據流程圖。

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(事件)的順序進行分層描述。

引入的SQLite數據庫,具有輕巧、操作方便的特點,是一個對所有應用程序可用,且功能強勁的輕型關系型數據庫引擎。對于業務信息中的圖片和文字其都是以“0”和“1”的形式存到Flash中,因此文件存儲采取二進制形式的優點是操作方便、快捷,且占用較小的內存空間。另外,在SQLite3中定義了操作二進制的內部接口函數,更利于對SI數據庫的各種操作。
在加載內存Flash數據時,可以通過預先讀取TS信息和Service信息,得知占用內存的大小[3],然后根據此信息創建一個稍大的內存緩沖池,用于保存數據庫信息。當內存緩沖池空間不足時,再去動態申請內存。這種內存分配方式可以盡量避免內存碎片[4],同時也避免內存緩沖池容量大小不足的問題。
本課題是高清機頂盒DEMO項目中的一部分,筆者課題研究所在的公司是重慶市指定的高清數字電視機頂盒開發商。該SI模塊的優化設計是在該公司自主研發的高清解碼芯片SIC8008的平臺上測試實現的。基于本文提出的嵌入式Linux下的高清機頂盒SI模塊優化設計的架構,筆者完成了部分模塊的設計與實現。實驗結果證明其優化效果較好,性能穩定。
在圖4可以看出,在搜索節目時有手動、網絡搜索方式,當用戶終端使用時,使用該模塊開始搜索節目信息。

圖5為根據主網所發送的頻點及數據流,經過SI模塊接收、解析、存儲后,將接收的節目加以統計,考慮接收的數據完整性(接收節目數與接收時間的比值),得出的結果比較圖。由圖5可以看出,由于高清頻道主要集中在403~503 MHz頻段中,可以看出優化后接收的高清節目的完整性,達到98%以上,明顯高于優化前1個百分點。同時,在實驗過程中,內存的占用非常合理,在節目信息量大的情況下,內存占用會比較大,但不會影響機頂盒等正常運行。
在介紹了嵌入式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.