TS_PSI介紹


/*
 **************************************************************************************************************************************
 (1)ES- Elementary Streams (原始流),對視頻、音頻信號及其他數據進行編碼壓縮後的數據流稱爲原始流。原始流包括訪問單元,比如視頻原始流的訪問單元就是一副圖像的編碼數據。

 (2)PES- Packetized Elementary Streams (分組的原始流),原始流形成的分組稱爲PES分組,是用來傳遞原始流的一種數據結構

 (3)節目是節目元素的集合。節目元素可能是原始流,這些原始流有共同的時間基點,用來做同步顯示。

 (4)傳輸流和節目流
   4.1) TS-Transport Stream 翻譯爲“傳輸流”
   4.2) PS-Program Stream  翻譯爲“節目流”
   4.3) PS用來傳輸和保存一道節目的編碼數據或其他數據,PS的組成單位是PES分組。
   4.4) TS用來傳輸和保存多道節目的編碼數據或其他數據,TS的組成單位是節目。
   4.5) PS適用於不容易發生錯誤的環境,以及涉及到軟件處理的應用,典型應用如DVD光盤的文件存儲.
   4.6) TS適用於容易發生錯誤的環境,典型應用就是數字電視信號的傳輸。
   TS和PS是可以互相轉換的,比如從TS中抽取一道節目的內容併產生有效的PS是可能。

 (5)傳輸流分組和PES分組原始流分成很多PES分組,保持串行順序,一個PES分組只包含一個原始流的編碼數據。
   5.1) PES分組長度很大,最大可爲64K字節。PES分組分爲“分組首部(header)”和“有效負載(payload)”。
   5.2) “有效負載”指跟隨在首部字節之後的字節。首部的前4個字節構成分組的起始碼,標識了該分組所屬原始流的類型和ID號。
   5.3) TS分組也就是傳輸流數據形成的數據包。每個TS分組長度爲188字節,包括“分組首部”和“有效負載,前4個字節是分組首部,包含了這個分組的一些信息。
   5.4) 有些情況下需要更多的信息時,需在後面添加“調整字段(adaption field)”。
   5.5) 兩者之間的關係:PES分組是插入到TS分組中的,每個PES分組首部的第一字節就是TS分組有效負載的第一字節。一個PID值的TS分組只帶有來自一個原始流的數據。
 
 (6)PSI 全稱Program Specific Information,意爲節目專用信息。
   6.1) 傳輸流中是多路節目複用的,那麼,怎麼知道這些節目在傳輸流中的位置,區分屬於不同節目呢?所以就還需要一些附加信息,這就是PSI。
   6.2) PSI也是插入到TS分組中的,它們的PID是特定值。
   6.3) MPEG-2中規定了4個PSI,包括:
        PAT(節目關聯表),
        CAT(條件訪問表),
        PMT(節目映射表),
        NIT(網絡信息表),
        這些PSI包含了進行多路解調和顯示節目的必要的和足夠的信息。
   6.4) 應用中可能包括更多的信息,比如DVB-T中定義了SDT(服務描述表),EIT(環境信息表),BAT(節目組相關表),TDT(時間日期表)等,統稱爲DVB-SI(服務信息)。 
   6.5) PSI的PID是特定的,含PSI的數據包必須週期性的出現在傳輸流中。
 
--->PMT (Program Map Table )節目映射表PMT所在分組的PID由PAT指定,所以要先解出PAT,再解PMT。
 PMT中包含了屬於同一節目的視頻、音頻和數據原始流的PID。找到了PMT,解多路複用器就可找到一道節目對應的每個原始流的PID,再根據原始流PID,去獲取原始流。
 
--->PAT (Program Association Table )節目關聯表PAT所在分組的PID=0 ;
 PAT中列出了傳輸流中存在的節目流PAT指定了傳輸流中每個節目對應PMT所在分組的PID;
 PAT的第一條數據指定了NIT所在分組的PID ,其他數據指定了PMT所在分組的PID。
 
--->CAT (Conditional Access Table )條件訪問表CAT所在分組的PID=1;
 CAT中列出了條件控制信息(ECM)和條件管理信息(EMM)所在分組的PID。
 CAT用於節目的加密和解密 
 
--->NIT( Network Information Table)網絡信息表;
 NIT所在分組的PID由PAT指定;
 NIT提供一組傳輸流的相關信息,以及於網絡自身特性相關的信息,比如網絡名稱,傳輸參數(如頻率,調製方式等)。
 NIT一般是解碼器內部使用的數據,當然也可以做爲EPG的一個顯示數據提供給用戶做爲參考。
 
 幾種PSI之間的關係,如下圖所示:
 1. 首先PAT中指定了傳輸流中所存在的節目,及每個節目對應的PMT的PID號。 
 2. 比如Program 1對應的PMT的PID=22,然後找到PID=22的TS分組;
 3. 解出PMT,得到這個節目中包含的原始流的PID;
 4. 再根據原始流的PID去找相應的TS分組,獲取原始流的數據;
 5. 然後就可以送入解碼器解碼了。
 **************************************************************************************************************************************
 */

