From 234904c2066cb8f1a85725f972604af55641d6ad Mon Sep 17 00:00:00 2001 From: HungMingWu Date: Sun, 21 May 2017 09:09:58 +0800 Subject: [PATCH 1/2] Refine Refine Refine kernel/ts code (#891) --- trunk/src/kernel/srs_kernel_ts.cpp | 24 ++++++++++++------------ trunk/src/kernel/srs_kernel_ts.hpp | 7 +------ 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/trunk/src/kernel/srs_kernel_ts.cpp b/trunk/src/kernel/srs_kernel_ts.cpp index b2198d31a..ec948ec9a 100644 --- a/trunk/src/kernel/srs_kernel_ts.cpp +++ b/trunk/src/kernel/srs_kernel_ts.cpp @@ -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; diff --git a/trunk/src/kernel/srs_kernel_ts.hpp b/trunk/src/kernel/srs_kernel_ts.hpp index 1042e934e..52da01049 100644 --- a/trunk/src/kernel/srs_kernel_ts.hpp +++ b/trunk/src/kernel/srs_kernel_ts.hpp @@ -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 ES_info; //[ES_info_length] bytes. public: SrsTsPayloadPMTESInfo(SrsTsStream st = SrsTsStreamReserved, int16_t epid = 0); virtual ~SrsTsPayloadPMTESInfo(); From 1e3550a52c0cfc54711554b47191565adb266da0 Mon Sep 17 00:00:00 2001 From: winlin Date: Sun, 21 May 2017 19:41:15 +0800 Subject: [PATCH 2/2] For #821, Parse basic mp4 boxes. --- trunk/src/kernel/srs_kernel_mp4.cpp | 397 ++++++++++++++++++++++--- trunk/src/kernel/srs_kernel_mp4.hpp | 68 +++++ trunk/src/main/srs_main_mp4_parser.cpp | 1 + 3 files changed, 428 insertions(+), 38 deletions(-) diff --git a/trunk/src/kernel/srs_kernel_mp4.cpp b/trunk/src/kernel/srs_kernel_mp4.cpp index 7e7a794bc..9e0d690fe 100644 --- a/trunk/src/kernel/srs_kernel_mp4.cpp +++ b/trunk/src/kernel/srs_kernel_mp4.cpp @@ -58,10 +58,62 @@ stringstream& srs_print_mp4_type(stringstream& ss, uint32_t v) } template -stringstream& srs_print_types(stringstream& ss, std::vector& arr) +stringstream& __srs_print_mp4_vector(std::vector& 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 +stringstream& srs_print_mp4_vector(std::vector& arr, stringstream& ss, int level) +{ + return __srs_print_mp4_vector(arr, ss, level, false); +} + +template +stringstream& __srs_print_mp4_vector_ptr(std::vector& 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 +stringstream& srs_print_mp4_vector_ptr(std::vector& arr, stringstream& ss, int level) { + return __srs_print_mp4_vector_ptr(arr, ss, level, false); +} + +template +stringstream& srs_print_mp4_vector_elem(std::vector& 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& 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& arr, stringstream& ss, int level) +{ + return srs_print_mp4_vector_elem(arr, ss, level); +} + +template<> +stringstream& srs_print_mp4_vector(std::vector& arr, stringstream& ss, int level) +{ + return srs_print_mp4_vector_ptr(arr, ss, level); +} + +template<> +stringstream& srs_print_mp4_vector(std::vector& 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::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; diff --git a/trunk/src/kernel/srs_kernel_mp4.hpp b/trunk/src/kernel/srs_kernel_mp4.hpp index b474fa7a5..a0ecde145 100644 --- a/trunk/src/kernel/srs_kernel_mp4.hpp +++ b/trunk/src/kernel/srs_kernel_mp4.hpp @@ -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); }; /** diff --git a/trunk/src/main/srs_main_mp4_parser.cpp b/trunk/src/main/srs_main_mp4_parser.cpp index d899c1c22..14e275c7a 100644 --- a/trunk/src/main/srs_main_mp4_parser.cpp +++ b/trunk/src/main/srs_main_mp4_parser.cpp @@ -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);