mirror of
https://github.com/ossrs/srs.git
synced 2025-02-13 03:41:55 +00:00
For #821, Parse basic mp4 boxes.
This commit is contained in:
parent
234904c206
commit
1e3550a52c
3 changed files with 428 additions and 38 deletions
|
@ -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);
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -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…
Reference in a new issue