TS資料結構分析

2021-09-06 15:02:28 字數 3289 閱讀 6831

ts包頭定義:

typedef struct ts_packet_header

ts_packet_header;

ts包頭解析**:

hresult cts_stream_parse::adjust_ts_packet_header( ts_packet_header* ts_header )

全稱program specific information,意為節目專用資訊。傳輸流中是多路節目復用的,那麼,怎麼知道這些節目在傳輸流中的位置,區分屬於不同節目呢?所以就還需要一些 附加資訊,這就是psi。psi也是插入到ts分組中的,它們的pid是特定值。mpeg-2中規定了4個psi,包括pat(節目關聯表),cat(條 件訪問表),pmt(節目對映表),nit(網路資訊表),這些psi包含了進行多路解調和顯示節目的必要的和足夠的資訊.psi的pid是特定的,含 psi的資料報必須週期性的出現在傳輸流中。

pat (program association table )節目關聯表pat所在分組的pid=0 pat中列出了傳輸流中存在的節目流,pat指定了傳輸流中每個節目對應pmt所在分組的pid,pat的第一條資料指定了nit所在分組的pid ,其他資料指定了pmt所在分組的pid,乙個節目包含多少個節目就含有多少pmt。

cat (conditional access table )條件訪問表cat所在分組的pid=1,cat中列出了條件控制資訊(ecm)和條件管理資訊(emm)所在分組的pid。cat用於節目的加密和解密

nit( network information table)網路資訊表

nit所在分組的pid由pat指定,nit提供一組傳輸流的相關資訊,以及於網路自身特性相關的資訊,比如網路名稱,傳輸引數(如頻率,調製方式等)。nit一般是解碼器內部使用的資料,當然也可以做為epg的乙個顯示資料提供給使用者做為參考。

幾種psi之間的關係,如下圖所示:首先pat中指定了傳輸流中所存在的節目,及每個節目對應的pmt的pid號。 比如program 1對應的pmt 的pid=22,然後找到pid=22的ts分組,解出pmt,得到這個節目中包含的原始流的pid,再根據原始流的pid去找相應的ts分組,獲取原始 流的資料,然後就可以送入解碼器解碼了。

psi由四張表構成:pat,pmt,cat和nit,這四張表分別描述了乙個ts所包括的所有es流的傳輸結構。首先的乙個概念是,ts是以包形式傳播,在編譯碼端都需要以一定的包id來標識ts流裡承載的內容,比如,pat表會存在於乙個或多個ts包裡,所以要用乙個特別的包id來表示,另外,不同的es流也需要不同的包id來標識。我們有了pat和pmt這兩種表,解碼器就可以根據 pid,將ts上從不同es來的ts包區分出來進行解碼。

注:1:pid=0用來標識cat

2:program number=0用來標識nit

ts的解碼分兩步進行,其一,是從pid為0 的ts包裡,解析出pat表,然後從pat表裡找到各個節目源的pid,一般此類節目源都由若干個es流組成,並描述在pmt表裡面,然後通過節目源的 pid,就可以在pmt表裡檢索到各個es的pid。其二,解碼器根據pmt表裡的es流的pid,將ts流上的包進行區分,並按不同的es流進行解碼。所以,ts是經過節目復用和傳輸復用兩層完成的,即在節目復用時,加入了pmt,在傳輸復用時,加入了pat。同樣在節目解復用時,可以得到pmt,在傳輸解復用時,可以得到pat。

//pat table

program_association_section() ts_pat;

hresult cts_stream_parse::adjust_pat_table( ts_pat * packet, unsigned char * buffer)

else

}return 0;

}pmt結構定義:

typedef struct ts_pmt_stream

ts_pmt_stream;

//pmt 表結構體

typedef struct ts_pmt

ts_pmt;

解析**為:

hresult cts_stream_parse::adjust_pmt_table ( ts_pmt * packet, unsigned char * buffer )

pos += pmt_stream.es_info_length;

}pos += 5;

packet->pmt_stream.push_back( pmt_stream );

ts_stream_type.push_back( pmt_stream );

}return 0;

}從bytevar的某位,獲取獲取指定的位值

#define get1bit(bytevar, frombit) ((bytevar >> (8 - (frombit))) & 0x01)

#define get2bit(bytevar, frombit) ((bytevar >> (7 - (frombit))) & 0x03)

#define get3bit(bytevar, frombit) ((bytevar >> (6 - (frombit))) & 0x07)

#define get4bit(bytevar, frombit) ((bytevar >> (5 - (frombit))) & 0x0f)

#define get5bit(bytevar, frombit) ((bytevar>>  (4 - (frombit))) & 0x1f)

#define get6bit(bytevar, frombit) ((bytevar >> (3 - (frombit))) & 0x3f)

#define get7bit(bytevar, frombit) ((bytevar >> (2 - (frombit))) & 0x7f)

#define get8bit(bytevar, frombit) ((bytevar >> (1 - (frombit))) & 0xff)

tableid=0x01

ptree資料結構分析

使用時包含標頭檔案ptree.h 還要編譯ptree.c檔案。3.1.1.應用 pat tree是目前資訊檢索領域應用十分成功的索引方法。主要在字串子串匹配上有著非常優異的表現,採用半無限長字串作為字串的查詢結構。當有了乙個文件的所有半無限長字串的集合,該文件的任何子串都可以定位為某一半無限長字串的...

Redis資料結構分析

redis有 記憶體資料庫的讚譽,其支援一下幾種資料結構 1.string 2.hashes 3.list 4.set 本文從源 角度來分析各種資料結構在 redis 內部是如何儲存和讀取的。在介紹各種資料結構之前,首先來介紹下 redisobject 這個 struct string hash l...

資料結構 演算法分析

1 冒泡法 冒泡法大家都較熟悉。其原理為從a 0 開始,依次將其和後面的元素比較,若a 0 a i 則交換它們,一直比較到a n 同理對a 1 a 2 a n 1 處理,即完成排序。voidbubble int a,intn 定義兩個引數 陣列首位址與陣列大小 冒泡法原理簡單,但其缺點是交換次數多,...