stuffing_byte
8
bslbf
}
if(nextbits()==system_header_start_code){
system_header()
}
}
包起始码字段pack_start_code
值为'00000000000000000000000110111010'(0x000001BA)的位串,用来标志一个包的开始。
系统时钟参考字段system_clock_reference_base,system_clock_reference_extenstion
系统时钟参考(SCR)分两部分编码的42位字段。
第一部分system_clock_reference_base是一个长度为33位的字段;第二部分system_clock_reference_extenstion是一个长度为9位的字段。
SCR字段指出了基本流中包含ESCR_base最后一位的字节到达节目目标解码器输入端的期望时间。
标记位字段marker_bit
1位字段,取值'1'。
节目复合速率字段program_mux_rate
一个22位整数,规定P-STD在包含该字段的包期间接收节目流的速率。
其值以50字节/秒为单位。
不允许取0值。
该字段值在本标准中的节目多路复合流的不同包中取值可能不同。
包填充长度字段pack_stuffing_length
3位整数,规定该字段后填充字节的个数。
填充字节字段stuffing_byte
8位字段,取值恒为'11111111'。
该字段能由编码器插入,例如为了满足通道的要求。
它由解码器丢弃。
在每个包标题中最多只允许有7个填充字节。
3.2系统标题
offset
语法
位数
助记符
system_header(){
0
system_header_start_code
32
bslbf
4
header_length
16
uimsbf
6
marker_bit
1
bslbf
rate_bound
22
uimsbf
marker_bit
1
bslbf
9
audio_bound
6
uimsbf
fixed_flag
1
bslbf
CSPS_flag
1
bslbf
10
system_audio_lock_flag
1
bslbf
system_video_lock_flag
1
bslbf
marker_bit
1
bslbf
vedio_bound
5
uimsbf
11
packet_rate_restriction_flag
1
bslbf
reserved_bits
7
bslbf
12
while(nextbits()=='1'){
stream_id
8
uimsbf
'11'
2
bslbf
P-STD_buffer_bound_scale
1
bslbf
P-STD_buffer_size_bound
13
uimsbf
}
}
系统标题起始码字段system_header_start_code
取值'00000000000000000000000110111011'(0x000001BB)的位串,指出系统标题的开始。
标题长度字段header_length
16位字段。
指出该字段后的系统标题的字节长度。
在本规范将来的扩充中可能扩展该字段。
速率界限字段rate_bound
22位字段,取值不小于编码在节目流的任何包中的program_mux_rate字段的最大值。
该字段可被解码器用于估计是否有能力对整个流解码。
音频界限字段audio_bound
6位字段,取值是在从0到32的闭区间中的整数,且不小于节目流中音频流的最大数目。
固定标志字段fixed_flag
1位标志位。
置'1'时表示比特率恒定的操作;置'0'时,表示操作的比特率可变。
CSPS标志字段CSPS_flag
1位字段。
系统音频锁定标志字段system_audio_lock_flag
1位字段。
表示在系统目标解码器的音频采样率和system_clock_frequency之间存在规定的比率。
系统视频锁定标志字段system_video_lock_flag
1位字段。
表示在系统目标解码器的视频帧速率和system_clock_frequency之间存在规定的比率。
比率SCFR的值是精确的。
视频界限字段video_bound
5位字段,取值是在从0到16的闭区间中的整数且不小于节目流中解码过程同时活动的流的最大数目。
分组速率限制标志字段packet_rate_restriction_flag
1位标志位。
若CSPS标识为'0',则该字段的含义未定义。
保留位字段reserved_bits
7位字段。
被保留供ISO/IEC将来使用。
它的值应为'1111111',除非ISO/IEC对它作出其它规定。
流标识字段stream_id
8位字段。
指示其后的P-STD_buffer_bound_scale和P-STD_buffer_size_bound字段所涉及的流的编码和基本流号码。
若取值'10111000'(0xB8),则其后的P-STD_buffer_bound_scale和P-STD_buffer_size_bound字段指节目流中所有的音频流;若取值'10111001'(0xB9),则其后的P-STD_buffer_bound_scale和P-STD_buffer_size_bound字段指节目流中所有的视频流;若stream_id取其它值,则应该是大于或等于'10111100'的一字节值且应根据下表解释为流的编码和基本流号码。
a)MPEG-4视频流:
0x10;
b)H.264视频流:
0x1B;
c)SVAC视频流:
0x80;
d)G.711音频流:
0x90;
e)G.722.1音频流:
0x92;
f)G.723.1音频流:
0x93;
g)G.729音频流:
0x99;
h)SVAC音频流:
0x9B。
节目流中的每个基本流应在每个系统标题中通过这种机制精确地规定一次它的P-STD_buffer_bound_scale和P-STD_buffer_size_bound;
P-STD缓冲区界限比例字段P-STD_buffer_bound_scale
1位字段。
表示用于解释后续P-STD_buffer_size_bound字段的比例系数。
若前面的stream_id表示一个音频流,则该字段值为'0'。
若表示一个视频流,则该字段值为'1'。
对于所有其它的流类型,该字段值可以为'0'也可以为'1'。
P-STD缓冲区大小界限字段P-STD_buffer_size_bound
13位无符号整数,取值不小于节目流中流n的所有分组的P-STD缓冲区大小BSn的最大值。
若P-STD_buffer_bound_scale的值为'0',则该字段以128字节为单位来度量缓冲区大小的边界。
若P-STD_buffer_bound_scale的值为'1',则该字段以1024字节为单位来度量缓冲区大小的边界。
3.3PES分组头部
offset
语法
位数
助记符
PES_packet(){
0
packet_start_code_prefix
24
bslbf
3
stream_id
8
uimsbf
4
PES_packet_length
16
uimsbf
if(stream_id!
=program_stream_map
&&stream_id!
=padding_stream
&&stream_id!
=private_stream_2
&&stream_id!
=ECM
&&stream_id!
=EMM
&&stream_id!
=program_stream_directory
&&stream_id!
=DSMCC_stream
&&stream_id!
=ITU-TRec.H.222.1typeEstream){
6
'10'
2
bslbf
PES_scrambling_control
2
bslbf
PES_priority
1
bslbf
data_alignment_indicator
1
bslbf
copyright
1
bslbf
original_or_copy
1
bslbf
7
PTS_DTS_flags
2
bslbf
ESCR_flag
1
bslbf
ES_rate_flag
1
bslbf
DSM_trick_mode_flag
1
bslbf
additional_copy_info_flag
1
bslbf
PES_CRC_flag
1
bslbf
PES_extension_flag
1
bslbf
8
PES_header_data_length
8
uimsbf
if(PTS_DTS_flags=='10'){
9
'0010'
4
bslbf
PTS[32..30]
3
bslbf
marker_bit
1
bslbf
10
PTS[29..15]
15
bslbf
marker_bit
1
bslbf
12
PTS[14..0]
15
bslbf
marker_bit
1
bslbf
}
if(PTS_DTS_flags=='11'){
9
'0011'
4
bslbf
PTS[32..30]
3
bslbf
marker_bit
1
bslbf
10
PTS[29..15]
15
bslbf
marker_bit
1
bslbf
12
PTS[14..0]
15
bslbf
marker_bit
1
bslbf
14
'0001'
4
bslbf
PTS[32..30]
3
bslbf
marker_bit
1
bslbf
15
PTS[29..15]
15
bslbf
marker_bit
1
bslbf
17
PTS[14..0]
15
bslbf
marker_bit
1
bslbf
}
if(ESCR_flag=='1'){
9
reserved
2
bslbf
ESCR_base[32..30]
3
bslbf
marker_bit
1
bslbf
ESCR_base[29..15]
15
bslbf
marker_bit
1
bslbf
ESCR_base[14..0]
15
bslbf
marker_bit
1
bslbf
ESCR_extension
9
uimsbf
marker_bit
1
bslbf
}
if(ES_rate_flag=='1'){
9
marker_bit
1
bslbf
ES_rate
22
uimsbf
marker_bit
1
bslbf
}
if(DSM_trick_mode_flag=='1'){
9
trick_mode_control
3
uimsbf
if(trick_mode_control==fast_forward){
field_id
2
bslbf
intra_slice_refresh
1
bslbf
frequency_truncation
2
bslbf
}
elseif(trick_mode_control==slow_motion){
rep_cntrl
5
uimsbf
}
elseif(trick_mode_control==freeze_frame){
field_id
2
uimsbf
reserved
3
bslbf
}
elseif(trick_mode_control==fast_reverse){
field_id
2
bslbf
intra_slice_refresh
1
bslbf
frequency_truncation
2
bslbf
elseif(trick_mode_control==slow_reverse){
rep_cntrl
5
uimsbf
}
else
reserved
5
bslbf
}
if(additional_copy_info_flag=='1'){
9
marker_bit
1
bslbf
additional_copy_info
7
bslbf
}
if(PES_CRC_flag==‘1’){
9
previous_PES_packet_CRC
16
bslbf
}
if(PES_extension_flag=='1'){
9
PES_private_data_flag
1
bslbf
pack_header_field_flag
1
bslbf
program_packet_sequence_counter_flag
1
bslbf
P-STD_buffer_flag
1
bslbf
reserved
3
bslbf
PES_extension_flag_2
1
bslbf
if(PES_private_data_flag=='1'){
10
PES_private_data
128
bslbf
}
if(pack_header_field_flag=='1'){
10
pack_field_length
8
uimsbf
pack_header()
}
if(program_packer_sequence_counter_flag=='1'){
10
marker_bit
1
bslbf
program_packet_sequence_counter
7
uimsbf
11
marker-bit
1
bslbf
MPEG1_MPEG2_indentifier
1
bslbf
original_stuff_length
6
uimsbf
}
if(P-STD_buffer_flag=='1'({
10
'01'
2
bslbf
P-STD_buffer_scale
1
bslbf
P-STD_buffer_size
13
uimsbf
}
if(PES_extension_flag_2=='1'{
10
marker_bit
1
bslbf
PES_extension_field_length
7
uimsbf
for(i=0;ireserved
8
bslbf
}
}
}
9
for(i=0;istuffing_byte
8
bslbf
}
9
for(i=0;iPES_packet_data_byte
8
bslbf
}
}
elseif(stream_id==program_stream_map
||stream_id==private_stream_2
||stream_id==ECM
||stream_id==EMM
||stream_id==program_stream_directory
||stream_id==DSMCC_stream
||stream_id==ITU-TRec.H.222.1typeEstream){
for(i=0;iPES