libdvbpsi库简单学习心得(二):PAT表

来源:互联网 发布:一万年来谁著史 知乎 编辑:程序博客网 时间:2024/05/20 15:42

在开始介绍libdvbpsi库过滤pat表的例子之前,首先简要分析一下ts流中相关的表结构。
参考博客:从TS流到PAT和PMT
在上述博客中可能与下面的分析标识稍有误差,只是大家取的变量名不太一样。下面是我参考《中华人民共和国国家标准 GB/T 17975.1-2000 idt ISO/IEC 13818-1:1996 信息技术 运动图像及其伴音信息的通用编码 第一部分:系统 》所做的简要ts及表分析。
(一)TS流(Transport Stream):传输流分组长度为188字节
1.传输流分组层

transport_packet(){        sync_byte                           //8 bits        transport_error_indicator           //1 bit        payload_unit_start_indicator        //1 bit        transport_priority                  //1 bit        PID                                 //13 bits        transport_scrambling_control        //2 bits        adaption_filed_control              //2 bits        continuity_counter                  //4 bits        if(adaption_field_control == '10' || adaption_field_control == '11') {            adaption_fields();                      }        if(adaption_field_control == '01' || adaption_field_control == '11') {            for(i=0; i<N; i++){                date_byte                   //8 bits            }        }   }

2.传输流分组层中各字段的定义
同步字节字段 sync_byte
一个固定的值‘0100 0111’(0x47),用来做同步。
传输错误指示标字段 transport_error_indicator
一个标志位。置‘1’表示相关传输流分组中至少有一个不可纠正的位误差。
有效负载数据单元起始指示符字段 pay_load_unit_start_indicator
一个标志位,对于携带PES分组或PSI数据的传输流分组有不同的含义
在传输流分组的有效负载数据包含PES分组数据时,该标志位置‘1’表示传输流分组的有效负载数据以PES分组的首字节开始,‘0’表示该传输流分组不以PES分组开始。
在传输流分组的有效负载数据包含PSI数据时,若传输流分组携带PSI段的第一个字节,则该值为‘1’,表示传输流分组中有效负载数据的首字节带有point_field。否则,该值为‘0’,表示无point_field。
传输优先级 transport_priority
一个标志位,置‘1’时表示相关分组比PID相同但该为为‘0’的其他分组的优先级更高
PID字段 PID
13个标志位,表示分组有效负载数据中存储的数据类型。PID值0x00表示 节目关联表,0x01表示条件存取表。
传输加扰控制字段 transport_scrambling_control
2个标志位,00表示不被加扰,其他表示用户定义加扰
适应字段控制字段 adaption_field_control
2个标志位,指出传输流分组标题后是否有适应字段及有效负载数据
‘00’:ISO/IEC 保留,以供将来使用
‘01’:没有适应字段,仅有有效负载
‘10’:仅有适应字段,没有有效负载
‘11’:跟有有效负载的适应字段
连续性计数器字段 continuity_counter
4个标志位,随着每个具有相同PID值的传输流分组而递增。在达到最大值后,回卷为0。当 adaption_field_control 为‘00’或 ‘10’时,该字段不应该递增。
3.对TS流中的一个数据包进行分析
一个数据包的188字节
可以得到以下信息
这里写图片描述
(二)PSI 节目特定信息
在传输流中,PSI被分为4个表结构,如下图,它们被进一步划分为各个段并插入到传输流分组中,一些带有预定的PID,另一些为用户可选的PID。

结构名 PID号码 描述 节目关联表 0x00 将节目号码与节目映射表PID相关联 节目映射表 PAT中指出 指定一个或多个节目成分的PID值 网络信息表 PAT中指出 诸如FDM频率,异频收发机号等物理网络参数 条件存取表 0x01 将一个或多个(专用)EMM流分别与唯一的PID值相关联

被划分的各个段可能长度不一样,每一段的开始由传输流有效负载中的pointer_field来标识。携带PSI段的传输流分组还可能有适应字段,在一个传输流中,值为0xFF的分组填充字节可能会出现在一个段的末字节后,这种情况下到分组结束的所有字节都将为0xFF填充字节。这些0xFF字节会被解码器丢弃,此时有相同PID值的下一次传输流分组有效负载,应以值0x00的pointer_field作为起始码,以指出紧跟其后开始的下一个段。
1. 指针字段 pointer_field
8个标志位,其值表示紧跟其后的直到出现在传输流分组的有效负载中第一个段的首字节为止的字节数(0x00表示该段紧跟在pointer_field之后开始)。当至少有一个段开始于给定的传输流分组中时,payload_unit_start_indicator应置‘1’且传输流分组的有效负载的首字节应该包含该指针。当没有段开始于给定的传输流分组中时,payload_unit_start_indicator置‘0’且分组的有效负载将不传送指针。
2. 节目关联表 PAT
节目关联表给出了携带节目定义的传输流分组中program_number与该分组的PID值的对应关系。program_number是与一个节目相关联的数值标号。

节目相关段

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

3.节目相关段中各个字段的语义定义
表标识字段 table_id
8位字段,PAT表值为0x00
段语法指示符字段 section_syntax_indicator
值为 1
段长度字段 section_length
12位字段,前两位为00,后10位规定紧跟在该字段之后且包括CRC的该段字节数目
传输流标识字段 transport_stream_id
16位字段,其值由用户定义
版本号字段 version_number
5位字段,整个节目相关表的版本号
当前下一个指示符字段 current_next_indicator
1位字段,置‘1’表示传送的节目相关表是当前适用,‘0’表示当前不适用,它是下一个生效的表
段号字段 section_number

8位字段,给出了该段的号码。节目相关表中第一个段的section_number应该为0x00。节目相关表每增加一个段,它将递增1

末段号字段 last_section_number

8位字段,给出整个节目相关表中最后一段(即最高的section_number)的号码

节目号字段 program_number
16位字段,规定program_map_PID可适用的节目,当值为0x00时,其后的PID参照将是网络PID
网络PID字段 network_PID
13位字段,指定包含网络信息表的传输流分组的PID
节目映射PID字段 program_map_PID
13位字段,用作于program_number所指定节目的program_map_section的传输流分组的PID
CRC_32字段
32位字段,包含CRC值

4.对TS流中的一个数据包进行分析
PAT数据包
可以得到一下信息,数据包的头

这里写图片描述
分析其他信息可得
因为在数据包头中payload_unit_start_indicator为1,所有有效负载的首字节应该为pointer_field, = 0x00。

标志位 数据 说明 pointer_field 0x00 下一个字节就是有效负载的第一个字节 table_id 0x00 PAT PID 0x00 section_syntax_indicator 1 reserved 3 section_length 0x51 紧跟这个字节之后并且包含CRC的长度 transport_stream_id 0x01 reserved 3 version_number 0x00 current_next_indicator 1 节目相关表当前适用 section_number 0x00 表示PAT表的段号 last_section_number 0x00 PAT表段号的最大值 program_number 0x00 网络PID program_map_PID/net_work_PID 0x10 网络PID=0x10

这里写图片描述
最后再附上EasyICE分析结果

原创粉丝点击