diff --git a/trunk/src/kernel/srs_kernel_ts.cpp b/trunk/src/kernel/srs_kernel_ts.cpp index c129b11de..b2198d31a 100644 --- a/trunk/src/kernel/srs_kernel_ts.cpp +++ b/trunk/src/kernel/srs_kernel_ts.cpp @@ -804,7 +804,6 @@ SrsTsPacket* SrsTsPacket::create_pmt(SrsTsContext* context, int16_t pmt_number, pmt->current_next_indicator = 1; pmt->section_number = 0; pmt->last_section_number = 0; - pmt->program_info_length = 0; // must got one valid codec. srs_assert(vs == SrsTsStreamVideoH264 || as == SrsTsStreamAudioAAC || as == SrsTsStreamAudioMp3); @@ -918,8 +917,6 @@ SrsTsAdaptationField::SrsTsAdaptationField(SrsTsPacket* pkt) 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; @@ -944,7 +941,6 @@ SrsTsAdaptationField::SrsTsAdaptationField(SrsTsPacket* pkt) SrsTsAdaptationField::~SrsTsAdaptationField() { - srs_freepa(transport_private_data); } int SrsTsAdaptationField::decode(SrsBuffer* stream) @@ -1061,7 +1057,12 @@ int SrsTsAdaptationField::decode(SrsBuffer* stream) srs_error("ts: demux af transport_private_data_flag failed. ret=%d", ret); return ret; } - transport_private_data_length = (uint8_t)stream->read_1bytes(); + /** + * The transport_private_data_length is an 8-bit field specifying the number of + * private_data bytes immediately following the transport private_data_length field. The number of private_data bytes shall + * not be such that private data extends beyond the adaptation field. + */ + uint8_t transport_private_data_length = (uint8_t)stream->read_1bytes(); if (transport_private_data_length> 0) { if (!stream->require(transport_private_data_length)) { @@ -1069,9 +1070,8 @@ int SrsTsAdaptationField::decode(SrsBuffer* stream) srs_error("ts: demux af transport_private_data_flag failed. ret=%d", ret); return ret; } - srs_freepa(transport_private_data); - transport_private_data = new char[transport_private_data_length]; - stream->read_bytes(transport_private_data, transport_private_data_length); + transport_private_data.resize(transport_private_data_length); + stream->read_bytes(&transport_private_data[0], transport_private_data_length); } } @@ -1157,7 +1157,7 @@ int SrsTsAdaptationField::size() sz += PCR_flag? 6 : 0; sz += OPCR_flag? 6 : 0; sz += splicing_point_flag? 1 : 0; - sz += transport_private_data_flag? 1 + transport_private_data_length : 0; + sz += transport_private_data_flag ? 1 + transport_private_data.size() : 0; sz += adaptation_field_extension_flag? 2 + adaptation_field_extension_length : 0; sz += nb_af_ext_reserved; sz += nb_af_reserved; @@ -1259,15 +1259,15 @@ int SrsTsAdaptationField::encode(SrsBuffer* stream) srs_error("ts: mux af transport_private_data_flag failed. ret=%d", ret); return ret; } - stream->write_1bytes(transport_private_data_length); + stream->write_1bytes(transport_private_data.size()); - if (transport_private_data_length> 0) { - if (!stream->require(transport_private_data_length)) { + if (!transport_private_data.empty()) { + if (!stream->require(transport_private_data.size())) { ret = ERROR_STREAM_CASTER_TS_AF; srs_error("ts: mux af transport_private_data_flag failed. ret=%d", ret); return ret; } - stream->write_bytes(transport_private_data, transport_private_data_length); + stream->write_bytes(&transport_private_data[0], transport_private_data.size()); } } @@ -1342,9 +1342,6 @@ SrsTsPayload::~SrsTsPayload() SrsTsPayloadPES::SrsTsPayloadPES(SrsTsPacket* p) : SrsTsPayload(p) { - PES_private_data = NULL; - pack_field = NULL; - PES_extension_field = NULL; nb_stuffings = 0; nb_bytes = 0; nb_paddings = 0; @@ -1354,9 +1351,6 @@ SrsTsPayloadPES::SrsTsPayloadPES(SrsTsPacket* p) : SrsTsPayload(p) SrsTsPayloadPES::~SrsTsPayloadPES() { - srs_freepa(PES_private_data); - srs_freepa(pack_field); - srs_freepa(PES_extension_field); } int SrsTsPayloadPES::decode(SrsBuffer* stream, SrsTsMessage** ppmsg) @@ -1633,14 +1627,14 @@ int SrsTsPayloadPES::decode(SrsBuffer* stream, SrsTsMessage** ppmsg) // 16B if (PES_private_data_flag) { - srs_freepa(PES_private_data); - PES_private_data = new char[16]; - stream->read_bytes(PES_private_data, 16); + PES_private_data.resize(16); + stream->read_bytes(&PES_private_data[0], 16); } // (1+x)B if (pack_header_field_flag) { - pack_field_length = stream->read_1bytes(); + // This is an 8-bit field which indicates the length, in bytes, of the pack_header_field() + uint8_t pack_field_length = stream->read_1bytes(); if (pack_field_length > 0) { // the adjust required bytes. nb_required = nb_required - 16 - 1 + pack_field_length; @@ -1649,9 +1643,8 @@ int SrsTsPayloadPES::decode(SrsBuffer* stream, SrsTsMessage** ppmsg) srs_error("ts: demux PSE ext pack failed. ret=%d", ret); return ret; } - srs_freepa(pack_field); - pack_field = new char[pack_field_length]; - stream->read_bytes(pack_field, pack_field_length); + pack_field.resize(pack_field_length); + stream->read_bytes(&pack_field[0], pack_field_length); } } @@ -1678,7 +1671,11 @@ int SrsTsPayloadPES::decode(SrsBuffer* stream, SrsTsMessage** ppmsg) // (1+x)B if (PES_extension_flag_2) { - PES_extension_field_length = stream->read_1bytes(); + /** + * This is a 7-bit field which specifies the length, in bytes, of the data following this field in + * the PES extension field up to and including any reserved bytes. + */ + uint8_t PES_extension_field_length = stream->read_1bytes(); PES_extension_field_length &= 0x07; if (PES_extension_field_length > 0) { @@ -1687,9 +1684,8 @@ int SrsTsPayloadPES::decode(SrsBuffer* stream, SrsTsMessage** ppmsg) srs_error("ts: demux PSE ext field failed. ret=%d", ret); return ret; } - srs_freepa(PES_extension_field); - PES_extension_field = new char[PES_extension_field_length]; - stream->read_bytes(PES_extension_field, PES_extension_field_length); + PES_extension_field.resize(PES_extension_field_length); + stream->read_bytes(&PES_extension_field[0], PES_extension_field_length); } } } @@ -1804,10 +1800,10 @@ int SrsTsPayloadPES::size() if (PES_extension_flag) { sz += PES_private_data_flag? 16:0; - sz += pack_header_field_flag? 1 + pack_field_length:0; // 1+x bytes. + sz += pack_header_field_flag ? 1 + pack_field.size() : 0; // 1+x bytes. sz += program_packet_sequence_counter_flag? 2:0; sz += P_STD_buffer_flag? 2:0; - sz += PES_extension_flag_2? 1 + PES_extension_field_length:0; // 1+x bytes. + sz += PES_extension_flag_2 ? 1 + PES_extension_field.size() : 0; // 1+x bytes. } PES_header_data_length = sz - PES_header_data_length; @@ -1969,10 +1965,10 @@ int SrsTsPayloadPES::encode(SrsBuffer* stream) nb_required = 0; nb_required += PES_private_data_flag? 16:0; - nb_required += pack_header_field_flag? 1+pack_field_length:0; // 1+x bytes. + nb_required += pack_header_field_flag ? 1 + pack_field.size() : 0; // 1+x bytes. nb_required += program_packet_sequence_counter_flag? 2:0; nb_required += P_STD_buffer_flag? 2:0; - nb_required += PES_extension_flag_2? 1+PES_extension_field_length:0; // 1+x bytes. + nb_required += PES_extension_flag_2 ? 1 + PES_extension_field.size() : 0; // 1+x bytes. if (!stream->require(nb_required)) { ret = ERROR_STREAM_CASTER_TS_PSE; srs_error("ts: mux PSE ext payload failed. ret=%d", ret); @@ -2531,14 +2527,10 @@ SrsTsPayloadPMT::SrsTsPayloadPMT(SrsTsPacket* p) : SrsTsPayloadPSI(p) const1_value0 = 3; const1_value1 = 7; const1_value2 = 0x0f; - program_info_length = 0; - program_info_desc = NULL; } SrsTsPayloadPMT::~SrsTsPayloadPMT() { - srs_freepa(program_info_desc); - std::vector::iterator it; for (it = infos.begin(); it != infos.end(); ++it) { SrsTsPayloadPMTESInfo* info = *it; @@ -2582,7 +2574,11 @@ int SrsTsPayloadPMT::psi_decode(SrsBuffer* stream) // 2B int16_t pilv = stream->read_2bytes(); const1_value2 = (pilv >> 12) & 0x0F; - program_info_length = pilv & 0xFFF; + /** + * This is a 12-bit field, the first two bits of which shall be '00'. The remaining 10 bits specify the + * number of bytes of the descriptors immediately following the program_info_length field. + */ + uint16_t program_info_length = pilv & 0xFFF; if (program_info_length > 0) { if (!stream->require(program_info_length)) { @@ -2591,9 +2587,8 @@ int SrsTsPayloadPMT::psi_decode(SrsBuffer* stream) return ret; } - srs_freepa(program_info_desc); - program_info_desc = new char[program_info_length]; - stream->read_bytes(program_info_desc, program_info_length); + program_info_desc.resize(program_info_length); + stream->read_bytes(&program_info_desc[0], program_info_length); } // [section_length] - 4(CRC) - 9B - [program_info_length] @@ -2633,7 +2628,7 @@ int SrsTsPayloadPMT::psi_decode(SrsBuffer* stream) int SrsTsPayloadPMT::psi_size() { int sz = 9; - sz += program_info_length; + sz += program_info_desc.size(); for (int i = 0; i < (int)infos.size(); i ++) { SrsTsPayloadPMTESInfo* info = infos.at(i); sz += info->size(); @@ -2673,18 +2668,18 @@ int SrsTsPayloadPMT::psi_encode(SrsBuffer* stream) stream->write_2bytes(ppv); // 2B - int16_t pilv = program_info_length & 0xFFF; + int16_t pilv = program_info_desc.size() & 0xFFF; pilv |= (const1_value2 << 12) & 0xF000; stream->write_2bytes(pilv); - if (program_info_length > 0) { - if (!stream->require(program_info_length)) { + if (!program_info_desc.empty()) { + if (!stream->require(program_info_desc.size())) { ret = ERROR_STREAM_CASTER_TS_PMT; srs_error("ts: mux PMT program info failed. ret=%d", ret); return ret; } - stream->write_bytes(program_info_desc, program_info_length); + stream->write_bytes(&program_info_desc[0], program_info_desc.size()); } for (int i = 0; i < (int)infos.size(); i ++) { diff --git a/trunk/src/kernel/srs_kernel_ts.hpp b/trunk/src/kernel/srs_kernel_ts.hpp index ebb514818..1042e934e 100644 --- a/trunk/src/kernel/srs_kernel_ts.hpp +++ b/trunk/src/kernel/srs_kernel_ts.hpp @@ -731,13 +731,7 @@ public: int8_t splice_countdown; //8bits // if transport_private_data_flag, 1+p[0] B - /** - * The transport_private_data_length is an 8-bit field specifying the number of - * private_data bytes immediately following the transport private_data_length field. The number of private_data bytes shall - * not be such that private data extends beyond the adaptation field. - */ - uint8_t transport_private_data_length; //8bits - char* transport_private_data; //[transport_private_data_length]bytes + std::vector transport_private_data; //[transport_private_data_length]bytes // if adaptation_field_extension_flag, 2+x B /** @@ -1145,14 +1139,10 @@ public: * This is a 16-byte field which contains private data. This data, combined with the fields before and * after, shall not emulate the packet_start_code_prefix (0x000001). */ - char* PES_private_data; //128bits + std::vector PES_private_data; //128bits // (1+x)B - /** - * This is an 8-bit field which indicates the length, in bytes, of the pack_header_field(). - */ - uint8_t pack_field_length; //8bits - char* pack_field; //[pack_field_length] bytes + std::vector pack_field; //[pack_field_length] bytes // 2B // 1bit const '1' @@ -1198,12 +1188,7 @@ public: // (1+x)B // 1bit const '1' - /** - * This is a 7-bit field which specifies the length, in bytes, of the data following this field in - * the PES extension field up to and including any reserved bytes. - */ - uint8_t PES_extension_field_length; //7bits - char* PES_extension_field; //[PES_extension_field_length] bytes + std::vector PES_extension_field; //[PES_extension_field_length] bytes // NB /** @@ -1535,8 +1520,7 @@ public: * This is a 12-bit field, the first two bits of which shall be '00'. The remaining 10 bits specify the * number of bytes of the descriptors immediately following the program_info_length field. */ - uint16_t program_info_length; //12bits - char* program_info_desc; //[program_info_length]bytes + std::vector program_info_desc; //[program_info_length]bytes // array of TSPMTESInfo. std::vector infos;