banner updates to 2015
[asdcplib.git] / src / MXFTypes.h
index eb26096183af58cc579ad785f37e6eb35536a13b..77c0f5fdf8cb1a240c71b0efe3c0dbcf6769f210 100755 (executable)
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2005-2006, John Hurst
+Copyright (c) 2005-2015, John Hurst
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -41,12 +41,11 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 // used with TLVReader::Read*
 //
 // these are used below to manufacture arguments
-#define OBJ_READ_ARGS(s,l) s_MDD_Table[MDDindex_##s##_##l], &l
-#define OBJ_READ_ARGS_R(s,l,r) s_MDD_Table[MDDindex_##s##_##l], &r
-
-#define OBJ_WRITE_ARGS(s,l) s_MDD_Table[MDDindex_##s##_##l], &l
-
-#define OBJ_TYPE_ARGS(t) s_MDD_Table[MDDindex_##t].ul
+#define OBJ_READ_ARGS(s,l) m_Dict->Type(MDD_##s##_##l), &l
+#define OBJ_WRITE_ARGS(s,l) m_Dict->Type(MDD_##s##_##l), &l
+#define OBJ_READ_ARGS_OPT(s,l) m_Dict->Type(MDD_##s##_##l), &l.get()
+#define OBJ_WRITE_ARGS_OPT(s,l) m_Dict->Type(MDD_##s##_##l), &l.get()
+#define OBJ_TYPE_ARGS(t) m_Dict->Type(MDD_##t).ul
 
 
 namespace ASDCP
@@ -57,7 +56,7 @@ namespace ASDCP
       typedef std::map<TagValue, ItemInfo> TagMap;
 
       //      
-      class TLVReader : public ASDCP::MemIOReader
+      class TLVReader : public Kumu::MemIOReader
        {
 
          TagMap         m_ElementMap;
@@ -69,7 +68,7 @@ namespace ASDCP
 
        public:
          TLVReader(const byte_t* p, ui32_t c, IPrimerLookup* = 0);
-         Result_t ReadObject(const MDDEntry&, IArchive*);
+         Result_t ReadObject(const MDDEntry&, Kumu::IArchive*);
          Result_t ReadUi8(const MDDEntry&, ui8_t*);
          Result_t ReadUi16(const MDDEntry&, ui16_t*);
          Result_t ReadUi32(const MDDEntry&, ui32_t*);
@@ -77,7 +76,7 @@ namespace ASDCP
        };
 
       //      
