• 沒有找到結果。

4. 系統架構設計與實作

4.1. Transport Stream Parser

在 Service Information 的工作當中,只有 PAT 以及 PMT 的部份和 DSM-CC 相關。所以如果把 SI 這部份獨立出來實作的話,除了增加實作上的困難之外,

在資料的傳輸上的時間耗費以及解出來的資料在送給 Demux 處理之前的記憶體 使用,都是一種不必要的負擔。

所以在這個部份,本論文特別把Demux和PAT、PMT的處理這部份,以及 Section Filter中處理packets的部份合併成為TS Parser,專門處理將AIT的資料及 DSM-CC的資料抽取出來的工作。流程大致上如Figure 39所示。

Figure 39. Block Diagram Transport Stream Parser 4.1.1. PAT and PMT

在本論文的實作系統當中,如果收到了一段 transport stream 的話,就會開始 處理去讀出每一個 packet 的 PID。然後在處理到 PID= 0x0000 的 packet 之前(也 就是 PAT),所有收到的 packet 都全部忽略不繼續處理。

等到取得PAT的資料並且完成處理之後,我們可以透過PAT的內容得知PMT 的PID,這時就開始處理PMT的內容,並且建立不同的table來儲存DSM-CC資料 的PID以及AIT資料的PID。如Figure 40所示。

Figure 40. The procedure of PAT and PMT parsing 4.1.2. Section Filter

在取得 DSM-CC 跟 AIT 資料的 PID 之後,我們會開始讀取該 PID 對應的 packets。

以AIT為例,首先先檢查這個packet的PID是不是屬於AIT,如果不是的話,

就把整個packet丟掉,再往下讀一個packet。如果是屬於AIT的話,則檢查它的 payloadUnitStartIndicator的值。如Figure 41所示。

1) 如果 payloadUnitStartIndicator = 0,表示在這個 packet 當中,沒有新的 section 的開頭,則檢查它相對應的 temp file 是不是空的。

A. 如果 temp file 是空的,代表這個 section 還沒有被處理過,但是若 是一個新的 AIT section 的話,那它的 payloadUnitStartIndicator 應 該會被設為 1,由此可知,這其中應該有丟失封包,所以我們必須 把這個 packet 整個略過不處理,直接去讀取下一個 packet。

的值,則我們要作的就是把資料讀入 temp file,再去讀取下一個 packet。

2) 如果 payloadUnitStartIndicator = 1 的話,表示在這個 packet 中,存在一 個新的 section 的開頭,這時我們就要去檢查 pointerField。

A. 如果 pointerField = 0 的話,代表上一個 section 的資料已經結束了,

這個 packet 從頭開始都是一個新的 AIT section 的資料,所以我們 就要把 temp file 關上,送給下一個處理者,並且再開一個新的 temp file,準備接受新的 section 的資料。

B. 如果 pointerField = n ≠ 0 的話,代表這個 packet 在 pointerField 後 的第 n 個 byte 之後是屬於一個新的 section,則我們先寫入 n 個 bytes 的資料到 temp file,然後把 temp file 關上並送給下一個處理者,最 後再開一個新的 temp file 把剩下的 bytes 寫入新的 temp file。

當我們成功的讀取出一個 section 之後,首先要檢查它的真實長度跟它的 section length 是不是一樣,因為有些 sections 被切成 188 bytes 長的 packet 時,會 因為長度不夠,而在最後被加上若干個 padding bytes,所以我們要先把這些 padding bytes 過濾掉。

而 DSM-CC 也是透過類似的方法處理。最後再把這些完整的 sections 送到 Cyclic Redundancy Check 處理,經過確認這些 sections 的內容都正確之後,就可 以分別送給 AIT Decoder 跟 DSM-CC 處理了。

Figure 41. Scheme of TS parser

相關文件