/*
 *  數據結構(1)TS分組前面提到,TS分組由188個字節構成,其結構如下:
 */

transport_packet(){
		sync_byte					// 8
		transport_error_indicator	//1
		payload_unit_start_indicator	//1
		transport_priority				// 1  PID	//13
		transport_scrambling_control	// 2
		adaptation_field_control		//2
		continuity_counter				//4
		if(adaptation_field_control=='10'  || adaptation_field_control=='11'){
			adaptation_field()
		}
	
		if(adaptation_field_control=='01' || adaptation_field_control=='11') {
		for (i=0;i<N;i++){
			data_byte					//8
		}
	}
}
/*
**************************************************************************************************************************************
--->前面32bit的數據即TS分組首部,它指出了這個分組的屬性。
 
sync_byte                   :    同步字節,固定爲0x47 ,表示後面的是一個TS分組,當然,後面包中的數據是不會出現0x47的
transport_error_indicator   :    傳輸錯誤標誌位,一般傳輸錯誤的話就不會處理這個包了
payload_unit_start_indicator :  這個位功能有點複雜,字面意思是有效負載的開始標誌,根據後面有效負載的內容不同功能也不同,後面用到的時候再說。
transport_priority           :  傳輸優先級位,1表示高優先級,傳輸機制可能用到,解碼好像用不着。
PID                          :  這個比較重要,指出了這個包的有效負載數據的類型,告訴我們這個包傳輸的是什麼內容。前面已經敘述過。
transport_scrambling_control :  加密標誌位,表示TS分組有效負載的加密模式。TS分組首部(也就是前面這32bit)是不應被加密的,00表示未加密。
adaption_field_control       :  翻譯爲“調整字段控制”,表示TS分組首部後面是否跟隨有調整字段和有效負載。
                                01 --僅含有效負載,
                                10 --僅含調整字段,
                                11 --含有調整字段和有效負載,
                                00 --解碼器不進行處理。空分組沒有調整字段
continuity_counter           :  一個4bit的計數器,範圍0-15,具有相同的PID的TS分組傳輸時每次加1,到15後清0。不過,有些情況下是不計數的。
                             : 如下:
                                (1)TS分組無有效負載;
                                (2)複製的TS分組和原分組這個值一樣;
                                (3)後面講到的一個標誌discontinuity_indicator爲1時;
adaptation_field()          :   調整字段的處理
data_byte                   :   有效負載的剩餘部分,可能爲PES分組,PSI,或一些自定義的數據。
**************************************************************************************************************************************
*/

/*
 *  (2)  PAT數據結構如下:
 */