-      class TLVWriter : public ASDCP::MemIOWriter
+      class TLVWriter : public Kumu::MemIOWriter
        {
 
          TagMap         m_ElementMap;
@@ -89,7 +88,7 @@ namespace ASDCP
 
        public:
          TLVWriter(byte_t* p, ui32_t c, IPrimerLookup* = 0);
-         Result_t WriteObject(const MDDEntry&, IArchive*);
+         Result_t WriteObject(const MDDEntry&, Kumu::IArchive*);
          Result_t WriteUi8(const MDDEntry&, ui8_t*);
          Result_t WriteUi16(const MDDEntry&, ui16_t*);
          Result_t WriteUi32(const MDDEntry&, ui32_t*);
@@ -98,47 +97,68 @@ namespace ASDCP
 
       //
       template <class T>
-       class Batch : public std::vector<T>, public IArchive
+       class Batch : public std::vector<T>, public Kumu::IArchive
        {
        public:
-         ui32_t ItemCount;
-         ui32_t ItemSize;
-
-         Batch() : ItemCount(0), ItemSize(0) { ItemSize = sizeof(T); }
-         ~Batch() {}
+         Batch() {}
+         virtual ~Batch() {}
 
          //
-         Result_t ReadFrom(ASDCP::MemIOReader& Reader) {
-           Result_t result = Reader.ReadUi32BE(&ItemCount);
-
-           if ( ASDCP_SUCCESS(result) )
-             result = Reader.ReadUi32BE(&ItemSize);
+         virtual bool Unarchive(Kumu::MemIOReader* Reader) {
+           ui32_t ItemCount, ItemSize;
+           if ( ! Reader->ReadUi32BE(&ItemCount) ) return false;
+           if ( ! Reader->ReadUi32BE(&ItemSize) ) return false;
 
            if ( ( ItemCount > 65536 ) || ( ItemSize > 1024 ) )
-             return RESULT_FAIL;
+             return false;
 
-           for ( ui32_t i = 0; i < ItemCount && ASDCP_SUCCESS(result); i++ )
+           bool result = true;
+           for ( ui32_t i = 0; i < ItemCount && result; i++ )
              {
                T Tmp;
-               result = Tmp.ReadFrom(Reader);
+               result = Tmp.Unarchive(Reader);
 
-               if ( ASDCP_SUCCESS(result) )
-                 push_back(Tmp);
+               if ( result )
+                 this->push_back(Tmp);
              }
 
            return result;
          }
 
+         inline virtual bool HasValue() const { return ! this->empty(); }
+
+         virtual ui32_t ArchiveLength() const {
+           ui32_t arch_size = sizeof(ui32_t)*2;
+
+           typename std::vector<T>::const_iterator l_i = this->begin();
+           assert(l_i != this->end());
+
+           for ( ; l_i != this->end(); l_i++ )
+             arch_size += l_i->ArchiveLength();
+           
+           return arch_size;
+         }
+
          //
-         Result_t WriteTo(ASDCP::MemIOWriter& Writer) {
-           Result_t result = Writer.WriteUi32BE(size());
+         virtual bool Archive(Kumu::MemIOWriter* Writer) const {
+           if ( ! Writer->WriteUi32BE(this->size()) ) return false;
+           byte_t* p = Writer->CurrentData();
 
-           if ( ASDCP_SUCCESS(result) )
-             result = Writer.WriteUi32BE(ItemSize);
+           if ( ! Writer->WriteUi32BE(0) ) return false;
+           if ( this->empty() ) return true;
+           
+           typename std::vector<T>::const_iterator l_i = this->begin();
+           assert(l_i != this->end());
+
+           ui32_t ItemSize = Writer->Remainder();
+           if ( ! (*l_i).Archive(Writer) ) return false;
+           ItemSize -= Writer->Remainder();
+           Kumu::i2p<ui32_t>(KM_i32_BE(ItemSize), p);
+           l_i++;
 
-           typename std::vector<T>::iterator l_i = begin();
-           for ( ; l_i != end() && ASDCP_SUCCESS(result); l_i++ )
-             result = (*l_i).WriteTo(Writer);
+           bool result = true;
+           for ( ; l_i != this->end() && result; l_i++ )
+             result = (*l_i).Archive(Writer);
 
            return result;
          }
@@ -153,38 +173,53 @@ namespace ASDCP
 
              typename std::vector<T>::iterator i = this->begin();
              for ( ; i != this->end(); i++ )
-               fprintf(stream, "  %s\n", (*i).ToString(identbuf));
+               fprintf(stream, "  %s\n", (*i).EncodeString(identbuf, IdentBufferLen));
            }
        };
 
       //
       template <class T>
-       class Array : public std::list<T>, public IArchive
+       class Array : public std::list<T>, public Kumu::IArchive
        {
        public:
          Array() {}
-         ~Array() {}
+         virtual ~Array() {}
 
          //
-         Result_t ReadFrom(ASDCP::MemIOReader& Reader)
+         virtual bool Unarchive(Kumu::MemIOReader* Reader)
            {
-             while ( Reader.Remainder() > 0 )
+             bool result = true;
+
+             while ( Reader->Remainder() > 0 && result )
                {
                  T Tmp;
-                 Tmp.ReadFrom(Reader);
-                 push_back(Tmp);
+                 result = Tmp.Unarchive(Reader);
+                 this->push_back(Tmp);
                }
 
-             return RESULT_OK;
+             return result;
            }
 
+         inline virtual bool HasValue() const { return ! this->empty(); }
+
+         virtual ui32_t ArchiveLength() const {
+           ui32_t arch_size = 0;
+
+           typename std::list<T>::const_iterator l_i = this->begin();
+
+           for ( ; l_i != this->end(); l_i++ )
+             arch_size += l_i->ArchiveLength();
+           
+           return arch_size;
+         }
+
          //
-         Result_t WriteTo(ASDCP::MemIOWriter& Writer) {
-           Result_t result = RESULT_OK;
-           typename std::list<T>::iterator l_i = begin();
+         virtual bool Archive(Kumu::MemIOWriter* Writer) const {
+           bool result = true;
+           typename std::list<T>::const_iterator l_i = this->begin();
 
-           for ( ; l_i != end() && ASDCP_SUCCESS(result); l_i++ )
-             result = (*l_i).WriteTo(Writer);
+           for ( ; l_i != this->end() && result; l_i++ )
+             result = (*l_i).Archive(Writer);
 
            return result;
          }
@@ -199,105 +234,282 @@ namespace ASDCP
 
              typename std::list<T>::iterator i = this->begin();
              for ( ; i != this->end(); i++ )
-               fprintf(stream, "  %s\n", (*i).ToString(identbuf));
+               fprintf(stream, "  %s\n", (*i).EncodeString(identbuf, IdentBufferLen));
            }
        };
 
       //
-      class Timestamp : public IArchive
+    class ISO8String : public std::string, public Kumu::IArchive
+       {
+       public:
+         ISO8String() {}
+         ISO8String(const char*);
+         ISO8String(const std::string&);
+         ~ISO8String() {}
+
+         const ISO8String& operator=(const char*);
+         const ISO8String& operator=(const std::string&);
+
+         const char* EncodeString(char* str_buf, ui32_t buf_len) const;
+         inline virtual bool HasValue() const { return ! empty(); }
+         inline virtual ui32_t ArchiveLength() const { return sizeof(ui32_t) + size(); }
+         virtual bool Unarchive(Kumu::MemIOReader* Reader);
+         virtual bool Archive(Kumu::MemIOWriter* Writer) const;
+       };
+
+      //
+    class UTF16String : public std::string, public Kumu::IArchive
        {
        public:
-         ui16_t Year;
-         ui8_t  Month;
-         ui8_t  Day;
-         ui8_t  Hour;
-         ui8_t  Minute;
-         ui8_t  Second;
-         ui8_t  mSec_4;
-
-         Timestamp() :
-           Year(0), Month(0),  Day(0),
-           Hour(0), Minute(0), Second(0), mSec_4(0) {}
+         UTF16String() {}
+         UTF16String(const char*);
+         UTF16String(const std::string&);
+         ~UTF16String() {}
 
-         //
-         inline const char* ToString(char* str_buf) const {
-           snprintf(str_buf, IdentBufferLen,
-                    "%04hu-%02hu-%02hu %02hu:%02hu:%02hu.%03hu",
-                    Year, Month, Day, Hour, Minute, Second, mSec_4);
-           return str_buf;
+         const UTF16String& operator=(const char*);
+         const UTF16String& operator=(const std::string&);
+
+         const char* EncodeString(char* str_buf, ui32_t buf_len) const;
+         inline virtual bool HasValue() const { return ! empty(); }
+         inline virtual ui32_t ArchiveLength() const { return sizeof(ui32_t) + size(); }
+         virtual bool Unarchive(Kumu::MemIOReader* Reader);
+         virtual bool Archive(Kumu::MemIOWriter* Writer) const;
+       };
+
+      //
+      class Rational : public ASDCP::Rational, public Kumu::IArchive
+       {
+       public:
+         Rational() {}
+         ~Rational() {}
+
+         Rational(const Rational& rhs) : ASDCP::Rational(), IArchive() {
+           Numerator = rhs.Numerator;
+           Denominator = rhs.Denominator;
          }
 
-         //
-         inline Result_t ReadFrom(ASDCP::MemIOReader& Reader) {
-           Result_t result = Reader.ReadUi16BE(&Year);
+         const Rational& operator=(const Rational& rhs) {
+           Numerator = rhs.Numerator;
+           Denominator = rhs.Denominator;
+           return *this;
+         }
 
-           if ( ASDCP_SUCCESS(result) )
-             result = Reader.ReadRaw(&Month, 6);
+         Rational(const ASDCP::Rational& rhs) {
+           Numerator = rhs.Numerator;
+           Denominator = rhs.Denominator;
+         }
 
-           return result;
+         const Rational& operator=(const ASDCP::Rational& rhs) {
+           Numerator = rhs.Numerator;
+           Denominator = rhs.Denominator;
+           return *this;
          }
 
          //
-         inline Result_t WriteTo(ASDCP::MemIOWriter& Writer) {
-           Result_t result = Writer.WriteUi16BE(Year);
+         inline const char* EncodeString(char* str_buf, ui32_t buf_len) const {
+           snprintf(str_buf, buf_len, "%d/%d", Numerator, Denominator);
+           return str_buf;
+         }
 
-           if ( ASDCP_SUCCESS(result) )
-             result = Writer.WriteRaw(&Month, 6);
+         inline virtual bool Unarchive(Kumu::MemIOReader* Reader) {
+           if ( ! Reader->ReadUi32BE((ui32_t*)&Numerator) ) return false;
+           if ( ! Reader->ReadUi32BE((ui32_t*)&Denominator) ) return false;
+           return true;
+         }
 
-           return result;
+         inline virtual bool HasValue() const { return true; }
+         inline virtual ui32_t ArchiveLength() const { return sizeof(ui32_t)*2; }
+
+         inline virtual bool Archive(Kumu::MemIOWriter* Writer) const {
+           if ( ! Writer->WriteUi32BE((ui32_t)Numerator) ) return false;
+           if ( ! Writer->WriteUi32BE((ui32_t)Denominator) ) return false;
+           return true;
          }
        };
 
       //
-      class UTF16String : public IArchive
+      class VersionType : public Kumu::IArchive
        {
-         ui16_t m_length;
-         char   m_buffer[IdentBufferLen];
-         
        public:
-         UTF16String() : m_length(0) { *m_buffer = 0; }
-         ~UTF16String() {}
+         enum Release_t { RL_UNKNOWN, RL_RELEASE, RL_DEVELOPMENT, RL_PATCHED, RL_BETA, RL_PRIVATE, RL_MAX };
+         ui16_t Major;
+         ui16_t Minor;
+         ui16_t Patch;
+         ui16_t Build;
+         Release_t Release;
+
+         VersionType() : Major(0), Minor(0), Patch(0), Build(0), Release(RL_UNKNOWN) {}
+         VersionType(const VersionType& rhs) { Copy(rhs); }
+         virtual ~VersionType() {}
+
+         const VersionType& operator=(const VersionType& rhs) { Copy(rhs); return *this; }
+         void Copy(const VersionType& rhs) {
+           Major = rhs.Major;
+           Minor = rhs.Minor;
+           Patch = rhs.Patch;
+           Build = rhs.Build;
+           Release = rhs.Release;
+         }
 
-         //
-         const char* ToString(char* str_buf) const {
-           strncpy(str_buf, m_buffer, m_length+1);
+         void Dump(FILE* = 0);
+
+         const char* EncodeString(char* str_buf, ui32_t buf_len) const {
+           snprintf(str_buf, buf_len, "%hu.%hu.%hu.%hur%hu", Major, Minor, Patch, Build, ui16_t(Release));
            return str_buf;
          }
 
-         Result_t ReadFrom(ASDCP::MemIOReader& Reader);
-         Result_t WriteTo(ASDCP::MemIOWriter& Writer);
+         virtual bool Unarchive(Kumu::MemIOReader* Reader) {
+           if ( ! Reader->ReadUi16BE(&Major) ) return false;
+           if ( ! Reader->ReadUi16BE(&Minor) ) return false;
+           if ( ! Reader->ReadUi16BE(&Patch) ) return false;
+           if ( ! Reader->ReadUi16BE(&Build) ) return false;
+           ui16_t tmp_release;
+           if ( ! Reader->ReadUi16BE(&tmp_release) ) return false;
+           Release = (Release_t)tmp_release;
+           return true;
+         }
+
+         inline virtual bool HasValue() const { return true; }
+         inline virtual ui32_t ArchiveLength() const { return sizeof(ui16_t)*5; }
+
+         virtual bool Archive(Kumu::MemIOWriter* Writer) const {
+           if ( ! Writer->WriteUi16BE(Major) ) return false;
+           if ( ! Writer->WriteUi16BE(Minor) ) return false;
+           if ( ! Writer->WriteUi16BE(Patch) ) return false;
+           if ( ! Writer->WriteUi16BE(Build) ) return false;
+           if ( ! Writer->WriteUi16BE((ui16_t)(Release & 0x0000ffffL)) ) return false;
+           return true;
+         }
        };
 
-      //
-      class Rational : public ASDCP::Rational, public IArchive
+      /*
+       The RGBALayout type shall be a fixed-size 8 element sequence with a total length
+       of 16 bytes, where each element shall consist of the RGBAComponent type with the
+       following fields:
+
+       Code (UInt8): Enumerated value specifying component (i.e., component identifier).
+       "0" is the layout terminator.
+
+       Depth (UInt8): Integer specifying the number of bits occupied (see also G.2.26) 
+         1->32 indicates integer depth
+         253 = HALF (floating point 16-bit value)
+         254 = IEEE floating point 32-bit value
+         255 = IEEE floating point 64-bit value
+         0 = RGBALayout terminator
+
+       A Fill component indicates unused bits. After the components have been specified,
+       the remaining Code and Size fields shall be set to zero (0).
+
+       For each component in the Pixel, one of the following Codes or the terminator
+       shall be specified (explained below):
+
+       Code    ASCII
+
+      */
+      struct RGBALayoutTableEntry
+      {
+       byte_t code;
+       char symbol;
+       const char* label;
+      };
+
+      struct RGBALayoutTableEntry const RGBALayoutTable[] = {
+       { 0x52, 'R', "Red component" },
+       { 0x47, 'G', "Green component" },
+       { 0x42, 'B', "Blue component" },
+       { 0x41, 'A', "Alpha component" },
+       { 0x72, 'r', "Red component (LSBs)" },
+       { 0x67, 'g', "Green component (LSBs)" },
+       { 0x62, 'b', "Blue component (LSBs)" },
+       { 0x61, 'a', "Alpha component (LSBs)" },
+       { 0x46, 'F', "Fill component" },
+       { 0x50, 'P', "Palette code" },
+       { 0x55, 'U', "Color Difference Sample (e.g. U, Cb, I etc.)" },
+       { 0x56, 'V', "Color Difference Sample (e.g. V, Cr, Q etc.)" },
+       { 0x57, 'W', "Composite Video" },
+       { 0x58, 'X', "Non co-sited luma component" },
+       { 0x59, 'Y', "Luma component" },
+       { 0x5a, 'Z', "Depth component (SMPTE ST 268 compatible)" },
+       { 0x75, 'u', "Color Difference Sample (e.g. U, Cb, I etc.) (LSBs)" },
+       { 0x76, 'v', "Color Difference Sample (e.g. V, Cr, Q etc.) (LSBs)" },
+       { 0x77, 'w', "Composite Video (LSBs)" },
+       { 0x78, 'x', "Non co-sited luma component (LSBs)" },
+       { 0x79, 'y', "Luma component (LSBs)" },
+       { 0x7a, 'z', "Depth component (LSBs) (SMPTE ST 268 compatible)" },
+       { 0xd8, 'X', "The DCDM X color component (see SMPTE ST 428-1 X')" },
+       { 0xd9, 'Y', "The DCDM Y color component (see SMPTE ST 428-1 Y')" },
+       { 0xda, 'Z', "The DCDM Z color component (see SMPTE ST 428-1 Z')" },
+       { 0x00, '_', "Terminator" }
+      };
+
+
+      size_t const RGBAValueLength = 16;
+
+      byte_t const RGBAValue_RGB_10[RGBAValueLength] = { 'R', 10, 'G', 10, 'B', 10, 0, 0 };
+      byte_t const RGBAValue_RGB_8[RGBAValueLength]  = { 'R', 8,  'G', 8,  'B', 8,  0, 0 };
+      byte_t const RGBAValue_YUV_10[RGBAValueLength] = { 'Y', 10, 'U', 10, 'V', 10, 0, 0 };
+      byte_t const RGBAValue_YUV_8[RGBAValueLength]  = { 'Y', 8,  'U', 8,  'V', 8,  0, 0 };
+      byte_t const RGBAValue_DCDM[RGBAValueLength] = { 0xd8, 10, 0xd9, 10, 0xda, 10, 0, 0 };
+
+
+      class RGBALayout : public Kumu::IArchive
        {
+         byte_t m_value[RGBAValueLength];
+
        public:
-         Rational() {}
-         ~Rational() {}
+         RGBALayout();
+         RGBALayout(const byte_t* value);
+         ~RGBALayout();
 
-         //
-         const char* ToString(char* str_buf) const {
-           snprintf(str_buf, IdentBufferLen, "%lu/%lu", Numerator, Denominator);
-           return str_buf;
+         RGBALayout(const RGBALayout& rhs) { Set(rhs.m_value); }
+         const RGBALayout& operator=(const RGBALayout& rhs) { Set(rhs.m_value); return *this; }
+         
+         void Set(const byte_t* value) {
+           memcpy(m_value, value, RGBAValueLength);
          }
 
-         Result_t ReadFrom(ASDCP::MemIOReader& Reader) {
-           Result_t result = Reader.ReadUi32BE((ui32_t*)&Numerator);
+         const char* EncodeString(char* buf, ui32_t buf_len) const;
 
-           if ( ASDCP_SUCCESS(result) )
-             result = Reader.ReadUi32BE((ui32_t*)&Denominator);
-           
-           return result;
+         bool HasValue() const { return true; }
+         ui32_t ArchiveLength() const { return RGBAValueLength; }
+
+         bool Archive(Kumu::MemIOWriter* Writer) const {
+           return Writer->WriteRaw(m_value, RGBAValueLength);
          }
 
-         Result_t WriteTo(ASDCP::MemIOWriter& Writer) {
-           Result_t result = Writer.WriteUi32BE((ui32_t)Numerator);
+         bool Unarchive(Kumu::MemIOReader* Reader) {
+           if ( Reader->Remainder() < RGBAValueLength )
+             {
+               return false;
+             }
 
-           if ( ASDCP_SUCCESS(result) )
-             result = Writer.WriteUi32BE((ui32_t)Denominator);
-           
-           return result;
+           memcpy(m_value, Reader->CurrentData(), RGBAValueLength);
+           Reader->SkipOffset(RGBAValueLength);
+           return true;
+         }
+       };
+
+
+      //
+      class Raw : public Kumu::ByteString
+       {
+       public:
+         Raw();
+         Raw(const Raw& rhs) { Copy(rhs); }
+         virtual ~Raw();
+
+         const Raw& operator=(const Raw& rhs) { Copy(rhs); return *this; }
+         void Copy(const Raw& rhs) {
+           if ( KM_SUCCESS(Capacity(rhs.Length())) )
+             {
+               Set(rhs);
+             }
          }
+
+         //
+          virtual bool Unarchive(Kumu::MemIOReader* Reader);
+         virtual bool Archive(Kumu::MemIOWriter* Writer) const;
+         const char* EncodeString(char* str_buf, ui32_t buf_len) const;
        };
 
     } // namespace MXF