1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

Refine Refine kernel/ts code (#881)

This commit is contained in:
HungMingWu 2017-05-13 09:19:19 +08:00 committed by winlin
parent 815d50f00a
commit e8ea27088a
2 changed files with 47 additions and 68 deletions

View file

@ -804,7 +804,6 @@ SrsTsPacket* SrsTsPacket::create_pmt(SrsTsContext* context, int16_t pmt_number,
pmt->current_next_indicator = 1; pmt->current_next_indicator = 1;
pmt->section_number = 0; pmt->section_number = 0;
pmt->last_section_number = 0; pmt->last_section_number = 0;
pmt->program_info_length = 0;
// must got one valid codec. // must got one valid codec.
srs_assert(vs == SrsTsStreamVideoH264 || as == SrsTsStreamAudioAAC || as == SrsTsStreamAudioMp3); 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_base = 0;
original_program_clock_reference_extension = 0; original_program_clock_reference_extension = 0;
splice_countdown = 0; splice_countdown = 0;
transport_private_data_length = 0;
transport_private_data = NULL;
adaptation_field_extension_length = 0; adaptation_field_extension_length = 0;
ltw_flag = 0; ltw_flag = 0;
piecewise_rate_flag = 0; piecewise_rate_flag = 0;
@ -944,7 +941,6 @@ SrsTsAdaptationField::SrsTsAdaptationField(SrsTsPacket* pkt)
SrsTsAdaptationField::~SrsTsAdaptationField() SrsTsAdaptationField::~SrsTsAdaptationField()
{ {
srs_freepa(transport_private_data);
} }
int SrsTsAdaptationField::decode(SrsBuffer* stream) 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); srs_error("ts: demux af transport_private_data_flag failed. ret=%d", ret);
return 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 (transport_private_data_length> 0) {
if (!stream->require(transport_private_data_length)) { 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); srs_error("ts: demux af transport_private_data_flag failed. ret=%d", ret);
return ret; return ret;
} }
srs_freepa(transport_private_data); transport_private_data.resize(transport_private_data_length);
transport_private_data = new char[transport_private_data_length]; stream->read_bytes(&transport_private_data[0], transport_private_data_length);
stream->read_bytes(transport_private_data, transport_private_data_length);
} }
} }
@ -1157,7 +1157,7 @@ int SrsTsAdaptationField::size()
sz += PCR_flag? 6 : 0; sz += PCR_flag? 6 : 0;
sz += OPCR_flag? 6 : 0; sz += OPCR_flag? 6 : 0;
sz += splicing_point_flag? 1 : 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 += adaptation_field_extension_flag? 2 + adaptation_field_extension_length : 0;
sz += nb_af_ext_reserved; sz += nb_af_ext_reserved;
sz += nb_af_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); srs_error("ts: mux af transport_private_data_flag failed. ret=%d", ret);
return ret; return ret;
} }
stream->write_1bytes(transport_private_data_length); stream->write_1bytes(transport_private_data.size());
if (transport_private_data_length> 0) { if (!transport_private_data.empty()) {
if (!stream->require(transport_private_data_length)) { if (!stream->require(transport_private_data.size())) {
ret = ERROR_STREAM_CASTER_TS_AF; ret = ERROR_STREAM_CASTER_TS_AF;
srs_error("ts: mux af transport_private_data_flag failed. ret=%d", ret); srs_error("ts: mux af transport_private_data_flag failed. ret=%d", ret);
return 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) SrsTsPayloadPES::SrsTsPayloadPES(SrsTsPacket* p) : SrsTsPayload(p)
{ {
PES_private_data = NULL;
pack_field = NULL;
PES_extension_field = NULL;
nb_stuffings = 0; nb_stuffings = 0;
nb_bytes = 0; nb_bytes = 0;
nb_paddings = 0; nb_paddings = 0;
@ -1354,9 +1351,6 @@ SrsTsPayloadPES::SrsTsPayloadPES(SrsTsPacket* p) : SrsTsPayload(p)
SrsTsPayloadPES::~SrsTsPayloadPES() SrsTsPayloadPES::~SrsTsPayloadPES()
{ {
srs_freepa(PES_private_data);
srs_freepa(pack_field);
srs_freepa(PES_extension_field);
} }
int SrsTsPayloadPES::decode(SrsBuffer* stream, SrsTsMessage** ppmsg) int SrsTsPayloadPES::decode(SrsBuffer* stream, SrsTsMessage** ppmsg)
@ -1633,14 +1627,14 @@ int SrsTsPayloadPES::decode(SrsBuffer* stream, SrsTsMessage** ppmsg)
// 16B // 16B
if (PES_private_data_flag) { if (PES_private_data_flag) {
srs_freepa(PES_private_data); PES_private_data.resize(16);
PES_private_data = new char[16]; stream->read_bytes(&PES_private_data[0], 16);
stream->read_bytes(PES_private_data, 16);
} }
// (1+x)B // (1+x)B
if (pack_header_field_flag) { 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) { if (pack_field_length > 0) {
// the adjust required bytes. // the adjust required bytes.
nb_required = nb_required - 16 - 1 + pack_field_length; 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); srs_error("ts: demux PSE ext pack failed. ret=%d", ret);
return ret; return ret;
} }
srs_freepa(pack_field); pack_field.resize(pack_field_length);
pack_field = new char[pack_field_length]; stream->read_bytes(&pack_field[0], pack_field_length);
stream->read_bytes(pack_field, pack_field_length);
} }
} }
@ -1678,7 +1671,11 @@ int SrsTsPayloadPES::decode(SrsBuffer* stream, SrsTsMessage** ppmsg)
// (1+x)B // (1+x)B
if (PES_extension_flag_2) { 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; PES_extension_field_length &= 0x07;
if (PES_extension_field_length > 0) { 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); srs_error("ts: demux PSE ext field failed. ret=%d", ret);
return ret; return ret;
} }
srs_freepa(PES_extension_field); PES_extension_field.resize(PES_extension_field_length);
PES_extension_field = new char[PES_extension_field_length]; stream->read_bytes(&PES_extension_field[0], PES_extension_field_length);
stream->read_bytes(PES_extension_field, PES_extension_field_length);
} }
} }
} }
@ -1804,10 +1800,10 @@ int SrsTsPayloadPES::size()
if (PES_extension_flag) { if (PES_extension_flag) {
sz += PES_private_data_flag? 16:0; 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 += program_packet_sequence_counter_flag? 2:0;
sz += P_STD_buffer_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; PES_header_data_length = sz - PES_header_data_length;
@ -1969,10 +1965,10 @@ int SrsTsPayloadPES::encode(SrsBuffer* stream)
nb_required = 0; nb_required = 0;
nb_required += PES_private_data_flag? 16: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 += program_packet_sequence_counter_flag? 2:0;
nb_required += P_STD_buffer_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)) { if (!stream->require(nb_required)) {
ret = ERROR_STREAM_CASTER_TS_PSE; ret = ERROR_STREAM_CASTER_TS_PSE;
srs_error("ts: mux PSE ext payload failed. ret=%d", ret); 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_value0 = 3;
const1_value1 = 7; const1_value1 = 7;
const1_value2 = 0x0f; const1_value2 = 0x0f;
program_info_length = 0;
program_info_desc = NULL;
} }
SrsTsPayloadPMT::~SrsTsPayloadPMT() SrsTsPayloadPMT::~SrsTsPayloadPMT()
{ {
srs_freepa(program_info_desc);
std::vector<SrsTsPayloadPMTESInfo*>::iterator it; std::vector<SrsTsPayloadPMTESInfo*>::iterator it;
for (it = infos.begin(); it != infos.end(); ++it) { for (it = infos.begin(); it != infos.end(); ++it) {
SrsTsPayloadPMTESInfo* info = *it; SrsTsPayloadPMTESInfo* info = *it;
@ -2582,7 +2574,11 @@ int SrsTsPayloadPMT::psi_decode(SrsBuffer* stream)
// 2B // 2B
int16_t pilv = stream->read_2bytes(); int16_t pilv = stream->read_2bytes();
const1_value2 = (pilv >> 12) & 0x0F; 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 (program_info_length > 0) {
if (!stream->require(program_info_length)) { if (!stream->require(program_info_length)) {
@ -2591,9 +2587,8 @@ int SrsTsPayloadPMT::psi_decode(SrsBuffer* stream)
return ret; return ret;
} }
srs_freepa(program_info_desc); program_info_desc.resize(program_info_length);
program_info_desc = new char[program_info_length]; stream->read_bytes(&program_info_desc[0], program_info_length);
stream->read_bytes(program_info_desc, program_info_length);
} }
// [section_length] - 4(CRC) - 9B - [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 SrsTsPayloadPMT::psi_size()
{ {
int sz = 9; int sz = 9;
sz += program_info_length; sz += program_info_desc.size();
for (int i = 0; i < (int)infos.size(); i ++) { for (int i = 0; i < (int)infos.size(); i ++) {
SrsTsPayloadPMTESInfo* info = infos.at(i); SrsTsPayloadPMTESInfo* info = infos.at(i);
sz += info->size(); sz += info->size();
@ -2673,18 +2668,18 @@ int SrsTsPayloadPMT::psi_encode(SrsBuffer* stream)
stream->write_2bytes(ppv); stream->write_2bytes(ppv);
// 2B // 2B
int16_t pilv = program_info_length & 0xFFF; int16_t pilv = program_info_desc.size() & 0xFFF;
pilv |= (const1_value2 << 12) & 0xF000; pilv |= (const1_value2 << 12) & 0xF000;
stream->write_2bytes(pilv); stream->write_2bytes(pilv);
if (program_info_length > 0) { if (!program_info_desc.empty()) {
if (!stream->require(program_info_length)) { if (!stream->require(program_info_desc.size())) {
ret = ERROR_STREAM_CASTER_TS_PMT; ret = ERROR_STREAM_CASTER_TS_PMT;
srs_error("ts: mux PMT program info failed. ret=%d", ret); srs_error("ts: mux PMT program info failed. ret=%d", ret);
return 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 ++) { for (int i = 0; i < (int)infos.size(); i ++) {

View file

@ -731,13 +731,7 @@ public:
int8_t splice_countdown; //8bits int8_t splice_countdown; //8bits
// if transport_private_data_flag, 1+p[0] B // if transport_private_data_flag, 1+p[0] B
/** std::vector<char> transport_private_data; //[transport_private_data_length]bytes
* 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
// if adaptation_field_extension_flag, 2+x B // 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 * 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). * after, shall not emulate the packet_start_code_prefix (0x000001).
*/ */
char* PES_private_data; //128bits std::vector<char> PES_private_data; //128bits
// (1+x)B // (1+x)B
/** std::vector<char> pack_field; //[pack_field_length] bytes
* 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
// 2B // 2B
// 1bit const '1' // 1bit const '1'
@ -1198,12 +1188,7 @@ public:
// (1+x)B // (1+x)B
// 1bit const '1' // 1bit const '1'
/** std::vector<char> PES_extension_field; //[PES_extension_field_length] bytes
* 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
// NB // 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 * 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. * number of bytes of the descriptors immediately following the program_info_length field.
*/ */
uint16_t program_info_length; //12bits std::vector<char> program_info_desc; //[program_info_length]bytes
char* program_info_desc; //[program_info_length]bytes
// array of TSPMTESInfo. // array of TSPMTESInfo.
std::vector<SrsTsPayloadPMTESInfo*> infos; std::vector<SrsTsPayloadPMTESInfo*> infos;