Chinaunix首页 | 论坛 | 博客
  • 博客访问: 63747
  • 博文数量: 23
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 250
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-04 22:45
文章分类

全部博文(23)

文章存档

2011年(1)

2010年(1)

2009年(21)

我的朋友

分类: LINUX

2009-08-02 16:26:34

数据结构(1TS分组前面提到,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   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,具有相同的PIDTS分组传输时每次加1,到15后清0。不过,有些情况下是不计数的。如下:(1)TS分组无有效负载(2)复制的TS分组和原分组这个值一样(3)后面讲到的一个标志discontinuity_indicator1

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       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时对应的PIDnetwork_PID

program_map_PID 节目映射表的PID,节目号大于0时对应的PID,每个节目对应一个

CRC_32   CRC32校验码

上面program_numbernetwork_PIDprogram_map_PID 是循环出现的。program_number等于0时对应network_PIDprogram_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
reser
ved 4
program_info_length                   //  12
for (i=0; i  descriptor()
}
for (i=0;i  stream_type                           //  8
  reserved                              //  3
  elementary_PID                        //  13
  reserved                              //  4
  ES_info_length                        //  12
  for (i=0; 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 指示了PIDelementary_PIDPES分组中原始流的类型,比如视频流,音频流等,见后面的表

elementary_PID 该节目中包括的视频流,音频流等对应的TS分组的PID

ES_info_length 该节目相关原始流的描述符的信息长度。stream_type对应的类型:

阅读(2315) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~