diff --git a/MP4/box.cpp b/MP4/box.cpp index 55f6408c..93a55575 100644 --- a/MP4/box.cpp +++ b/MP4/box.cpp @@ -94,6 +94,12 @@ uint8_t * Box::uint16_to_uint8( uint16_t data ) { return temp; } +uint8_t * Box::uint8_to_uint8( uint8_t data ) { + uint8_t * temp = new uint8_t[1]; + temp[0] = data; + return temp; +} + BoxHeader Box::GetHeader( ) { return header; } diff --git a/MP4/box.h b/MP4/box.h index 772bbb82..67b73dc2 100644 --- a/MP4/box.h +++ b/MP4/box.h @@ -24,6 +24,7 @@ class Box { static uint8_t * uint32_to_uint8( uint32_t data ); static uint8_t * uint16_to_uint8( uint16_t data ); + static uint8_t * uint8_to_uint8( uint8_t data ); BoxHeader GetHeader( ); void ResetPayload( ); private: diff --git a/MP4/box_asrt.cpp b/MP4/box_asrt.cpp new file mode 100644 index 00000000..32a43661 --- /dev/null +++ b/MP4/box_asrt.cpp @@ -0,0 +1,57 @@ +#include "box_asrt.h" + +Box_asrt::Box_asrt( ) { + Container = new Box( 0x61737274 ); +} + +Box_asrt::~Box_asrt() { + delete Container; +} + +Box * Box_asrt::GetBox() { + return Container; +} + +void Box_asrt::SetUpdate( bool Update ) { + isUpdate = Update; +} + +void Box_asrt::AddQualityEntry( std::string Quality, uint32_t Offset ) { + if(Offset >= QualitySegmentUrlModifiers.size()) { + QualitySegmentUrlModifiers.resize(Offset+1); + } + QualitySegmentUrlModifiers[Offset] = Quality; +} + +void Box_asrt::AddSegmentRunEntry( uint32_t FirstSegment, uint32_t FragmentsPerSegment, uint32_t Offset ) { + if( Offset >= SegmentRunEntryTable.size() ) { + SegmentRunEntryTable.resize(Offset+1); + } + SegmentRunEntryTable[Offset].FirstSegment = FirstSegment; + SegmentRunEntryTable[Offset].FragmentsPerSegment = FragmentsPerSegment; +} + +void Box_asrt::SetDefaults( ) { + SetUpdate( ); +} + +void Box_asrt::WriteContent( ) { + std::string serializedQualities = ""; + Container->ResetPayload( ); + + for( uint32_t i = 0; i < Qualities.size(); i++ ) { + serializedQualities.append(Qualities[i].QualityModifier.c_str()); + serializedQualities += '\0'; + } + + uint32_t OffsetSegmentRunEntryCount = 8 + serializedQualities.size(); + + for( uint32_t i = 0; i < SegmentRunEntryTable.size(); i ++ ) { + Container->SetPayload((uint32_t)4,Box::uint32_to_uint8(SegmentRunEntryTable[i].FragmentsPerSegment),(8*i)+OffsetSegmentRunEntryCount+8); + Container->SetPayload((uint32_t)4,Box::uint32_to_uint8(SegmentRunEntryTable[i].FirstSegment),(8*i)+OffsetSegmentRunEntryCount+4); + } + Container->SetPayload((uint32_t)4,Box::uint32_to_uint8(SegmentRunEntryTable.size()),OffsetSegmentRunEntryCount); + Container->SetPayload((uint32_t)serializedQualities.size(),(uint8_t*)serializedQualities.c_str(),5); + Container->SetPayload((uint32_t)1,Box::uint8_to_uint8(QualitySegmentUrlModifiers.size()),4); + Container->SetPayload((uint32_t)4,Box::uint32_to_uint8((isUpdate ? 1 : 0))); +} diff --git a/MP4/box_asrt.h b/MP4/box_asrt.h new file mode 100644 index 00000000..f5b78e9b --- /dev/null +++ b/MP4/box_asrt.h @@ -0,0 +1,25 @@ +#include "box.h" +#include +#include + +struct asrt_segmentrunentry { + uint32_t FirstSegment; + uint32_t FragmentsPerSegment; +};//abst_qualityentry + +class Box_asrt { + public: + Box_asrt( ); + ~Box_asrt(); + Box * GetBox(); + void SetUpdate( bool Update = false ); + 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( ); + private: + void SetDefaults( ); + bool isUpdate; + std::vector QualitySegmentUrlModifiers; + std::vector SegmentRunEntryTable; + Box * Container; +};//Box_ftyp Class