我正在尝试编写自己的多路复用器。 我到达了PES数据包
我构建了一个getbit,getbyte(s)命令,以将每个提取到pes数据包中的条目中。
到达该点时,我无法计算N1(填充)和N2(实际有效载荷)。
有人可以帮助理解N1和N2是什么,以便直接在字节上循环播放。
PES_packet() {
packet_start_code_prefix 24 bslbf
stream_id 8 uimsbf
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-T Rec. H.222.1 type E stream) {
'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
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
PES_header_data_length 8 uimsbf
if (PTS_DTS_flags == '10') {
'0010' 4 bslbf
PTS [32..30] 3 bslbf
marker_bit 1 bslbf
PTS [29..15] 15 bslbf
marker_bit 1 bslbf
PTS [14..0] 15 bslbf
marker_bit 1 bslbf
}
ISO/IEC 13818-1 : 2000 (E)
32 ITU-T Rec. H.222.0 (2000 E)
Table 2-17 – PES packet (continued)
Syntax No. of bits Mnemonic
if (PTS_DTS_flags == '11') {
'0011' 4 bslbf
PTS [32..30] 3 bslbf
marker_bit 1 bslbf
PTS [29..15] 15 bslbf
marker_bit 1 bslbf
PTS [14..0] 15 bslbf
marker_bit 1 bslbf
'0001' 4 bslbf
DTS [32..30] 3 bslbf
marker_bit 1 bslbf
DTS [29..15] 15 bslbf
marker_bit 1 bslbf
DTS [14..0] 15 bslbf
marker_bit 1 bslbf
}
if (ESCR_flag == '1') {
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') {
marker_bit 1 bslbf
ES_rate 22 uimsbf
marker_bit 1 bslbf
}
if (DSM_trick_mode_flag == '1') {
trick_mode_control 3 uimsbf
if ( trick_mode_control == fast_forward ) {
field_id 2 bslbf
intra_slice_refresh 1 bslbf
frequency_truncation 2 bslbf
}
else if ( trick_mode_control == slow_motion ) {
rep_cntrl 5 uimsbf
}
else if ( trick_mode_control == freeze_frame ) {
field_id 2 uimsbf
reserved 3 bslbf
}
else if ( trick_mode_control == fast_reverse ) {
field_id 2 bslbf
intra_slice_refresh 1 bslbf
frequency_truncation 2 bslbf
else if ( trick_mode_control == slow_reverse ) {
rep_cntrl 5 uimsbf
}
else
reserved 5 bslbf
}
if ( additional_copy_info_flag == '1') {
marker_bit 1 bslbf
additional_copy_info 7 bslbf
}
if ( PES_CRC_flag == '1') {
previous_PES_packet_CRC 16 bslbf
}
ISO/IEC 13818-1 : 2000 (E)
ITU-T Rec. H.222.0 (2000 E) 33
Table 2-17 – PES packet (concluded)
Syntax No. of bits Mnemonic
if ( PES_extension_flag == '1') {
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') {
PES_private_data 128 bslbf
}
if (pack_header_field_flag == '1') {
pack_field_length 8 uimsbf
pack_header()
}
if (program_packet_sequence_counter_flag == '1') {
marker_bit 1 bslbf
program_packet_sequence_counter 7 uimsbf
marker_bit 1 bslbf
MPEG1_MPEG2_identifier 1 bslbf
original_stuff_length 6 uimsbf
}
if ( P-STD_buffer_flag == '1') {
'01' 2 bslbf
P-STD_buffer_scale 1 bslbf
P-STD_buffer_size 13 uimsbf
}
if ( PES_extension_flag_2 == '1') {
marker_bit 1 bslbf
PES_extension_field_length 7 uimsbf
for (i = 0; i < PES_extension_field_length; i++) {
reserved 8 bslbf
}
}
}
for (i = 0; i < **N1**; i++) {
stuffing_byte 8 bslbf
}
for (i = 0; i < **N2**; i++) {
PES_packet_data_byte 8 bslbf
}
}
else if ( 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-T Rec. H.222.1 type E stream ) {
for (i = 0; i < PES_packet_length; i++) {
PES_packet_data_byte 8 bslbf
}
}
else if ( stream_id == padding_stream) {
for (i = 0; i < PES_packet_length; i++) {
padding_byte 8 bslbf
}
}
}