葛 倩,于鴻洋,張 萍
(電子科技大學 電子工程學院,四川 成都 611731)
在數字電視廣播系統中,在TS(Transport Stream)傳輸流最終被送到信道設備進行信道發送之前,TS流復用器將不同來源的傳輸流合并為一個新的傳輸流。電子節目指南(Electronic Program Guide,EPG)是指在符合MPEG-2(13818-1)的TS傳輸流中插入DVB標準定義的業務信息(Service Information,SI),是一種收視導航工具,是交互電視的關鍵技術。EPG協助觀看電視節目的用戶選擇節目,用戶通過EPG可以得到節目的相關信息。
復用時,EPG等其他服務信息要通過復用器插入到TS流中。由于輸入到復用器的各TS流的EPG信息可能不完整或需要在原TS流中插播節目,所以復用之前需對各個待復用TS流的EPG信息進行添加或修改。同時,復用器會對節目號等信息重新賦值,攜帶EPG信息的各個表也要根據復用器的修改情況進行相應的修改和合并。EPG的處理在TS復用中非常重要,筆者介紹了一種TS流復用器中EPG信息相關表的處理方法。
EPG信息由兩部分信息組成:基本EPG信息和擴展EPG信息。基本EPG信息是指完全可以用《數字廣播業務信息規范(GY/Z174-2001)》中的網絡信息表(NIT)、業務群關聯表(BAT)(可選)、業務描述表(SDT)和事件信息表(EIT)進行描述的EPG信息[1-3]。筆者主要介紹基本EPG的處理,包括對NIT,SDT和EIT的處理,BAT的處理方式與其他表相似。
筆者設計基于IP多路輸入、多路復用輸出的TS軟件復用器中的EPG處理部分,復用器與設計均在Linux系統下實現。整個設計主要可分為EPG獲取、EPG數據存儲編輯、EPG發生等模塊,系統框圖如圖1所示。

圖1 系統框圖
EPG獲取模塊主要完成對EPG信息的接收提取與分析。之后由EPG數據存儲編輯模塊將得到的信息存入數據庫MySQL,并由用戶進行導入或編輯操作,對EPG進行相應的添加或修改,最后EPG發生模塊根據數據庫中存儲的新EPG信息和復用信息,產生新的EPG數據,按一定的時間間隔插入到輸出TS流中。筆者將通過對各模塊的實現方法介紹來論述TS流復用器中EPG信息處理的實現。
為了提高EPG的接收效率,對EPG獲取的兩個處理過程進行了優化,即各表section接收和接收信息完整性的判斷。
1)section接收優化
部分機頂盒由于處理器主頻和存儲空間的限制,在接收PSI/SI表的section時采用PAT→NIT→SDT→EIT順序接收的方法,即在一個時間段內只對一種PSI/SI表進行接收。會出現接收到SDT或EIT的包時,因為PAT或NIT沒有接收完成或者丟包而放棄接收分析的情況,當需要接收這些表時又要等到下一個發送周期,這樣接收完所有的表可能需要幾個發送周期,接收效率較低。由于系統在PC上實現,存儲空間和處理器主頻的限制較小,故對接收方式進行了優化,采用并行接收,即先接收PAT,之后并行接收NIT,SDT和EIT,可以節省時間。并行接收主要體現在section的接收處理上,接收步驟為:
(1) 過濾 PID=0x000的包,分析PAT,獲得 NIT的PID、該流的節目數量以及所有節目的節目號,存入節目數據鏈表。由于PAT發送周期較短(為40ms),這一步驟可在很短的時間內完成。
(2)對其余3種表的section進行并行接收。程序根據TS包的PID過濾出需要的包,分別送入NIT,SDT和EIT各自的接收通道中,每個通道利用獨立的數據結構來記錄section接收情況信息和獨立的存儲空間,存儲接收到的section內容,使得各通道互不干擾。
(3)section進入各自的接收通道后,先判斷是否丟包,之后對TS包解包,將section內容存入緩沖,根據section_length來判斷一個section是否接收完成,如果完成,按照各表的結構,分析該section,存儲相關信息,最后判斷接收信息的完整性,決定是否繼續接收。
2)判斷信息完整性優化
在判斷接收信息的完整性時,不采用以往一些設計中根據last_section_number來判斷的方法,這要求section以section_number的順序依次接收,若開始接收時錯過section_number為0的包或者丟包,則導致之后section_number的包需等到下一發送周期才能接收,降低了接收效率,PSI/SI發送周期較長或者網絡質量較差時影響尤為嚴重。
筆者采用一種改進的接收判斷方法,可以解決這個問題,即利用段存在標志數組來判斷信息完整性,不要求按照section_number順序接收。具體實現為:程序首次收到該表section時,通過last_section_number(EIT還需要segment_last_section_number和last_table_id以及本TS流中的節目數和節目的program_number)計算出該表的section總數和所有section_number,以此建立section存在標志數組。以SDT為例,若得到last_section_number為1,則可以計算出該流SDT分段有2個section,section_number分別為0和1,即可建立標志數組,把0和1的位置置位為存在。之后每接收完一個section,把對應標志數組中的該section標志置位為已接收,并檢查所有的存在標志,若有存在標志未置位為已接收,則繼續接收該表,否則該表接收完成,停止接收。
3)優化結果
優化以存儲空間為代價來提高接收效率,適合于在存儲空間限制較小的PC上實現。若不經優化,系統可能需要接收端接收到數次完整的信息才能完成接收,而優化之后的系統接收端只須收到一次完整的信息,就可以完成接收,減小了PSI/SI發送周期和丟包的影響。
系統對各表采用介紹的優化方法進行并行接收,完成EPG信息的分析存儲,接收框圖如圖2所示。
EPG相關表格接收完畢后,形成數據鏈表,結構如圖3所示。
這樣的結構可以通過輸入TS流標號和節目號迅速定位節目信息,使之在鏈表中的添加刪除靈活簡便,也便于之后的表生成模塊的處理。
選用的數據庫為MySQL。MySQL是一個開放源碼的關系數據庫管理系統,支持Linux操作系統,CPU利用率高,查詢速度快,還提供多種語言支持,滿足EPG信息的多語言要求。基于這些特性,MySQL可以滿足設計中對EPG處理的要求。
所有的EPG信息存入創建的database中,程序根據輸入TS流的EPG建立table:SDT,EIT_PF和EIT_schedule_stream.No_prog_program.No,存入相關信息。
用戶通過EPG編輯器對EPG信息進行編輯。其功能模塊包括網絡配置和事件編輯(包括節目編輯和節目單導入導出),完成后,將修改的信息導入數據庫。

