传输流(TS)
将具有共同时间基准或具有独立时间基准的一个或多个PES组合而成的单一的数据流称为传输流(Transport Stream)。TS实际是面向数字化分配媒介(有线、卫星、地面网)的传输层接口。对具有共同时间基准的两个以上的PES先进行节目复用,然后再对相互可有独立时间基准的各个PS进行传输复用,即将每个PES再细分为更小的TS包
TS包由包头、自适应区和包数据3部分组成。每个包长度为固定的188B,包头长度占4 B,自适应区和包数据长度占184B。184B为有用信息空间,用于传送已编码的视音频数据流。当节目时钟基准(PCR-Program Clock Reference)存在时,包头还包括可变长度的自适应区,包头的长度就会大于4B。考虑到与通信的关系,整个传输包固定长度应相当于4个ATM包。考虑到加密是按照8B顺序加扰的,代表有用信息的自适应区和包数据的长度应该是8B的整数倍,即自适应区和包数据为23×8B =184B。
TS包的包头由如图所示的同步字节、传输误码指示符、有效载荷单元起始指示符、传输优先、包识别(PID-Packet Identification)、传输加扰控制、自适应区控制和连续计数器8个部分组成。其中,可用同步字节位串的自动相关特性,检测数据流中的包限制,建立包同步;传输误码指示符,是指有不能消除误码时,采用误码校正解码器可表示1bit 的误码,但无法校正;有效载荷单元起始指示符,表示该数据包是否存在确定的起始信息;传输优先,是给TS包分配优先权;PID值是由用户确定的,解码器根据PID将TS上从不同ES来的TS包区别出来,以重建原来的ES;传输加扰控制,可指示数据包内容是否加扰,但包头和自适应区永远不加扰;自适应区控制,用2 bit表示有否自适应区,即(01)表示有有用信息无自适应区,(10)表示无有用信息有自适应区,(11)表示有有用信息有自适应区,(00)无定义;连续计数器可对PID包传送顺序计数,据计数器读数,接收端可判断是否有包丢失及包传送顺序错误。显然,包头对TS包具有同步、识别、检错及加密功能。
TS包自适应区由自适应区长、各种标志指示符、与插入标志有关的信息和填充数据4部分组成。其中标志部分由间断指示符、随机存取指示符、ES优化指示符、PCR标志、接点标志、传输专用数据标志、原始PCR标志、自适应区扩展标志8个部分组成。
TS包语法结构如下:
Syntax | No. of bits | Mnemonic |
transport_packet(){ |
|
|
sync_byte | 8 | bslbf |
transport_error_indicator | 1 | bslbf |
payload_unit_start_indicator | 1 | bslbf |
transport_priority | 1 | bslbf |
PID | 13 | uimsbf |
transport_scrambling_control | 2 | bslbf |
adaptation_field_control | 2 | bslbf |
continuity_counter | 4 | uimsbf |
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 | bslbf |
} |
|
|
} |
|
|
} |
|
|
自适应控制区语法结构如下:
Syntax | No. of Bits | Mnemonic |
adaptation_field() { |
|
|
adaptation_field_length | 8 | uimsbf |
if(adaptation_field_length >0) { |
|
|
discontinuity_indicator | 1 | bslbf |
random_access_indicator | 1 | bslbf |
elementary_stream_priority_indicator | 1 | bslbf |
PCR_flag | 1 | bslbf |
OPCR_flag | 1 | bslbf |
splicing_point_flag | 1 | bslbf |
transport_private_data_flag | 1 | bslbf |
adaptation_field_extension_flag | 1 | bslbf |
if(PCR_flag == '1') { |
|
|
program_clock_reference_base | 33 | uimsbf |
reserved | 6 | bslbf |
program_clock_reference_extension | 9 | uimsbf |
} |
|
|
if(OPCR_flag == '1') { |
|
|
original_program_clock_reference_base | 33 | uimsbf |
reserved | 6 | bslbf |
original_program_clock_reference_extension | 9 | uimsbf |
} |
|
|
if (splicing_point_flag == '1') { |
|
|
splice_countdown | 8 | tcimsbf |
} |
|
|
if(transport_private_data_flag == '1') { |
|
|
transport_private_data_length | 8 | uimsbf |
for (i=0; i<transport_private_data_length;i++){ |
|
|
private_data_byte | 8 | bslbf |
} |
|
|
} |
|
|
if (adaptation_field_extension_flag == '1' ) { |
|
|
adaptation_field_extension_length | 8 | uimsbf |
ltw_flag | 1 | bslbf |
piecewise_rate_flag | 1 | bslbf |
seamless_splice_flag | 1 | bslbf |
reserved | 5 | bslbf |
if (ltw_flag == '1') { |
|
|
ltw_valid_flag | 1 | bslbf |
ltw_offset | 15 | uimsbf |
} |
|
|
if (piecewise_rate_flag == '1') { |
|
|
reserved | 2 | bslbf |
piecewise_rate | 22 | uimsbf |
} |
|
|
if (seamless_splice_flag == '1'){ |
|
|
splice_type | 4 | bslbf |
DTS_next_AU[32..30] | 3 | bslbf |
marker_bit | 1 | bslbf |
DTS_next_AU[29..15] | 15 | bslbf |
marker_bit | 1 | bslbf |
DTS_next_AU[14..0] | 15 | bslbf |
marker_bit | 1 | bslbf |
} |
|
|
for ( i=0;i<N;i++) { |
|
|
reserved | 8 | bslbf |
} |
|
|
} |
|
|
for (i=0;i<N;i++){ |
|
|
stuffing_byte | 8 | bslbf |
} |
|
|
} |
|
|
} |