Refine Refine kernel/ts code (#881)

pull/891/head
HungMingWu 8 years ago committed by winlin
parent 815d50f00a
commit e8ea27088a

@ -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<SrsTsPayloadPMTESInfo*>::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 ++) {

@ -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<char> 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<char> 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<char> 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<char> 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<char> program_info_desc; //[program_info_length]bytes
// array of TSPMTESInfo.
std::vector<SrsTsPayloadPMTESInfo*> infos;

Loading…
Cancel
Save