Tussentijdse commit
This commit is contained in:
parent
645a1d0910
commit
9daf3e37be
3 changed files with 12 additions and 223 deletions
226
util/MP4/box.cpp
226
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<std::string> ServerEntryTable;
|
||||
uint8_t QualityEntryCount = -1;
|
||||
std::vector<std::string> QualityEntryTable;
|
||||
std::string DrmData;
|
||||
std::string MetaData;
|
||||
uint8_t SegmentRunTableCount = -1;
|
||||
std::vector<Box*> SegmentRunTableEntries;
|
||||
uint8_t FragmentRunTableCount = -1;
|
||||
std::vector<Box*> 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<std::string> QualitySegmentUrlModifiers;
|
||||
uint32_t SegmentRunEntryCount;
|
||||
std::vector< std::pair<uint32_t,uint32_t> > SegmentRunEntryTable;
|
||||
|
||||
uint32_t CurrentOffset = 4;
|
||||
std::string temp;
|
||||
std::pair<uint32_t,uint32_t> 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<std::string> QualitySegmentUrlModifiers;
|
||||
uint32_t FragmentRunEntryCount;
|
||||
std::vector<afrt_fragmentrunentry> 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";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
#pragma once
|
||||
#include "box.cpp"
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
|
||||
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));
|
||||
}
|
||||
|
|
|
@ -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<std::string> QualitySegmentUrlModifiers;
|
||||
std::vector<asrt_segmentrunentry> 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( );
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue