数据结构:
typedef struct pmt_es_component_tag
{
D_UINT8 stream_type;
D_UINT8 bfree;
D_UINT16 elementary_PID;
}pmt_component_t;
typedef struct pid_tag
{
PID_STATE state;
PID_TYPE type;
D_UINT16 pid;
D_UINT8 ch_idx;
D_UINT8 bfree;
}ts_pid_t;
typedef struct
{
D_UINT16 prog_number;
D_UINT16 pcr_pid;
D_UINT16 video_pid;
D_UINT16 video_stream_type;
D_UINT16 audio_pid;
D_UINT16 audio_pids_cnt;
D_UINT16 audio_pids[MAX_AUDIO_PER_CHANNEL];
D_UINT16 audio_stream_type[MAX_AUDIO_PER_CHANNEL];
D_UINT8 bfree;
}PMTEXT_T;
ts分组结构
TS分组前面提到,TS分组由188个字节构成,其结构如下:
transport_packet()
{
sync_byte 8bit
transport_error_indicator 1 bit
payload_unit_start_indicator 1 bit
transport_priority 1 bit
PID 13bit
transport_scrambling_control 2 bit
adaptation_field_control 2 bit
continuity_counter 4 bit
if(adaptation_field_control=='10'||daptation_field_control=='11')
{
adaptation_field()
}
if(adaptation_field_control=='01' ||adaptation_field_control=='11')
{
for (i=0;i<N;i++)
{
data_byte 8 bit
}
}
}
前面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,或一些自定义的数据。
PAT数据结构如下:
program_association_section()
{
table_id 8
section_syntax_indicator 1