Added basic pretty-printing to MP4 boxes.

This commit is contained in:
Thulinma 2012-08-24 17:14:27 +02:00
parent ca0fd8a641
commit 9b3037d0e4
2 changed files with 75 additions and 0 deletions

View file

@ -96,6 +96,11 @@ void Box::ResetPayload( ) {
((unsigned int*)Payload)[0] = htonl(0);
}
std::string Box::toPrettyString(int indent){
return std::string(indent, ' ')+"Unimplemented pretty-printing for this box";
}
void ABST::SetBootstrapVersion( uint32_t Version ) {
curBootstrapInfoVersion = Version;
}
@ -255,6 +260,33 @@ void ABST::WriteContent( ) {
SetPayload((uint32_t)4,Box::uint32_to_uint8(curBootstrapInfoVersion),4);
}
std::string ABST::toPrettyString(int indent){
std::string r;
r += std::string(indent, ' ')+"Bootstrap Info\n";
if (isUpdate){
r += std::string(indent+1, ' ')+"Update\n";
}else{
r += std::string(indent+1, ' ')+"Replacement or new table\n";
}
if (isLive){
r += std::string(indent+1, ' ')+"Live\n";
}else{
r += std::string(indent+1, ' ')+"Recorded\n";
}
r += std::string(indent+1, ' ')+"Profile "+JSON::Value((long long int)curProfile).asString()+"\n";
r += std::string(indent+1, ' ')+"Timescale "+JSON::Value((long long int)curTimeScale).asString()+"\n";
r += std::string(indent+1, ' ')+"CurrMediaTime "+JSON::Value((long long int)curMediatime).asString()+"\n";
r += std::string(indent+1, ' ')+"Segment Run Tables "+JSON::Value((long long int)SegmentRunTables.size()).asString()+"\n";
for( uint32_t i = 0; i < SegmentRunTables.size(); i++ ) {
r += ((ASRT*)SegmentRunTables[i])->toPrettyString(indent+2)+"\n";
}
r += std::string(indent+1, ' ')+"Fragment Run Tables "+JSON::Value((long long int)FragmentRunTables.size()).asString()+"\n";
for( uint32_t i = 0; i < FragmentRunTables.size(); i++ ) {
r += ((AFRT*)FragmentRunTables[i])->toPrettyString(indent+2)+"\n";
}
return r;
}
void AFRT::SetUpdate( bool Update ) {
isUpdate = Update;
}
@ -316,6 +348,26 @@ void AFRT::WriteContent( ) {
SetPayload((uint32_t)4,Box::uint32_to_uint8((isUpdate ? 1 : 0)));
}
std::string AFRT::toPrettyString(int indent){
std::string r;
r += std::string(indent, ' ')+"Fragment Run Table\n";
if (isUpdate){
r += std::string(indent+1, ' ')+"Update\n";
}else{
r += std::string(indent+1, ' ')+"Replacement or new table\n";
}
r += std::string(indent+1, ' ')+"Timescale "+JSON::Value((long long int)curTimeScale).asString()+"\n";
r += std::string(indent+1, ' ')+"Qualities "+JSON::Value((long long int)QualitySegmentUrlModifiers.size()).asString()+"\n";
for( uint32_t i = 0; i < QualitySegmentUrlModifiers.size(); i++ ) {
r += std::string(indent+2, ' ')+"\""+QualitySegmentUrlModifiers[i]+"\"\n";
}
r += std::string(indent+1, ' ')+"Fragments "+JSON::Value((long long int)FragmentRunEntryTable.size()).asString()+"\n";
for( uint32_t i = 0; i < FragmentRunEntryTable.size(); i ++ ) {
r += std::string(indent+2, ' ')+"Duration "+JSON::Value((long long int)FragmentRunEntryTable[i].FragmentDuration).asString()+", starting at "+JSON::Value((long long int)FragmentRunEntryTable[i].FirstFragment).asString()+" @ "+JSON::Value((long long int)FragmentRunEntryTable[i].FirstFragmentTimestamp).asString();
}
return r;
}
void ASRT::SetUpdate( bool Update ) {
isUpdate = Update;
}
@ -364,6 +416,25 @@ void ASRT::WriteContent( ) {
SetPayload((uint32_t)4,Box::uint32_to_uint8((isUpdate ? 1 : 0)));
}
std::string ASRT::toPrettyString(int indent){
std::string r;
r += std::string(indent, ' ')+"Segment Run Table\n";
if (isUpdate){
r += std::string(indent+1, ' ')+"Update\n";
}else{
r += std::string(indent+1, ' ')+"Replacement or new table\n";
}
r += std::string(indent+1, ' ')+"Qualities "+JSON::Value((long long int)QualitySegmentUrlModifiers.size()).asString()+"\n";
for( uint32_t i = 0; i < QualitySegmentUrlModifiers.size(); i++ ) {
r += std::string(indent+2, ' ')+"\""+QualitySegmentUrlModifiers[i]+"\"\n";
}
r += std::string(indent+1, ' ')+"Segments "+JSON::Value((long long int)SegmentRunEntryTable.size()).asString()+"\n";
for( uint32_t i = 0; i < SegmentRunEntryTable.size(); i ++ ) {
r += std::string(indent+2, ' ')+JSON::Value((long long int)SegmentRunEntryTable[i].FragmentsPerSegment).asString()+" fragments per, starting at "+JSON::Value((long long int)SegmentRunEntryTable[i].FirstSegment).asString();
}
return r;
}
std::string mdatFold(std::string data){
std::string Result;
unsigned int t_int;

View file

@ -25,6 +25,7 @@ namespace MP4{
static uint8_t * uint16_to_uint8( uint16_t data );
static uint8_t * uint8_to_uint8( uint8_t data );
void ResetPayload( );
std::string toPrettyString(int indent = 0);
private:
uint8_t * Payload;
uint32_t PayloadSize;
@ -58,6 +59,7 @@ namespace MP4{
void AddFragmentRunTable( Box * newFragment, uint32_t Offset = 0 );
void SetVersion( bool NewVersion = 0 );
void WriteContent( );
std::string toPrettyString(int indent = 0);
private:
void SetDefaults( );
void SetReserved( );
@ -95,6 +97,7 @@ namespace MP4{
void AddQualityEntry( std::string Quality = "", uint32_t Offset = 0 );
void AddFragmentRunEntry( uint32_t FirstFragment = 0, uint32_t FirstFragmentTimestamp = 0, uint32_t FragmentsDuration = 1, uint8_t Discontinuity = 0, uint32_t Offset = 0 );
void WriteContent( );
std::string toPrettyString(int indent = 0);
private:
void SetDefaults( );
bool isUpdate;
@ -117,6 +120,7 @@ namespace MP4{
void AddSegmentRunEntry( uint32_t FirstSegment = 0, uint32_t FragmentsPerSegment = 100, uint32_t Offset = 0 );
void WriteContent( );
void SetVersion( bool NewVersion = 0 );
std::string toPrettyString(int indent = 0);
private:
void SetDefaults( );
bool isUpdate;