PSI信息解析
/*学习SPI和PI的时候看到一篇博客,内容非常好,只是排序不好,我就改了下*/
"PSI是对单一TS流的描述,是TS流中的引导信息"
PSI信息由节目关联表PAT、条件接收表CAT、节目映射表PMT和网络信息表NIT组成。这些表会被插入到TS流中。PSI信息是对单一TS流的描述,它是TS流的引导信息;PSI信息指定了如何从一个携带多个节目的传输流中找到指定的节目(见Q1)。
下面给出的是节目引导信息(或称节目特定信息,PSI)的四个表结构。
结构名 |
中文 |
所定义标准 |
PID |
描述 |
PAT |
节目关联表 |
MPEG2标准 |
0x0000 |
将节目号码和节目映射表PID相关联,是获取数据的开始 |
PMT |
节目映射表 |
MPEG2标准 |
在PAT中指出 |
指定一个或多个节目的PID |
CAT |
条件接收表 |
MPEG2标准 |
0x0001 |
将一个或多个专用EMM流分别与唯一的PID相关联 |
NIT |
网络信息表 |
SI标准 |
PAT中指出 |
描述整个网络,如多少个TS流、频点和调制方式等信息 |
虽然这四个结构可以视为简单的表,但事实上,它们被进一步划分为各个段,并插入到TS包中。
一:PAT解析
PARSING OF PAT
"PAT是机顶盒接收的入口点,是它获取数据的开始"
节目关联表PAT的意义在于,它描述了当前TS流中包含了哪些PID;只有根据获得的PID,用户才可以以此作为凭据找出其他表(如PMT表)及其信息。所以PAT是机顶盒接收的入口点,是它获取数据的开始;要保证一个TS流能被正常接收,则至少要有一个完整有效的PAT。
下面给出了PID字段的取值要求:
值 |
描述 |
0x0000 |
PAT |
0x0001 |
CAT |
0x0002~0x000F |
保留 |
0x0010~0x1FFE |
可赋给network_PID、Program_map_PID、elementary_PID或作其他用途 |
0x1FFF |
空的分组 |
PAT的表结构分析
ANALYZE OF THE STRUCTURE OF PAT
首先,对PAT的表结构进行分析。下面给出了PAT表的基本结构:
节目关联段
Syntax(句法结构) No. ofbits(所占位数) Identifier(识别符) Note(注释)
program_association_section(){
table_id 8 uimsbf
Section_syntax_indicator 1 bslbf 通常设为“1”
"0" 1 bslbf
Reserved 2 bslbf
Section_length 12 uimsbf 见注释
transport_stream_id 16 uimsbf 见注释
Reserved 2 bslbf
Version_number 5 uimsbf 见注释
Current_next_indicator 1 bslbf 见注释
Section_number 8 uimsbf 见注释
last_section_number 8 uimsbf 见注释
for(i=0;i<N;i++){
program_number 16 uimsbf 见注释
reserved 3 bslbf
if(program_number == 0){
network_PID 13 uimsbf 见注释
}
else{
program_map_PID 13 uimsbf 见注释
}
}
CRC_32 32 rpchof 见注释
}
这里我们注意关注五个字段:
table_id(赋值):PAT的table_id应为0x00
transport_stream_id(传输流标志):用以标识来源于网络中任何其他复合流的TS流
program_number(节目号):规定program_map_PID可适用的节目。当值为0x0000时,其后的PID参照将是网络PID。它可以作为一个指示符号,例如用于广播通道。
network_PID(网络PID):仅当program_number为0x00时使用
program_map_PID(节目映射PID):据此找出相应的PMT表
PAT的实例分析
ANALYZE OF REAL EXAMPLE OF PAT
借助码流分析仪,我们可以很清楚地以实例的方式更加清晰地了解PAT的结构。下面给出的就是一个TS流的PAT分析情况:
根据上表可以看出,这个TS流里共有6套节目,其映射关系PID分别为0xc9、0xcb、0xce、0xcc、0xcd和0xca。(注:0xc9=201)
下面给出的是PMT的简单解析
两相比较,可以很清楚地知道,PAT是如何锁定各个PMT的(每个节目都有一个自己的PMT)。
Q1:如何找到一个特定的节目?
1.已知节目名称(或id等信息)
P248
首先要从节目关联表PAT中获取这个节目的节目映射表PMT的PID值,再从TS流中找出与此PID值相对应的节目映射表PMT;再从PMT中获取构成这个节目的基本码流的PID值,从而根据该PID过滤出相应的视频、音频和数据等基本码流。最后解码恢复为原始信号。
二:PMT解析
PARSING OF PMT
"PMT是连接节目号与节目元素的桥梁"
节目映射表PMT的意义在于,它给出了节目号与组成这个节目元素之间的映射;也就是说,PMT是连接节目号与节目元素的桥梁。我们知道,一个电视节目至少包含了视频和音频数据,而每一个节目的视音频数据都是以包的形式在TS流中传输的;所以说,一个TS流包含了多个节目的视频和音频数据包。要想过滤出一个TS流中其中一个节目的视频和音频,则需要知道这个节目中视频和音频的标识号PID。PMT表的作用就在于,它提供了每个节目视频、音频(或其他)数据包的PID。
PMT的表结构分析
ANALYZE OF THE STRUCTUREOF PMT
先给出PMT表的段结构:
Syntax (句法结构) No. of bits(所占位数) Identifier(识别符) Note(注释)
program_map_section(){
table_id 8 uimsbf
Section_syntax_indicator 1 bslbf 通常设为“1”
"0" 1 bslbf
Reserved 2 bslbf
Section_length 12 uimsbf 见注释
program_number 16 uimsbf
Reserved 2 bslbf
Version_number 5 uimsbf 见注释
Current_next_indicator 1 bslbf 见注释
Section_number 8 uimsbf 见注释
last_section_number 8 uimsbf 见注释
reserved 3 bslbf
PCR_PID 13 uimsbf 见注释
reserved 4 bslbf
program_info_length 12 uimsbf 头两位为"00"
for(i=0;i<N;i++){
descriptor()
}
for(i=0;i<N1;i++){
stream_type 8 uimsbf 见注释
reserved 3 bslbf
elementary_PID 13 uimsbf 见注释
reserved 4 bslbf
ES_info_length 12 uimsbf 头两位为"00"
for(j=0;j<N2;j++){
descriptor();
}
}
CRC_32 32 rpchof 见注释
}
这里着重介绍两个字段:
elementary_PID:标识了该节目(program_number)携带的基本流的识别号PID
stream_type:流类型,指出了PID为elementary_PID的基本流的类型
附:流类型取值说明
取值 |
描述 |
0x00 |
国际标准保留 |
0x01 |
视频 |
0x02 |
视频或受限参数视频流 |
0x03 |
音频 |
0x04 |
音频 |
0x05 |
private_sections |
0x06 |
包含专用数据的PES分组 |
0x07 |
ISO/IEC 13533 MHEG |
0x08 |
|
0x09 |
ITU-T Rec.H.222.1 |
0x0A~0x0D |
GB/T类型 |
0x0E |
GB/T辅助 |
0x0F~0x7F |
GB/T保留 |
0x80~0xFF |
用户专用 |
PMT的实例分析
ANALYZEOF REAL EXAMPLE OF PMT
下面给出了码流分析仪分析一段TS流的PMT表:
首先,注意到这张PMT表的progam_number=0xc9,就是我们在上面解析PAT表得到的。
从上面可以知道,节目号为0xc9(即201)的节目有两个单元流:
流名称 |
标识号 |
类型 |
说明 |
MPEG2视频 |
ES PID=0x21 |
stream_type=0x02 |
ES PID即为elementary_PID |
MPEG1音频 |
ES PID=0x28 |
stream_type=0x03 |
ES PID即为elementary_PID |
elementary_PID和stream_type的意义在于,告知接收机基本流的类型和识别PID。要想获取这个节目的视频,只需要对PID为0x21的数据包进行过滤,并交由视频处理模块处理。下图所示(除了节目名称,还需要SDT表信息)即为PAT和PMT共同获取的信息。
三:CAT解析
PARSINGOF CAT
"CAT描述了节目的加密方式"
条件接收表CAT描述了节目的加密方式,它包含了节目的EMM注1识别PID。它给出了一个或多个CA系统、EMM流以及与CA相关的特定参数之间的关系。
注1:EMM(Entitlement Management Message),即授权管理信息。描述了用户可看的节目或时间段、用户的付费等。
CA描述符既用于规定像EMM这样的系统范围条件接收管理信息,也用于规定像ECM这样的基本流特定信息。
- 如果一个基本流(Elementary Stream)是加扰的,那么包含该基本流的节目信息PMT中需要一个CA描述符
- 如果一个TS流中有任何一个系统范围的条件接收管理信息,则条件接收表中应有CA描述符。
下图给出的PMT表即是基本流加扰的情况,因此PMT表需要有CA描述符:
CAT的表结构分析
ANALYZEOF THE STRUCTUREOF CAT
条件存取段
Syntax(句法结构) No. ofbits(所占位数) Identifier(识别符) Note(注释)
conditional_access_section(){
table_id 8 uimsbf
Section_syntax_indicator 1 bslbf 通常设为“1”
"0" 1 bslbf
Reserved 2 bslbf
Section_length 12 uimsbf 见注释
reserved 18 bslbf
Version_number 5 uimsbf 见注释
Current_next_indicator 1 bslbf 见注释
Section_number 8 uimsbf 见注释
last_section_number 8 uimsbf 见注释
for(i=0;i<N;i++){
descriptor()
}
CRC_32 32 rpchof 见注释
}
条件存取段主要作用是指示本TS流中存在加扰节目,并且在描述符循环中必须插入CA描述符来作进一步指引。下面给出的是条件接收的描述符
条件接收描述符
Syntax(句法结构) No. of bits(所占位数) Identifier(识别符)
CA_identifier_descriptor(){
descriptor_tag 8 uimsbf
descriptor_length 8 uimsbf
CA_system_ID 16 uimsbf
reserved 3 bslbf
CA_PID 13 uimsbf for(i=0;i<N;i++){
private_data_byte 8
}}
CA_system_ID(CA系统ID):指出用于相关ECM(授权控制信息)及(或)EMM流的CA系统类型。
CA_PID(CA PID):指出包含用于相关CA_system_ID所规定的CA系统的ECM或EMM信息传输流分组的PID(即在TS流中过滤出相应PID的分组)。
下面给出的TS流中并没有CAT:
但在PMT表中有CA描述符:
四:NIT解析
PARSINGOF NIT
"NIT描述了数字电视网络中与网络相关的信息"
NIT描述了数字电视网络中与网络相关的信息,但这个表本身的信息有限,更多的信息是依靠插入表中的描述符来提供的。NIT常用的描述符有:网络名称描述符(network_name_descriptor)、有线传送系统(cable_delivery_system_descriptor)、业务列表描述符(service_list_descriptor)和链接描述符(linkage_descriptor)。下图是实际的一个例子中的两种描述符。
NIT的表结构分析
ANALYZE OF THE STRUCTURE OF NIT
网络信息表(NIT)传递了与通过一个给定的网络传输的复用流/TS流的物理结构相关的信息,以及与网络自身特性相关的信息。
网络信息段
Syntax(句法结构) No.of bit(所占位数) Identifier(识别符) Note(注释)
network_information_section(){
table_id 8 uimsbf
Section_syntax_indicator 1 bslbf 通常设为“1”
Reserved_future_use 1 bslbf
Reserved 2 bslbf
Section_length 12 uimsbf 见注释
Network_id 16 uimsbf 见注释
Reserved 2 bslbf
Version_number 5 uimsbf 见注释
Current_next_indicator 1 bslbf 见注释
Section_number 8 uimsbf 见注释
last_section_number 8 uimsbf 见注释
Reserved_future_use 4 bslbf
Network_descriptors_length 12 uimsbf
for(i=0;i<N;i++){
descriptor() //First descriptor loop
}
reserved_future_use 4 bslbf
transport_stream_loop_length 12 uimsbf
for(i=0;i<N;i++){
transport_stream_id 16 uimsbf 见注释
original_network_id 16 uimsbf 见注释
reserved_future_use 4 bslbf
transport_descriptors_length 12 uimsbf
for(j=0;j<N;j++){
descriptor() //Second descriptor loop
}
}
CRC_32 32 rpchof 见注释
}
在SI标准中规定:original_network_id和transport_stream_id两个标识符相结合唯一确定了网络中的TS流。各网络被分配独立的network_id值作为网络的唯一识别码。当NIT表在生成TS流的网络上传输时,network_id和original_network_id将取同一值。
NIT表被切分为网络信息段(network_information_section)
任何NIT的段都必须由PID为0x0010的TS包传输
现行网络的NIT表任何段的table_id值应为0x40,且具有相同的table_id_extension即(network_id);
现行网络以外的其他网络NIT表的段table_id值应为0x41
注意到这里出现了两个循环,分别成为第一层循环和第二层循环;每层循环都插入了一个描述符,也就是一共插入了两个描述符。这两个描述符的特点如下:
第一层描述符 |
作用域是针对整个网络的,如插入网络名称描述符、链接描述符等 |
第二层描述符 |
作用域是第一层循环所代表的一个TS流,如插入有线传输系统描述符 |
上图提供的即是一个真实的NIT表,红色框内有两个描述符,分别是业务列表描述符service_list_descriptor和有线传输系统描述符cable_delivery_system_descriptor;它们都位于第二层循环。
NIT的业务列表描述符结构分析
ANALYZE OF THE STRUCTURE OF SERVICE_LIST_DESCRIPTOR IN NIT
业务列表描述符通过业务标识符和业务类型提供业务服务。其目的在于:告诉接收机每一个TS流中存在多少个业务以及每一个业务的类型。其结构如下:
业务列表描述符
Syntax(句法结构) No. of bits(所占位数)Identifier(识别符)
service_list_descriptor(){
descriptor_tag 8 uimsbf
descriptor_length 8 uimsbf
for(i=0;i<N;i++){
service_id 16 uimsbf
service_type 8 uimsbf
}
}
service_id(业务标识符):唯一标识TS中的一个业务,它与program_map_section中的program_number(参看PMT表结构)相同。但当业务类型为0x04时(即NVOD参考业务,service_id没有对应的program_number)。
service_type(业务类型):指示业务的类型。如0x01为数字电视业务,0x02为数字音频广播业务,0x04为NVOD参考业务,0x05为NVOD时移业务。
HINT:下表给出了业务类型编码方法
service_type |
描述 |
0x00 |
预留使用 |
0x01 |
数字电视业务 |
0x02 |
数字音频广播业务 |
0x03 |
图文电视业务 |
0x04 |
NVOD参考业务 |
0x05 |
NVOD时移业务 |
0x06 |
马赛克业务 |
0x07 |
PAL制编码信号 |
0x08 |
SECAM制编码信号 |
0x09 |
D/D2-MAC |
0x0A |
调频广播 |
0x0B |
NTSC制信号 |
0x0C |
数据广播业务 |
0x0D |
公共接口使用预留 |
0x0E |
RCS映射(见EN 301 790) |
0x0F |
RCS FLS(见EN 301 790) |
0x10 |
DVB MHP业务 |
0x11~0x7F |
预留使用 |
0x80~0xFE |
用户定义 |
0xFF |
预留使用 |
上图所示只是其中一个section的业务列表描述符,如果将所有的section全解析,那么此网络中所有TS流包含的所有service_id和service_type都可以获得。这样,用户可以据此了解整个网络业务的构成,并以此为基础对业务进行分类、整合。
NIT的有线传输系统描述符结构分析
ANALYZE OF THE STRUCTURE OF CABLE_DELIVERY_SYSTEM_DESCRIPTOR IN NIT
有线传输系统描述符(Cable_Delivery_System_descriptor)是NIT业务中重要的描述符,也是基本运营所必需的描述符。它主要描述了每一个TS流的物理参数(频率、调制方式、符码率等),使接收机能正确锁频、得到数据。其结构如下:
有线传输系统描述符
Syntax(句法结构) No. of bits(所占位数) Identifier(识别符)
cable_delivery_system_descriptor(){
descriptor_tag 8 uimsbf
descriptor_length 8 uimsbf
frequency 32 bslbf
reserved_future_use 12 bslbf
FEC_outer 4 bslbf前向纠错外码
modulation 8 bslbf
symbol_rate 28 bslbf
FEC_inner 4 bslbf前向纠错内码
}
Frequency(频率):32位,以8个4位BCD码给出频率。其单位是MHz,小数点位于第四个BCD码之后,如0312.0000MHz。
Modulation(调制方式):指出有线传输系统的调制方式。其定义如下表:
调制方式(十六进制) |
描述 |
0x00 |
未定义 |
0x01 |
16 QAM |
0x02 |
32 QAM |
0x03 |
64 QAM |
0x04 |
128 QAM |
0x05 |
256 QAM |
0x06~0xFF |
预留使用 |
symbol_rate(符码率):28位,以7个4位BCD码表示符码率。其单位是MSPS(兆符号每秒),小数点位于第三个BCD码后,如027.4500 MSPS
上图所示为一个真实TS流里的一个有线传输系统描述符。可以看到其频率为331.0000MHz,符码率为6.8750MSym/s,调制方式为64 QAM。
NIT的网络名称描述符结构分析
ANALYZE OF THE STRUCTURE OF NETWORK_NAME_DESCRIPTOR IN NIT
网络名称描述符的功能比较简单,它以字符串的形式将网络的名称告诉接收机。下面是其描述符结构列表:
网络名称描述符
Syntax(句法结构) No. of bits(所占位数)Identifier(识别符)
network_name_descriptor(){
descriptor_tag 8 uimsbf
descriptor_length 8 uimsbf
for(i=0;i<N;i++){
char 8 uimsbf
}
}
char(字符):8位字段,一个字符串,给出NIT表指定的传送系统的名称。
NIT的链接描述符结构分析
ANALYZE OF THE STRUCTURE OF LINKAGE_DESCRIPTOR IN NIT
链接描述符
Syntax(句法结构) No. of bits(所占位数)Identifier(识别符)
linkage_descriptor(){
descriptor_tag 8 uimsbf
descriptor_length 8 uimsbf
transport_stream_id 16 uimsbf
original_network_id 16 uimsbf
service_id 16 uimsbf
linkage_type 8 uimsbf
for(i=0;i<N;i++){
private_data_byte 8 bslbf
}
}
如果用户要求得到SI系统描述的特定实体的进一步信息,则可以使用链接描述符。链接描述符包含的信息给出了该实体的位置。如:可以在一个NIT中使用一个链接描述符,给出网络中可存放业务附加信息的位置;或者在BAT表中的链接描述符可链接到业务群的相关信息等。
使用链接描述符,也可以提供一种业务,以替换CA系统的功能。如果CA系统不能处理相应功能的时候,接收机就可以用这个业务来取代CA。
使用链接描述符,还可以以一种备用业务,用以替换主业务。若主业务的运行状态被置为“not_running”,那么,接收机可以自动选择被链接描述符指引的备用业务,以取代该业务。
使用链接描述符,还可以向移动接收机提供漫游功能。若现行业务其service_id下无法使用,IRD可以自动选择该功能。hand-over_type指明link_descriptor是否链接到不同国家的同一业务,或者链接到本地变更业务或关联业务。
总之,链接描述符为运营商提供了一种业务扩充功能,使得运营商可以更加灵活地组合各种业务。
NIT的软件下载链接描述符结构分析
ANALYZE OF THE STRUCTURE OF DOWNLOAD_LINKAGE_DESCRIPTOR IN NIT
软件下载描述符用于运营商在网络内进行多于一个机顶盒的软件下载更新标识,在网络信息表NIT的第一个循环内,并且可能多次出现。针对同一组制造商号(manufacturer_id)、硬件类型(hw_model)、硬件版本(hw_version)和软件类型(sw_model),可能有不只一组的不同软件版本(sw_version)和开始时间(start_time)参数,并可能出现在同一个或多个链接描述符(linkage_descriptor)的各个循环内。
PSI小结
SUMMARY OF PSI
上图给出了在一个TS流中PSI各表之间的联系。首先从PAT表出发,获取当前有哪些节目号(program_map_PID),再根据这些节目号找出program_number相同的PMT;获取到PMT后,即可根据elementary_PID和stream_type来确定要过滤哪些含有基本流的TS包,以及这些包里面是什么类型的数据。这样,机顶盒就可以过滤出相应的节目(视频和音频数据)来收看了。