圖3 EPG信息數據鏈表
為了便于表的生成,為各輸出流建立一個數據結構數組mult_infomation,存儲該流的復用信息,其中包含了stream_id(輸入 TS 流標號),origin_program_number(該節目的原始節目號),new_program_number(在復用流中的節目號)等信息,數組的項數為該復用流中所包含的節目數,通過該數據結構可以方便地得到節目被復用到輸出流中的位置。
NIT,SDT和EIT在TS流中的獨立性各不相同,所以section生成方式稍有不同。NIT對網絡信息進行描述,在同一網絡中,所有流的NIT是相同的,只須生成一種NIT section之后進行打包,作為同一網絡中所有流的NIT包,對于SDT,每個流的SDT section各不相同,需對各輸出流生成各自的SDT section,之后再打包,EIT是以節目為單位獨立的,即相同節目的EIT section除了service_id,其余部分在各TS流中都是相同的,所以先對各輸入TS流的各節目生成EIT section,之后輸出流根據mult_infomation從這些EIT section中選出需要的section,修改service_id,進行打包。
生成section的信息從數據庫中讀取,之后根據各表的結構建立section,完成后計算CRC并插入。輸出TS流還需帶有同一網絡中其他TS流的SDT和EIT信息,傳輸這些信息需修改 table_id(SDT改為 0x4F,EIT在原table_id上加上0x10)和重新計算CRC。
SDT和EIT作為其他流信息發送時只須改變table_id和CRC,所以同一網絡TS流中的SDT和EIT除table_id和CRC部分不同之外,其余部分完全相同,同時,一個網絡中所有流共用一個NIT。由于設計的復用器輸出流均在同一網絡中,故各表可分別僅用一個TS包鏈表和相應的修改信息構成網絡中所有輸出流的待發送包。
為了建立鏈表,須對生成的section打包并存儲到TS包數據結構中,該數據結構除了有TS包的完整內容之外,還帶有output_id(輸出流編號)和需要替換的內容(table_id和CRC)。建立好的鏈表如圖4所示(以SDT為例),其中NEXT_SDT_USE[output_id]為指向TS包數據結構的指針,每個輸出流均有1個,用于在發送TS包時指示當前應發送的包,header_n和rear_n為指向輸出流n的本流SDT包鏈表的頭和尾。

