diff --git a/trunk/research/ts_info.cpp b/trunk/research/ts_info.cpp index 4cbc15ac9..a4536b377 100755 --- a/trunk/research/ts_info.cpp +++ b/trunk/research/ts_info.cpp @@ -440,15 +440,51 @@ public: // 1B u_int8_t PES_header_data_length; //8bits - /** - * logic data. - */ - // generated by PTS_DTS_flags int64_t pts; // 33bits int64_t dts; // 33bits + + int16_t ESCR_extension; //9bits + int64_t ESCR_base; //33bits + int32_t ES_rate; //22bits + + int8_t trick_mode_control; //3bits + int8_t trick_mode_value; //5bits + + int8_t additional_copy_info; //7bits + int16_t previous_PES_packet_CRC; //16bits + + int8_t PES_private_data_flag; //1bit + int8_t pack_header_field_flag; //1bit + int8_t program_packet_sequence_counter_flag; //1bit + int8_t P_STD_buffer_flag; //1bit + // reserved 3bits + int8_t PES_extension_flag_2; //1bit + + // 16B + char* PES_private_data; //128bits + + int8_t pack_field_length; //8bits + char* pack_field; //[pack_field_length] bytes + + int8_t program_packet_sequence_counter; //7bits + int8_t MPEG1_MPEG2_identifier; //1bit + int8_t original_stuff_length; //6bits + + int8_t P_STD_buffer_scale; //1bit + int16_t P_STD_buffer_size; //13bits + + int8_t PES_extension_field_length; //7bits + char* PES_extension_field; //[PES_extension_field_length] bytes + + int stuffing_size; + char* stuffing_byte; + + char* PES_packet_data_byte; //[PES_packet_length] bytes TSPayloadPES(); virtual ~TSPayloadPES(); + int64_t decode_33bits_int(u_int8_t*& p, int64_t& temp); + int64_t decode_33bits_int(int64_t& temp); int demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t* last, u_int8_t*& p); }; @@ -537,10 +573,38 @@ void TSContext::push(TSPidType type, int16_t pid) TSAdaptionField::TSAdaptionField() { + adaption_field_length = 0; + discontinuity_indicator = 0; + random_access_indicator = 0; + elementary_stream_priority_indicator = 0; + PCR_flag = 0; + OPCR_flag = 0; + splicing_point_flag = 0; + transport_private_data_flag = 0; + adaptation_field_extension_flag = 0; + program_clock_reference_base = 0; + program_clock_reference_extension = 0; + original_program_clock_reference_base = 0; + original_program_clock_reference_extension = 0; + splice_countdown = 0; + transport_private_data_length = 0; transport_private_data = NULL; + adaptation_field_extension_length = 0; + ltw_flag = 0; + piecewise_rate_flag = 0; + seamless_splice_flag = 0; + ltw_valid_flag = 0; + ltw_offset = 0; + piecewise_rate = 0; + splice_type = 0; + DTS_next_AU0 = 0; + marker_bit0 = 0; + DTS_next_AU1 = 0; + marker_bit1 = 0; + DTS_next_AU2 = 0; + marker_bit2 = 0; af_ext_reserved = NULL; af_reserved = NULL; - __user_size = 0; } @@ -719,7 +783,18 @@ int TSPayloadReserved::demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_i TSPayloadPAT::TSPayloadPAT() { + table_id = 0; + section_syntax_indicator = 0; + const0_value = 0; + section_length = 0; + transport_stream_id = 0; + version_number = 0; + current_next_indicator = 0; + section_number = 0; + last_section_number = 0; + program_size = 0; programs = NULL; + CRC_32 = 0; } TSPayloadPAT::~TSPayloadPAT() @@ -781,7 +856,9 @@ int TSPayloadPAT::demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t TSPMTESInfo::TSPMTESInfo() { - ES_info_length = 0; + stream_type = 0; + elementary_PID = 0; + ES_info_length = 0; ES_info = NULL; } @@ -792,8 +869,19 @@ TSPMTESInfo::~TSPMTESInfo() TSPayloadPMT::TSPayloadPMT() { - program_info_length = 0; - program_info_desc = NULL; + table_id = 0; + section_syntax_indicator = 0; + const0_value = 0; + section_length = 0; + program_number = 0; + version_number = 0; + current_next_indicator = 0; + section_number = 0; + last_section_number = 0; + PCR_PID = 0; + program_info_length = 0; + program_info_desc = NULL; + CRC_32 = 0; } TSPayloadPMT::~TSPayloadPMT() @@ -904,11 +992,92 @@ int TSPayloadPMT::demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t TSPayloadPES::TSPayloadPES() { - pts = dts = 0; + packet_start_code_prefix = 0; + stream_id = 0; + PES_packet_length = 0; + PES_scrambling_control = 0; + PES_priority = 0; + data_alignment_indicator = 0; + copyright = 0; + original_or_copy = 0; + PTS_DTS_flags = 0; + ESCR_flag = 0; + ES_rate_flag = 0; + DSM_trick_mode_flag = 0; + additional_copy_info_flag = 0; + PES_CRC_flag = 0; + PES_extension_flag = 0; + PES_header_data_length = 0; + pts = 0; + dts = 0; + ESCR_extension = 0; + ESCR_base = 0; + ES_rate = 0; + trick_mode_control = 0; + trick_mode_value = 0; + additional_copy_info = 0; + previous_PES_packet_CRC = 0; + PES_private_data_flag = 0; + pack_header_field_flag = 0; + program_packet_sequence_counter_flag = 0; + P_STD_buffer_flag = 0; + PES_extension_flag_2 = 0; + PES_private_data = NULL; + pack_field_length = 0; + pack_field = NULL; + program_packet_sequence_counter = 0; + MPEG1_MPEG2_identifier = 0; + original_stuff_length = 0; + P_STD_buffer_scale = 0; + P_STD_buffer_size = 0; + PES_extension_field_length = 0; + PES_extension_field = NULL; + stuffing_size = 0; + stuffing_byte = NULL; + PES_packet_data_byte = NULL; } TSPayloadPES::~TSPayloadPES() { + srs_freepa(PES_private_data); + srs_freepa(pack_field); + srs_freepa(PES_extension_field); + srs_freepa(stuffing_byte); + srs_freepa(PES_packet_data_byte); +} + +int64_t TSPayloadPES::decode_33bits_int(u_int8_t*& p, int64_t& temp) +{ + char* pp = (char*)&temp; + pp[4] = *p++; + pp[3] = *p++; + pp[2] = *p++; + pp[1] = *p++; + pp[0] = *p++; + + return decode_33bits_int(temp); +} + +int64_t TSPayloadPES::decode_33bits_int(int64_t& temp) +{ + int64_t ret = 0; + + // marker_bit 1bit + temp = temp >> 1; + // PTS [14..0] 15bits + ret |= temp & 0x3fff; + // marker_bit 1bit + temp = temp >> 1; + // PTS [29..15] 15bits, 15zero, 29-15+1one + ret |= temp & 0x3fff8000; + // marker_bit 1bit + temp = temp >> 1; + // PTS [32..30] 3bits + ret |= temp & 0x1c0000000; + + temp = temp >> 33; + + return ret; } int TSPayloadPES::demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t* last, u_int8_t*& p) @@ -957,82 +1126,141 @@ int TSPayloadPES::demux(TSContext* ctx, TSPacket* pkt, u_int8_t* start, u_int8_t PES_extension_flag &= 0x01; PES_header_data_length = *p++; + u_int8_t* pos = p; + int64_t temp = 0; if (PTS_DTS_flags == 0x2) { - int64_t temp = 0; - pp = (char*)&temp; - pp[4] = *p++; - pp[3] = *p++; - pp[2] = *p++; - pp[1] = *p++; - pp[0] = *p++; - - // marker_bit 1bit - temp = temp >> 1; - // PTS [14..0] 15bits - pts |= temp & 0x3FFF; - // marker_bit 1bit - temp = temp >> 1; - // PTS [29..15] 15bits - pts |= temp & 0x3fff8000; - // marker_bit 1bit - temp = temp >> 1; - // PTS [32..30] 3bits - pts |= temp & 0x1c0000000; + pts = decode_33bits_int(p, temp); // '0010' 4bits - //int8_t const4bits = (temp >> 32) & 0x0F; + //int8_t const4bits = temp & 0x0F; } if (PTS_DTS_flags == 0x3) { - int64_t temp = 0; - - pp = (char*)&temp; - pp[4] = *p++; - pp[3] = *p++; - pp[2] = *p++; - pp[1] = *p++; - pp[0] = *p++; + pts = decode_33bits_int(p, temp); + // '0011' 4bits + //int8_t const4bits = temp & 0x0F; - // marker_bit 1bit - temp = temp >> 1; - // PTS [14..0] 15bits - pts |= temp & 0x3FFF; - // marker_bit 1bit - temp = temp >> 1; - // PTS [29..15] 15bits - pts |= temp & 0x3fff8000; - // marker_bit 1bit - temp = temp >> 1; - // PTS [32..30] 3bits - pts |= temp & 0x1c0000000; - // '0010' 4bits - //int8_t const4bits = (temp >> 32) & 0x0F; - - pp = (char*)&temp; - pp[4] = *p++; - pp[3] = *p++; - pp[2] = *p++; - pp[1] = *p++; - pp[0] = *p++; - - // marker_bit 1bit - temp = temp >> 1; - // PTS [14..0] 15bits - dts |= temp & 0x3FFF; - // marker_bit 1bit - temp = temp >> 1; - // PTS [29..15] 15bits - dts |= temp & 0x3fff8000; - // marker_bit 1bit - temp = temp >> 1; - // PTS [32..30] 3bits - dts |= temp & 0x1c0000000; - // '0010' 4bits - //int8_t const4bits = (temp >> 32) & 0x0F; + dts = decode_33bits_int(p, temp); + // '0001' 4bits + //int8_t const4bits = temp & 0x0F; } if (ESCR_flag) { + pp = (char*)&temp; + pp[5] = *p++; + pp[4] = *p++; + pp[3] = *p++; + pp[2] = *p++; + pp[1] = *p++; + pp[0] = *p++; + + // marker_bit 1bit + temp = temp >> 1; + // ESCR_extension 9bits + ESCR_extension = temp & 0x1f; + temp = temp >> 9; + + ESCR_base = decode_33bits_int(temp); + + // reserved 2bits + //int8_t reserved2bits = temp & 0x03; } + + if (ES_rate_flag) { + pp = (char*)&ES_rate; + pp[2] = *p++; + pp[1] = *p++; + pp[0] = *p++; + + ES_rate = ES_rate >> 1; + ES_rate &= 0x3FFFFF; + } + + if (DSM_trick_mode_flag) { + trick_mode_control = *p++; + + trick_mode_value = trick_mode_control & 0x1f; + trick_mode_control = (trick_mode_control >> 5) & 0x03; + } + + if (additional_copy_info_flag) { + additional_copy_info = *p++; + additional_copy_info &= 0x7f; + } + + if (PES_CRC_flag) { + pp = (char*)&previous_PES_packet_CRC; + pp[1] = *p++; + pp[0] = *p++; + } + + if (PES_extension_flag) { + PES_extension_flag_2 = *p++; + + PES_private_data_flag = (PES_extension_flag_2 >> 7) & 0x01; + pack_header_field_flag = (PES_extension_flag_2 >> 6) & 0x01; + program_packet_sequence_counter_flag = (PES_extension_flag_2 >> 5) & 0x01; + P_STD_buffer_flag = (PES_extension_flag_2 >> 4) & 0x01; + PES_extension_flag_2 &= PES_extension_flag_2 & 0x01; + + if (PES_private_data_flag) { + PES_private_data = new char[16]; + memcpy(PES_private_data, p, 16); + p += 16; + } + + if (pack_header_field_flag) { + pack_field_length = *p++; + if (pack_field_length > 0) { + pack_field = new char[pack_field_length]; + memcpy(pack_field, p, pack_field_length); + p += pack_field_length; + } + } + + if (program_packet_sequence_counter_flag) { + program_packet_sequence_counter = *p++; + program_packet_sequence_counter &= 0x7f; + + original_stuff_length = *p++; + MPEG1_MPEG2_identifier = (original_stuff_length >> 6) & 0x01; + original_stuff_length &= 0x3f; + } + + if (P_STD_buffer_flag) { + pp = (char*)&P_STD_buffer_size; + pp[1] = *p++; + pp[0] = *p++; + + // '01' + //int8_t const2bits = (P_STD_buffer_scale >>14) & 0x03; + + P_STD_buffer_scale = (P_STD_buffer_scale >>13) & 0x01; + P_STD_buffer_size &= 0x1FFF; + } + + if (PES_extension_flag_2) { + PES_extension_field_length = *p++; + PES_extension_field_length &= 0x07; + + if (PES_extension_field_length > 0) { + PES_extension_field = new char[PES_extension_field_length]; + memcpy(PES_extension_field, p, PES_extension_field_length); + p += PES_extension_field_length; + } + } + } + + // stuffing_byte + int stuffing_size = PES_header_data_length - (p - pos); + if (stuffing_size > 0) { + stuffing_byte = new char[stuffing_size]; + memcpy(stuffing_byte, p, stuffing_size); + p += stuffing_size; + } + + // PES_packet_data_byte + PES_packet_data_byte = new char[PES_packet_length]; } else if (stream_id == PES_program_stream_map || stream_id == PES_private_stream_2 || stream_id == PES_ECM_stream @@ -1064,12 +1292,13 @@ TSPayload::TSPayload() { size = 0; pointer_field_size = 0; - type = TSPidTypeReserved; + pointer_field = 0; reserved = NULL; pat = NULL; pmt = NULL; pes = NULL; + } TSPayload::~TSPayload() @@ -1179,6 +1408,14 @@ int TSPacket::finish() TSHeader::TSHeader() { + sync_byte = 0; + transport_error_indicator = 0; + payload_unit_start_indicator = 0; + transport_priority = 0; + pid = 0; + transport_scrambling_control = 0; + adaption_field_control = 0; + continuity_counter = 0; } TSHeader::~TSHeader()