From 671a452578c5bf54bc4ec38860d4b0447ad7536f Mon Sep 17 00:00:00 2001
From: Oswald Auguste de Bruin <oswald.de.bruin@ddvtech.com>
Date: Mon, 8 Jul 2013 12:01:59 +0200
Subject: [PATCH] Latest MP4 commit
---
 lib/mp4.cpp | 239 ++++++++++++++++++++++++++++++++++++++--------------
 lib/mp4.h   |  34 ++++++--
 2 files changed, 203 insertions(+), 70 deletions(-)
diff --git a/lib/mp4.cpp b/lib/mp4.cpp
index 8205e162..f4352a40 100644
--- a/lib/mp4.cpp
+++ b/lib/mp4.cpp
@@ -268,6 +268,9 @@ namespace MP4 {
       case 0x656C7374:
         return ((ELST*)this)->toPrettyString(indent);
         break;
+      case 0x65736473:
+        return ((ESDS*)this)->toPrettyString(indent);
+        break;
       case 0x75647461:
         return ((UDTA*)this)->toPrettyString(indent);
         break;
@@ -2283,8 +2286,16 @@ namespace MP4 {
   ESDS::ESDS(){
     memcpy(data + 4, "esds", 4);
     setESDescriptorType(0x03);
-    setExtendedDescriptorType(0x8000FE);
-    
+    setExtendedESDescriptorType(0x808080);
+    setStreamPriority(16);
+    setDecoderConfigDescriptorTag(0x04);
+    setExtendedDecoderConfigDescriptorTag(0x808080);
+    setReservedFlag(true);
+    setDecoderDescriptorTypeTag(0x05);
+    setExtendedDecoderDescriptorTypeTag(0x808080);
+    setSLConfigDescriptorTypeTag(0x06);
+    setSLConfigExtendedDescriptorTypeTag(0x808010);
+    setSLValue(0x02);
   }
   
   char ESDS::getESDescriptorType(){
@@ -2295,11 +2306,11 @@ namespace MP4 {
     setInt8(newVal,4);
   }
   
-  uint32_t ESDS::getExtendedDescriptorType(){
+  uint32_t ESDS::getExtendedESDescriptorType(){
     return getInt24(5);
   }
   //3 bytes
-  void ESDS::setExtendedDescriptorType(uint32_t newVal){
+  void ESDS::setExtendedESDescriptorType(uint32_t newVal){
     setInt24(newVal,5);
   }
   //3 bytes
@@ -2310,125 +2321,220 @@ namespace MP4 {
   void ESDS::setESDescriptorTypeLength(char newVal){
     setInt8(newVal,8);
   }
+  //ESID 2 bytes
+  uint16_t ESDS::getESID(){
+    return getInt16(9);
+  }
   
+  void ESDS::setESID(uint16_t newVal){
+    setInt16(newVal, 9);
+  }
+  
+  //stream priority 1 byte
+  char ESDS::getStreamPriority(){
+    return getInt8(11);
+  }
+  
+  void ESDS::setStreamPriority(char newVal){
+    setInt8(newVal, 11);
+  }
+  
+  //decoder config descriptor tag 1byte
+  char ESDS::getDecoderConfigDescriptorTag(){
+    return getInt8(12);
+  }
+  
+  void ESDS::setDecoderConfigDescriptorTag(char newVal){
+    setInt8(newVal, 12);
+  }
+  
+  //extended decoder config descriptor tag 3 bytes
+  uint32_t ESDS::getExtendedDecoderConfigDescriptorTag(){
+    return getInt24(13);
+  }
+  //3 bytes
+  void ESDS::setExtendedDecoderConfigDescriptorTag(uint32_t newVal){
+    setInt24(newVal, 13);
+  }
+  //3 bytes
+  //decoder config descriptor type length
+  char ESDS::getDecoderConfigDescriptorTypeLength(){
+    return getInt8(16);
+  }
+  
+  void ESDS::setDecoderConfigDescriptorTypeLength(char newVal){
+    setInt8(newVal, 16);
+  }
+  //Note: tel 8 bytes op bij de volgende functies
   char ESDS::getByteObjectTypeID(){
-    return getInt8(9);  
+    return getInt8(17);  
   }
   
   void ESDS::setByteObjectTypeID(char newVal){
-    setInt8(newVal,9);
+    setInt8(newVal,17);
   }
   
   char ESDS::getStreamType(){
-    return getInt8(10) >> 2;  
+    return getInt8(18) >> 2;  
   }
   //6 bits
   void ESDS::setStreamType(char newVal){
-    setInt8(newVal<<2 + ((uint8_t)getUpstreamFlag() << 1) + (uint8_t)getReservedFlag() , 10);
+    setInt8(newVal<<2 + ((uint8_t)getUpstreamFlag() << 1) + (uint8_t)getReservedFlag() , 18);
   }
   //6 bits
   bool ESDS::getUpstreamFlag(){
-    return (((getInt8(10) >> 1) & 0x01) == 1);  
+    return (((getInt8(18) >> 1) & 0x01) == 1);  
   }
   
   void ESDS::setUpstreamFlag(bool newVal){
-    setInt8(getStreamType()<<2 + ((uint8_t)newVal << 1) + (uint8_t)getReservedFlag() , 10);
+    setInt8(getStreamType()<<2 + ((uint8_t)newVal << 1) + (uint8_t)getReservedFlag() , 18);
   }
   
   bool ESDS::getReservedFlag(){
-    return ((getInt8(10) & 0x01) == 1);  
+    return ((getInt8(18) & 0x01) == 1);  
   }
   
   void ESDS::setReservedFlag(bool newVal){
-    setInt8((getStreamType()<<2) + ((uint8_t)getUpstreamFlag() << 1) + (uint8_t)newVal , 10);
+    setInt8((getStreamType()<<2) + ((uint8_t)getUpstreamFlag() << 1) + (uint8_t)newVal , 18);
   }
   
   uint32_t ESDS::getBufferSize(){
-    return getInt24(11);  
+    return getInt24(19);  
   }
   //3 bytes
   void ESDS::setBufferSize(uint32_t newVal){
-    setInt24(newVal,11);
+    setInt24(newVal,19);
   }
   //3 bytes
   uint32_t ESDS::getMaximumBitRate(){
-    return getInt32(14);  
+    return getInt32(22);  
   }
   
-  void ESDS::getMaximumBitRate(uint32_t newVal){
-    setInt32(newVal,14);
+  void ESDS::setMaximumBitRate(uint32_t newVal){
+    setInt32(newVal,22);
   }
   
   uint32_t ESDS::getAverageBitRate(){
-    return getInt32(18);  
+    return getInt32(26);  
   }
   
   void ESDS::setAverageBitRate(uint32_t newVal){
-    setInt32(newVal,18);
+    setInt32(newVal,26);
   }
   
-  char ESDS::getDescriptorTypeTag(){
-    return getInt8(22);
+  char ESDS::getDecoderDescriptorTypeTag(){
+    return getInt8(30);
   }
   
-  void ESDS::setDescriptorTypeTag(char newVal){
-    setInt8(newVal,22);
+  void ESDS::setDecoderDescriptorTypeTag(char newVal){
+    setInt8(newVal,30);
   }
   
-  uint32_t ESDS::getExtendedDescriptorTypeTag(){
-    return getInt24(23);
+  uint32_t ESDS::getExtendedDecoderDescriptorTypeTag(){
+    return getInt24(31);
   }
   //3 bytes
-  void ESDS::setExtendedDescriptorTypeTag(uint32_t newVal){
-    setInt24(newVal, 23);
-  }
-  //3 bytes
-  char ESDS::getConfigDescriptorTypeLength(){
-    return getInt8(26);
-  }
-  
-  void ESDS::setConfigDescriptorTypeLength(char newVal){
-    setInt8(newVal, 26);
-  }
-  
-  uint16_t ESDS::getESHeaderStartCodes(){
-    return getInt16(27);
-  }
-  
-  void ESDS::setESHeaderStartCodes(uint16_t newVal){
-    setInt16(newVal,27);
-  }
-  
-  char ESDS::getSLConfigDescriptorTypeTag(){
-    return getInt16(29);  
-  }
-  
-  void ESDS::setSLConfigDescriptorTypeTag(char newVal){
-    setInt16(newVal, 29);
-  }
-  
-  uint32_t ESDS::getSLConfigExtendedDescriptorTypeTag(){
-    return getInt24(31);  
-  }
-  //3 bytes
-  void ESDS::setSLConfigExtendedDescriptorTypeTag(uint32_t newVal){
+  void ESDS::setExtendedDecoderDescriptorTypeTag(uint32_t newVal){
     setInt24(newVal, 31);
   }
   //3 bytes
-  char ESDS::getSLDescriptorTypeLength(){
+  char ESDS::getConfigDescriptorTypeLength(){
     return getInt8(34);
   }
   
-  void ESDS::setSLDescriptorTypeLength(char newVal){
+  void ESDS::setConfigDescriptorTypeLength(char newVal){
     setInt8(newVal, 34);
   }
   
+  uint16_t ESDS::getESHeaderStartCodes(){
+    return getInt16(35);
+  }
+  
+  void ESDS::setESHeaderStartCodes(uint16_t newVal){
+    setInt16(newVal,35);
+  }
+  
+  char ESDS::getSLConfigDescriptorTypeTag(){
+    return getInt16(37);  
+  }
+  
+  void ESDS::setSLConfigDescriptorTypeTag(char newVal){
+    setInt16(newVal, 37);
+  }
+  
+  uint32_t ESDS::getSLConfigExtendedDescriptorTypeTag(){
+    return getInt24(39);  
+  }
+  //3 bytes
+  void ESDS::setSLConfigExtendedDescriptorTypeTag(uint32_t newVal){
+    setInt24(newVal, 39);
+  }
+  //3 bytes
+  char ESDS::getSLDescriptorTypeLength(){
+    return getInt8(42);
+  }
+  
+  void ESDS::setSLDescriptorTypeLength(char newVal){
+    setInt8(newVal, 42);
+  }
+  
   char ESDS::getSLValue(){
-    return getInt8(35);
+    return getInt8(43);
   }
   
   void ESDS::setSLValue(char newVal){
-    setInt8(newVal, 35);
+    setInt8(newVal, 43);
+  }
+  
+  std::string ESDS::toPrettyString(uint32_t indent){
+    std::stringstream r;
+    r << std::string(indent, ' ') << "[esds] ES Descriptor Box (" << boxedSize() << ")" << std::endl;
+    r << fullBox::toPrettyString(indent);
+    //char getESDescriptorType();
+    r << std::string(indent + 1, ' ') << "ESDescriptorType: 0x" << std::hex << getESDescriptorType() << std::dec << std::endl;    
+    //uint32_t getExtendedESDescriptorType();//3 bytes
+    r << std::string(indent + 1, ' ') << "ExtendedESDescriptorType: 0x" << std::hex << getExtendedESDescriptorType() << std::dec << std::endl;
+    //char getESDescriptorTypeLength();
+    r << std::string(indent + 1, ' ') << "ESDescriptorTypeLength:"  << getESDescriptorTypeLength() << std::endl;
+    //uint16_t getESID();
+    r << std::string(indent + 1, ' ') << "ESID: 0x" << std::hex << getESID() << std::dec << std::endl;
+    //char getStreamPriority();
+    r << std::string(indent + 1, ' ') << "StreamPriority:"  << getStreamPriority() << std::endl;
+    //char getDecoderConfigDescriptorTag();
+    r << std::string(indent + 1, ' ') << "DecoderConfigDescriptorTag: 0x" << std::hex << getDecoderConfigDescriptorTag() << std::dec << std::endl;
+    //uint32_t getExtendedDecoderConfigDescriptorTag();
+    r << std::string(indent + 1, ' ') << "ExtendedDecoderConfigDescriptorTag: 0x" << std::hex << getExtendedDecoderConfigDescriptorTag() << std::dec << std::endl;
+    //char getDecoderConfigDescriptorTypeLength();
+    r << std::string(indent + 1, ' ') << "DecoderConfigDescriptorTag: 0x" << std::hex << getDecoderConfigDescriptorTag() << std::dec << std::endl;
+    //char getByteObjectTypeID();
+    r << std::string(indent + 1, ' ') << "ByteObjectTypeID: 0x" << std::hex << getByteObjectTypeID() << std::dec << std::endl;
+    //char getStreamType();//6 bits
+    r << std::string(indent + 1, ' ') << "StreamType: 0x" << std::hex << getStreamType() << std::dec << std::endl;
+    //bool getUpstreamFlag();
+    r << std::string(indent + 1, ' ') << "UpstreamFlag: 0x" << getUpstreamFlag() << std::endl;
+    //uint32_t getBufferSize();//3 bytes
+    r << std::string(indent + 1, ' ') << "BufferSize: 0x" << std::hex << getBufferSize() << std::dec << std::endl;
+    //uint32_t getMaximumBitRate();
+    r << std::string(indent + 1, ' ') << "MaximumBitRate: 0x" << std::hex << getMaximumBitRate() << std::dec << std::endl;
+    //uint32_t getAverageBitRate();
+    r << std::string(indent + 1, ' ') << "AverageBitRate: 0x" << std::hex << getAverageBitRate() << std::dec << std::endl;
+    //char getDecoderDescriptorTypeTag();
+    r << std::string(indent + 1, ' ') << "DecoderDescriptorTypeTag: 0x" << std::hex << getDecoderDescriptorTypeTag() << std::dec << std::endl;
+    //uint32_t getExtendedDecoderDescriptorTypeTag();//3 bytes
+    r << std::string(indent + 1, ' ') << "ExtendedDecoderDescriptorTypeTag: 0x" << std::hex << getExtendedDecoderDescriptorTypeTag() << std::dec << std::endl;
+    //char getConfigDescriptorTypeLength();
+    r << std::string(indent + 1, ' ') << "ConfigDescriptorTypeLength: 0x" << std::hex << getConfigDescriptorTypeLength() << std::dec << std::endl;
+    //uint16_t getESHeaderStartCodes();
+    r << std::string(indent + 1, ' ') << "ESHeaderStartCodes: 0x" << std::hex << getESHeaderStartCodes() << std::dec << std::endl;
+    //char getSLConfigDescriptorTypeTag();
+    r << std::string(indent + 1, ' ') << "SLConfigDescriptorTypeTag: 0x" << std::hex << getSLConfigDescriptorTypeTag() << std::dec << std::endl;
+    //uint32_t getSLConfigExtendedDescriptorTypeTag();//3 bytes
+    r << std::string(indent + 1, ' ') << "SLConfigExtendedDescriptorTypeTag: 0x" << std::hex << getSLConfigExtendedDescriptorTypeTag() << std::dec << std::endl;
+    //char getSLDescriptorTypeLength();
+    r << std::string(indent + 1, ' ') << "SLDescriptorTypeLength: 0x" << std::hex << getSLDescriptorTypeLength() << std::dec << std::endl;
+    //char getSLValue();
+    r << std::string(indent + 1, ' ') << "SLValue: 0x" << std::hex << getSLValue() << std::dec << std::endl;
+    return r.str();
   }
   
   SDTP::SDTP(){
@@ -4250,6 +4356,14 @@ namespace MP4 {
     return getInt32(24) >> 16;
   }
   
+  void AudioSampleEntry::setCodecBox(Box& newBox){
+    setBox(newBox, 28);
+  }
+  
+  Box & AudioSampleEntry::getCodecBox(){
+    return getBox(28);
+  }
+  
   std::string AudioSampleEntry::toPrettyAudioString(uint32_t indent, std::string name){
     std::stringstream r;
     r << std::string(indent, ' ') << name << " (" << boxedSize() << ")" << std::endl;
@@ -4258,6 +4372,7 @@ namespace MP4 {
     r << std::string(indent + 1, ' ') << "SampleSize: " << getSampleSize() << std::endl;
     r << std::string(indent + 1, ' ') << "PreDefined: " << getPreDefined() << std::endl;
     r << std::string(indent + 1, ' ') << "SampleRate: " << getSampleRate() << std::endl;
+    r << getCodecBox().toPrettyString(indent + 1) << std::endl;
     return r.str();
   }
 
diff --git a/lib/mp4.h b/lib/mp4.h
index 3cc8738e..f2a0675d 100644
--- a/lib/mp4.h
+++ b/lib/mp4.h
@@ -350,10 +350,25 @@ namespace MP4 {
       ESDS();
       char getESDescriptorType();
       void setESDescriptorType(char newVal);
-      uint32_t getExtendedDescriptorType();//3 bytes
-      void setExtendedDescriptorType(uint32_t newVal);//3 bytes
+      uint32_t getExtendedESDescriptorType();//3 bytes
+      void setExtendedESDescriptorType(uint32_t newVal);//3 bytes
       char getESDescriptorTypeLength();
       void setESDescriptorTypeLength(char newVal);
+      //ESID 2 bytes
+      uint16_t getESID();
+      void setESID(uint16_t newVal);
+      //stream priority 1 byte
+      char getStreamPriority();
+      void setStreamPriority(char newVal);
+      //decoder config descriptor tag 1byte
+      char getDecoderConfigDescriptorTag();
+      void setDecoderConfigDescriptorTag(char newVal);
+      //extended decoder config descriptor tag 3 bytes
+      uint32_t getExtendedDecoderConfigDescriptorTag();
+      void setExtendedDecoderConfigDescriptorTag(uint32_t newVal);//3 bytes
+      //decoder config descriptor type length
+      char getDecoderConfigDescriptorTypeLength();
+      void setDecoderConfigDescriptorTypeLength(char newVal);
       char getByteObjectTypeID();
       void setByteObjectTypeID(char newVal);
       char getStreamType();//6 bits
@@ -365,13 +380,13 @@ namespace MP4 {
       uint32_t getBufferSize();//3 bytes
       void setBufferSize(uint32_t newVal);//3 bytes
       uint32_t getMaximumBitRate();
-      void getMaximumBitRate(uint32_t newVal);
+      void setMaximumBitRate(uint32_t newVal);
       uint32_t getAverageBitRate();
       void setAverageBitRate(uint32_t newVal);
-      char getDescriptorTypeTag();
-      void setDescriptorTypeTag(char newVal);
-      uint32_t getExtendedDescriptorTypeTag();//3 bytes
-      void setExtendedDescriptorTypeTag(uint32_t newVal);//3 bytes
+      char getDecoderDescriptorTypeTag();
+      void setDecoderDescriptorTypeTag(char newVal);
+      uint32_t getExtendedDecoderDescriptorTypeTag();//3 bytes
+      void setExtendedDecoderDescriptorTypeTag(uint32_t newVal);//3 bytes
       char getConfigDescriptorTypeLength();
       void setConfigDescriptorTypeLength(char newVal);
       uint16_t getESHeaderStartCodes();
@@ -384,6 +399,7 @@ namespace MP4 {
       void setSLDescriptorTypeLength(char newVal);
       char getSLValue();
       void setSLValue(char newVal);
+      std::string toPrettyString(uint32_t indent = 0);
   };
   
   class SDTP: public Box{
@@ -814,7 +830,9 @@ namespace MP4 {
       void setPreDefined(uint16_t newPreDefined);
       uint16_t getPreDefined();
       void setSampleRate(uint32_t newSampleRate);
-      uint32_t getSampleRate();    
+      uint32_t getSampleRate();
+      void setCodecBox(Box& newBox);
+      Box & getCodecBox();
       std::string toPrettyAudioString(uint32_t indent = 0, std::string name = "");
   };