圖4 TS包鏈表結構
對于每一個輸出流,需發送的表為:網絡NIT、流SDT和EIT、同一網絡中其他流SDT和EIT分段。DVB關于SI表的傳輸間隔要求如表1[4]所示。

表1 DVB關于SI表的傳輸間隔
以SDT發送為例,每隔2 s發送一次本流SDT分段,每隔10 s發送一次本流和其他流SDT分段,每發送一個包,NEXT_SDT_USE[output_id]就指向下一個包,當發現發送完成標志(僅發送當前流分段時標志為rear_n,發送所有分段時標志為header_n)即停止發送,等待下一發送周期,EIT和NIT的發送與此類似。當TS包作為其他流分段 (根據結構體中output_id和當前輸出流id判斷)發送時,須根據結構體中的修改信息進行修改。
EPG更新可以采用兩種方式:僅允許用戶手動更新和根據輸入TS流更新。更新方式的選擇以輸入TS流為單位。
1)用戶手動更新。在復用過程中,用戶通過EPG編輯器更新EPG信息,導入數據庫,程序根據數據庫中的信息重新生成表,并使表的version_number加1,完成更新。
2)根據輸入TS流更新。開始復用后,程序監視各種表的version_number,若發現版本號變化,進行相關表的重新接收存儲,按照復用信息mult_infomation確定應該重建哪些表,同樣,使表的version_number加1。更新原則為[5]:
(1)若NIT變更,重新建立整個網絡的傳輸流和業務信息。
(2)若SDT變更,重新建立對應傳輸流里的業務信息。
(3)若EIT變更,不改變整個網絡的傳輸流和業務信息,只改變相應的事件信息。
TS流復用器的EPG處理系統工作于Linux系統下,完成復用器中EPG信息的添加、刪除等處理,進行測試,結果與分析如表2所示。

表2 系統EPG接收效率測試結果
測試中的丟包由隨機刪去發送流PSI/SI包來模擬,丟包程度為能夠保證接收端在1min內收到一次完整的信息,接收超時時間設為1 min,若在網絡環境較差的情況下,可適當增加接收超時時間,以保證獲取完整的信息。在不丟包的情況下,理論上,對于TS1和TS2,優化后的接收方式需要的最長時間分別為5 s和30 s。由表2的測試結果可以看到,優化后的接收方式所用的時間小于未優化的接收方式,并且丟包對優化后的接收方式影響較小,對于沒有優化的接收方式,丟包的影響在發送周期較長的分段時尤為嚴重。
之后對EPG信息通過EPG編輯器進行修改,輸出流經EPG分析軟件分析,各表均正常。EPG編輯器界面如圖5所示。

圖6和圖7分別為輸入輸出流的EPG在數據庫中的情況 (系統對復用輸出流再次進行接收可分析得到輸出流的EPG情況),右半部分為數據庫中的table,左半部分為SDT內容。輸入為2個TS流,第1個流沒有EPG信息,SDT中的provide_name和program_name默認為節目號。經EPG編輯后輸出,輸出為1個流,第1個流選取節目號為ec1的流,第2個流選取所有節目,可以看到,節目號均重新賦值,并且對ec1節目的SDT進行了添加。

[1]王大鵬.電子節目指南(EPG)在機頂盒中的實現[C]//國際有線電視技術研討會論文集,2003.杭州:中國廣播電視協會技術工作委員會,2003:406-410.
[2]ISO/IEC 13818-1,Third edition 2007.10 information technologygeneric coding ofmoving pictures and associated audio information:system[S].2007.
[3]方濤.數字電視業務信息及其編碼[M].北京:國防工業出版社,2003.
[4]Guidelines on implementation and usage of service information[EB/OL].[2010-04-13].http://www.bjpace.com.cn/data/tec/tec-DVB/DVB-20BlueBooks-20Standards/Specifications-20and-20Standards/multiplexing/dvb-si/a005r1.pdf.
[5]陳德林.EPG前端SI發表和機頂盒終端收表策略[J].廣播與電視技術,2005(8):99-101.