From 7d91a073e97aa462d532ccb3531799225fccbef1 Mon Sep 17 00:00:00 2001 From: Erik Zandvliet Date: Sat, 19 Mar 2011 19:09:40 +0100 Subject: [PATCH 01/10] Tussentijdse commit --- .gitignore | 1 + ABST_Parser/main.cpp | 395 +++++++++++++++++++++++++++++++++++++++++- util/MP4/box.cpp | 226 +----------------------- util/MP4/box_abst.cpp | 3 +- util/MP4/box_asrt.cpp | 6 + 5 files changed, 407 insertions(+), 224 deletions(-) diff --git a/.gitignore b/.gitignore index 7a6c4c6b..65d32739 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ bin/* gearbox/plugins/001_putserversup.sh AMF_Tester/AMFtest AMF_Creator/AMFtest +ABST_Parser/Box_Parser diff --git a/ABST_Parser/main.cpp b/ABST_Parser/main.cpp index 42b952cc..f8b4ea1a 100644 --- a/ABST_Parser/main.cpp +++ b/ABST_Parser/main.cpp @@ -3,6 +3,395 @@ #include #include "../util/MP4/box_includes.h" +void Parse( Box * source ,std::string PrintOffset ) { + if( source->header.BoxType == 0x61627374 ) { + uint8_t Version = source->Payload[0]; + uint32_t Flags = (source->Payload[1] << 16) + (source->Payload[2] << 8) + (source->Payload[3]); //uint24_t + uint32_t BootstrapInfoVersion = (source->Payload[4] << 24) + (source->Payload[5] << 16) +(source->Payload[6] << 8) + (source->Payload[7]); + uint8_t Profile = (source->Payload[8] >> 6); //uint2_t + uint8_t Live = ((source->Payload[8] >> 5 ) & 0x1); //uint1_t + uint8_t Update = ((source->Payload[8] >> 4 ) & 0x1); //uint1_t + uint8_t Reserved = (source->Payload[8] & 0x4); //uint4_t + uint32_t Timescale = (source->Payload[9] << 24) + (source->Payload[10] << 16) +(source->Payload[11] << 8) + (source->Payload[12]); + uint32_t CurrentMediaTime_Upperhalf = (source->Payload[13] << 24) + (source->Payload[14] << 16) +(source->Payload[15] << 8) + (source->Payload[16]); + uint32_t CurrentMediaTime_Lowerhalf = (source->Payload[17] << 24) + (source->Payload[18] << 16) +(source->Payload[19] << 8) + (source->Payload[20]); + uint32_t SmpteTimeCodeOffset_Upperhalf = (source->Payload[21] << 24) + (source->Payload[22] << 16) +(source->Payload[23] << 8) + (source->Payload[24]); + uint32_t SmpteTimeCodeOffset_Lowerhalf = (source->Payload[25] << 24) + (source->Payload[26] << 16) +(source->Payload[27] << 8) + (source->Payload[28]); + + std::string MovieIdentifier; + uint8_t ServerEntryCount = -1; + std::vector ServerEntryTable; + uint8_t QualityEntryCount = -1; + std::vector QualityEntryTable; + std::string DrmData; + std::string MetaData; + uint8_t SegmentRunTableCount = -1; + std::vector SegmentRunTableEntries; + uint8_t FragmentRunTableCount = -1; + std::vector FragmentRunTableEntries; + + uint32_t CurrentOffset = 29; + uint32_t TempSize; + Box* TempBox; + std::string temp; + while( source->Payload[CurrentOffset] != '\0' ) { MovieIdentifier += source->Payload[CurrentOffset]; CurrentOffset ++; } + CurrentOffset ++; + ServerEntryCount = source->Payload[CurrentOffset]; + CurrentOffset ++; + for( uint8_t i = 0; i < ServerEntryCount; i++ ) { + temp = ""; + while( source->Payload[CurrentOffset] != '\0' ) { temp += source->Payload[CurrentOffset]; CurrentOffset ++; } + ServerEntryTable.push_back(temp); + CurrentOffset++; + } + QualityEntryCount = source->Payload[CurrentOffset]; + CurrentOffset ++; + for( uint8_t i = 0; i < QualityEntryCount; i++ ) { + temp = ""; + while( source->Payload[CurrentOffset] != '\0' ) { temp += source->Payload[CurrentOffset]; CurrentOffset ++; } + QualityEntryTable.push_back(temp); + CurrentOffset++; + } + while( source->Payload[CurrentOffset] != '\0' ) { DrmData += source->Payload[CurrentOffset]; CurrentOffset ++; } + CurrentOffset ++; + while( source->Payload[CurrentOffset] != '\0' ) { MetaData += source->Payload[CurrentOffset]; CurrentOffset ++; } + CurrentOffset ++; + SegmentRunTableCount = source->Payload[CurrentOffset]; + CurrentOffset ++; + for( uint8_t i = 0; i < SegmentRunTableCount; i++ ) { + TempSize = (source->Payload[CurrentOffset] << 24) + (source->Payload[CurrentOffset+1]<< 16) + (source->Payload[CurrentOffset+2]<< 8) + (source->Payload[CurrentOffset+3]); + TempBox = new Box( &source->Payload[CurrentOffset], TempSize ); + SegmentRunTableEntries.push_back(TempBox); + CurrentOffset += TempSize; + } + FragmentRunTableCount = source->Payload[CurrentOffset]; + CurrentOffset ++; + for( uint8_t i = 0; i < FragmentRunTableCount; i++ ) { + TempSize = (source->Payload[CurrentOffset] << 24) + (source->Payload[CurrentOffset+1]<< 16) + (source->Payload[CurrentOffset+2]<< 8) + (source->Payload[CurrentOffset+3]); + TempBox = new Box( &source->Payload[CurrentOffset], TempSize ); + FragmentRunTableEntries.push_back(TempBox); + CurrentOffset += TempSize; + } + + std::cerr << "Box_ABST:\n"; + std::cerr << PrintOffset << " Version: " << (int)Version << "\n"; + std::cerr << PrintOffset << " Flags: " << (int)Flags << "\n"; + std::cerr << PrintOffset << " BootstrapInfoVersion: " << (int)BootstrapInfoVersion << "\n"; + std::cerr << PrintOffset << " Profile: " << (int)Profile << "\n"; + std::cerr << PrintOffset << " Live: " << (int)Live << "\n"; + std::cerr << PrintOffset << " Update: " << (int)Update << "\n"; + std::cerr << PrintOffset << " Reserved: " << (int)Reserved << "\n"; + std::cerr << PrintOffset << " Timescale: " << (int)Timescale << "\n"; + std::cerr << PrintOffset << " CurrentMediaTime: " << (int)CurrentMediaTime_Upperhalf << " " << CurrentMediaTime_Lowerhalf << "\n"; + std::cerr << PrintOffset << " SmpteTimeCodeOffset: " << (int)SmpteTimeCodeOffset_Upperhalf << " " << SmpteTimeCodeOffset_Lowerhalf << "\n"; + std::cerr << PrintOffset << " MovieIdentifier: " << MovieIdentifier << "\n"; + std::cerr << PrintOffset << " ServerEntryCount: " << (int)ServerEntryCount << "\n"; + std::cerr << PrintOffset << " ServerEntryTable:\n"; + for( uint32_t i = 0; i < ServerEntryTable.size( ); i++ ) { + std::cerr << PrintOffset << " " << i+1 << ": " << ServerEntryTable[i] << "\n"; + } + std::cerr << PrintOffset << " QualityEntryCount: " << (int)QualityEntryCount << "\n"; + std::cerr << PrintOffset << " QualityEntryTable:\n"; + for( uint32_t i = 0; i < QualityEntryTable.size( ); i++ ) { + std::cerr << PrintOffset << " " << i+1 << ": " << QualityEntryTable[i] << "\n"; + } + std::cerr << PrintOffset << " DrmData: " << DrmData << "\n"; + std::cerr << PrintOffset << " MetaData: " << MetaData << "\n"; + std::cerr << PrintOffset << " SegmentRunTableCount: " << (int)SegmentRunTableCount << "\n"; + std::cerr << PrintOffset << " SegmentRunTableEntries:\n"; + for( uint32_t i = 0; i < SegmentRunTableEntries.size( ); i++ ) { + std::cerr << PrintOffset << " " << i+1 << ": "; + Parse( SegmentRunTableEntries[i], PrintOffset+" " ); + } + std::cerr << PrintOffset << " FragmentRunTableCount: " << (int)FragmentRunTableCount << "\n"; + std::cerr << PrintOffset << " FragmentRunTableEntries:\n"; + for( uint32_t i = 0; i < FragmentRunTableEntries.size( ); i++ ) { + std::cerr << PrintOffset << " " << i+1 << ": "; + Parse( FragmentRunTableEntries[i], PrintOffset+" " ); + } + + } else if ( source->header.BoxType == 0x61737274 ) { + uint8_t Version = source->Payload[0]; + uint32_t Flags = (source->Payload[1] << 16) + (source->Payload[2] << 8) + (source->Payload[3]); //uint24_t + uint8_t QualityEntryCount; + std::vector QualitySegmentUrlModifiers; + uint32_t SegmentRunEntryCount; + std::vector< std::pair > SegmentRunEntryTable; + + uint32_t CurrentOffset = 4; + std::string temp; + std::pair TempPair; + QualityEntryCount = source->Payload[CurrentOffset]; + CurrentOffset ++; + for( uint8_t i = 0; i < QualityEntryCount; i++ ) { + temp = ""; + while( source->Payload[CurrentOffset] != '\0' ) { temp += source->Payload[CurrentOffset]; CurrentOffset ++; } + QualitySegmentUrlModifiers.push_back(temp); + CurrentOffset++; + } + SegmentRunEntryCount = (source->Payload[CurrentOffset] << 24) + (source->Payload[CurrentOffset+1] << 16) + (source->Payload[CurrentOffset+2]) + (source->Payload[CurrentOffset+3]); + CurrentOffset +=4; + for( uint8_t i = 0; i < SegmentRunEntryCount; i++ ) { + TempPair.first = (source->Payload[CurrentOffset] << 24) + (source->Payload[CurrentOffset+1] << 16) + (source->Payload[CurrentOffset+2] << 8) + (source->Payload[CurrentOffset+3]); + CurrentOffset+=4; + TempPair.second = (source->Payload[CurrentOffset] << 24) + (source->Payload[CurrentOffset+1] << 16) + (source->Payload[CurrentOffset+2] << 8) + (source->Payload[CurrentOffset+3]); + CurrentOffset+=4; + SegmentRunEntryTable.push_back(TempPair); + } + + std::cerr << "Box_ASRT:\n"; + std::cerr << PrintOffset << " Version: " << (int)Version << "\n"; + std::cerr << PrintOffset << " Flags: " << (int)Flags << "\n"; + std::cerr << PrintOffset << " QualityEntryCount: " << (int)QualityEntryCount << "\n"; + std::cerr << PrintOffset << " QualitySegmentUrlModifiers:\n"; + for( uint32_t i = 0; i < QualitySegmentUrlModifiers.size( ); i++ ) { + std::cerr << PrintOffset << " " << i+1 << ": " << QualitySegmentUrlModifiers[i] << "\n"; + } + std::cerr << PrintOffset << " SegmentRunEntryCount: " << (int)SegmentRunEntryCount << "\n"; + std::cerr << PrintOffset << " SegmentRunEntryTable:\n"; + for( uint32_t i = 0; i < SegmentRunEntryTable.size( ); i++ ) { + std::cerr << PrintOffset << " " << i+1 << ":\n"; + std::cerr << PrintOffset << " FirstSegment: " << SegmentRunEntryTable[i].first << "\n"; + std::cerr << PrintOffset << " FragmentsPerSegment: " << SegmentRunEntryTable[i].second << "\n"; + } + } else if ( source->header.BoxType == 0x61667274 ) { + uint8_t Version = source->Payload[0]; + uint32_t Flags = (source->Payload[1] << 16) + (source->Payload[2] << 8) + (source->Payload[3]); //uint24_t + uint32_t TimeScale = (source->Payload[4] << 24) + (source->Payload[5] << 16) + (source->Payload[6] << 8) + (source->Payload[7]); + uint8_t QualityEntryCount; + std::vector QualitySegmentUrlModifiers; + uint32_t FragmentRunEntryCount; + std::vector FragmentRunEntryTable; + + uint32_t CurrentOffset = 8; + std::string temp; + afrt_fragmentrunentry TempEntry; + QualityEntryCount = source->Payload[CurrentOffset]; + CurrentOffset ++; + for( uint8_t i = 0; i < QualityEntryCount; i++ ) { + temp = ""; + while( source->Payload[CurrentOffset] != '\0' ) { temp += source->Payload[CurrentOffset]; CurrentOffset ++; } + QualitySegmentUrlModifiers.push_back(temp); + CurrentOffset++; + } + FragmentRunEntryCount = (source->Payload[CurrentOffset] << 24) + (source->Payload[CurrentOffset+1] << 16) + (source->Payload[CurrentOffset+2]) + (source->Payload[CurrentOffset+3]); + CurrentOffset +=4; + for( uint8_t i = 0; i < FragmentRunEntryCount; i ++ ) { + TempEntry.FirstFragment = (source->Payload[CurrentOffset] << 24) + (source->Payload[CurrentOffset+1] << 16) + (source->Payload[CurrentOffset+2]) + (source->Payload[CurrentOffset+3]); + CurrentOffset +=4; + TempEntry.FirstFragmentTimestamp_Upperhalf = (source->Payload[CurrentOffset] << 24) + (source->Payload[CurrentOffset+1] << 16) + (source->Payload[CurrentOffset+2]) + (source->Payload[CurrentOffset+3]); + CurrentOffset +=4; + TempEntry.FirstFragmentTimestamp = (source->Payload[CurrentOffset] << 24) + (source->Payload[CurrentOffset+1] << 16) + (source->Payload[CurrentOffset+2]) + (source->Payload[CurrentOffset+3]); + CurrentOffset +=4; + TempEntry.FragmentDuration = (source->Payload[CurrentOffset] << 24) + (source->Payload[CurrentOffset+1] << 16) + (source->Payload[CurrentOffset+2]) + (source->Payload[CurrentOffset+3]); + CurrentOffset +=4; + if( TempEntry.FragmentDuration == 0 ) { + TempEntry.DiscontinuityIndicator = source->Payload[CurrentOffset]; + CurrentOffset++; + } + FragmentRunEntryTable.push_back(TempEntry); + } + + std::cerr << "Box_AFRT:\n"; + std::cerr << PrintOffset << " Version: " << (int)Version << "\n"; + std::cerr << PrintOffset << " Flags: " << (int)Flags << "\n"; + std::cerr << PrintOffset << " Timescale: " << (int)TimeScale << "\n"; + std::cerr << PrintOffset << " QualityEntryCount: " << (int)QualityEntryCount << "\n"; + std::cerr << PrintOffset << " QualitySegmentUrlModifiers:\n"; + for( uint32_t i = 0; i < QualitySegmentUrlModifiers.size( ); i++ ) { + std::cerr << PrintOffset << " " << i+1 << ": " << QualitySegmentUrlModifiers[i] << "\n"; + } + std::cerr << PrintOffset << " FragmentRunEntryCount: " << (int)FragmentRunEntryCount << "\n"; + std::cerr << PrintOffset << " FragmentRunEntryTable:\n"; + for( uint32_t i = 0; i < FragmentRunEntryTable.size( ); i++ ) { + std::cerr << PrintOffset << " " << i+1 << ":\n"; + std::cerr << PrintOffset << " FirstFragment: " << FragmentRunEntryTable[i].FirstFragment << "\n"; + std::cerr << PrintOffset << " FirstFragmentTimestamp: " << FragmentRunEntryTable[i].FirstFragmentTimestamp_Upperhalf << FragmentRunEntryTable[i].FirstFragmentTimestamp << "\n"; + std::cerr << PrintOffset << " FragmentDuration: " << FragmentRunEntryTable[i].FragmentDuration << "\n"; + if( FragmentRunEntryTable[i].FragmentDuration == 0 ) { + std::cerr << PrintOffset << " DiscontinuityIndicator: " << (int)FragmentRunEntryTable[i].DiscontinuityIndicator << "\n"; + } + } + } else { + std::cerr << "BoxType '" + << (char)(source->header.BoxType >> 24) + << (char)((source->header.BoxType << 8) >> 24) + << (char)((source->header.BoxType << 16) >> 24) + << (char)((source->header.BoxType << 24) >> 24) + << "' not yet implemented!\n"; + } +} + +void * Parse( Box * source ) { + if( source->header.BoxType == 0x61627374 ) { //abst + uint8_t Version = source->Payload[0]; + uint32_t Flags = (source->Payload[1] << 16) + (source->Payload[2] << 8) + (source->Payload[3]); //uint24_t + uint32_t BootstrapInfoVersion = (source->Payload[4] << 24) + (source->Payload[5] << 16) +(source->Payload[6] << 8) + (source->Payload[7]); + uint8_t Profile = (source->Payload[8] >> 6); //uint2_t + uint8_t Live = (( source->Payload[8] >> 5 ) & 0x1); //uint1_t + uint8_t Update = (( source->Payload[8] >> 4 ) & 0x1); //uint1_t + uint8_t Reserved = ( source->Payload[8] & 0x4); //uint4_t + uint32_t Timescale = (source->Payload[9] << 24) + (source->Payload[10] << 16) +(source->Payload[11] << 8) + (source->Payload[12]); + uint32_t CurrentMediaTime_Upperhalf = (source->Payload[13] << 24) + (source->Payload[14] << 16) +(source->Payload[15] << 8) + (source->Payload[16]); + uint32_t CurrentMediaTime_Lowerhalf = (source->Payload[17] << 24) + (source->Payload[18] << 16) +(source->Payload[19] << 8) + (source->Payload[20]); + uint32_t SmpteTimeCodeOffset_Upperhalf = (source->Payload[21] << 24) + (source->Payload[22] << 16) +(source->Payload[23] << 8) + (source->Payload[24]); + uint32_t SmpteTimeCodeOffset_Lowerhalf = (source->Payload[25] << 24) + (source->Payload[26] << 16) +(source->Payload[27] << 8) + (source->Payload[28]); + + std::string MovieIdentifier; + uint8_t ServerEntryCount = -1; + std::vector ServerEntryTable; + uint8_t QualityEntryCount = -1; + std::vector QualityEntryTable; + std::string DrmData; + std::string MetaData; + uint8_t SegmentRunTableCount = -1; + std::vector SegmentRunTableEntries; + uint8_t FragmentRunTableCount = -1; + std::vector FragmentRunTableEntries; + + uint32_t CurrentOffset = 29; + uint32_t TempSize; + Box_asrt* TempAsrt; + Box_afrt* TempAfrt; + std::string temp; + while( source->Payload[CurrentOffset] != '\0' ) { MovieIdentifier += source->Payload[CurrentOffset]; CurrentOffset ++; } + CurrentOffset ++; + ServerEntryCount = source->Payload[CurrentOffset]; + CurrentOffset ++; + for( uint8_t i = 0; i < ServerEntryCount; i++ ) { + temp = ""; + while( source->Payload[CurrentOffset] != '\0' ) { temp += source->Payload[CurrentOffset]; CurrentOffset ++; } + ServerEntryTable.push_back(temp); + CurrentOffset++; + } + QualityEntryCount = source->Payload[CurrentOffset]; + CurrentOffset ++; + for( uint8_t i = 0; i < QualityEntryCount; i++ ) { + temp = ""; + while( source->Payload[CurrentOffset] != '\0' ) { temp += source->Payload[CurrentOffset]; CurrentOffset ++; } + QualityEntryTable.push_back(temp); + CurrentOffset++; + } + while( source->Payload[CurrentOffset] != '\0' ) { DrmData += source->Payload[CurrentOffset]; CurrentOffset ++; } + CurrentOffset ++; + while( source->Payload[CurrentOffset] != '\0' ) { MetaData += source->Payload[CurrentOffset]; CurrentOffset ++; } + CurrentOffset ++; + SegmentRunTableCount = source->Payload[CurrentOffset]; + CurrentOffset ++; + for( uint8_t i = 0; i < SegmentRunTableCount; i++ ) { + TempSize = (source->Payload[CurrentOffset] << 24) + (source->Payload[CurrentOffset+1]<< 16) + (source->Payload[CurrentOffset+2]<< 8) + (source->Payload[CurrentOffset+3]); + TempAsrt = (Box_asrt*)Parse( new Box( &source->Payload[CurrentOffset], TempSize ) ); + SegmentRunTableEntries.push_back(TempAsrt); + CurrentOffset += TempSize; + } + FragmentRunTableCount = source->Payload[CurrentOffset]; + CurrentOffset ++; + for( uint8_t i = 0; i < FragmentRunTableCount; i++ ) { + TempSize = (source->Payload[CurrentOffset] << 24) + (source->Payload[CurrentOffset+1]<< 16) + (source->Payload[CurrentOffset+2]<< 8) + (source->Payload[CurrentOffset+3]); + TempAfrt = (Box_afrt*)Parse( new Box( &source->Payload[CurrentOffset], TempSize ) ); + FragmentRunTableEntries.push_back(TempAfrt); + CurrentOffset += TempSize; + } + Box_abst * returnval = new Box_abst( ); + returnval->SetVersion( Version ); + returnval->SetBootstrapVersion( BootstrapInfoVersion ); + returnval->SetProfile( Profile ); + returnval->SetLive( Live ); + returnval->SetUpdate( Update ); + returnval->SetTimeScale( Timescale ); + returnval->SetMediaTime( CurrentMediaTime_Lowerhalf ); + returnval->SetSMPTE( SmpteTimeCodeOffset_Lowerhalf ); + returnval->SetMovieIdentifier( MovieIdentifier ); + returnval->SetDRM( DrmData ); + returnval->SetMetaData( MetaData ); + for( uint8_t i = 0; i < ServerEntryTable.size( ); i++ ) { returnval->AddServerEntry( ServerEntryTable[i], i); } + for( uint8_t i = 0; i < QualityEntryTable.size( ); i++ ) { returnval->AddQualityEntry( QualityEntryTable[i], i ); } + for( uint8_t i = 0; i < SegmentRunTableEntries.size( ); i++ ) { returnval->AddSegmentRunTable( SegmentRunTableEntries[i]->GetBox( ), i ); } + for( uint8_t i = 0; i < FragmentRunTableEntries.size( ); i++ ) { returnval->AddFragmentRunTable( FragmentRunTableEntries[i]->GetBox( ), i ); } + return(void *)returnval; + } else if ( source->header.BoxType == 0x61737274 ) { //asrt + uint8_t Version = source->Payload[0]; + uint32_t Flags = (source->Payload[1] << 16) + (source->Payload[2] << 8) + (source->Payload[3]); //uint24_t + uint8_t QualityEntryCount; + std::vector QualitySegmentUrlModifiers; + uint32_t SegmentRunEntryCount; + std::vector< std::pair > SegmentRunEntryTable; + + uint32_t CurrentOffset = 4; + std::string temp; + std::pair TempPair; + QualityEntryCount = source->Payload[CurrentOffset]; + CurrentOffset ++; + for( uint8_t i = 0; i < QualityEntryCount; i++ ) { + temp = ""; + while( source->Payload[CurrentOffset] != '\0' ) { temp += source->Payload[CurrentOffset]; CurrentOffset ++; } + QualitySegmentUrlModifiers.push_back(temp); + CurrentOffset++; + } + SegmentRunEntryCount = (source->Payload[CurrentOffset] << 24) + (source->Payload[CurrentOffset+1] << 16) + (source->Payload[CurrentOffset+2]) + (source->Payload[CurrentOffset+3]); + CurrentOffset +=4; + for( uint8_t i = 0; i < SegmentRunEntryCount; i++ ) { + TempPair.first = (source->Payload[CurrentOffset] << 24) + (source->Payload[CurrentOffset+1] << 16) + (source->Payload[CurrentOffset+2] << 8) + (source->Payload[CurrentOffset+3]); + CurrentOffset+=4; + TempPair.second = (source->Payload[CurrentOffset] << 24) + (source->Payload[CurrentOffset+1] << 16) + (source->Payload[CurrentOffset+2] << 8) + (source->Payload[CurrentOffset+3]); + CurrentOffset+=4; + SegmentRunEntryTable.push_back(TempPair); + } + Box_asrt * returnval = new Box_asrt( ); + returnval->SetVersion(Version); + returnval->SetUpdate( ); + for( uint8_t i = 0; i < QualitySegmentUrlModifiers.size( ); i++ ) { returnval->AddQualityEntry( QualitySegmentUrlModifiers[i], i ); } + for( uint8_t i = 0; i < SegmentRunEntryTable.size( ); i++ ) { returnval->AddSegmentRunEntry( SegmentRunEntryTable[i].first, SegmentRunEntryTable[i].second, i); } + return (void*)returnval; + } else if ( source->header.BoxType == 0x61667274 ) { //afrt + uint8_t Version = source->Payload[0]; + uint32_t Flags = (source->Payload[1] << 16) + (source->Payload[2] << 8) + (source->Payload[3]); //uint24_t + uint32_t TimeScale = (source->Payload[4] << 24) + (source->Payload[5] << 16) + (source->Payload[6] << 8) + (source->Payload[7]); + uint8_t QualityEntryCount; + std::vector QualitySegmentUrlModifiers; + uint32_t FragmentRunEntryCount; + std::vector FragmentRunEntryTable; + + uint32_t CurrentOffset = 8; + std::string temp; + afrt_fragmentrunentry TempEntry; + QualityEntryCount = source->Payload[CurrentOffset]; + CurrentOffset ++; + for( uint8_t i = 0; i < QualityEntryCount; i++ ) { + temp = ""; + while( source->Payload[CurrentOffset] != '\0' ) { temp += source->Payload[CurrentOffset]; CurrentOffset ++; } + QualitySegmentUrlModifiers.push_back(temp); + CurrentOffset++; + } + FragmentRunEntryCount = (source->Payload[CurrentOffset] << 24) + (source->Payload[CurrentOffset+1] << 16) + (source->Payload[CurrentOffset+2]) + (source->Payload[CurrentOffset+3]); + CurrentOffset +=4; + for( uint8_t i = 0; i < FragmentRunEntryCount; i ++ ) { + TempEntry.FirstFragment = (source->Payload[CurrentOffset] << 24) + (source->Payload[CurrentOffset+1] << 16) + (source->Payload[CurrentOffset+2]) + (source->Payload[CurrentOffset+3]); + CurrentOffset +=4; + TempEntry.FirstFragmentTimestamp_Upperhalf = (source->Payload[CurrentOffset] << 24) + (source->Payload[CurrentOffset+1] << 16) + (source->Payload[CurrentOffset+2]) + (source->Payload[CurrentOffset+3]); + CurrentOffset +=4; + TempEntry.FirstFragmentTimestamp = (source->Payload[CurrentOffset] << 24) + (source->Payload[CurrentOffset+1] << 16) + (source->Payload[CurrentOffset+2]) + (source->Payload[CurrentOffset+3]); + CurrentOffset +=4; + TempEntry.FragmentDuration = (source->Payload[CurrentOffset] << 24) + (source->Payload[CurrentOffset+1] << 16) + (source->Payload[CurrentOffset+2]) + (source->Payload[CurrentOffset+3]); + CurrentOffset +=4; + if( TempEntry.FragmentDuration == 0 ) { + TempEntry.DiscontinuityIndicator = source->Payload[CurrentOffset]; + CurrentOffset++; + } + FragmentRunEntryTable.push_back(TempEntry); + } + + } else { + std::cerr << "BoxType '" + << (char)(source->header.BoxType >> 24) + << (char)((source->header.BoxType << 8) >> 24) + << (char)((source->header.BoxType << 16) >> 24) + << (char)((source->header.BoxType << 24) >> 24) + << "' not yet implemented!\n"; + } + return NULL; +} + int main( ) { std::string temp; bool validinp = true; @@ -16,6 +405,10 @@ int main( ) { } } Box * TestBox = new Box((uint8_t*)temp.c_str( ), temp.size( )); - TestBox->Parse( ); + Box_abst * TestABST; + TestABST = (Box_abst*)Parse( TestBox ); + std::cout << "Box Created\n"; + Parse( TestABST->GetBox(), "" ); + delete TestABST; delete TestBox; } diff --git a/util/MP4/box.cpp b/util/MP4/box.cpp index 2e948bf6..be18b31e 100644 --- a/util/MP4/box.cpp +++ b/util/MP4/box.cpp @@ -41,11 +41,12 @@ class Box { static uint8_t * uint8_to_uint8( uint8_t data ); BoxHeader GetHeader( ); void ResetPayload( ); - void Parse( std::string PrintOffset = "" ); - private: - BoxHeader header; + void Parse( std::string PrintOffset ); + void * Parse( ); uint8_t * Payload; + BoxHeader header; uint32_t PayloadSize; + private: };//Box Class Box::Box() { @@ -175,222 +176,3 @@ void Box::ResetPayload( ) { Payload = NULL; } } - -void Box::Parse( std::string PrintOffset ) { - if( header.BoxType == 0x61627374 ) { - uint8_t Version = Payload[0]; - uint32_t Flags = (Payload[1] << 16) + (Payload[2] << 8) + (Payload[3]); //uint24_t - uint32_t BootstrapInfoVersion = (Payload[4] << 24) + (Payload[5] << 16) +(Payload[6] << 8) + (Payload[7]); - uint8_t Profile = (Payload[8] >> 6); //uint2_t - uint8_t Live = (( Payload[8] >> 5 ) & 0x1); //uint1_t - uint8_t Update = (( Payload[8] >> 4 ) & 0x1); //uint1_t - uint8_t Reserved = ( Payload[8] & 0x4); //uint4_t - uint32_t Timescale = (Payload[9] << 24) + (Payload[10] << 16) +(Payload[11] << 8) + (Payload[12]); - uint32_t CurrentMediaTime_Upperhalf = (Payload[13] << 24) + (Payload[14] << 16) +(Payload[15] << 8) + (Payload[16]); - uint32_t CurrentMediaTime_Lowerhalf = (Payload[17] << 24) + (Payload[18] << 16) +(Payload[19] << 8) + (Payload[20]); - uint32_t SmpteTimeCodeOffset_Upperhalf = (Payload[21] << 24) + (Payload[22] << 16) +(Payload[23] << 8) + (Payload[24]); - uint32_t SmpteTimeCodeOffset_Lowerhalf = (Payload[25] << 24) + (Payload[26] << 16) +(Payload[27] << 8) + (Payload[28]); - - std::string MovieIdentifier; - uint8_t ServerEntryCount = -1; - std::vector ServerEntryTable; - uint8_t QualityEntryCount = -1; - std::vector QualityEntryTable; - std::string DrmData; - std::string MetaData; - uint8_t SegmentRunTableCount = -1; - std::vector SegmentRunTableEntries; - uint8_t FragmentRunTableCount = -1; - std::vector FragmentRunTableEntries; - - uint32_t CurrentOffset = 29; - uint32_t TempSize; - Box* TempBox; - std::string temp; - while( Payload[CurrentOffset] != '\0' ) { MovieIdentifier += Payload[CurrentOffset]; CurrentOffset ++; } - CurrentOffset ++; - ServerEntryCount = Payload[CurrentOffset]; - CurrentOffset ++; - for( uint8_t i = 0; i < ServerEntryCount; i++ ) { - temp = ""; - while( Payload[CurrentOffset] != '\0' ) { temp += Payload[CurrentOffset]; CurrentOffset ++; } - ServerEntryTable.push_back(temp); - CurrentOffset++; - } - QualityEntryCount = Payload[CurrentOffset]; - CurrentOffset ++; - for( uint8_t i = 0; i < QualityEntryCount; i++ ) { - temp = ""; - while( Payload[CurrentOffset] != '\0' ) { temp += Payload[CurrentOffset]; CurrentOffset ++; } - QualityEntryTable.push_back(temp); - CurrentOffset++; - } - while( Payload[CurrentOffset] != '\0' ) { DrmData += Payload[CurrentOffset]; CurrentOffset ++; } - CurrentOffset ++; - while( Payload[CurrentOffset] != '\0' ) { MetaData += Payload[CurrentOffset]; CurrentOffset ++; } - CurrentOffset ++; - SegmentRunTableCount = Payload[CurrentOffset]; - CurrentOffset ++; - for( uint8_t i = 0; i < SegmentRunTableCount; i++ ) { - TempSize = (Payload[CurrentOffset] << 24) + (Payload[CurrentOffset+1]<< 16) + (Payload[CurrentOffset+2]<< 8) + (Payload[CurrentOffset+3]); - TempBox = new Box( &Payload[CurrentOffset], TempSize ); - SegmentRunTableEntries.push_back(TempBox); - CurrentOffset += TempSize; - } - FragmentRunTableCount = Payload[CurrentOffset]; - CurrentOffset ++; - for( uint8_t i = 0; i < FragmentRunTableCount; i++ ) { - TempSize = (Payload[CurrentOffset] << 24) + (Payload[CurrentOffset+1]<< 16) + (Payload[CurrentOffset+2]<< 8) + (Payload[CurrentOffset+3]); - TempBox = new Box( &Payload[CurrentOffset], TempSize ); - FragmentRunTableEntries.push_back(TempBox); - CurrentOffset += TempSize; - } - - std::cerr << "Box_ABST:\n"; - std::cerr << PrintOffset << " Version: " << (int)Version << "\n"; - std::cerr << PrintOffset << " Flags: " << (int)Flags << "\n"; - std::cerr << PrintOffset << " BootstrapInfoVersion: " << (int)BootstrapInfoVersion << "\n"; - std::cerr << PrintOffset << " Profile: " << (int)Profile << "\n"; - std::cerr << PrintOffset << " Live: " << (int)Live << "\n"; - std::cerr << PrintOffset << " Update: " << (int)Update << "\n"; - std::cerr << PrintOffset << " Reserved: " << (int)Reserved << "\n"; - std::cerr << PrintOffset << " Timescale: " << (int)Timescale << "\n"; - std::cerr << PrintOffset << " CurrentMediaTime: " << (int)CurrentMediaTime_Upperhalf << " " << CurrentMediaTime_Lowerhalf << "\n"; - std::cerr << PrintOffset << " SmpteTimeCodeOffset: " << (int)SmpteTimeCodeOffset_Upperhalf << " " << SmpteTimeCodeOffset_Lowerhalf << "\n"; - std::cerr << PrintOffset << " MovieIdentifier: " << MovieIdentifier << "\n"; - std::cerr << PrintOffset << " ServerEntryCount: " << (int)ServerEntryCount << "\n"; - std::cerr << PrintOffset << " ServerEntryTable:\n"; - for( uint32_t i = 0; i < ServerEntryTable.size( ); i++ ) { - std::cerr << PrintOffset << " " << i+1 << ": " << ServerEntryTable[i] << "\n"; - } - std::cerr << PrintOffset << " QualityEntryCount: " << (int)QualityEntryCount << "\n"; - std::cerr << PrintOffset << " QualityEntryTable:\n"; - for( uint32_t i = 0; i < QualityEntryTable.size( ); i++ ) { - std::cerr << PrintOffset << " " << i+1 << ": " << QualityEntryTable[i] << "\n"; - } - std::cerr << PrintOffset << " DrmData: " << DrmData << "\n"; - std::cerr << PrintOffset << " MetaData: " << MetaData << "\n"; - std::cerr << PrintOffset << " SegmentRunTableCount: " << (int)SegmentRunTableCount << "\n"; - std::cerr << PrintOffset << " SegmentRunTableEntries:\n"; - for( uint32_t i = 0; i < SegmentRunTableEntries.size( ); i++ ) { - std::cerr << PrintOffset << " " << i+1 << ": "; - SegmentRunTableEntries[i]->Parse( PrintOffset+" "); - } - std::cerr << PrintOffset << " FragmentRunTableCount: " << (int)FragmentRunTableCount << "\n"; - std::cerr << PrintOffset << " FragmentRunTableEntries:\n"; - for( uint32_t i = 0; i < FragmentRunTableEntries.size( ); i++ ) { - std::cerr << PrintOffset << " " << i+1 << ": "; - FragmentRunTableEntries[i]->Parse( PrintOffset+" "); - } - - } else if ( header.BoxType == 0x61737274 ) { - uint8_t Version = Payload[0]; - uint32_t Flags = (Payload[1] << 16) + (Payload[2] << 8) + (Payload[3]); //uint24_t - uint8_t QualityEntryCount; - std::vector QualitySegmentUrlModifiers; - uint32_t SegmentRunEntryCount; - std::vector< std::pair > SegmentRunEntryTable; - - uint32_t CurrentOffset = 4; - std::string temp; - std::pair TempPair; - QualityEntryCount = Payload[CurrentOffset]; - CurrentOffset ++; - for( uint8_t i = 0; i < QualityEntryCount; i++ ) { - temp = ""; - while( Payload[CurrentOffset] != '\0' ) { temp += Payload[CurrentOffset]; CurrentOffset ++; } - QualitySegmentUrlModifiers.push_back(temp); - CurrentOffset++; - } - SegmentRunEntryCount = (Payload[CurrentOffset] << 24) + (Payload[CurrentOffset+1] << 16) + (Payload[CurrentOffset+2]) + (Payload[CurrentOffset+3]); - CurrentOffset +=4; - for( uint8_t i = 0; i < SegmentRunEntryCount; i++ ) { - TempPair.first = (Payload[CurrentOffset] << 24) + (Payload[CurrentOffset+1] << 16) + (Payload[CurrentOffset+2] << 8) + (Payload[CurrentOffset+3]); - CurrentOffset+=4; - TempPair.second = (Payload[CurrentOffset] << 24) + (Payload[CurrentOffset+1] << 16) + (Payload[CurrentOffset+2] << 8) + (Payload[CurrentOffset+3]); - CurrentOffset+=4; - SegmentRunEntryTable.push_back(TempPair); - } - - std::cerr << "Box_ASRT:\n"; - std::cerr << PrintOffset << " Version: " << (int)Version << "\n"; - std::cerr << PrintOffset << " Flags: " << (int)Flags << "\n"; - std::cerr << PrintOffset << " QualityEntryCount: " << (int)QualityEntryCount << "\n"; - std::cerr << PrintOffset << " QualitySegmentUrlModifiers:\n"; - for( uint32_t i = 0; i < QualitySegmentUrlModifiers.size( ); i++ ) { - std::cerr << PrintOffset << " " << i+1 << ": " << QualitySegmentUrlModifiers[i] << "\n"; - } - std::cerr << PrintOffset << " SegmentRunEntryCount: " << (int)SegmentRunEntryCount << "\n"; - std::cerr << PrintOffset << " SegmentRunEntryTable:\n"; - for( uint32_t i = 0; i < SegmentRunEntryTable.size( ); i++ ) { - std::cerr << PrintOffset << " " << i+1 << ":\n"; - std::cerr << PrintOffset << " FirstSegment: " << SegmentRunEntryTable[i].first << "\n"; - std::cerr << PrintOffset << " FragmentsPerSegment: " << SegmentRunEntryTable[i].second << "\n"; - } - } else if ( header.BoxType == 0x61667274 ) { - uint8_t Version = Payload[0]; - uint32_t Flags = (Payload[1] << 16) + (Payload[2] << 8) + (Payload[3]); //uint24_t - uint32_t TimeScale = (Payload[4] << 24) + (Payload[5] << 16) + (Payload[6] << 8) + (Payload[7]); - uint8_t QualityEntryCount; - std::vector QualitySegmentUrlModifiers; - uint32_t FragmentRunEntryCount; - std::vector FragmentRunEntryTable; - - uint32_t CurrentOffset = 8; - std::string temp; - afrt_fragmentrunentry TempEntry; - QualityEntryCount = Payload[CurrentOffset]; - CurrentOffset ++; - for( uint8_t i = 0; i < QualityEntryCount; i++ ) { - temp = ""; - while( Payload[CurrentOffset] != '\0' ) { temp += Payload[CurrentOffset]; CurrentOffset ++; } - QualitySegmentUrlModifiers.push_back(temp); - CurrentOffset++; - } - FragmentRunEntryCount = (Payload[CurrentOffset] << 24) + (Payload[CurrentOffset+1] << 16) + (Payload[CurrentOffset+2]) + (Payload[CurrentOffset+3]); - CurrentOffset +=4; - for( uint8_t i = 0; i < FragmentRunEntryCount; i ++ ) { - TempEntry.FirstFragment = (Payload[CurrentOffset] << 24) + (Payload[CurrentOffset+1] << 16) + (Payload[CurrentOffset+2]) + (Payload[CurrentOffset+3]); - CurrentOffset +=4; - TempEntry.FirstFragmentTimestamp_Upperhalf = (Payload[CurrentOffset] << 24) + (Payload[CurrentOffset+1] << 16) + (Payload[CurrentOffset+2]) + (Payload[CurrentOffset+3]); - CurrentOffset +=4; - TempEntry.FirstFragmentTimestamp = (Payload[CurrentOffset] << 24) + (Payload[CurrentOffset+1] << 16) + (Payload[CurrentOffset+2]) + (Payload[CurrentOffset+3]); - CurrentOffset +=4; - TempEntry.FragmentDuration = (Payload[CurrentOffset] << 24) + (Payload[CurrentOffset+1] << 16) + (Payload[CurrentOffset+2]) + (Payload[CurrentOffset+3]); - CurrentOffset +=4; - if( TempEntry.FragmentDuration == 0 ) { - TempEntry.DiscontinuityIndicator = Payload[CurrentOffset]; - CurrentOffset++; - } - FragmentRunEntryTable.push_back(TempEntry); - } - - std::cerr << "Box_AFRT:\n"; - std::cerr << PrintOffset << " Version: " << (int)Version << "\n"; - std::cerr << PrintOffset << " Flags: " << (int)Flags << "\n"; - std::cerr << PrintOffset << " Timescale: " << (int)TimeScale << "\n"; - std::cerr << PrintOffset << " QualityEntryCount: " << (int)QualityEntryCount << "\n"; - std::cerr << PrintOffset << " QualitySegmentUrlModifiers:\n"; - for( uint32_t i = 0; i < QualitySegmentUrlModifiers.size( ); i++ ) { - std::cerr << PrintOffset << " " << i+1 << ": " << QualitySegmentUrlModifiers[i] << "\n"; - } - std::cerr << PrintOffset << " FragmentRunEntryCount: " << (int)FragmentRunEntryCount << "\n"; - std::cerr << PrintOffset << " FragmentRunEntryTable:\n"; - for( uint32_t i = 0; i < FragmentRunEntryTable.size( ); i++ ) { - std::cerr << PrintOffset << " " << i+1 << ":\n"; - std::cerr << PrintOffset << " FirstFragment: " << FragmentRunEntryTable[i].FirstFragment << "\n"; - std::cerr << PrintOffset << " FirstFragmentTimestamp: " << FragmentRunEntryTable[i].FirstFragmentTimestamp_Upperhalf << FragmentRunEntryTable[i].FirstFragmentTimestamp << "\n"; - std::cerr << PrintOffset << " FragmentDuration: " << FragmentRunEntryTable[i].FragmentDuration << "\n"; - if( FragmentRunEntryTable[i].FragmentDuration == 0 ) { - std::cerr << PrintOffset << " DiscontinuityIndicator: " << (int)FragmentRunEntryTable[i].DiscontinuityIndicator << "\n"; - } - } - } else { - std::cerr << "BoxType '" - << (char)(header.BoxType >> 24) - << (char)((header.BoxType << 8) >> 24) - << (char)((header.BoxType << 16) >> 24) - << (char)((header.BoxType << 24) >> 24) - << "' not yet implemented!\n"; - } -} diff --git a/util/MP4/box_abst.cpp b/util/MP4/box_abst.cpp index 129a423c..238679ee 100644 --- a/util/MP4/box_abst.cpp +++ b/util/MP4/box_abst.cpp @@ -1,7 +1,9 @@ +#pragma once #include "box.cpp" #include #include + struct abst_serverentry { std::string ServerBaseUrl; };//abst_serverentry @@ -156,7 +158,6 @@ void Box_abst::SetVersion( bool NewVersion) { Version = NewVersion; } - void Box_abst::SetReserved( ) { Container->SetPayload((uint32_t)4,Box::uint32_to_uint8(0)); } diff --git a/util/MP4/box_asrt.cpp b/util/MP4/box_asrt.cpp index 23553037..cbc5ba31 100644 --- a/util/MP4/box_asrt.cpp +++ b/util/MP4/box_asrt.cpp @@ -16,9 +16,11 @@ class Box_asrt { void AddQualityEntry( std::string Quality = "", uint32_t Offset = 0 ); void AddSegmentRunEntry( uint32_t FirstSegment = 0, uint32_t FragmentsPerSegment = 100, uint32_t Offset = 0 ); void WriteContent( ); + void SetVersion( bool NewVersion = 0 ); private: void SetDefaults( ); bool isUpdate; + bool Version; std::vector QualitySegmentUrlModifiers; std::vector SegmentRunEntryTable; Box * Container; @@ -55,6 +57,10 @@ void Box_asrt::AddSegmentRunEntry( uint32_t FirstSegment, uint32_t FragmentsPerS SegmentRunEntryTable[Offset].FragmentsPerSegment = FragmentsPerSegment; } +void Box_asrt::SetVersion( bool NewVersion ) { + Version = NewVersion; +} + void Box_asrt::SetDefaults( ) { SetUpdate( ); } From 251cd12710ab9a5d9020e1a8c83082bc7db55314 Mon Sep 17 00:00:00 2001 From: Erik Zandvliet Date: Sat, 19 Mar 2011 19:49:40 +0100 Subject: [PATCH 02/10] Test1 --- ABST_Parser/main.cpp | 176 +--------------------------------------- Connector_HTTP/main.cpp | 4 +- util/MP4/interface.cpp | 11 ++- 3 files changed, 10 insertions(+), 181 deletions(-) diff --git a/ABST_Parser/main.cpp b/ABST_Parser/main.cpp index f8b4ea1a..e4a2dae6 100644 --- a/ABST_Parser/main.cpp +++ b/ABST_Parser/main.cpp @@ -222,176 +222,6 @@ void Parse( Box * source ,std::string PrintOffset ) { } } -void * Parse( Box * source ) { - if( source->header.BoxType == 0x61627374 ) { //abst - uint8_t Version = source->Payload[0]; - uint32_t Flags = (source->Payload[1] << 16) + (source->Payload[2] << 8) + (source->Payload[3]); //uint24_t - uint32_t BootstrapInfoVersion = (source->Payload[4] << 24) + (source->Payload[5] << 16) +(source->Payload[6] << 8) + (source->Payload[7]); - uint8_t Profile = (source->Payload[8] >> 6); //uint2_t - uint8_t Live = (( source->Payload[8] >> 5 ) & 0x1); //uint1_t - uint8_t Update = (( source->Payload[8] >> 4 ) & 0x1); //uint1_t - uint8_t Reserved = ( source->Payload[8] & 0x4); //uint4_t - uint32_t Timescale = (source->Payload[9] << 24) + (source->Payload[10] << 16) +(source->Payload[11] << 8) + (source->Payload[12]); - uint32_t CurrentMediaTime_Upperhalf = (source->Payload[13] << 24) + (source->Payload[14] << 16) +(source->Payload[15] << 8) + (source->Payload[16]); - uint32_t CurrentMediaTime_Lowerhalf = (source->Payload[17] << 24) + (source->Payload[18] << 16) +(source->Payload[19] << 8) + (source->Payload[20]); - uint32_t SmpteTimeCodeOffset_Upperhalf = (source->Payload[21] << 24) + (source->Payload[22] << 16) +(source->Payload[23] << 8) + (source->Payload[24]); - uint32_t SmpteTimeCodeOffset_Lowerhalf = (source->Payload[25] << 24) + (source->Payload[26] << 16) +(source->Payload[27] << 8) + (source->Payload[28]); - - std::string MovieIdentifier; - uint8_t ServerEntryCount = -1; - std::vector ServerEntryTable; - uint8_t QualityEntryCount = -1; - std::vector QualityEntryTable; - std::string DrmData; - std::string MetaData; - uint8_t SegmentRunTableCount = -1; - std::vector SegmentRunTableEntries; - uint8_t FragmentRunTableCount = -1; - std::vector FragmentRunTableEntries; - - uint32_t CurrentOffset = 29; - uint32_t TempSize; - Box_asrt* TempAsrt; - Box_afrt* TempAfrt; - std::string temp; - while( source->Payload[CurrentOffset] != '\0' ) { MovieIdentifier += source->Payload[CurrentOffset]; CurrentOffset ++; } - CurrentOffset ++; - ServerEntryCount = source->Payload[CurrentOffset]; - CurrentOffset ++; - for( uint8_t i = 0; i < ServerEntryCount; i++ ) { - temp = ""; - while( source->Payload[CurrentOffset] != '\0' ) { temp += source->Payload[CurrentOffset]; CurrentOffset ++; } - ServerEntryTable.push_back(temp); - CurrentOffset++; - } - QualityEntryCount = source->Payload[CurrentOffset]; - CurrentOffset ++; - for( uint8_t i = 0; i < QualityEntryCount; i++ ) { - temp = ""; - while( source->Payload[CurrentOffset] != '\0' ) { temp += source->Payload[CurrentOffset]; CurrentOffset ++; } - QualityEntryTable.push_back(temp); - CurrentOffset++; - } - while( source->Payload[CurrentOffset] != '\0' ) { DrmData += source->Payload[CurrentOffset]; CurrentOffset ++; } - CurrentOffset ++; - while( source->Payload[CurrentOffset] != '\0' ) { MetaData += source->Payload[CurrentOffset]; CurrentOffset ++; } - CurrentOffset ++; - SegmentRunTableCount = source->Payload[CurrentOffset]; - CurrentOffset ++; - for( uint8_t i = 0; i < SegmentRunTableCount; i++ ) { - TempSize = (source->Payload[CurrentOffset] << 24) + (source->Payload[CurrentOffset+1]<< 16) + (source->Payload[CurrentOffset+2]<< 8) + (source->Payload[CurrentOffset+3]); - TempAsrt = (Box_asrt*)Parse( new Box( &source->Payload[CurrentOffset], TempSize ) ); - SegmentRunTableEntries.push_back(TempAsrt); - CurrentOffset += TempSize; - } - FragmentRunTableCount = source->Payload[CurrentOffset]; - CurrentOffset ++; - for( uint8_t i = 0; i < FragmentRunTableCount; i++ ) { - TempSize = (source->Payload[CurrentOffset] << 24) + (source->Payload[CurrentOffset+1]<< 16) + (source->Payload[CurrentOffset+2]<< 8) + (source->Payload[CurrentOffset+3]); - TempAfrt = (Box_afrt*)Parse( new Box( &source->Payload[CurrentOffset], TempSize ) ); - FragmentRunTableEntries.push_back(TempAfrt); - CurrentOffset += TempSize; - } - Box_abst * returnval = new Box_abst( ); - returnval->SetVersion( Version ); - returnval->SetBootstrapVersion( BootstrapInfoVersion ); - returnval->SetProfile( Profile ); - returnval->SetLive( Live ); - returnval->SetUpdate( Update ); - returnval->SetTimeScale( Timescale ); - returnval->SetMediaTime( CurrentMediaTime_Lowerhalf ); - returnval->SetSMPTE( SmpteTimeCodeOffset_Lowerhalf ); - returnval->SetMovieIdentifier( MovieIdentifier ); - returnval->SetDRM( DrmData ); - returnval->SetMetaData( MetaData ); - for( uint8_t i = 0; i < ServerEntryTable.size( ); i++ ) { returnval->AddServerEntry( ServerEntryTable[i], i); } - for( uint8_t i = 0; i < QualityEntryTable.size( ); i++ ) { returnval->AddQualityEntry( QualityEntryTable[i], i ); } - for( uint8_t i = 0; i < SegmentRunTableEntries.size( ); i++ ) { returnval->AddSegmentRunTable( SegmentRunTableEntries[i]->GetBox( ), i ); } - for( uint8_t i = 0; i < FragmentRunTableEntries.size( ); i++ ) { returnval->AddFragmentRunTable( FragmentRunTableEntries[i]->GetBox( ), i ); } - return(void *)returnval; - } else if ( source->header.BoxType == 0x61737274 ) { //asrt - uint8_t Version = source->Payload[0]; - uint32_t Flags = (source->Payload[1] << 16) + (source->Payload[2] << 8) + (source->Payload[3]); //uint24_t - uint8_t QualityEntryCount; - std::vector QualitySegmentUrlModifiers; - uint32_t SegmentRunEntryCount; - std::vector< std::pair > SegmentRunEntryTable; - - uint32_t CurrentOffset = 4; - std::string temp; - std::pair TempPair; - QualityEntryCount = source->Payload[CurrentOffset]; - CurrentOffset ++; - for( uint8_t i = 0; i < QualityEntryCount; i++ ) { - temp = ""; - while( source->Payload[CurrentOffset] != '\0' ) { temp += source->Payload[CurrentOffset]; CurrentOffset ++; } - QualitySegmentUrlModifiers.push_back(temp); - CurrentOffset++; - } - SegmentRunEntryCount = (source->Payload[CurrentOffset] << 24) + (source->Payload[CurrentOffset+1] << 16) + (source->Payload[CurrentOffset+2]) + (source->Payload[CurrentOffset+3]); - CurrentOffset +=4; - for( uint8_t i = 0; i < SegmentRunEntryCount; i++ ) { - TempPair.first = (source->Payload[CurrentOffset] << 24) + (source->Payload[CurrentOffset+1] << 16) + (source->Payload[CurrentOffset+2] << 8) + (source->Payload[CurrentOffset+3]); - CurrentOffset+=4; - TempPair.second = (source->Payload[CurrentOffset] << 24) + (source->Payload[CurrentOffset+1] << 16) + (source->Payload[CurrentOffset+2] << 8) + (source->Payload[CurrentOffset+3]); - CurrentOffset+=4; - SegmentRunEntryTable.push_back(TempPair); - } - Box_asrt * returnval = new Box_asrt( ); - returnval->SetVersion(Version); - returnval->SetUpdate( ); - for( uint8_t i = 0; i < QualitySegmentUrlModifiers.size( ); i++ ) { returnval->AddQualityEntry( QualitySegmentUrlModifiers[i], i ); } - for( uint8_t i = 0; i < SegmentRunEntryTable.size( ); i++ ) { returnval->AddSegmentRunEntry( SegmentRunEntryTable[i].first, SegmentRunEntryTable[i].second, i); } - return (void*)returnval; - } else if ( source->header.BoxType == 0x61667274 ) { //afrt - uint8_t Version = source->Payload[0]; - uint32_t Flags = (source->Payload[1] << 16) + (source->Payload[2] << 8) + (source->Payload[3]); //uint24_t - uint32_t TimeScale = (source->Payload[4] << 24) + (source->Payload[5] << 16) + (source->Payload[6] << 8) + (source->Payload[7]); - uint8_t QualityEntryCount; - std::vector QualitySegmentUrlModifiers; - uint32_t FragmentRunEntryCount; - std::vector FragmentRunEntryTable; - - uint32_t CurrentOffset = 8; - std::string temp; - afrt_fragmentrunentry TempEntry; - QualityEntryCount = source->Payload[CurrentOffset]; - CurrentOffset ++; - for( uint8_t i = 0; i < QualityEntryCount; i++ ) { - temp = ""; - while( source->Payload[CurrentOffset] != '\0' ) { temp += source->Payload[CurrentOffset]; CurrentOffset ++; } - QualitySegmentUrlModifiers.push_back(temp); - CurrentOffset++; - } - FragmentRunEntryCount = (source->Payload[CurrentOffset] << 24) + (source->Payload[CurrentOffset+1] << 16) + (source->Payload[CurrentOffset+2]) + (source->Payload[CurrentOffset+3]); - CurrentOffset +=4; - for( uint8_t i = 0; i < FragmentRunEntryCount; i ++ ) { - TempEntry.FirstFragment = (source->Payload[CurrentOffset] << 24) + (source->Payload[CurrentOffset+1] << 16) + (source->Payload[CurrentOffset+2]) + (source->Payload[CurrentOffset+3]); - CurrentOffset +=4; - TempEntry.FirstFragmentTimestamp_Upperhalf = (source->Payload[CurrentOffset] << 24) + (source->Payload[CurrentOffset+1] << 16) + (source->Payload[CurrentOffset+2]) + (source->Payload[CurrentOffset+3]); - CurrentOffset +=4; - TempEntry.FirstFragmentTimestamp = (source->Payload[CurrentOffset] << 24) + (source->Payload[CurrentOffset+1] << 16) + (source->Payload[CurrentOffset+2]) + (source->Payload[CurrentOffset+3]); - CurrentOffset +=4; - TempEntry.FragmentDuration = (source->Payload[CurrentOffset] << 24) + (source->Payload[CurrentOffset+1] << 16) + (source->Payload[CurrentOffset+2]) + (source->Payload[CurrentOffset+3]); - CurrentOffset +=4; - if( TempEntry.FragmentDuration == 0 ) { - TempEntry.DiscontinuityIndicator = source->Payload[CurrentOffset]; - CurrentOffset++; - } - FragmentRunEntryTable.push_back(TempEntry); - } - - } else { - std::cerr << "BoxType '" - << (char)(source->header.BoxType >> 24) - << (char)((source->header.BoxType << 8) >> 24) - << (char)((source->header.BoxType << 16) >> 24) - << (char)((source->header.BoxType << 24) >> 24) - << "' not yet implemented!\n"; - } - return NULL; -} - int main( ) { std::string temp; bool validinp = true; @@ -405,10 +235,6 @@ int main( ) { } } Box * TestBox = new Box((uint8_t*)temp.c_str( ), temp.size( )); - Box_abst * TestABST; - TestABST = (Box_abst*)Parse( TestBox ); - std::cout << "Box Created\n"; - Parse( TestABST->GetBox(), "" ); - delete TestABST; + Parse( TestBox, "" ); delete TestBox; } diff --git a/Connector_HTTP/main.cpp b/Connector_HTTP/main.cpp index 3912698b..d6696d45 100644 --- a/Connector_HTTP/main.cpp +++ b/Connector_HTTP/main.cpp @@ -101,8 +101,8 @@ std::string BuildManifest( std::string MetaData, std::string MovieId, int Curren Result += "live\n"; Result += "streaming\n"; Result += ""; -// Result += base64_encode(temp->GenerateLiveBootstrap(1)); - Result += "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"; + Result += base64_encode(temp->GenerateLiveBootstrap(1)); +// Result += "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"; Result += "\n"; Result += "SetUpdate(false); afrt->SetTimeScale( 1000 ); afrt->AddQualityEntry( "" ); - afrt->AddFragmentRunEntry( 1, CurMediaTime, 4000 ); + for(int i = 0; i < 198 ; i++ ) { + afrt->AddFragmentRunEntry( i+1, (195*(i+1)) , 195, i ); + } + afrt->AddFragmentRunEntry( 199, 590083 , 163, 198 ); afrt->WriteContent( ); //SetUpASRT asrt->SetUpdate(false); asrt->AddQualityEntry( "" ); - asrt->AddSegmentRunEntry( 1, 0xFFFFFFFF ); + asrt->AddSegmentRunEntry( 1, 199 ); asrt->WriteContent( ); //SetUpABST abst->SetBootstrapVersion( 1 ); abst->SetProfile( 0 ); -// abst->SetLive( true ); + abst->SetLive( false ); abst->SetUpdate( false ); abst->SetTimeScale( 1000 ); - abst->SetMediaTime( CurMediaTime ); + abst->SetMediaTime( 596458 ); abst->SetSMPTE( 0 ); abst->SetMovieIdentifier( "" ); abst->SetDRM( "" ); From d39978c90b5b8b321634fcb720f656685f990054 Mon Sep 17 00:00:00 2001 From: Erik Zandvliet Date: Sun, 20 Mar 2011 14:08:01 +0100 Subject: [PATCH 03/10] Added Timings --- Connector_HTTP/main.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Connector_HTTP/main.cpp b/Connector_HTTP/main.cpp index d6696d45..e73e229e 100644 --- a/Connector_HTTP/main.cpp +++ b/Connector_HTTP/main.cpp @@ -15,6 +15,7 @@ #include #include #include +#include enum {HANDLER_NONE, HANDLER_PROGRESSIVE, HANDLER_FLASH, HANDLER_APPLE, HANDLER_MICRO}; @@ -257,6 +258,14 @@ int mainHandler(int CONN_fd){ if (FlashBuf != ""){ Flash_FragBuffer.push(FlashBuf); #if DEBUG >= 4 + /* strftime example */ + time_t rawtime; + struct tm * timeinfo; + char timebuffer [80]; + time ( &rawtime ); + timeinfo = localtime ( &rawtime ); + strftime (timebuffer,80,"%I:%M.",timeinfo); + fprintf(stderr, "< %s >\t", timebuffer ); fprintf(stderr, "Received a fragment. Now %i in buffer.\n", (int)Flash_FragBuffer.size()); #endif } From 0eeb4fb3ba910b118bd46da0571b69e1090c6e49 Mon Sep 17 00:00:00 2001 From: Erik Zandvliet Date: Sun, 20 Mar 2011 14:14:27 +0100 Subject: [PATCH 04/10] Added Timings --- Connector_HTTP/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Connector_HTTP/main.cpp b/Connector_HTTP/main.cpp index e73e229e..91257c6b 100644 --- a/Connector_HTTP/main.cpp +++ b/Connector_HTTP/main.cpp @@ -264,7 +264,7 @@ int mainHandler(int CONN_fd){ char timebuffer [80]; time ( &rawtime ); timeinfo = localtime ( &rawtime ); - strftime (timebuffer,80,"%I:%M.",timeinfo); + strftime (timebuffer,80,"%H:%M.%S.",timeinfo); fprintf(stderr, "< %s >\t", timebuffer ); fprintf(stderr, "Received a fragment. Now %i in buffer.\n", (int)Flash_FragBuffer.size()); #endif From 9efb557a0ae9ba6134644ffe4c053f2d6c9bcaff Mon Sep 17 00:00:00 2001 From: Erik Zandvliet Date: Sun, 20 Mar 2011 14:18:23 +0100 Subject: [PATCH 05/10] Fixed framerate --- util/MP4/interface.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/util/MP4/interface.cpp b/util/MP4/interface.cpp index 8292fa83..9f812de0 100644 --- a/util/MP4/interface.cpp +++ b/util/MP4/interface.cpp @@ -547,10 +547,7 @@ std::string Interface::GenerateLiveBootstrap( uint32_t CurMediaTime ) { afrt->SetUpdate(false); afrt->SetTimeScale( 1000 ); afrt->AddQualityEntry( "" ); - for(int i = 0; i < 198 ; i++ ) { - afrt->AddFragmentRunEntry( i+1, (195*(i+1)) , 195, i ); - } - afrt->AddFragmentRunEntry( 199, 590083 , 163, 198 ); + afrt->AddFragmentRunEntry( 1, 4000 , 4000 ); afrt->WriteContent( ); //SetUpASRT From ca090e160b7f53b06aebf69b04eedd95ddd19f30 Mon Sep 17 00:00:00 2001 From: Erik Zandvliet Date: Sun, 20 Mar 2011 14:46:23 +0100 Subject: [PATCH 06/10] Timestamps added --- Connector_HTTP/main.cpp | 17 ++++++++++++++++- util/MP4/interface.cpp | 2 +- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/Connector_HTTP/main.cpp b/Connector_HTTP/main.cpp index 91257c6b..d2b97e1b 100644 --- a/Connector_HTTP/main.cpp +++ b/Connector_HTTP/main.cpp @@ -178,6 +178,14 @@ int mainHandler(int CONN_fd){ temp = HTTP_R.url.find("Frag") + 4; ReqFragment = atoi( HTTP_R.url.substr(temp).c_str() ); #if DEBUG >= 4 + /* strftime example */ + time_t rawtime; + struct tm * timeinfo; + char timebuffer [80]; + time ( &rawtime ); + timeinfo = localtime ( &rawtime ); + strftime (timebuffer,80,"%H:%M.%S.",timeinfo); + fprintf(stderr, "< %s >\t", timebuffer ); printf( "URL: %s\n", HTTP_R.url.c_str()); printf( "Movie: %s, Quality: %s, Seg %d Frag %d\n", Movie.c_str(), Quality.c_str(), Segment, ReqFragment); #endif @@ -238,6 +246,14 @@ int mainHandler(int CONN_fd){ HTTP_S.SendResponse(CONN_fd, "200", "OK");//schrijf de HTTP response header Flash_RequestPending--; #if DEBUG >= 3 + /* strftime example */ + time_t rawtime; + struct tm * timeinfo; + char timebuffer [80]; + time ( &rawtime ); + timeinfo = localtime ( &rawtime ); + strftime (timebuffer,80,"%H:%M.%S.",timeinfo); + fprintf(stderr, "< %s >\t", timebuffer ); fprintf(stderr, "Sending a video fragment. %i left in buffer, %i requested\n", (int)Flash_FragBuffer.size(), Flash_RequestPending); #endif } @@ -258,7 +274,6 @@ int mainHandler(int CONN_fd){ if (FlashBuf != ""){ Flash_FragBuffer.push(FlashBuf); #if DEBUG >= 4 - /* strftime example */ time_t rawtime; struct tm * timeinfo; char timebuffer [80]; diff --git a/util/MP4/interface.cpp b/util/MP4/interface.cpp index 9f812de0..00f0eb1c 100644 --- a/util/MP4/interface.cpp +++ b/util/MP4/interface.cpp @@ -547,7 +547,7 @@ std::string Interface::GenerateLiveBootstrap( uint32_t CurMediaTime ) { afrt->SetUpdate(false); afrt->SetTimeScale( 1000 ); afrt->AddQualityEntry( "" ); - afrt->AddFragmentRunEntry( 1, 4000 , 4000 ); + afrt->AddFragmentRunEntry( 1, 1 , 4000 ); afrt->WriteContent( ); //SetUpASRT From 8e50e0a804b2baa4f9b5208800a5b17f384499e2 Mon Sep 17 00:00:00 2001 From: Erik Zandvliet Date: Sun, 20 Mar 2011 15:11:47 +0100 Subject: [PATCH 07/10] CurMediaTime edit --- util/MP4/interface.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/MP4/interface.cpp b/util/MP4/interface.cpp index 00f0eb1c..f50b41d5 100644 --- a/util/MP4/interface.cpp +++ b/util/MP4/interface.cpp @@ -562,7 +562,7 @@ std::string Interface::GenerateLiveBootstrap( uint32_t CurMediaTime ) { abst->SetLive( false ); abst->SetUpdate( false ); abst->SetTimeScale( 1000 ); - abst->SetMediaTime( 596458 ); + abst->SetMediaTime( 1 ); abst->SetSMPTE( 0 ); abst->SetMovieIdentifier( "" ); abst->SetDRM( "" ); From da5a4f477a216b5409bcaf08556d0fafc5f316a8 Mon Sep 17 00:00:00 2001 From: Erik Zandvliet Date: Sun, 20 Mar 2011 15:14:18 +0100 Subject: [PATCH 08/10] Live edit --- util/MP4/interface.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/util/MP4/interface.cpp b/util/MP4/interface.cpp index f50b41d5..cac5581f 100644 --- a/util/MP4/interface.cpp +++ b/util/MP4/interface.cpp @@ -559,7 +559,8 @@ std::string Interface::GenerateLiveBootstrap( uint32_t CurMediaTime ) { //SetUpABST abst->SetBootstrapVersion( 1 ); abst->SetProfile( 0 ); - abst->SetLive( false ); +// abst->SetLive( false ); + abst->SetLive( true ); abst->SetUpdate( false ); abst->SetTimeScale( 1000 ); abst->SetMediaTime( 1 ); From ae6df99f22027200c2b9c0811558259536502d26 Mon Sep 17 00:00:00 2001 From: Erik Zandvliet Date: Sun, 20 Mar 2011 15:18:50 +0100 Subject: [PATCH 09/10] Live edit --- util/MP4/interface.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/util/MP4/interface.cpp b/util/MP4/interface.cpp index cac5581f..8437913b 100644 --- a/util/MP4/interface.cpp +++ b/util/MP4/interface.cpp @@ -559,11 +559,10 @@ std::string Interface::GenerateLiveBootstrap( uint32_t CurMediaTime ) { //SetUpABST abst->SetBootstrapVersion( 1 ); abst->SetProfile( 0 ); -// abst->SetLive( false ); abst->SetLive( true ); abst->SetUpdate( false ); abst->SetTimeScale( 1000 ); - abst->SetMediaTime( 1 ); + abst->SetMediaTime( 596458 ); abst->SetSMPTE( 0 ); abst->SetMovieIdentifier( "" ); abst->SetDRM( "" ); From 6c6b32f1e1a509f0c5f9b4949fdca91516bffee0 Mon Sep 17 00:00:00 2001 From: Erik Zandvliet Date: Sun, 20 Mar 2011 15:25:11 +0100 Subject: [PATCH 10/10] Live edit --- util/MP4/interface.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/MP4/interface.cpp b/util/MP4/interface.cpp index 8437913b..5175acbe 100644 --- a/util/MP4/interface.cpp +++ b/util/MP4/interface.cpp @@ -547,7 +547,7 @@ std::string Interface::GenerateLiveBootstrap( uint32_t CurMediaTime ) { afrt->SetUpdate(false); afrt->SetTimeScale( 1000 ); afrt->AddQualityEntry( "" ); - afrt->AddFragmentRunEntry( 1, 1 , 4000 ); + afrt->AddFragmentRunEntry( 1, 596458 , 4000 ); afrt->WriteContent( ); //SetUpASRT