在機頂盒中demux部分相對來說是比較復雜的部分,對於機頂盒軟件開發的新手來說通常在這里會遇到一些困難,今天特意研究了一下驅動層代碼,有一點自己的理解,因此寫下來記錄一下學習過程。
機頂盒中數據是如何流向的呢?
清流數據大致流向: TS流-->高頻頭(tuner) -->過濾(demux)-->緩沖區(Buffer)-->中間件、app
TS流中的數據是前段經過編碼、復用、調制之后的數據,機頂盒通過tuner對TS流解調,demux解復用然后將數據送到buffer中,最后機頂盒通過讀取buffer獲得需要的數據。
那這個數據流是如何驅動的呢?
eg:播放節目:
軟件在啟動時會創建很多任務,其中一個就是過濾不同psi、SI表(pat/pmt等),它循環的向demux請求PSISI表(主要設置的參數包括PID、data、mask),demux的數據是從tuner過來的,因此請求之前需要tuner先鎖定頻點,解調出數據,之后就解復用,解析PMT表后可以獲得音視頻的pid, 然后將音視頻、PCR的PID送到播放器中進行播放, 當然播放過程中也需要不停的根據PID請求音視頻數據。
在demux中數據是如何過濾的呢?
demux中主要的資源有slot、 filter和 buffer
主要分為4個步驟:
1. 判斷是否有空閑的filter,沒有的話就直接退出了。每一個數據請求需要占用一個filter,如PAT/PMT等表的請求,通常是需要一直占用filter的。
2. 將app設置下來的PID設到SLOT里面,同時設置slot的數據輸入端口,數據流的類型等, 然后根據這個slot創建一個虛擬通道,將slot、filter、buffer等聯系在一起。
slot.in = DMX_INPUT_PORT;
slot.pid = ReqPid;
slot.type = DMX_CH_TYPE_SECTION;
pid唯一標識包數據,同一類型的包只有一個pid,pid是demux的實現基礎,沒有設置demux就不能實現過濾。
slot可以把它看成一個管理對象,管理PID、filter、buffer,一個slot對應一個PID,但可以對應對個filter。
3. 設置filter。首先設置filter的buffer,然后將app設置下來的data 、mask(data mask相‘與’后來過濾數據)設置到filter中,filter將過濾后的數據放到buffer中。
4. 最后通過回調,將數據拋向app層。