Implemented TFHD box - fixed TRUN namespace pollution.

This commit is contained in:
Thulinma 2012-09-25 12:42:55 +02:00
parent 7492e99628
commit d9b8f7c7f0
2 changed files with 203 additions and 47 deletions

View file

@ -897,13 +897,13 @@ namespace MP4{
} }
void TRUN::setDataOffset(long newOffset){ void TRUN::setDataOffset(long newOffset){
if (getFlags() & dataOffset){ if (getFlags() & trundataOffset){
setInt32(newOffset, 8); setInt32(newOffset, 8);
} }
} }
long TRUN::getDataOffset(){ long TRUN::getDataOffset(){
if (getFlags() & dataOffset){ if (getFlags() & trundataOffset){
return getInt32(8); return getInt32(8);
}else{ }else{
return 0; return 0;
@ -911,8 +911,8 @@ namespace MP4{
} }
void TRUN::setFirstSampleFlags(long newSampleFlags){ void TRUN::setFirstSampleFlags(long newSampleFlags){
if (!(getFlags() & firstSampleFlags)){return;} if (!(getFlags() & trunfirstSampleFlags)){return;}
if (getFlags() & dataOffset){ if (getFlags() & trundataOffset){
setInt32(newSampleFlags, 12); setInt32(newSampleFlags, 12);
}else{ }else{
setInt32(newSampleFlags, 8); setInt32(newSampleFlags, 8);
@ -920,8 +920,8 @@ namespace MP4{
} }
long TRUN::getFirstSampleFlags(){ long TRUN::getFirstSampleFlags(){
if (!(getFlags() & firstSampleFlags)){return 0;} if (!(getFlags() & trunfirstSampleFlags)){return 0;}
if (getFlags() & dataOffset){ if (getFlags() & trundataOffset){
return getInt32(12); return getInt32(12);
}else{ }else{
return getInt32(8); return getInt32(8);
@ -935,27 +935,27 @@ namespace MP4{
void TRUN::setSampleInformation(trunSampleInformation newSample, long no){ void TRUN::setSampleInformation(trunSampleInformation newSample, long no){
long flags = getFlags(); long flags = getFlags();
long sampInfoSize = 0; long sampInfoSize = 0;
if (flags & sampleDuration){sampInfoSize += 4;} if (flags & trunsampleDuration){sampInfoSize += 4;}
if (flags & sampleSize){sampInfoSize += 4;} if (flags & trunsampleSize){sampInfoSize += 4;}
if (flags & sampleFlags){sampInfoSize += 4;} if (flags & trunsampleFlags){sampInfoSize += 4;}
if (flags & sampleOffsets){sampInfoSize += 4;} if (flags & trunsampleOffsets){sampInfoSize += 4;}
long offset = 8; long offset = 8;
if (flags & dataOffset){offset += 4;} if (flags & trundataOffset){offset += 4;}
if (flags & firstSampleFlags){offset += 4;} if (flags & trunfirstSampleFlags){offset += 4;}
long innerOffset = 0; long innerOffset = 0;
if (flags & sampleDuration){ if (flags & trunsampleDuration){
setInt32(newSample.sampleDuration, offset + no*sampInfoSize + innerOffset); setInt32(newSample.sampleDuration, offset + no*sampInfoSize + innerOffset);
innerOffset += 4; innerOffset += 4;
} }
if (flags & sampleSize){ if (flags & trunsampleSize){
setInt32(newSample.sampleSize, offset + no*sampInfoSize + innerOffset); setInt32(newSample.sampleSize, offset + no*sampInfoSize + innerOffset);
innerOffset += 4; innerOffset += 4;
} }
if (flags & sampleFlags){ if (flags & trunsampleFlags){
setInt32(newSample.sampleFlags, offset + no*sampInfoSize + innerOffset); setInt32(newSample.sampleFlags, offset + no*sampInfoSize + innerOffset);
innerOffset += 4; innerOffset += 4;
} }
if (flags & sampleOffsets){ if (flags & trunsampleOffsets){
setInt32(newSample.sampleOffset, offset + no*sampInfoSize + innerOffset); setInt32(newSample.sampleOffset, offset + no*sampInfoSize + innerOffset);
innerOffset += 4; innerOffset += 4;
} }
@ -973,27 +973,27 @@ namespace MP4{
if (getSampleInformationCount() < no+1){return ret;} if (getSampleInformationCount() < no+1){return ret;}
long flags = getFlags(); long flags = getFlags();
long sampInfoSize = 0; long sampInfoSize = 0;
if (flags & sampleDuration){sampInfoSize += 4;} if (flags & trunsampleDuration){sampInfoSize += 4;}
if (flags & sampleSize){sampInfoSize += 4;} if (flags & trunsampleSize){sampInfoSize += 4;}
if (flags & sampleFlags){sampInfoSize += 4;} if (flags & trunsampleFlags){sampInfoSize += 4;}
if (flags & sampleOffsets){sampInfoSize += 4;} if (flags & trunsampleOffsets){sampInfoSize += 4;}
long offset = 8; long offset = 8;
if (flags & dataOffset){offset += 4;} if (flags & trundataOffset){offset += 4;}
if (flags & firstSampleFlags){offset += 4;} if (flags & trunfirstSampleFlags){offset += 4;}
long innerOffset = 0; long innerOffset = 0;
if (flags & sampleDuration){ if (flags & trunsampleDuration){
ret.sampleDuration = getInt32(offset + no*sampInfoSize + innerOffset); ret.sampleDuration = getInt32(offset + no*sampInfoSize + innerOffset);
innerOffset += 4; innerOffset += 4;
} }
if (flags & sampleSize){ if (flags & trunsampleSize){
ret.sampleSize = getInt32(offset + no*sampInfoSize + innerOffset); ret.sampleSize = getInt32(offset + no*sampInfoSize + innerOffset);
innerOffset += 4; innerOffset += 4;
} }
if (flags & sampleFlags){ if (flags & trunsampleFlags){
ret.sampleFlags = getInt32(offset + no*sampInfoSize + innerOffset); ret.sampleFlags = getInt32(offset + no*sampInfoSize + innerOffset);
innerOffset += 4; innerOffset += 4;
} }
if (flags & sampleOffsets){ if (flags & trunsampleOffsets){
ret.sampleOffset = getInt32(offset + no*sampInfoSize + innerOffset); ret.sampleOffset = getInt32(offset + no*sampInfoSize + innerOffset);
innerOffset += 4; innerOffset += 4;
} }
@ -1007,31 +1007,31 @@ namespace MP4{
long flags = getFlags(); long flags = getFlags();
r << std::string(indent+1, ' ') << "Flags"; r << std::string(indent+1, ' ') << "Flags";
if (flags & dataOffset){r << " dataOffset";} if (flags & trundataOffset){r << " dataOffset";}
if (flags & firstSampleFlags){r << " firstSampleFlags";} if (flags & trunfirstSampleFlags){r << " firstSampleFlags";}
if (flags & sampleDuration){r << " sampleDuration";} if (flags & trunsampleDuration){r << " sampleDuration";}
if (flags & sampleSize){r << " sampleSize";} if (flags & trunsampleSize){r << " sampleSize";}
if (flags & sampleFlags){r << " sampleFlags";} if (flags & trunsampleFlags){r << " sampleFlags";}
if (flags & sampleOffsets){r << " sampleOffsets";} if (flags & trunsampleOffsets){r << " sampleOffsets";}
r << std::endl; r << std::endl;
if (flags & dataOffset){r << std::string(indent+1, ' ') << "Data Offset " << getDataOffset() << std::endl;} if (flags & trundataOffset){r << std::string(indent+1, ' ') << "Data Offset " << getDataOffset() << std::endl;}
if (flags & dataOffset){r << std::string(indent+1, ' ') << "Sample Flags" << prettyFlags(getFirstSampleFlags()) << std::endl;} if (flags & trundataOffset){r << std::string(indent+1, ' ') << "Sample Flags" << prettySampleFlags(getFirstSampleFlags()) << std::endl;}
r << std::string(indent+1, ' ') << "SampleInformation (" << getSampleInformationCount() << "):" << std::endl; r << std::string(indent+1, ' ') << "SampleInformation (" << getSampleInformationCount() << "):" << std::endl;
for (int i = 0; i < getSampleInformationCount(); ++i){ for (int i = 0; i < getSampleInformationCount(); ++i){
r << std::string(indent+2, ' ') << "[" << i << "]" << std::endl; r << std::string(indent+2, ' ') << "[" << i << "]" << std::endl;
trunSampleInformation samp = getSampleInformation(i); trunSampleInformation samp = getSampleInformation(i);
if (flags & sampleDuration){ if (flags & trunsampleDuration){
r << std::string(indent+2, ' ') << "Duration " << samp.sampleDuration << std::endl; r << std::string(indent+2, ' ') << "Duration " << samp.sampleDuration << std::endl;
} }
if (flags & sampleSize){ if (flags & trunsampleSize){
r << std::string(indent+2, ' ') << "Size " << samp.sampleSize << std::endl; r << std::string(indent+2, ' ') << "Size " << samp.sampleSize << std::endl;
} }
if (flags & sampleFlags){ if (flags & trunsampleFlags){
r << std::string(indent+2, ' ') << "Flags " << prettyFlags(samp.sampleFlags) << std::endl; r << std::string(indent+2, ' ') << "Flags " << prettySampleFlags(samp.sampleFlags) << std::endl;
} }
if (flags & sampleOffsets){ if (flags & trunsampleOffsets){
r << std::string(indent+2, ' ') << "Offset " << samp.sampleOffset << std::endl; r << std::string(indent+2, ' ') << "Offset " << samp.sampleOffset << std::endl;
} }
} }
@ -1039,7 +1039,7 @@ namespace MP4{
return r.str(); return r.str();
} }
std::string TRUN::prettyFlags(long flag){ std::string prettySampleFlags(long flag){
std::stringstream r; std::stringstream r;
if (flag & noIPicture){r << " noIPicture";} if (flag & noIPicture){r << " noIPicture";}
if (flag & isIPicture){r << " isIPicture";} if (flag & isIPicture){r << " isIPicture";}
@ -1051,5 +1051,132 @@ namespace MP4{
return r.str(); return r.str();
} }
TFHD::TFHD(){
memcpy(data + 4, "tfhd", 4);
}
void TFHD::setFlags(long newFlags){
setInt24(newFlags,1);
}
long TFHD::getFlags(){
return getInt24(1);
}
void TFHD::setTrackID(long newID){
setInt32(newID,4);
}
long TFHD::getTrackID(){
return getInt32(4);
}
void TFHD::setBaseDataOffset(long long newOffset){
if (getFlags() & tfhdBaseOffset){
setInt64(newOffset, 8);
}
}
long long TFHD::getBaseDataOffset(){
if (getFlags() & tfhdBaseOffset){
return getInt64(8);
}else{
return 0;
}
}
void TFHD::setSampleDescriptionIndex(long newIndex){
if (!(getFlags() & tfhdSampleDesc)){return;}
int offset = 8;
if (getFlags() & tfhdBaseOffset){offset += 8;}
setInt32(newIndex, offset);
}
long TFHD::getSampleDescriptionIndex(){
if (!(getFlags() & tfhdSampleDesc)){return 0;}
int offset = 8;
if (getFlags() & tfhdBaseOffset){offset += 8;}
return getInt32(offset);
}
void TFHD::setDefaultSampleDuration(long newDuration){
if (!(getFlags() & tfhdSampleDura)){return;}
int offset = 8;
if (getFlags() & tfhdBaseOffset){offset += 8;}
if (getFlags() & tfhdSampleDesc){offset += 4;}
setInt32(newDuration, offset);
}
long TFHD::getDefaultSampleDuration(){
if (!(getFlags() & tfhdSampleDura)){return 0;}
int offset = 8;
if (getFlags() & tfhdBaseOffset){offset += 8;}
if (getFlags() & tfhdSampleDesc){offset += 4;}
return getInt32(offset);
}
void TFHD::setDefaultSampleSize(long newSize){
if (!(getFlags() & tfhdSampleSize)){return;}
int offset = 8;
if (getFlags() & tfhdBaseOffset){offset += 8;}
if (getFlags() & tfhdSampleDesc){offset += 4;}
if (getFlags() & tfhdSampleDura){offset += 4;}
setInt32(newSize, offset);
}
long TFHD::getDefaultSampleSize(){
if (!(getFlags() & tfhdSampleSize)){return 0;}
int offset = 8;
if (getFlags() & tfhdBaseOffset){offset += 8;}
if (getFlags() & tfhdSampleDesc){offset += 4;}
if (getFlags() & tfhdSampleDura){offset += 4;}
return getInt32(offset);
}
void TFHD::setDefaultSampleFlags(long newFlags){
if (!(getFlags() & tfhdSampleFlag)){return;}
int offset = 8;
if (getFlags() & tfhdBaseOffset){offset += 8;}
if (getFlags() & tfhdSampleDesc){offset += 4;}
if (getFlags() & tfhdSampleDura){offset += 4;}
if (getFlags() & tfhdSampleSize){offset += 4;}
setInt32(newFlags, offset);
}
long TFHD::getDefaultSampleFlags(){
if (!(getFlags() & tfhdSampleFlag)){return 0;}
int offset = 8;
if (getFlags() & tfhdBaseOffset){offset += 8;}
if (getFlags() & tfhdSampleDesc){offset += 4;}
if (getFlags() & tfhdSampleDura){offset += 4;}
if (getFlags() & tfhdSampleSize){offset += 4;}
return getInt32(offset);
}
std::string TFHD::toPrettyString(long indent){
std::stringstream r;
r << std::string(indent, ' ') << "[tfhd] Track Fragment Header" << std::endl;
r << std::string(indent+1, ' ') << "Version " << getInt8(0) << std::endl;
long flags = getFlags();
r << std::string(indent+1, ' ') << "Flags";
if (flags & tfhdBaseOffset){r << " BaseOffset";}
if (flags & tfhdSampleDesc){r << " SampleDesc";}
if (flags & tfhdSampleDura){r << " SampleDura";}
if (flags & tfhdSampleSize){r << " SampleSize";}
if (flags & tfhdSampleFlag){r << " SampleFlag";}
if (flags & tfhdNoDuration){r << " NoDuration";}
r << std::endl;
r << std::string(indent+1, ' ') << "TrackID " << getTrackID() << std::endl;
if (flags & tfhdBaseOffset){r << std::string(indent+1, ' ') << "Base Offset " << getBaseDataOffset() << std::endl;}
if (flags & tfhdSampleDesc){r << std::string(indent+1, ' ') << "Sample Description Index " << getSampleDescriptionIndex() << std::endl;}
if (flags & tfhdSampleDura){r << std::string(indent+1, ' ') << "Default Sample Duration " << getDefaultSampleDuration() << std::endl;}
if (flags & tfhdSampleSize){r << std::string(indent+1, ' ') << "Default Same Size " << getDefaultSampleSize() << std::endl;}
if (flags & tfhdSampleFlag){r << std::string(indent+1, ' ') << "Default Sample Flags " << prettySampleFlags(getDefaultSampleFlags()) << std::endl;}
return r.str();
}
}; };

View file

@ -161,12 +161,12 @@ namespace MP4{
long sampleOffset; long sampleOffset;
}; };
enum trunflags { enum trunflags {
dataOffset = 0x000001, trundataOffset = 0x000001,
firstSampleFlags = 0x000004, trunfirstSampleFlags = 0x000004,
sampleDuration = 0x000100, trunsampleDuration = 0x000100,
sampleSize = 0x000200, trunsampleSize = 0x000200,
sampleFlags = 0x000400, trunsampleFlags = 0x000400,
sampleOffsets = 0x000800 trunsampleOffsets = 0x000800
}; };
enum sampleflags { enum sampleflags {
noIPicture = 0x1000000, noIPicture = 0x1000000,
@ -179,6 +179,7 @@ namespace MP4{
iskeySample = 0x0, iskeySample = 0x0,
MUST_BE_PRESENT = 0x1 MUST_BE_PRESENT = 0x1
}; };
std::string prettySampleFlags(long flag);
class TRUN : public Box { class TRUN : public Box {
public: public:
TRUN(); TRUN();
@ -192,6 +193,34 @@ namespace MP4{
void setSampleInformation(trunSampleInformation newSample, long no); void setSampleInformation(trunSampleInformation newSample, long no);
trunSampleInformation getSampleInformation(long no); trunSampleInformation getSampleInformation(long no);
std::string toPrettyString(long indent = 0); std::string toPrettyString(long indent = 0);
std::string prettyFlags(long flag);
}; };
enum tfhdflags {
tfhdBaseOffset = 0x000001,
tfhdSampleDesc = 0x000002,
tfhdSampleDura = 0x000008,
tfhdSampleSize = 0x000010,
tfhdSampleFlag = 0x000020,
tfhdNoDuration = 0x010000,
};
class TFHD : public Box {
public:
TFHD();
void setFlags(long newFlags);
long getFlags();
void setTrackID(long newID);
long getTrackID();
void setBaseDataOffset(long long newOffset);
long long getBaseDataOffset();
void setSampleDescriptionIndex(long newIndex);
long getSampleDescriptionIndex();
void setDefaultSampleDuration(long newDuration);
long getDefaultSampleDuration();
void setDefaultSampleSize(long newSize);
long getDefaultSampleSize();
void setDefaultSampleFlags(long newFlags);
long getDefaultSampleFlags();
std::string toPrettyString(long indent = 0);
};
}; };