diff --git a/README.md b/README.md
index 387fe0962..290aaf117 100755
--- a/README.md
+++ b/README.md
@@ -12,6 +12,9 @@ Download from github.io: [Centos6-x86_64][centos0], [more...][more0]
Download from ossrs.net: [Centos6-x86_64][centos1], [more...][more1]
For the wiki for SRS/3.0, please read [Chinese][srs_CN] or [English][srs_EN].
+Although SRS is licenced under [MIT][LICENSE], but there are some depended libraries
+which are distributed using their own licenses, please read [License Mixing][LicenseMixing].
+
## Content
* [About](#about)
@@ -1457,6 +1460,9 @@ Winlin
[more0]: http://winlinvip.github.io/srs.release/releases/
[more1]: http://www.ossrs.net/srs.release/releases/
+[LICENSE]: https://github.com/ossrs/srs/blob/develop/LICENSE
+[LicenseMixing]: https://github.com/ossrs/srs/wiki/LicenseMixing
+
[srs_CN]: https://github.com/ossrs/srs/wiki/v3_CN_Home
[srs_EN]: https://github.com/ossrs/srs/wiki/v3_EN_Home
[branch1]: https://github.com/ossrs/srs/tree/1.0release
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);