Merge branch 'develop' of github.com:ossrs/srs into develop

pull/902/merge
winlin 8 years ago
commit 792ef6795f

@ -58,10 +58,62 @@ stringstream& srs_print_mp4_type(stringstream& ss, uint32_t v)
}
template<typename T>
stringstream& srs_print_types(stringstream& ss, std::vector<T>& arr)
stringstream& __srs_print_mp4_vector(std::vector<T>& arr, stringstream& ss, int level, bool is_box)
{
for (size_t i = 0; i < arr.size(); i++) {
T elem = arr[i];
if (is_box) {
elem.dumps(ss, level);
} else {
elem.dumps_detail(ss, level);
}
if (i < arr.size() - 1) {
ss << endl;
srs_padding(ss, level);
}
}
return ss;
}
template<typename T>
stringstream& srs_print_mp4_vector(std::vector<T>& arr, stringstream& ss, int level)
{
return __srs_print_mp4_vector(arr, ss, level, false);
}
template<typename T>
stringstream& __srs_print_mp4_vector_ptr(std::vector<T>& arr, stringstream& ss, int level, bool is_box)
{
for (size_t i = 0; i < arr.size(); i++) {
T elem = arr[i];
if (is_box) {
elem->dumps(ss, level);
} else {
elem->dumps_detail(ss, level);
}
if (i < arr.size() - 1) {
ss << endl;
srs_padding(ss, level);
}
}
return ss;
}
template<typename T>
stringstream& srs_print_mp4_vector_ptr(std::vector<T>& arr, stringstream& ss, int level) {
return __srs_print_mp4_vector_ptr(arr, ss, level, false);
}
template<typename T>
stringstream& srs_print_mp4_vector_elem(std::vector<T>& arr, stringstream& ss, int level)
{
for (size_t i = 0; i < arr.size(); i++) {
srs_print_mp4_type(ss, (uint32_t)arr[i]);
if (i < arr.size() - 1) {
ss << ",";
}
@ -69,16 +121,38 @@ stringstream& srs_print_types(stringstream& ss, std::vector<T>& arr)
return ss;
}
stringstream& srs_print_bytes(stringstream& ss, const char* p, int size, int max = -1)
template<>
stringstream& srs_print_mp4_vector(std::vector<SrsMp4BoxBrand>& arr, stringstream& ss, int level)
{
return srs_print_mp4_vector_elem(arr, ss, level);
}
template<>
stringstream& srs_print_mp4_vector(std::vector<SrsMp4DataEntryBox*>& arr, stringstream& ss, int level)
{
return srs_print_mp4_vector_ptr(arr, ss, level);
}
template<>
stringstream& srs_print_mp4_vector(std::vector<SrsMp4SampleEntry*>& arr, stringstream& ss, int level)
{
return __srs_print_mp4_vector_ptr(arr, ss, level, true);
}
stringstream& srs_print_bytes(stringstream& ss, const char* p, int size, int level, int line = 16, int max = -1)
{
if (max == -1) {
max = size;
}
for (int i = 0; i < max; i++) {
ss << "0x" << std::setw(2) << std::setfill('0') << std::hex << (uint32_t)p[i] << std::dec;
if (i < max -1) {
ss << ", ";
ss << "0x" << std::setw(2) << std::setfill('0') << std::hex << (uint32_t)(uint8_t)p[i] << std::dec;
if (i < max -1) {
ss << ", ";
if (((i+1)%line) == 0) {
ss << endl;
srs_padding(ss, level);
}
}
}
return ss;
@ -217,7 +291,15 @@ stringstream& SrsMp4Box::dumps(stringstream& ss, int level)
dumps_detail(ss, level);
ss << endl;
if (!boxes.empty()) {
ss << ", " << boxes.size() << " boxes";
}
// If there contained boxes in header,
// which means the last box has already output the endl.
if (!boxes_in_header()) {
ss << endl;
}
vector<SrsMp4Box*>::iterator it;
for (it = boxes.begin(); it != boxes.end(); ++it) {
@ -523,6 +605,11 @@ int SrsMp4Box::decode_header(SrsBuffer* buf)
return ret;
}
bool SrsMp4Box::boxes_in_header()
{
return false;
}
stringstream& SrsMp4Box::dumps_detail(stringstream& ss, int level)
{
return ss;
@ -679,7 +766,7 @@ stringstream& SrsMp4FileTypeBox::dumps_detail(stringstream& ss, int level)
if (!compatible_brands.empty()) {
ss << "(";
srs_print_types(ss, compatible_brands);
srs_print_mp4_vector(compatible_brands, ss, level);
ss << ")";
}
return ss;
@ -789,7 +876,7 @@ stringstream& SrsMp4FreeSpaceBox::dumps_detail(stringstream& ss, int level)
if (!data.empty()) {
ss << endl;
srs_padding(ss, level + 1);
srs_print_bytes(ss, &data[0], (int)data.size());
srs_print_bytes(ss, &data[0], (int)data.size(), level + 1);
}
return ss;
}
@ -1020,7 +1107,7 @@ int SrsMp4MovieHeaderBox::decode_header(SrsBuffer* buf)
stringstream& SrsMp4MovieHeaderBox::dumps_detail(stringstream& ss, int level)
{
ss << ", TBN=" << timescale << ", duratoin=" << std::setprecision(2) << duration() << "ms";
ss << ", " << std::setprecision(2) << duration() << "ms, TBN=" << timescale << ", nTID=" << next_track_ID;
return ss;
}
@ -1104,27 +1191,6 @@ SrsMp4TrackBox::~SrsMp4TrackBox()
{
}
SrsMp4TrackHeaderBox::SrsMp4TrackHeaderBox()
{
type = SrsMp4BoxTypeTKHD;
reserved0 = 0;
reserved1 = 0;
reserved2 = 0;
layer = alternate_group = 0;
volume = 0; // if track_is_audio 0x0100 else 0
int32_t v[] = {0x00010000, 0, 0, 0, 0x00010000, 0, 0, 0, 0x40000000};
memcpy(matrix, v, 36);
width = height = 0;
flags = 0x03;
}
SrsMp4TrackHeaderBox::~SrsMp4TrackHeaderBox()
{
}
SrsMp4TrackType SrsMp4TrackBox::track_type()
{
// TODO: Maybe should discovery all mdia boxes.
@ -1279,6 +1345,27 @@ SrsMp4AudioSampleEntry* SrsMp4TrackBox::mp4a()
return box? box->mp4a():NULL;
}
SrsMp4TrackHeaderBox::SrsMp4TrackHeaderBox()
{
type = SrsMp4BoxTypeTKHD;
reserved0 = 0;
reserved1 = 0;
reserved2 = 0;
layer = alternate_group = 0;
volume = 0; // if track_is_audio 0x0100 else 0
int32_t v[] = {0x00010000, 0, 0, 0, 0x00010000, 0, 0, 0, 0x40000000};
memcpy(matrix, v, 36);
width = height = 0;
flags = 0x03;
}
SrsMp4TrackHeaderBox::~SrsMp4TrackHeaderBox()
{
}
int SrsMp4TrackHeaderBox::nb_header()
{
int size = SrsMp4FullBox::nb_header();
@ -1366,6 +1453,21 @@ int SrsMp4TrackHeaderBox::decode_header(SrsBuffer* buf)
return ret;
}
stringstream& SrsMp4TrackHeaderBox::dumps_detail(stringstream& ss, int level)
{
ss << ", track #" << track_ID << ", " << duration << "TBN";
if (volume) {
ss << ", volume=" << uint32_t(volume>>8) << "." << uint32_t(volume&0xFF);
}
if (width || height) {
ss << ", size=" << uint16_t(width>>16) << "x" << uint16_t(height>>16);
}
return ss;
}
SrsMp4EditBox::SrsMp4EditBox()
{
type = SrsMp4BoxTypeEDTS;
@ -1380,6 +1482,18 @@ SrsMp4ElstEntry::SrsMp4ElstEntry()
media_rate_fraction = 0;
}
stringstream& SrsMp4ElstEntry::dumps(stringstream& ss, int level)
{
return dumps_detail(ss, level);
}
stringstream& SrsMp4ElstEntry::dumps_detail(stringstream& ss, int level)
{
ss << "Entry, " << segment_duration << "TBN, start=" << media_time << "TBN"
<< ", rate=" << media_rate_integer << "," << media_rate_fraction;
return ss;
}
SrsMp4EditListBox::SrsMp4EditListBox()
{
type = SrsMp4BoxTypeELST;
@ -1410,7 +1524,7 @@ int SrsMp4EditListBox::encode_header(SrsBuffer* buf)
return ret;
}
buf->write_4bytes(entries.size());
buf->write_4bytes((int)entries.size());
for (size_t i = 0; i < entries.size(); i++) {
SrsMp4ElstEntry& entry = entries[i];
@ -1459,6 +1573,19 @@ int SrsMp4EditListBox::decode_header(SrsBuffer* buf)
return ret;
}
stringstream& SrsMp4EditListBox::dumps_detail(stringstream& ss, int level)
{
ss << ", " << entries.size() << " childs";
if (!entries.empty()) {
ss << "(+)" << endl;
srs_padding(ss, level + 1);
srs_print_mp4_vector(entries, ss, level + 1);
}
return ss;
}
SrsMp4MediaBox::SrsMp4MediaBox()
{
type = SrsMp4BoxTypeMDIA;
@ -1629,6 +1756,15 @@ int SrsMp4MediaHeaderBox::decode_header(SrsBuffer* buf)
return ret;
}
stringstream& SrsMp4MediaHeaderBox::dumps_detail(stringstream& ss, int level)
{
ss << ", TBN=" << timescale << ", " << duration << "TBN";
if (language) {
ss << ", LANG=" << language0() << language1() << language2();
}
return ss;
}
SrsMp4HandlerReferenceBox::SrsMp4HandlerReferenceBox()
{
type = SrsMp4BoxTypeHDLR;
@ -1694,6 +1830,15 @@ int SrsMp4HandlerReferenceBox::decode_header(SrsBuffer* buf)
return ret;
}
stringstream& SrsMp4HandlerReferenceBox::dumps_detail(stringstream& ss, int level)
{
ss << ", ";
srs_print_mp4_type(ss, (uint32_t)handler_type);
ss << ", " << name;
return ss;
}
SrsMp4MediaInformationBox::SrsMp4MediaInformationBox()
{
type = SrsMp4BoxTypeMINF;
@ -1937,6 +2082,15 @@ int SrsMp4DataEntryUrlBox::decode_header(SrsBuffer* buf)
return ret;
}
stringstream& SrsMp4DataEntryUrlBox::dumps_detail(stringstream& ss, int level)
{
ss << "URL: " << location;
if (location.empty()) {
ss << "Same file";
}
return ss;
}
SrsMp4DataEntryUrnBox::SrsMp4DataEntryUrnBox()
{
type = SrsMp4BoxTypeURN;
@ -1986,6 +2140,12 @@ int SrsMp4DataEntryUrnBox::decode_header(SrsBuffer* buf)
return ret;
}
stringstream& SrsMp4DataEntryUrnBox::dumps_detail(stringstream& ss, int level)
{
ss << "URN: " << name << ", " << location;
return ss;
}
SrsMp4DataReferenceBox::SrsMp4DataReferenceBox()
{
type = SrsMp4BoxTypeDREF;
@ -2090,6 +2250,17 @@ int SrsMp4DataReferenceBox::decode_header(SrsBuffer* buf)
return ret;
}
stringstream& SrsMp4DataReferenceBox::dumps_detail(stringstream& ss, int level)
{
ss << ", " << entries.size() << " childs";
if (!entries.empty()) {
ss << "(+)" << endl;
srs_padding(ss, level + 1);
srs_print_mp4_vector(entries, ss, level + 1);
}
return ss;
}
SrsMp4SampleTableBox::SrsMp4SampleTableBox()
{
type = SrsMp4BoxTypeSTBL;
@ -2242,6 +2413,12 @@ int SrsMp4SampleEntry::decode_header(SrsBuffer* buf)
return ret;
}
stringstream& SrsMp4SampleEntry::dumps_detail(stringstream& ss, int level)
{
ss << ", refs#" << data_reference_index;
return ss;
}
SrsMp4VisualSampleEntry::SrsMp4VisualSampleEntry()
{
type = SrsMp4BoxTypeAVC1;
@ -2329,6 +2506,14 @@ int SrsMp4VisualSampleEntry::decode_header(SrsBuffer* buf)
return ret;
}
stringstream& SrsMp4VisualSampleEntry::dumps_detail(stringstream& ss, int level)
{
SrsMp4SampleEntry::dumps_detail(ss, level);
ss << ", size=" << width << "x" << height;
return ss;
}
SrsMp4AvccBox::SrsMp4AvccBox()
{
type = SrsMp4BoxTypeAVCC;
@ -2340,7 +2525,7 @@ SrsMp4AvccBox::~SrsMp4AvccBox()
int SrsMp4AvccBox::nb_header()
{
return SrsMp4Box::nb_header() + avc_config.size();
return SrsMp4Box::nb_header() + (int)avc_config.size();
}
int SrsMp4AvccBox::encode_header(SrsBuffer* buf)
@ -2352,7 +2537,7 @@ int SrsMp4AvccBox::encode_header(SrsBuffer* buf)
}
if (!avc_config.empty()) {
buf->write_bytes(&avc_config[0], avc_config.size());
buf->write_bytes(&avc_config[0], (int)avc_config.size());
}
return ret;
@ -2375,6 +2560,14 @@ int SrsMp4AvccBox::decode_header(SrsBuffer* buf)
return ret;
}
stringstream& SrsMp4AvccBox::dumps_detail(stringstream& ss, int level)
{
ss << ", AVC Config: " << (int)avc_config.size() << "B" << endl;
srs_padding(ss, level + 1);
srs_print_bytes(ss, (const char*)&avc_config[0], (int)avc_config.size(), level + 1);
return ss;
}
SrsMp4AudioSampleEntry::SrsMp4AudioSampleEntry()
{
type = SrsMp4BoxTypeMP4A;
@ -2449,6 +2642,15 @@ int SrsMp4AudioSampleEntry::decode_header(SrsBuffer* buf)
return ret;
}
stringstream& SrsMp4AudioSampleEntry::dumps_detail(stringstream& ss, int level)
{
SrsMp4SampleEntry::dumps_detail(ss, level);
ss << ", " << channelcount << " channels, " << samplesize << " bits"
<< ", " << (samplerate>>16) << " Hz";
return ss;
}
SrsMp4BaseDescriptor::SrsMp4BaseDescriptor()
{
tag = SrsMp4ESTagESforbidden;
@ -2566,6 +2768,12 @@ int SrsMp4BaseDescriptor::decode(SrsBuffer* buf)
return ret;
}
stringstream& SrsMp4BaseDescriptor::dumps_detail(stringstream& ss, int level)
{
ss << ", tag=" << "0x" << std::setw(2) << std::setfill('0') << std::hex << (uint32_t)(uint8_t)tag << std::dec;
return ss;
}
SrsMp4DecoderSpecificInfo::SrsMp4DecoderSpecificInfo()
{
tag = SrsMp4ESTagESDecSpecificInfoTag;
@ -2577,7 +2785,7 @@ SrsMp4DecoderSpecificInfo::~SrsMp4DecoderSpecificInfo()
int32_t SrsMp4DecoderSpecificInfo::nb_payload()
{
return asc.size();
return (int)asc.size();
}
int SrsMp4DecoderSpecificInfo::encode_payload(SrsBuffer* buf)
@ -2585,7 +2793,7 @@ int SrsMp4DecoderSpecificInfo::encode_payload(SrsBuffer* buf)
int ret = ERROR_SUCCESS;
if (!asc.empty()) {
buf->write_bytes(&asc[0], asc.size());
buf->write_bytes(&asc[0], (int)asc.size());
}
return ret;
@ -2604,6 +2812,17 @@ int SrsMp4DecoderSpecificInfo::decode_payload(SrsBuffer* buf)
return ret;
}
stringstream& SrsMp4DecoderSpecificInfo::dumps_detail(stringstream& ss, int level)
{
SrsMp4BaseDescriptor::dumps_detail(ss, level);
ss << ", ASC " << asc.size() << "B";
ss << endl;
srs_padding(ss, level + 1);
return srs_print_bytes(ss, (const char*)&asc[0], (int)asc.size(), level + 1);
}
SrsMp4DecoderConfigDescriptor::SrsMp4DecoderConfigDescriptor()
{
tag = SrsMp4ESTagESDecoderConfigDescrTag;
@ -2671,6 +2890,19 @@ int SrsMp4DecoderConfigDescriptor::decode_payload(SrsBuffer* buf)
return ret;
}
stringstream& SrsMp4DecoderConfigDescriptor::dumps_detail(stringstream& ss, int level)
{
SrsMp4BaseDescriptor::dumps_detail(ss, level);
ss << ", type=" << objectTypeIndication << ", stream=" << streamType;
ss << endl;
srs_padding(ss, level + 1);
ss << "decoder specific";
return decSpecificInfo->dumps_detail(ss, level + 1);
}
SrsMp4SLConfigDescriptor::SrsMp4SLConfigDescriptor()
{
tag = SrsMp4ESTagESSLConfigDescrTag;
@ -2827,6 +3059,20 @@ int SrsMp4ES_Descriptor::decode_payload(SrsBuffer* buf)
return ret;
}
stringstream& SrsMp4ES_Descriptor::dumps_detail(stringstream& ss, int level)
{
SrsMp4BaseDescriptor::dumps_detail(ss, level);
ss << ", ID=" << ES_ID;
ss << endl;
srs_padding(ss, level + 1);
ss << "decoder config";
decConfigDescr.dumps_detail(ss, level + 1);
return ss;
}
SrsMp4EsdsBox::SrsMp4EsdsBox()
{
type = SrsMp4BoxTypeESDS;
@ -2886,6 +3132,11 @@ int SrsMp4EsdsBox::decode_header(SrsBuffer* buf)
return ret;
}
stringstream& SrsMp4EsdsBox::dumps_detail(stringstream& ss, int level)
{
return es->dumps_detail(ss, level);
}
SrsMp4SampleDescriptionBox::SrsMp4SampleDescriptionBox()
{
type = SrsMp4BoxTypeSTSD;
@ -3007,12 +3258,32 @@ int SrsMp4SampleDescriptionBox::decode_header(SrsBuffer* buf)
return ret;
}
bool SrsMp4SampleDescriptionBox::boxes_in_header()
{
return true;
}
stringstream& SrsMp4SampleDescriptionBox::dumps_detail(stringstream& ss, int level)
{
ss << ", " << entries.size() << " childs";
if (!entries.empty()) {
ss << "(+)" << endl;
srs_print_mp4_vector(entries, ss, level + 1);
}
return ss;
}
SrsMp4SttsEntry::SrsMp4SttsEntry()
{
sample_count = 0;
sample_delta = 0;
}
stringstream& SrsMp4SttsEntry::dumps_detail(stringstream& ss, int level)
{
return ss;
}
SrsMp4DecodingTime2SampleBox::SrsMp4DecodingTime2SampleBox()
{
type = SrsMp4BoxTypeSTTS;
@ -3105,12 +3376,22 @@ int SrsMp4DecodingTime2SampleBox::decode_header(SrsBuffer* buf)
return ret;
}
stringstream& SrsMp4DecodingTime2SampleBox::dumps_detail(stringstream& ss, int level)
{
return ss;
}
SrsMp4CttsEntry::SrsMp4CttsEntry()
{
sample_count = 0;
sample_offset = 0;
}
stringstream& SrsMp4CttsEntry::dumps_detail(stringstream& ss, int level)
{
return ss;
}
SrsMp4CompositionTime2SampleBox::SrsMp4CompositionTime2SampleBox()
{
type = SrsMp4BoxTypeCTTS;
@ -3211,6 +3492,11 @@ int SrsMp4CompositionTime2SampleBox::decode_header(SrsBuffer* buf)
return ret;
}
stringstream& SrsMp4CompositionTime2SampleBox::dumps_detail(stringstream& ss, int level)
{
return ss;
}
SrsMp4SyncSampleBox::SrsMp4SyncSampleBox()
{
type = SrsMp4BoxTypeSTSS;
@ -3275,6 +3561,11 @@ int SrsMp4SyncSampleBox::decode_header(SrsBuffer* buf)
return ret;
}
stringstream& SrsMp4SyncSampleBox::dumps_detail(stringstream& ss, int level)
{
return ss;
}
SrsMp4StscEntry::SrsMp4StscEntry()
{
first_chunk = 0;
@ -3282,6 +3573,11 @@ SrsMp4StscEntry::SrsMp4StscEntry()
sample_description_index = 0;
}
stringstream& SrsMp4StscEntry::dumps_detail(stringstream& ss, int level)
{
return ss;
}
SrsMp4Sample2ChunkBox::SrsMp4Sample2ChunkBox()
{
type = SrsMp4BoxTypeSTSC;
@ -3361,6 +3657,11 @@ int SrsMp4Sample2ChunkBox::decode_header(SrsBuffer* buf)
return ret;
}
stringstream& SrsMp4Sample2ChunkBox::dumps_detail(stringstream& ss, int level)
{
return ss;
}
SrsMp4ChunkOffsetBox::SrsMp4ChunkOffsetBox()
{
type = SrsMp4BoxTypeSTCO;
@ -3414,6 +3715,11 @@ int SrsMp4ChunkOffsetBox::decode_header(SrsBuffer* buf)
return ret;
}
stringstream& SrsMp4ChunkOffsetBox::dumps_detail(stringstream& ss, int level)
{
return ss;
}
SrsMp4ChunkLargeOffsetBox::SrsMp4ChunkLargeOffsetBox()
{
type = SrsMp4BoxTypeCO64;
@ -3467,6 +3773,11 @@ int SrsMp4ChunkLargeOffsetBox::decode_header(SrsBuffer* buf)
return ret;
}
stringstream& SrsMp4ChunkLargeOffsetBox::dumps_detail(stringstream& ss, int level)
{
return ss;
}
SrsMp4SampleSizeBox::SrsMp4SampleSizeBox()
{
type = SrsMp4BoxTypeSTSZ;
@ -3544,6 +3855,11 @@ int SrsMp4SampleSizeBox::decode_header(SrsBuffer* buf)
return ret;
}
stringstream& SrsMp4SampleSizeBox::dumps_detail(stringstream& ss, int level)
{
return ss;
}
SrsMp4UserDataBox::SrsMp4UserDataBox()
{
type = SrsMp4BoxTypeUDTA;
@ -3555,7 +3871,7 @@ SrsMp4UserDataBox::~SrsMp4UserDataBox()
int SrsMp4UserDataBox::nb_header()
{
return SrsMp4Box::nb_header() + data.size();
return SrsMp4Box::nb_header() + (int)data.size();
}
int SrsMp4UserDataBox::encode_header(SrsBuffer* buf)
@ -3567,7 +3883,7 @@ int SrsMp4UserDataBox::encode_header(SrsBuffer* buf)
}
if (!data.empty()) {
buf->write_bytes(&data[0], data.size());
buf->write_bytes(&data[0], (int)data.size());
}
return ret;
@ -3584,12 +3900,17 @@ int SrsMp4UserDataBox::decode_header(SrsBuffer* buf)
int nb_data = left_space(buf);
if (nb_data) {
data.resize(nb_data);
buf->read_bytes(&data[0], data.size());
buf->read_bytes(&data[0], (int)data.size());
}
return ret;
}
stringstream& SrsMp4UserDataBox::dumps_detail(stringstream& ss, int level)
{
return ss;
}
SrsMp4Sample::SrsMp4Sample()
{
type = SrsFrameTypeForbidden;

@ -218,6 +218,10 @@ protected:
// It's not necessary to check the buffer, unless the box is not only determined by the verson.
// Generally, it's not necessary, that is, all boxes is determinated by version.
virtual int decode_header(SrsBuffer* buf);
// Whether there contained boxes in header.
virtual bool boxes_in_header();
// @remark internal for template methods.
public:
// Dumps the detail of box.
virtual std::stringstream& dumps_detail(std::stringstream& ss, int level);
};
@ -240,6 +244,7 @@ protected:
virtual int nb_header();
virtual int encode_header(SrsBuffer* buf);
virtual int decode_header(SrsBuffer* buf);
public:
virtual std::stringstream& dumps_detail(std::stringstream& ss, int level);
};
@ -270,6 +275,7 @@ protected:
virtual int nb_header();
virtual int encode_header(SrsBuffer* buf);
virtual int decode_header(SrsBuffer* buf);
public:
virtual std::stringstream& dumps_detail(std::stringstream& ss, int level);
};
@ -360,6 +366,7 @@ protected:
virtual int nb_header();
virtual int encode_header(SrsBuffer* buf);
virtual int decode_header(SrsBuffer* buf);
public:
virtual std::stringstream& dumps_detail(std::stringstream& ss, int level);
};
@ -445,6 +452,7 @@ protected:
virtual int nb_header();
virtual int encode_header(SrsBuffer* buf);
virtual int decode_header(SrsBuffer* buf);
public:
virtual std::stringstream& dumps_detail(std::stringstream& ss, int level);
};
@ -614,6 +622,8 @@ protected:
virtual int nb_header();
virtual int encode_header(SrsBuffer* buf);
virtual int decode_header(SrsBuffer* buf);
public:
virtual std::stringstream& dumps_detail(std::stringstream& ss, int level);
};
/**
@ -652,6 +662,9 @@ public:
int16_t media_rate_fraction;
public:
SrsMp4ElstEntry();
public:
virtual std::stringstream& dumps(std::stringstream& ss, int level);
virtual std::stringstream& dumps_detail(std::stringstream& ss, int level);
};
/**
@ -673,6 +686,8 @@ protected:
virtual int nb_header();
virtual int encode_header(SrsBuffer* buf);
virtual int decode_header(SrsBuffer* buf);
public:
virtual std::stringstream& dumps_detail(std::stringstream& ss, int level);
};
/**
@ -751,6 +766,8 @@ protected:
virtual int nb_header();
virtual int encode_header(SrsBuffer* buf);
virtual int decode_header(SrsBuffer* buf);
public:
virtual std::stringstream& dumps_detail(std::stringstream& ss, int level);
};
/**
@ -781,6 +798,8 @@ protected:
virtual int nb_header();
virtual int encode_header(SrsBuffer* buf);
virtual int decode_header(SrsBuffer* buf);
public:
virtual std::stringstream& dumps_detail(std::stringstream& ss, int level);
};
/**
@ -898,6 +917,8 @@ protected:
virtual int nb_header();
virtual int encode_header(SrsBuffer* buf);
virtual int decode_header(SrsBuffer* buf);
public:
virtual std::stringstream& dumps_detail(std::stringstream& ss, int level);
};
/**
@ -915,6 +936,8 @@ protected:
virtual int nb_header();
virtual int encode_header(SrsBuffer* buf);
virtual int decode_header(SrsBuffer* buf);
public:
virtual std::stringstream& dumps_detail(std::stringstream& ss, int level);
};
/**
@ -939,6 +962,8 @@ protected:
virtual int nb_header();
virtual int encode_header(SrsBuffer* buf);
virtual int decode_header(SrsBuffer* buf);
public:
virtual std::stringstream& dumps_detail(std::stringstream& ss, int level);
};
/**
@ -1000,6 +1025,8 @@ protected:
virtual int nb_header();
virtual int encode_header(SrsBuffer* buf);
virtual int decode_header(SrsBuffer* buf);
public:
virtual std::stringstream& dumps_detail(std::stringstream& ss, int level);
};
/**
@ -1041,6 +1068,8 @@ protected:
virtual int nb_header();
virtual int encode_header(SrsBuffer* buf);
virtual int decode_header(SrsBuffer* buf);
public:
virtual std::stringstream& dumps_detail(std::stringstream& ss, int level);
};
/**
@ -1058,6 +1087,8 @@ protected:
virtual int nb_header();
virtual int encode_header(SrsBuffer* buf);
virtual int decode_header(SrsBuffer* buf);
public:
virtual std::stringstream& dumps_detail(std::stringstream& ss, int level);
};
/**
@ -1086,6 +1117,8 @@ protected:
virtual int nb_header();
virtual int encode_header(SrsBuffer* buf);
virtual int decode_header(SrsBuffer* buf);
public:
virtual std::stringstream& dumps_detail(std::stringstream& ss, int level);
};
// Table 1 — List of Class Tags for Descriptors
@ -1132,6 +1165,8 @@ protected:
virtual int32_t nb_payload() = 0;
virtual int encode_payload(SrsBuffer* buf) = 0;
virtual int decode_payload(SrsBuffer* buf) = 0;
public:
virtual std::stringstream& dumps_detail(std::stringstream& ss, int level);
};
// Table 5 — objectTypeIndication Values
@ -1168,6 +1203,8 @@ protected:
virtual int32_t nb_payload();
virtual int encode_payload(SrsBuffer* buf);
virtual int decode_payload(SrsBuffer* buf);
public:
virtual std::stringstream& dumps_detail(std::stringstream& ss, int level);
};
/**
@ -1194,6 +1231,8 @@ protected:
virtual int32_t nb_payload();
virtual int encode_payload(SrsBuffer* buf);
virtual int decode_payload(SrsBuffer* buf);
public:
virtual std::stringstream& dumps_detail(std::stringstream& ss, int level);
};
/**
@ -1240,6 +1279,8 @@ protected:
virtual int32_t nb_payload();
virtual int encode_payload(SrsBuffer* buf);
virtual int decode_payload(SrsBuffer* buf);
public:
virtual std::stringstream& dumps_detail(std::stringstream& ss, int level);
};
/**
@ -1262,6 +1303,8 @@ protected:
virtual int nb_header();
virtual int encode_header(SrsBuffer* buf);
virtual int decode_header(SrsBuffer* buf);
public:
virtual std::stringstream& dumps_detail(std::stringstream& ss, int level);
};
/**
@ -1290,6 +1333,9 @@ protected:
virtual int nb_header();
virtual int encode_header(SrsBuffer* buf);
virtual int decode_header(SrsBuffer* buf);
virtual bool boxes_in_header();
public:
virtual std::stringstream& dumps_detail(std::stringstream& ss, int level);
};
/**
@ -1305,6 +1351,8 @@ struct SrsMp4SttsEntry
uint32_t sample_delta;
// Constructor
SrsMp4SttsEntry();
public:
virtual std::stringstream& dumps_detail(std::stringstream& ss, int level);
};
/**
@ -1336,6 +1384,8 @@ protected:
virtual int nb_header();
virtual int encode_header(SrsBuffer* buf);
virtual int decode_header(SrsBuffer* buf);
public:
virtual std::stringstream& dumps_detail(std::stringstream& ss, int level);
};
/**
@ -1353,6 +1403,8 @@ struct SrsMp4CttsEntry
int64_t sample_offset;
// Constructor
SrsMp4CttsEntry();
public:
virtual std::stringstream& dumps_detail(std::stringstream& ss, int level);
};
/**
@ -1386,6 +1438,8 @@ protected:
virtual int nb_header();
virtual int encode_header(SrsBuffer* buf);
virtual int decode_header(SrsBuffer* buf);
public:
virtual std::stringstream& dumps_detail(std::stringstream& ss, int level);
};
/**
@ -1412,6 +1466,8 @@ protected:
virtual int nb_header();
virtual int encode_header(SrsBuffer* buf);
virtual int decode_header(SrsBuffer* buf);
public:
virtual std::stringstream& dumps_detail(std::stringstream& ss, int level);
};
/**
@ -1433,6 +1489,8 @@ struct SrsMp4StscEntry
uint32_t sample_description_index;
// Constructor
SrsMp4StscEntry();
public:
virtual std::stringstream& dumps_detail(std::stringstream& ss, int level);
};
/**
@ -1464,6 +1522,8 @@ protected:
virtual int nb_header();
virtual int encode_header(SrsBuffer* buf);
virtual int decode_header(SrsBuffer* buf);
public:
virtual std::stringstream& dumps_detail(std::stringstream& ss, int level);
};
/**
@ -1488,6 +1548,8 @@ protected:
virtual int nb_header();
virtual int encode_header(SrsBuffer* buf);
virtual int decode_header(SrsBuffer* buf);
public:
virtual std::stringstream& dumps_detail(std::stringstream& ss, int level);
};
/**
@ -1512,6 +1574,8 @@ protected:
virtual int nb_header();
virtual int encode_header(SrsBuffer* buf);
virtual int decode_header(SrsBuffer* buf);
public:
virtual std::stringstream& dumps_detail(std::stringstream& ss, int level);
};
/**
@ -1543,6 +1607,8 @@ protected:
virtual int nb_header();
virtual int encode_header(SrsBuffer* buf);
virtual int decode_header(SrsBuffer* buf);
public:
virtual std::stringstream& dumps_detail(std::stringstream& ss, int level);
};
/**
@ -1562,6 +1628,8 @@ protected:
virtual int nb_header();
virtual int encode_header(SrsBuffer* buf);
virtual int decode_header(SrsBuffer* buf);
public:
virtual std::stringstream& dumps_detail(std::stringstream& ss, int level);
};
/**

@ -2440,13 +2440,10 @@ SrsTsPayloadPMTESInfo::SrsTsPayloadPMTESInfo(SrsTsStream st, int16_t epid)
const1_value0 = 7;
const1_value1 = 0x0f;
ES_info_length = 0;
ES_info = NULL;
}
SrsTsPayloadPMTESInfo::~SrsTsPayloadPMTESInfo()
{
srs_freepa(ES_info);
}
int SrsTsPayloadPMTESInfo::decode(SrsBuffer* stream)
@ -2468,7 +2465,11 @@ int SrsTsPayloadPMTESInfo::decode(SrsBuffer* stream)
int16_t eilv = stream->read_2bytes();
const1_value1 = (epv >> 12) & 0x0f;
ES_info_length = eilv & 0x0FFF;
/**
* 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 of the associated program element immediately following the ES_info_length field.
*/
int16_t ES_info_length = eilv & 0x0FFF;
if (ES_info_length > 0) {
if (!stream->require(ES_info_length)) {
@ -2476,9 +2477,8 @@ int SrsTsPayloadPMTESInfo::decode(SrsBuffer* stream)
srs_error("ts: demux PMT es info data failed. ret=%d", ret);
return ret;
}
srs_freepa(ES_info);
ES_info = new char[ES_info_length];
stream->read_bytes(ES_info, ES_info_length);
ES_info.resize(ES_info_length);
stream->read_bytes(&ES_info[0], ES_info_length);
}
return ret;
@ -2486,7 +2486,7 @@ int SrsTsPayloadPMTESInfo::decode(SrsBuffer* stream)
int SrsTsPayloadPMTESInfo::size()
{
return 5 + ES_info_length;
return 5 + ES_info.size();
}
int SrsTsPayloadPMTESInfo::encode(SrsBuffer* stream)
@ -2506,17 +2506,17 @@ int SrsTsPayloadPMTESInfo::encode(SrsBuffer* stream)
epv |= (const1_value0 << 13) & 0xE000;
stream->write_2bytes(epv);
int16_t eilv = ES_info_length & 0x0FFF;
int16_t eilv = ES_info.size() & 0x0FFF;
eilv |= (const1_value1 << 12) & 0xF000;
stream->write_2bytes(eilv);
if (ES_info_length > 0) {
if (!stream->require(ES_info_length)) {
if (!ES_info.empty()) {
if (!stream->require(ES_info.size())) {
ret = ERROR_STREAM_CASTER_TS_PMT;
srs_error("ts: mux PMT es info data failed. ret=%d", ret);
return ret;
}
stream->write_bytes(ES_info, ES_info_length);
stream->write_bytes(&ES_info[0], ES_info.size());
}
return ret;

@ -1428,12 +1428,7 @@ public:
* reverved value, must be '1'
*/
int8_t const1_value1; //4bits
/**
* 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 of the associated program element immediately following the ES_info_length field.
*/
int16_t ES_info_length; //12bits
char* ES_info; //[ES_info_length] bytes.
std::vector<char> ES_info; //[ES_info_length] bytes.
public:
SrsTsPayloadPMTESInfo(SrsTsStream st = SrsTsStreamReserved, int16_t epid = 0);
virtual ~SrsTsPayloadPMTESInfo();

@ -61,6 +61,7 @@ int parse(std::string mp4_file)
SrsSimpleStream* stream = new SrsSimpleStream();
SrsAutoFree(SrsSimpleStream, stream);
fprintf(stderr, "\n");
while (true) {
SrsMp4Box* box = NULL;
SrsAutoFree(SrsMp4Box, box);

Loading…
Cancel
Save