program_association_section() 
{
		table_id                                // 8
		section_syntax_indicator                // 1
		'0'                                     // 1
		reserved                                // 2
		section_length                          // 12
		transport_stream_id                     // 16
		reserved                                // 2
		version_number                          // 5
		current_next_indicator                  // 1
		section_number                          // 8
		last_section_number                     // 8
		for (i=0; i<N;i++) {
			program_number                      // 16
			reserved                            // 3
			if(program_number == '0') {
				network_PID                     // 13
			}
			else
			{
				program_map_PID                 // 13
			}
		}
		CRC_32                                  //  32
}

/*
**************************************************************************************************************************************
table_id                    : 固定爲0x00 ,標誌是該表是PAT
section_syntax_indicator    : 段語法標誌位,固定爲1
section_length              : 表示這個字節後面有用的字節數,包括CRC32。
                              假如後面的字節加上前面的字節數少於188,後面會用0XFF填充。假如這個數值比較大,則PAT會分成幾部分來傳輸。
transport_stream_id         : 該傳輸流的ID,區別於一個網絡中其它多路複用的流。
version_number              : 範圍0-31,表示PAT的版本號,標註當前節目的版本.
                              這是個非常有用的參數,當檢測到這個字段改變時,說明TS流中的節目已經變化了,程序必須重新搜索節目.
current_next_indicator      : 表示發送的PAT是當前有效還是下一個PAT有效。
section_number              : 分段的號碼。PAT可能分爲多段傳輸,第一段爲00,以後每個分段加1,最多可能有256個分段
last_section_number         : 最後一個分段的號碼

program_number              : 節目號
network_PID                 : 網絡信息表(NIT)的PID,網絡信息表提供了該物理網絡的一些信息,和電視臺相關的。節目號爲0時對應的PID爲network_PID
program_map_PID             : 節目映射表的PID,節目號大於0時對應的PID,每個節目對應一個

CRC_32                      : CRC32校驗碼
 
上面program_number,network_PID,program_map_PID 是循環出現的。
program_number等於0時          ---->對應network_PID;
program_number等於其它值時      ---->對應program_map_PID。
**************************************************************************************************************************************
*/

/*
 *(3)PMT   PMT數據結構如下:
 */

TS_program_map_section() {
    table_id                               // 8
    section_syntax_indicator              //  1
    '0'                                   //  1
    reserved                              //  2
    section_length                        //  12
    program_number                        //  16
    reserved                              //  2
    version_number                        //  5
    current_next_indicator                //  1
    section_number                        //  8
    last_section_number                   //  8
    reserved                              //  3
    PCR_PID                               //  13
    reserved 4
    program_info_length                   //  12
    for (i=0; i<N; i++) {
        descriptor()
    }
    for (i=0;i<N1;i++) {
        stream_type                           //  8
        reserved                              //  3
        elementary_PID                        //  13
        reserved                              //  4
        ES_info_length                        //  12
        for (i=0; i<N2; i++) {
            descriptor()
        }
    }
    CRC_32                                 //  32
}

/*
**************************************************************************************************************************************
table_id                    : 固定爲0x02 ,標誌是該表是PMT。
section_syntax_indicator    :
section_length              :
version_number              : 
current_next_indicator      : 以上四個字段意思和PAT相同,可參考上面解釋
section_number              : 
last_section_number         : 以上兩個字段意思和PAT相同,不過值都固定爲0x00,這樣的原因可能是因爲PMT不需要有先後順序,因爲先定義哪個節目都是無所謂。
program_number              : 節目號,表示該PMT對應的節目
PCR_PID PCR                 :(節目時鐘參考)所在TS分組的PID,根據PID可以去搜索相應的TS分組,解出PCR信息。
program_info_length         : 該節目的信息長度,在此字段之後可能會有一些字節描述該節目的信息
stream_type                 : 指示了PID爲elementary_PID的PES分組中原始流的類型,比如視頻流,音頻流等,見後面的表
elementary_PID              : 該節目中包括的視頻流,音頻流等對應的TS分組的PID
ES_info_length              : 該節目相關原始流的描述符的信息長度。stream_type對應的類型:
**************************************************************************************************************************************
*/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章