Added 5 headers and the new STBL, which introduced us to 6 extra boxes to implement :(
This commit is contained in:
parent
c6eca9b990
commit
3f7c5b0019
2 changed files with 781 additions and 39 deletions
625
lib/mp4.cpp
625
lib/mp4.cpp
|
@ -119,7 +119,7 @@ namespace MP4 {
|
||||||
|
|
||||||
/// Attempts to typecast this Box to a more specific type and call the toPrettyString() function of that type.
|
/// Attempts to typecast this Box to a more specific type and call the toPrettyString() function of that type.
|
||||||
/// If this failed, it will print out a message saying pretty-printing is not implemented for <boxtype>.
|
/// If this failed, it will print out a message saying pretty-printing is not implemented for <boxtype>.
|
||||||
std::string Box::toPrettyString(int indent){
|
std::string Box::toPrettyString(uint32_t indent){
|
||||||
switch (ntohl( *((int*)(data + 4)))){ //type is at this address
|
switch (ntohl( *((int*)(data + 4)))){ //type is at this address
|
||||||
case 0x6D666864:
|
case 0x6D666864:
|
||||||
return ((MFHD*)this)->toPrettyString(indent);
|
return ((MFHD*)this)->toPrettyString(indent);
|
||||||
|
@ -169,6 +169,54 @@ namespace MP4 {
|
||||||
case 0x6D667261:
|
case 0x6D667261:
|
||||||
return ((MFRA*)this)->toPrettyString(indent);
|
return ((MFRA*)this)->toPrettyString(indent);
|
||||||
break;
|
break;
|
||||||
|
case 0x7472616B:
|
||||||
|
return ((TRAK*)this)->toPrettyString(indent);
|
||||||
|
break;
|
||||||
|
case 0x6D646961:
|
||||||
|
return ((MDIA*)this)->toPrettyString(indent);
|
||||||
|
break;
|
||||||
|
case 0x6D696E66:
|
||||||
|
return ((MINF*)this)->toPrettyString(indent);
|
||||||
|
break;
|
||||||
|
case 0x64696E66:
|
||||||
|
return ((DINF*)this)->toPrettyString(indent);
|
||||||
|
break;
|
||||||
|
case 0x6D66726F:
|
||||||
|
return ((MFRO*)this)->toPrettyString(indent);
|
||||||
|
break;
|
||||||
|
case 0x68646C72:
|
||||||
|
return ((HDLR*)this)->toPrettyString(indent);
|
||||||
|
break;
|
||||||
|
case 0x766D6864:
|
||||||
|
return ((VMHD*)this)->toPrettyString(indent);
|
||||||
|
break;
|
||||||
|
case 0x736D6864:
|
||||||
|
return ((SMHD*)this)->toPrettyString(indent);
|
||||||
|
break;
|
||||||
|
case 0x686D6864:
|
||||||
|
return ((HMHD*)this)->toPrettyString(indent);
|
||||||
|
break;
|
||||||
|
case 0x6E6D6864:
|
||||||
|
return ((NMHD*)this)->toPrettyString(indent);
|
||||||
|
break;
|
||||||
|
case 0x6D656864:
|
||||||
|
return ((MEHD*)this)->toPrettyString(indent);
|
||||||
|
break;
|
||||||
|
case 0x7374626C:
|
||||||
|
return ((STBL*)this)->toPrettyString(indent);
|
||||||
|
break;
|
||||||
|
case 0x64726566:
|
||||||
|
return ((DREF*)this)->toPrettyString(indent);
|
||||||
|
break;
|
||||||
|
case 0x75726C20:
|
||||||
|
return ((URL*)this)->toPrettyString(indent);
|
||||||
|
break;
|
||||||
|
case 0x75726E20:
|
||||||
|
return ((URN*)this)->toPrettyString(indent);
|
||||||
|
break;
|
||||||
|
case 0x6D766864:
|
||||||
|
return ((MVHD*)this)->toPrettyString(indent);
|
||||||
|
break;
|
||||||
case 0x75756964:
|
case 0x75756964:
|
||||||
return ((UUID*)this)->toPrettyString(indent);
|
return ((UUID*)this)->toPrettyString(indent);
|
||||||
break;
|
break;
|
||||||
|
@ -460,6 +508,21 @@ namespace MP4 {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void fullBox::setVersion(char newVersion){
|
||||||
|
setInt8(newVersion, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
char fullBox::getVersion(){
|
||||||
|
return getInt8(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void fullBox::setFlags(uint32_t newFlags){
|
||||||
|
setInt24(newFlags, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t fullBox::getFlags(){
|
||||||
|
return getInt24(1);
|
||||||
|
}
|
||||||
uint32_t containerBox::getContentCount(){
|
uint32_t containerBox::getContentCount(){
|
||||||
int res = 0;
|
int res = 0;
|
||||||
int tempLoc = 0;
|
int tempLoc = 0;
|
||||||
|
@ -470,6 +533,13 @@ namespace MP4 {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string fullBox::toPrettyString(uint32_t indent){
|
||||||
|
std::stringstream r;
|
||||||
|
r << std::string(indent + 1, ' ') << "Version: " << (int)getVersion() << std::endl;
|
||||||
|
r << std::string(indent + 1, ' ') << "Flags: " << getFlags() << std::endl;
|
||||||
|
return r.str();
|
||||||
|
}
|
||||||
|
|
||||||
void containerBox::setContent(Box & newContent, uint32_t no){
|
void containerBox::setContent(Box & newContent, uint32_t no){
|
||||||
int tempLoc = 0;
|
int tempLoc = 0;
|
||||||
int contentCount = getContentCount();
|
int contentCount = getContentCount();
|
||||||
|
@ -502,7 +572,7 @@ namespace MP4 {
|
||||||
return getBox(tempLoc);
|
return getBox(tempLoc);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string containerBox::toPrettyContainerString(int indent, std::string boxName){
|
std::string containerBox::toPrettyContainerString(uint32_t indent, std::string boxName){
|
||||||
std::stringstream r;
|
std::stringstream r;
|
||||||
r << std::string(indent, ' ') << boxName <<" (" << boxedSize() << ")" << std::endl;
|
r << std::string(indent, ' ') << boxName <<" (" << boxedSize() << ")" << std::endl;
|
||||||
Box curBox;
|
Box curBox;
|
||||||
|
@ -1092,7 +1162,7 @@ namespace MP4 {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string AFRT::toPrettyString(int indent){
|
std::string AFRT::toPrettyString(uint32_t indent){
|
||||||
std::stringstream r;
|
std::stringstream r;
|
||||||
r << std::string(indent, ' ') << "[afrt] Fragment Run Table (" << boxedSize() << ")" << std::endl;
|
r << std::string(indent, ' ') << "[afrt] Fragment Run Table (" << boxedSize() << ")" << std::endl;
|
||||||
r << std::string(indent + 1, ' ') << "Version " << (int)getVersion() << std::endl;
|
r << std::string(indent + 1, ' ') << "Version " << (int)getVersion() << std::endl;
|
||||||
|
@ -1218,7 +1288,7 @@ namespace MP4 {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string ASRT::toPrettyString(int indent){
|
std::string ASRT::toPrettyString(uint32_t indent){
|
||||||
std::stringstream r;
|
std::stringstream r;
|
||||||
r << std::string(indent, ' ') << "[asrt] Segment Run Table (" << boxedSize() << ")" << std::endl;
|
r << std::string(indent, ' ') << "[asrt] Segment Run Table (" << boxedSize() << ")" << std::endl;
|
||||||
r << std::string(indent + 1, ' ') << "Version " << getVersion() << std::endl;
|
r << std::string(indent + 1, ' ') << "Version " << getVersion() << std::endl;
|
||||||
|
@ -1252,7 +1322,7 @@ namespace MP4 {
|
||||||
return getInt32(4);
|
return getInt32(4);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string MFHD::toPrettyString(int indent){
|
std::string MFHD::toPrettyString(uint32_t indent){
|
||||||
std::stringstream r;
|
std::stringstream r;
|
||||||
r << std::string(indent, ' ') << "[mfhd] Movie Fragment Header (" << boxedSize() << ")" << std::endl;
|
r << std::string(indent, ' ') << "[mfhd] Movie Fragment Header (" << boxedSize() << ")" << std::endl;
|
||||||
r << std::string(indent + 1, ' ') << "SequenceNumber " << getSequenceNumber() << std::endl;
|
r << std::string(indent + 1, ' ') << "SequenceNumber " << getSequenceNumber() << std::endl;
|
||||||
|
@ -1263,7 +1333,7 @@ namespace MP4 {
|
||||||
memcpy(data + 4, "moof", 4);
|
memcpy(data + 4, "moof", 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string MOOF::toPrettyString(int indent){
|
std::string MOOF::toPrettyString(uint32_t indent){
|
||||||
return toPrettyContainerString(indent, std::string("[moof] Movie Fragment Box"));
|
return toPrettyContainerString(indent, std::string("[moof] Movie Fragment Box"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1313,7 +1383,7 @@ namespace MP4 {
|
||||||
return getBox(tempLoc);
|
return getBox(tempLoc);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string TRAF::toPrettyString(int indent){
|
std::string TRAF::toPrettyString(uint32_t indent){
|
||||||
std::stringstream r;
|
std::stringstream r;
|
||||||
r << std::string(indent, ' ') << "[traf] Track Fragment Box (" << boxedSize() << ")" << std::endl;
|
r << std::string(indent, ' ') << "[traf] Track Fragment Box (" << boxedSize() << ")" << std::endl;
|
||||||
Box curBox;
|
Box curBox;
|
||||||
|
@ -2199,7 +2269,7 @@ namespace MP4 {
|
||||||
return getInt32(8 + (index * 4));
|
return getInt32(8 + (index * 4));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string FTYP::toPrettyString(int indent){
|
std::string FTYP::toPrettyString(uint32_t indent){
|
||||||
std::stringstream r;
|
std::stringstream r;
|
||||||
r << std::string(indent, ' ') << "[ftyp] File Type (" << boxedSize() << ")" << std::endl;
|
r << std::string(indent, ' ') << "[ftyp] File Type (" << boxedSize() << ")" << std::endl;
|
||||||
r << std::string(indent + 1, ' ') << "MajorBrand: 0x" << std::hex << getMajorBrand() << std::dec << std::endl;
|
r << std::string(indent + 1, ' ') << "MajorBrand: 0x" << std::hex << getMajorBrand() << std::dec << std::endl;
|
||||||
|
@ -2215,7 +2285,7 @@ namespace MP4 {
|
||||||
memcpy(data + 4, "moov", 4);
|
memcpy(data + 4, "moov", 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string MOOV::toPrettyString(int indent){
|
std::string MOOV::toPrettyString(uint32_t indent){
|
||||||
return toPrettyContainerString(indent, std::string("[moov] Movie Box"));
|
return toPrettyContainerString(indent, std::string("[moov] Movie Box"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2223,12 +2293,12 @@ namespace MP4 {
|
||||||
memcpy(data + 4, "mvex", 4);
|
memcpy(data + 4, "mvex", 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string MVEX::toPrettyString(int indent){
|
std::string MVEX::toPrettyString(uint32_t indent){
|
||||||
return toPrettyContainerString(indent, std::string("[mvex] Movie Extends Header Box"));
|
return toPrettyContainerString(indent, std::string("[mvex] Movie Extends Header Box"));
|
||||||
}
|
}
|
||||||
|
|
||||||
TREX::TREX(){
|
TREX::TREX(){
|
||||||
memcpy(data + 4, "ftyp", 4);
|
memcpy(data + 4, "trex", 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TREX::setTrackID(uint32_t newTrackID){
|
void TREX::setTrackID(uint32_t newTrackID){
|
||||||
|
@ -2271,7 +2341,7 @@ namespace MP4 {
|
||||||
getInt32(16);
|
getInt32(16);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string TREX::toPrettyString(int indent){
|
std::string TREX::toPrettyString(uint32_t indent){
|
||||||
std::stringstream r;
|
std::stringstream r;
|
||||||
r << std::string(indent, ' ') << "[trex] Track Extends (" << boxedSize() << ")" << std::endl;
|
r << std::string(indent, ' ') << "[trex] Track Extends (" << boxedSize() << ")" << std::endl;
|
||||||
r << std::string(indent + 1, ' ') << "TrackID: " << getTrackID() << std::endl;
|
r << std::string(indent + 1, ' ') << "TrackID: " << getTrackID() << std::endl;
|
||||||
|
@ -2282,21 +2352,540 @@ namespace MP4 {
|
||||||
return r.str();
|
return r.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
static char c2hex(int c){
|
TRAK::TRAK(){
|
||||||
if (c >= '0' && c <= '9') return c - '0';
|
memcpy(data + 4, "trak", 4);
|
||||||
if (c >= 'a' && c <= 'f') return c - 'a' + 10;
|
}
|
||||||
if (c >= 'A' && c <= 'F') return c - 'A' + 10;
|
|
||||||
return 0;
|
std::string TRAK::toPrettyString(uint32_t indent){
|
||||||
|
return toPrettyContainerString(indent, std::string("[trak] Track Structure"));
|
||||||
|
}
|
||||||
|
|
||||||
|
MDIA::MDIA(){
|
||||||
|
memcpy(data + 4, "mdia", 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string MDIA::toPrettyString(uint32_t indent){
|
||||||
|
return toPrettyContainerString(indent, std::string("[mdia] Track Media Structure"));
|
||||||
|
}
|
||||||
|
|
||||||
|
MINF::MINF(){
|
||||||
|
memcpy(data + 4, "minf", 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string MINF::toPrettyString(uint32_t indent){
|
||||||
|
return toPrettyContainerString(indent, std::string("[minf] Media Information"));
|
||||||
|
}
|
||||||
|
|
||||||
|
DINF::DINF(){
|
||||||
|
memcpy(data + 4, "dinf", 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string DINF::toPrettyString(uint32_t indent){
|
||||||
|
return toPrettyContainerString(indent, std::string("[dinf] Data Information"));
|
||||||
}
|
}
|
||||||
|
|
||||||
MFRA::MFRA(){
|
MFRA::MFRA(){
|
||||||
memcpy(data + 4, "mfra", 4);
|
memcpy(data + 4, "mfra", 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string MFRA::toPrettyString(int indent){
|
std::string MFRA::toPrettyString(uint32_t indent){
|
||||||
return toPrettyContainerString(indent, std::string("[mfra] Movie Fragment Random Acces Box"));
|
return toPrettyContainerString(indent, std::string("[mfra] Movie Fragment Random Acces Box"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MFRO::MFRO(){
|
||||||
|
memcpy(data + 4, "mfro", 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MFRO::setSize(uint32_t newSize){
|
||||||
|
setInt32(newSize,0);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t MFRO::getSize(){
|
||||||
|
getInt32(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string MFRO::toPrettyString(uint32_t indent){
|
||||||
|
std::stringstream r;
|
||||||
|
r << std::string(indent, ' ') << "[mfro] Movie Fragment Random Access Offset (" << boxedSize() << ")" << std::endl;
|
||||||
|
r << std::string(indent + 1, ' ') << "Size: " << getSize() << std::endl;
|
||||||
|
return r.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
HDLR::HDLR(){
|
||||||
|
memcpy(data + 4, "hdlr", 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
void HDLR::setSize(uint32_t newSize){
|
||||||
|
setInt32(newSize,0);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t HDLR::getSize(){
|
||||||
|
return getInt32(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void HDLR::setPreDefined(uint32_t newPreDefined){
|
||||||
|
setInt32(newPreDefined,4);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t HDLR::getPreDefined(){
|
||||||
|
return getInt32(4);
|
||||||
|
}
|
||||||
|
|
||||||
|
void HDLR::setHandlerType(uint32_t newHandlerType){
|
||||||
|
setInt32(newHandlerType, 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t HDLR::getHandlerType(){
|
||||||
|
return getInt32(8);
|
||||||
|
}
|
||||||
|
|
||||||
|
void HDLR::setName(std::string newName){
|
||||||
|
setString(newName, 24);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string HDLR::getName(){
|
||||||
|
return getString(24);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string HDLR::toPrettyString(uint32_t indent){
|
||||||
|
std::stringstream r;
|
||||||
|
r << std::string(indent, ' ') << "[hdlr] Handler Reference (" << boxedSize() << ")" << std::endl;
|
||||||
|
r << std::string(indent + 1, ' ') << "PreDefined: " << getPreDefined() << std::endl;
|
||||||
|
r << std::string(indent + 1, ' ') << "HandlerType: " << getHandlerType() << std::endl;
|
||||||
|
r << std::string(indent + 1, ' ') << "Name: " << getName() << std::endl;
|
||||||
|
return r.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
//Note: next 4 headers inherit from fullBox, start at byte 4.
|
||||||
|
VMHD::VMHD(){
|
||||||
|
memcpy(data + 4, "vmhd", 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
void VMHD::setGraphicsMode(uint16_t newGraphicsMode){
|
||||||
|
setInt16(newGraphicsMode,4);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t VMHD::getGraphicsMode(){
|
||||||
|
return getInt16(4);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t VMHD::getOpColorCount(){
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
void VMHD::setOpColor(uint16_t newOpColor, size_t index){
|
||||||
|
if (index <3){
|
||||||
|
setInt16(newOpColor, 6 + (2 * index));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t VMHD::getOpColor(size_t index){
|
||||||
|
if (index < 3){
|
||||||
|
return getInt16(6 + (index * 2));
|
||||||
|
}else{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string VMHD::toPrettyString(uint32_t indent){
|
||||||
|
std::stringstream r;
|
||||||
|
r << std::string(indent, ' ') << "[vmhd] Video Media Header Box (" << boxedSize() << ")" << std::endl;
|
||||||
|
r << fullBox::toPrettyString(indent);
|
||||||
|
r << std::string(indent + 1, ' ') << "GraphicsMode: " << getGraphicsMode() << std::endl;
|
||||||
|
for (int i = 0; i < getOpColorCount(); i++){
|
||||||
|
r << std::string(indent + 1, ' ') << "OpColor["<<i<<"]: " << getOpColor(i) << std::endl;
|
||||||
|
}
|
||||||
|
return r.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
SMHD::SMHD(){
|
||||||
|
memcpy(data + 4, "smhd", 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SMHD::setBalance(int16_t newBalance){
|
||||||
|
setInt16(newBalance,4);
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t SMHD::getBalance(){
|
||||||
|
return getInt16(4);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string SMHD::toPrettyString(uint32_t indent){
|
||||||
|
std::stringstream r;
|
||||||
|
r << std::string(indent, ' ') << "[smhd] Sound Media Header Box (" << boxedSize() << ")" << std::endl;
|
||||||
|
r << fullBox::toPrettyString(indent);
|
||||||
|
r << std::string(indent + 1, ' ') << "Balance: " << getBalance() << std::endl;
|
||||||
|
return r.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
HMHD::HMHD(){
|
||||||
|
memcpy(data + 4, "hmhd", 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
void HMHD::setMaxPDUSize(uint16_t newMaxPDUSize){
|
||||||
|
setInt16(newMaxPDUSize,4);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t HMHD::getMaxPDUSize(){
|
||||||
|
return getInt16(4);
|
||||||
|
}
|
||||||
|
|
||||||
|
void HMHD::setAvgPDUSize(uint16_t newAvgPDUSize){
|
||||||
|
setInt16(newAvgPDUSize,6);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t HMHD::getAvgPDUSize(){
|
||||||
|
return getInt16(6);
|
||||||
|
}
|
||||||
|
|
||||||
|
void HMHD::setMaxBitRate(uint32_t newMaxBitRate){
|
||||||
|
setInt32(newMaxBitRate,8);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t HMHD::getMaxBitRate(){
|
||||||
|
return getInt32(8);
|
||||||
|
}
|
||||||
|
|
||||||
|
void HMHD::setAvgBitRate(uint32_t newAvgBitRate){
|
||||||
|
setInt32(newAvgBitRate,12);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t HMHD::getAvgBitRate(){
|
||||||
|
return getInt32(12);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string HMHD::toPrettyString(uint32_t indent){
|
||||||
|
std::stringstream r;
|
||||||
|
r << std::string(indent, ' ') << "[hmhd] Hint Media Header Box (" << boxedSize() << ")" << std::endl;
|
||||||
|
r << fullBox::toPrettyString(indent);
|
||||||
|
r << std::string(indent + 1, ' ') << "maxPDUSize: " << getMaxPDUSize() << std::endl;
|
||||||
|
r << std::string(indent + 1, ' ') << "avgPDUSize: " << getAvgPDUSize() << std::endl;
|
||||||
|
r << std::string(indent + 1, ' ') << "maxBitRate: " << getMaxBitRate() << std::endl;
|
||||||
|
r << std::string(indent + 1, ' ') << "avgBitRate: " << getAvgBitRate() << std::endl;
|
||||||
|
return r.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
NMHD::NMHD(){
|
||||||
|
memcpy(data + 4, "nmhd", 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string NMHD::toPrettyString(uint32_t indent){
|
||||||
|
std::stringstream r;
|
||||||
|
r << std::string(indent, ' ') << "[nmhd] Null Media Header Box (" << boxedSize() << ")" << std::endl;
|
||||||
|
r << fullBox::toPrettyString(indent);
|
||||||
|
return r.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
MEHD::MEHD(){
|
||||||
|
memcpy(data + 4, "mehd", 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MEHD::setFragmentDuration(uint64_t newFragmentDuration){
|
||||||
|
if (getVersion() == 0){
|
||||||
|
setInt32(newFragmentDuration,4);
|
||||||
|
}else{
|
||||||
|
setInt64(newFragmentDuration,4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t MEHD::getFragmentDuration(){
|
||||||
|
if(getVersion() == 0){
|
||||||
|
return getInt32(4);
|
||||||
|
}else{
|
||||||
|
return getInt64(4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string MEHD::toPrettyString(uint32_t indent){
|
||||||
|
std::stringstream r;
|
||||||
|
r << std::string(indent, ' ') << "[mehd] Movie Extends Header Box (" << boxedSize() << ")" << std::endl;
|
||||||
|
r << fullBox::toPrettyString(indent);
|
||||||
|
r << std::string(indent + 1, ' ') << "FragmentDuration: " << getFragmentDuration() << std::endl;
|
||||||
|
return r.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
STBL::STBL(){
|
||||||
|
memcpy(data + 4, "stbl", 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string STBL::toPrettyString(uint32_t indent){
|
||||||
|
return toPrettyContainerString(indent, std::string("[stbl] Sample Table"));
|
||||||
|
}
|
||||||
|
|
||||||
|
URL::URL(){
|
||||||
|
memcpy(data + 4, "url ", 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
void URL::setLocation(std::string newLocation){
|
||||||
|
setString(newLocation, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string URL::getLocation(){
|
||||||
|
return std::string(getString(4),getStringLen(4));
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string URL::toPrettyString(uint32_t indent){
|
||||||
|
std::stringstream r;
|
||||||
|
r << std::string(indent, ' ') << "[url ] URL Box (" << boxedSize() << ")" << std::endl;
|
||||||
|
r << fullBox::toPrettyString(indent);
|
||||||
|
r << std::string(indent + 1, ' ') << "Location: " << getLocation() << std::endl;
|
||||||
|
return r.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
URN::URN(){
|
||||||
|
memcpy(data + 4, "urn ", 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
void URN::setName(std::string newName){
|
||||||
|
setString(newName, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string URN::getName(){
|
||||||
|
return std::string(getString(4),getStringLen(4));
|
||||||
|
}
|
||||||
|
|
||||||
|
void URN::setLocation(std::string newLocation){
|
||||||
|
setString(newLocation, 4 + getStringLen(4) + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string URN::getLocation(){
|
||||||
|
int loc = 4 + getStringLen(4) + 1;
|
||||||
|
return std::string(getString(loc),getStringLen(loc));
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string URN::toPrettyString(uint32_t indent){
|
||||||
|
std::stringstream r;
|
||||||
|
r << std::string(indent, ' ') << "[urn ] URN Box (" << boxedSize() << ")" << std::endl;
|
||||||
|
r << fullBox::toPrettyString(indent);
|
||||||
|
r << std::string(indent + 1, ' ') << "Name: " << getName() << std::endl;
|
||||||
|
r << std::string(indent + 1, ' ') << "Location: " << getLocation() << std::endl;
|
||||||
|
return r.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DREF::DREF(){
|
||||||
|
memcpy(data + 4, "dref", 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t DREF::getEntryCount(){
|
||||||
|
return getInt32(4);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DREF::setDataEntry(fullBox & newDataEntry, size_t index){
|
||||||
|
int i;
|
||||||
|
uint32_t offset = 8; //start of boxes
|
||||||
|
for (i=0; i< getEntryCount() && i < index; i++){
|
||||||
|
offset += getBoxLen(offset);
|
||||||
|
}
|
||||||
|
if (index+1 > getEntryCount()){
|
||||||
|
int amount = index + 1 - getEntryCount();
|
||||||
|
if ( !reserve(payloadOffset + offset, 0, amount * 8)){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (int j = 0; j < amount; ++j){
|
||||||
|
memcpy(data + payloadOffset + offset + j * 8, "\000\000\000\010erro", 8);
|
||||||
|
}
|
||||||
|
setInt32(index + 1, 4);
|
||||||
|
offset += (index - i) * 8;
|
||||||
|
}
|
||||||
|
setBox(newDataEntry, offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
Box & DREF::getDataEntry(size_t index){
|
||||||
|
uint32_t offset = 8;
|
||||||
|
if (index > getEntryCount()){
|
||||||
|
static Box res;
|
||||||
|
return (Box &)res;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i=0; i < index; i++){
|
||||||
|
offset += getBoxLen(offset);
|
||||||
|
}
|
||||||
|
return (Box &)getBox(offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string DREF::toPrettyString(uint32_t indent){
|
||||||
|
std::stringstream r;
|
||||||
|
r << std::string(indent, ' ') << "[dref] Data Reference Box (" << boxedSize() << ")" << std::endl;
|
||||||
|
r << fullBox::toPrettyString(indent);
|
||||||
|
r << std::string(indent + 1, ' ') << "EntryCount: " << getEntryCount() << std::endl;
|
||||||
|
for (int32_t i = 0; i< getEntryCount(); i++){
|
||||||
|
r << getDataEntry(i).toPrettyString(indent+1);
|
||||||
|
}
|
||||||
|
return r.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
MVHD::MVHD(){
|
||||||
|
memcpy(data + 4, "dref", 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MVHD::setCreationTime(uint64_t newCreationTime){
|
||||||
|
if (getVersion() == 0){
|
||||||
|
setInt32((uint32_t) newCreationTime, 4);
|
||||||
|
}else{
|
||||||
|
setInt64(newCreationTime, 4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t MVHD::getCreationTime(){
|
||||||
|
if (getVersion() == 0){
|
||||||
|
return (uint64_t)getInt32(4);
|
||||||
|
}else{
|
||||||
|
return getInt64(4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MVHD::setModificationTime(uint64_t newModificationTime){
|
||||||
|
if (getVersion() == 0){
|
||||||
|
setInt32((uint32_t) newModificationTime, 8);
|
||||||
|
}else{
|
||||||
|
setInt64(newModificationTime, 12);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t MVHD::getModificationTime(){
|
||||||
|
if (getVersion() == 0){
|
||||||
|
return (uint64_t)getInt32(8);
|
||||||
|
}else{
|
||||||
|
return getInt64(12);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MVHD::setTimeScale(uint32_t newTimeScale){
|
||||||
|
if (getVersion() == 0){
|
||||||
|
setInt32((uint32_t) newTimeScale, 12);
|
||||||
|
}else{
|
||||||
|
setInt32(newTimeScale, 20);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t MVHD::getTimeScale(){
|
||||||
|
if (getVersion() == 0){
|
||||||
|
return getInt32(12);
|
||||||
|
}else{
|
||||||
|
return getInt32(20);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MVHD::setDuration(uint64_t newDuration){
|
||||||
|
if (getVersion() == 0){
|
||||||
|
setInt32((uint32_t) newDuration, 16);
|
||||||
|
}else{
|
||||||
|
setInt64(newDuration, 24);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t MVHD::getDuration(){
|
||||||
|
if (getVersion() == 0){
|
||||||
|
return (uint64_t)getInt32(16);
|
||||||
|
}else{
|
||||||
|
return getInt64(24);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MVHD::setRate(uint32_t newRate){
|
||||||
|
if (getVersion() == 0){
|
||||||
|
setInt32( newRate, 20);
|
||||||
|
}else{
|
||||||
|
setInt32(newRate, 32);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t MVHD::getRate(){
|
||||||
|
if (getVersion() == 0){
|
||||||
|
return getInt32(20);
|
||||||
|
}else{
|
||||||
|
return getInt32(32);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MVHD::setVolume(uint16_t newVolume){
|
||||||
|
if (getVersion() == 0){
|
||||||
|
setInt16(newVolume, 24);
|
||||||
|
}else{
|
||||||
|
setInt16(newVolume, 36);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t MVHD::getVolume(){
|
||||||
|
if (getVersion() == 0){
|
||||||
|
return getInt16(24);
|
||||||
|
}else{
|
||||||
|
return getInt16(36);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//10 bytes reserverd in between
|
||||||
|
uint32_t MVHD::getMatrixCount(){
|
||||||
|
return 9;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MVHD::setMatrix(int32_t newMatrix, size_t index){
|
||||||
|
int offset = 0;
|
||||||
|
if (getVersion() == 0){
|
||||||
|
offset = 24 + 2 + 10;
|
||||||
|
}else{
|
||||||
|
offset = 36 + 2 + 10;
|
||||||
|
}
|
||||||
|
setInt32(newMatrix, offset + index * 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t MVHD::getMatrix(size_t index){
|
||||||
|
int offset = 0;
|
||||||
|
if (getVersion() == 0){
|
||||||
|
offset = 24 + 2 + 10;
|
||||||
|
}else{
|
||||||
|
offset = 36 + 2 + 10;
|
||||||
|
}
|
||||||
|
return getInt32(offset + index * 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
//24 bytes of pre-defined in between
|
||||||
|
void MVHD::setTrackID(uint32_t newTrackID){
|
||||||
|
if (getVersion() == 0){
|
||||||
|
setInt32(newTrackID, 86);
|
||||||
|
}else{
|
||||||
|
setInt32(newTrackID, 98);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t MVHD::getTrackID(){
|
||||||
|
if (getVersion() == 0){
|
||||||
|
return getInt32(86);
|
||||||
|
}else{
|
||||||
|
return getInt32(98);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string MVHD::toPrettyString(uint32_t indent){
|
||||||
|
std::stringstream r;
|
||||||
|
r << std::string(indent, ' ') << "[mvhd] Movie Header Box (" << boxedSize() << ")" << std::endl;
|
||||||
|
r << fullBox::toPrettyString(indent);
|
||||||
|
r << std::string(indent + 1, ' ') << "CreationTime: " << getCreationTime() << std::endl;
|
||||||
|
r << std::string(indent + 1, ' ') << "ModificationTime: " << getModificationTime() << std::endl;
|
||||||
|
r << std::string(indent + 1, ' ') << "TimeScale: " << getTimeScale() << std::endl;
|
||||||
|
r << std::string(indent + 1, ' ') << "Duration: " << getDuration() << std::endl;
|
||||||
|
r << std::string(indent + 1, ' ') << "Rate: " << getRate() << std::endl;
|
||||||
|
r << std::string(indent + 1, ' ') << "Volume: " << getVolume() << std::endl;
|
||||||
|
r << std::string(indent + 1, ' ') << "Matrix: ";
|
||||||
|
for (int32_t i = 0; i< getMatrixCount(); i++){
|
||||||
|
r << getMatrix(i);
|
||||||
|
if (i!=getMatrixCount()-1){
|
||||||
|
r << ", ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
r << std::endl;
|
||||||
|
r << std::string(indent + 1, ' ') << "TrackID: " << getTrackID() << std::endl;
|
||||||
|
return r.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
static char c2hex(int c){
|
||||||
|
if (c >= '0' && c <= '9') return c - '0';
|
||||||
|
if (c >= 'a' && c <= 'f') return c - 'a' + 10;
|
||||||
|
if (c >= 'A' && c <= 'F') return c - 'A' + 10;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
UUID::UUID(){
|
UUID::UUID(){
|
||||||
memcpy(data + 4, "uuid", 4);
|
memcpy(data + 4, "uuid", 4);
|
||||||
setInt64(0, 0);
|
setInt64(0, 0);
|
||||||
|
|
187
lib/mp4.h
187
lib/mp4.h
|
@ -24,7 +24,7 @@ namespace MP4 {
|
||||||
char * asBox();
|
char * asBox();
|
||||||
char * payload();
|
char * payload();
|
||||||
void clear();
|
void clear();
|
||||||
std::string toPrettyString(int indent = 0);
|
std::string toPrettyString(uint32_t indent = 0);
|
||||||
protected:
|
protected:
|
||||||
//integer functions
|
//integer functions
|
||||||
void setInt8(char newData, size_t index);
|
void setInt8(char newData, size_t index);
|
||||||
|
@ -56,14 +56,23 @@ namespace MP4 {
|
||||||
};
|
};
|
||||||
//Box Class
|
//Box Class
|
||||||
|
|
||||||
|
class fullBox: public Box{
|
||||||
|
public:
|
||||||
|
void setVersion(char newVersion);
|
||||||
|
char getVersion();
|
||||||
|
void setFlags(uint32_t newFlags);
|
||||||
|
uint32_t getFlags();
|
||||||
|
std::string toPrettyString(uint32_t indent = 0);
|
||||||
|
};
|
||||||
|
|
||||||
class containerBox: public Box{
|
class containerBox: public Box{
|
||||||
public:
|
public:
|
||||||
//containerBox();
|
//containerBox();
|
||||||
uint32_t getContentCount();
|
uint32_t getContentCount();
|
||||||
void setContent(Box & newContent, uint32_t no);
|
void setContent(Box & newContent, uint32_t no);
|
||||||
Box & getContent(uint32_t no);
|
Box & getContent(uint32_t no);
|
||||||
std::string toPrettyString(int indent = 0);
|
std::string toPrettyString(uint32_t indent = 0);
|
||||||
std::string toPrettyContainerString(int indent, std::string boxName);
|
std::string toPrettyContainerString(uint32_t indent, std::string boxName);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct afrt_runtable{
|
struct afrt_runtable{
|
||||||
|
@ -90,7 +99,7 @@ namespace MP4 {
|
||||||
uint32_t getFragmentRunCount();
|
uint32_t getFragmentRunCount();
|
||||||
void setFragmentRun(afrt_runtable newRun, uint32_t no);
|
void setFragmentRun(afrt_runtable newRun, uint32_t no);
|
||||||
afrt_runtable getFragmentRun(uint32_t no);
|
afrt_runtable getFragmentRun(uint32_t no);
|
||||||
std::string toPrettyString(int indent = 0);
|
std::string toPrettyString(uint32_t indent = 0);
|
||||||
};
|
};
|
||||||
//AFRT Box
|
//AFRT Box
|
||||||
|
|
||||||
|
@ -113,7 +122,7 @@ namespace MP4 {
|
||||||
uint32_t getSegmentRunEntryCount();
|
uint32_t getSegmentRunEntryCount();
|
||||||
void setSegmentRun(uint32_t firstSegment, uint32_t fragmentsPerSegment, uint32_t no);
|
void setSegmentRun(uint32_t firstSegment, uint32_t fragmentsPerSegment, uint32_t no);
|
||||||
asrt_runtable getSegmentRun(uint32_t no);
|
asrt_runtable getSegmentRun(uint32_t no);
|
||||||
std::string toPrettyString(int indent = 0);
|
std::string toPrettyString(uint32_t indent = 0);
|
||||||
};
|
};
|
||||||
//ASRT Box
|
//ASRT Box
|
||||||
|
|
||||||
|
@ -166,7 +175,7 @@ namespace MP4 {
|
||||||
MFHD();
|
MFHD();
|
||||||
void setSequenceNumber(uint32_t newSequenceNumber);
|
void setSequenceNumber(uint32_t newSequenceNumber);
|
||||||
uint32_t getSequenceNumber();
|
uint32_t getSequenceNumber();
|
||||||
std::string toPrettyString(int indent = 0);
|
std::string toPrettyString(uint32_t indent = 0);
|
||||||
};
|
};
|
||||||
//MFHD Box
|
//MFHD Box
|
||||||
|
|
||||||
|
@ -176,13 +185,13 @@ namespace MP4 {
|
||||||
uint32_t getContentCount();
|
uint32_t getContentCount();
|
||||||
void setContent(Box & newContent, uint32_t no);
|
void setContent(Box & newContent, uint32_t no);
|
||||||
Box & getContent(uint32_t no);
|
Box & getContent(uint32_t no);
|
||||||
std::string toPrettyString(int indent = 0);
|
std::string toPrettyString(uint32_t indent = 0);
|
||||||
};*/
|
};*/
|
||||||
|
|
||||||
class MOOF: public containerBox{
|
class MOOF: public containerBox{
|
||||||
public:
|
public:
|
||||||
MOOF();
|
MOOF();
|
||||||
std::string toPrettyString(int indent = 0);
|
std::string toPrettyString(uint32_t indent = 0);
|
||||||
};
|
};
|
||||||
//MOOF Box
|
//MOOF Box
|
||||||
|
|
||||||
|
@ -192,7 +201,7 @@ namespace MP4 {
|
||||||
uint32_t getContentCount();
|
uint32_t getContentCount();
|
||||||
void setContent(Box & newContent, uint32_t no);
|
void setContent(Box & newContent, uint32_t no);
|
||||||
Box & getContent(uint32_t no);
|
Box & getContent(uint32_t no);
|
||||||
std::string toPrettyString(int indent = 0);
|
std::string toPrettyString(uint32_t indent = 0);
|
||||||
};
|
};
|
||||||
//TRAF Box
|
//TRAF Box
|
||||||
|
|
||||||
|
@ -346,19 +355,19 @@ namespace MP4 {
|
||||||
uint32_t getCompatibleBrandsCount();
|
uint32_t getCompatibleBrandsCount();
|
||||||
void setCompatibleBrands(uint32_t newCompatibleBrand, size_t index);
|
void setCompatibleBrands(uint32_t newCompatibleBrand, size_t index);
|
||||||
uint32_t getCompatibleBrands(size_t index);
|
uint32_t getCompatibleBrands(size_t index);
|
||||||
std::string toPrettyString(int indent = 0);
|
std::string toPrettyString(uint32_t indent = 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
class MOOV: public containerBox{
|
class MOOV: public containerBox{
|
||||||
public:
|
public:
|
||||||
MOOV();
|
MOOV();
|
||||||
std::string toPrettyString(int indent = 0);
|
std::string toPrettyString(uint32_t indent = 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
class MVEX: public containerBox{
|
class MVEX: public containerBox{
|
||||||
public:
|
public:
|
||||||
MVEX();
|
MVEX();
|
||||||
std::string toPrettyString(int indent = 0);
|
std::string toPrettyString(uint32_t indent = 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
class TREX: public Box{
|
class TREX: public Box{
|
||||||
|
@ -374,20 +383,164 @@ namespace MP4 {
|
||||||
uint32_t getDefaultSampleSize();
|
uint32_t getDefaultSampleSize();
|
||||||
void setDefaultSampleFlags(uint32_t newDefaultSampleFlags);
|
void setDefaultSampleFlags(uint32_t newDefaultSampleFlags);
|
||||||
uint32_t getDefaultSampleFlags();
|
uint32_t getDefaultSampleFlags();
|
||||||
std::string toPrettyString(int indent = 0);
|
std::string toPrettyString(uint32_t indent = 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class MFRA: public containerBox{
|
class MFRA: public containerBox{
|
||||||
public:
|
public:
|
||||||
MFRA();
|
MFRA();
|
||||||
std::string toPrettyString(int indent = 0);
|
std::string toPrettyString(uint32_t indent = 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
/*class MDAT: public Box{
|
class TRAK: public containerBox{
|
||||||
public:
|
public:
|
||||||
MDAT();
|
TRAK();
|
||||||
};*/
|
std::string toPrettyString(uint32_t indent = 0);
|
||||||
|
};
|
||||||
|
|
||||||
|
class MDIA: public containerBox{
|
||||||
|
public:
|
||||||
|
MDIA();
|
||||||
|
std::string toPrettyString(uint32_t indent = 0);
|
||||||
|
};
|
||||||
|
|
||||||
|
class MINF: public containerBox{
|
||||||
|
public:
|
||||||
|
MINF();
|
||||||
|
std::string toPrettyString(uint32_t indent = 0);
|
||||||
|
};
|
||||||
|
|
||||||
|
class DINF: public containerBox{
|
||||||
|
public:
|
||||||
|
DINF();
|
||||||
|
std::string toPrettyString(uint32_t indent = 0);
|
||||||
|
};
|
||||||
|
|
||||||
|
class MFRO: public Box{
|
||||||
|
public:
|
||||||
|
MFRO();
|
||||||
|
void setSize(uint32_t newSize);
|
||||||
|
uint32_t getSize();
|
||||||
|
std::string toPrettyString(uint32_t indent = 0);
|
||||||
|
};
|
||||||
|
|
||||||
|
class HDLR: public Box{
|
||||||
|
public:
|
||||||
|
HDLR();
|
||||||
|
void setSize(uint32_t newSize);
|
||||||
|
uint32_t getSize();
|
||||||
|
void setPreDefined(uint32_t newPreDefined);
|
||||||
|
uint32_t getPreDefined();
|
||||||
|
void setHandlerType(uint32_t newHandlerType);
|
||||||
|
uint32_t getHandlerType();
|
||||||
|
void setName(std::string newName);
|
||||||
|
std::string getName();
|
||||||
|
std::string toPrettyString(uint32_t indent = 0);
|
||||||
|
};
|
||||||
|
|
||||||
|
class VMHD: public fullBox{
|
||||||
|
public:
|
||||||
|
VMHD();
|
||||||
|
void setGraphicsMode(uint16_t newGraphicsMode);
|
||||||
|
uint16_t getGraphicsMode();
|
||||||
|
uint32_t getOpColorCount();
|
||||||
|
void setOpColor(uint16_t newOpColor, size_t index);
|
||||||
|
uint16_t getOpColor(size_t index);
|
||||||
|
std::string toPrettyString(uint32_t indent = 0);
|
||||||
|
};
|
||||||
|
|
||||||
|
class SMHD: public fullBox{
|
||||||
|
public:
|
||||||
|
SMHD();
|
||||||
|
void setBalance(int16_t newBalance);
|
||||||
|
int16_t getBalance();
|
||||||
|
std::string toPrettyString(uint32_t indent = 0);
|
||||||
|
};
|
||||||
|
|
||||||
|
class HMHD: public fullBox{
|
||||||
|
public:
|
||||||
|
HMHD();
|
||||||
|
void setMaxPDUSize(uint16_t newMaxPDUSize);
|
||||||
|
uint16_t getMaxPDUSize();
|
||||||
|
void setAvgPDUSize(uint16_t newAvgPDUSize);
|
||||||
|
uint16_t getAvgPDUSize();
|
||||||
|
void setMaxBitRate(uint32_t newMaxBitRate);
|
||||||
|
uint32_t getMaxBitRate();
|
||||||
|
void setAvgBitRate(uint32_t newAvgBitRate);
|
||||||
|
uint32_t getAvgBitRate();
|
||||||
|
std::string toPrettyString(uint32_t indent = 0);
|
||||||
|
};
|
||||||
|
|
||||||
|
class NMHD: public fullBox{
|
||||||
|
public:
|
||||||
|
NMHD();
|
||||||
|
std::string toPrettyString(uint32_t indent = 0);
|
||||||
|
};
|
||||||
|
|
||||||
|
class MEHD: public fullBox{
|
||||||
|
public:
|
||||||
|
MEHD();
|
||||||
|
void setFragmentDuration(uint64_t newFragmentDuration);
|
||||||
|
uint64_t getFragmentDuration();
|
||||||
|
std::string toPrettyString(uint32_t indent = 0);
|
||||||
|
};
|
||||||
|
|
||||||
|
class STBL: public containerBox{
|
||||||
|
public:
|
||||||
|
STBL();
|
||||||
|
std::string toPrettyString(uint32_t indent = 0);
|
||||||
|
};
|
||||||
|
|
||||||
|
class URL: public fullBox{
|
||||||
|
public:
|
||||||
|
URL();
|
||||||
|
void setLocation(std::string newLocation);
|
||||||
|
std::string getLocation();
|
||||||
|
std::string toPrettyString(uint32_t indent = 0);
|
||||||
|
};
|
||||||
|
|
||||||
|
class URN: public fullBox{
|
||||||
|
public:
|
||||||
|
URN();
|
||||||
|
void setName(std::string newName);
|
||||||
|
std::string getName();
|
||||||
|
void setLocation(std::string newLocation);
|
||||||
|
std::string getLocation();
|
||||||
|
std::string toPrettyString(uint32_t indent = 0);
|
||||||
|
};
|
||||||
|
|
||||||
|
class DREF: public fullBox{
|
||||||
|
public:
|
||||||
|
DREF();
|
||||||
|
uint32_t getEntryCount();
|
||||||
|
void setDataEntry(fullBox & newDataEntry, size_t index);
|
||||||
|
Box & getDataEntry(size_t index);
|
||||||
|
std::string toPrettyString(uint32_t indent = 0);
|
||||||
|
};
|
||||||
|
|
||||||
|
class MVHD: public fullBox{
|
||||||
|
public:
|
||||||
|
MVHD();
|
||||||
|
void setCreationTime(uint64_t newCreationTime);
|
||||||
|
uint64_t getCreationTime();
|
||||||
|
void setModificationTime(uint64_t newModificationTime);
|
||||||
|
uint64_t getModificationTime();
|
||||||
|
void setTimeScale(uint32_t newTimeScale);
|
||||||
|
uint32_t getTimeScale();
|
||||||
|
void setDuration(uint64_t newDuration);
|
||||||
|
uint64_t getDuration();
|
||||||
|
void setRate(uint32_t newRate);
|
||||||
|
uint32_t getRate();
|
||||||
|
void setVolume(uint16_t newVolume);
|
||||||
|
uint16_t getVolume();
|
||||||
|
uint32_t getMatrixCount();
|
||||||
|
void setMatrix(int32_t newMatrix, size_t index);
|
||||||
|
int32_t getMatrix(size_t index);
|
||||||
|
void setTrackID(uint32_t newTrackID);
|
||||||
|
uint32_t getTrackID();
|
||||||
|
std::string toPrettyString(uint32_t indent = 0);
|
||||||
|
};
|
||||||
|
|
||||||
class UUID: public Box{
|
class UUID: public Box{
|
||||||
public:
|
public:
|
||||||
|
|
Loading…
Add table
Reference in a new issue