more optional stuff
authorjhurst <jhurst@cinecert.com>
Tue, 2 Jul 2013 05:51:18 +0000 (05:51 +0000)
committerjhurst <>
Tue, 2 Jul 2013 05:51:18 +0000 (05:51 +0000)
12 files changed:
src/AS_DCP_JP2K.cpp
src/AS_DCP_MPEG2.cpp
src/AS_DCP_PCM.cpp
src/AS_DCP_internal.h
src/MDD.cpp
src/MDD.h
src/MXF.h
src/MXFTypes.cpp
src/MXFTypes.h
src/Makefile.am
src/Metadata.cpp
src/Metadata.h

index 956a867ea7dbd5d1640c1269f852eeb0b3c00d84..b8400e1c0c3edb3b47962fbce1c547ba62b006d8 100755 (executable)
@@ -290,8 +290,8 @@ ASDCP::MD_to_JP2K_PDesc(const ASDCP::MXF::RGBAEssenceDescriptor&  EssenceDescrip
 
   PDesc.EditRate           = EditRate;
   PDesc.SampleRate         = SampleRate;
-  assert(EssenceDescriptor.ContainerDuration <= 0xFFFFFFFFL);
-  PDesc.ContainerDuration  = (ui32_t) EssenceDescriptor.ContainerDuration;
+  assert(EssenceDescriptor.ContainerDuration.cget() <= 0xFFFFFFFFL);
+  PDesc.ContainerDuration  = static_cast<ui32_t>(EssenceDescriptor.ContainerDuration.cget());
   PDesc.StoredWidth        = EssenceDescriptor.StoredWidth;
   PDesc.StoredHeight       = EssenceDescriptor.StoredHeight;
   PDesc.AspectRatio        = EssenceDescriptor.AspectRatio;
@@ -421,8 +421,8 @@ ASDCP::MD_to_JP2K_PDesc(const ASDCP::MXF::CDCIEssenceDescriptor&  EssenceDescrip
 
   PDesc.EditRate           = EditRate;
   PDesc.SampleRate         = SampleRate;
-  assert(EssenceDescriptor.ContainerDuration <= 0xFFFFFFFFL);
-  PDesc.ContainerDuration  = (ui32_t) EssenceDescriptor.ContainerDuration;
+  assert(EssenceDescriptor.ContainerDuration.cget() <= 0xFFFFFFFFL);
+  PDesc.ContainerDuration  = static_cast<ui32_t>(EssenceDescriptor.ContainerDuration.cget());
   PDesc.StoredWidth        = EssenceDescriptor.StoredWidth;
   PDesc.StoredHeight       = EssenceDescriptor.StoredHeight;
   PDesc.AspectRatio        = EssenceDescriptor.AspectRatio;
index b10c8b53b995b619df6164e1f2b399ebac3e9960..d7cc935cfa951ee125e081a6695aeae55134db2d 100755 (executable)
@@ -62,7 +62,7 @@ MD_to_MPEG2_VDesc(MXF::MPEG2VideoDescriptor* VDescObj, MPEG2::VideoDescriptor& V
   VDesc.ColorSiting            = VDescObj->ColorSiting;
   VDesc.CodedContentType       = VDescObj->CodedContentType;
 
-  VDesc.LowDelay               = VDescObj->LowDelay == 0 ? false : true;
+  VDesc.LowDelay               = VDescObj->LowDelay.get() == 0 ? false : true;
   VDesc.BitRate                = VDescObj->BitRate;
   VDesc.ProfileAndLevel        = VDescObj->ProfileAndLevel;
   return RESULT_OK;
index d683ed07feead910e2c75942b9b8673e3b0bf626..8cff9cf4c465eeedabe3d8b4f3b1885defea977c 100755 (executable)
@@ -54,7 +54,7 @@ ASDCP::PCM_ADesc_to_MD(PCM::AudioDescriptor& ADesc, MXF::WaveAudioDescriptor* AD
   ADescObj->LinkedTrackID = ADesc.LinkedTrackID;
   ADescObj->ContainerDuration = ADesc.ContainerDuration;
 
-  ADescObj->ChannelAssignment.Reset();
+  ADescObj->ChannelAssignment.get().Reset();
 
   switch ( ADesc.ChannelFormat )
     {
@@ -100,7 +100,7 @@ ASDCP::MD_to_PCM_ADesc(MXF::WaveAudioDescriptor* ADescObj, PCM::AudioDescriptor&
 
   ADesc.ChannelFormat = PCM::CF_NONE;
 
-  if ( ADescObj->ChannelAssignment.HasValue() )
+  if ( ! ADescObj->ChannelAssignment.empty() )
     {
       if ( ADescObj->ChannelAssignment == DefaultSMPTEDict().Type(MDD_DCAudioChannelCfg_1_5p1).ul )
        ADesc.ChannelFormat = PCM::CF_CFG_1;
index df342bf113cfdda87f0e681c84829e54777a2b32..8b05dc77d1c92ec159e0acb3f2b30478c05c233c 100755 (executable)
@@ -607,14 +607,14 @@ namespace ASDCP
          TrackSet<TimecodeComponent> MPTCTrack =
            CreateTimecodeTrack<MaterialPackage>(m_HeaderPart, *m_MaterialPackage,
                                                 tc_edit_rate, TCFrameRate, 0, m_Dict);
-         m_DurationUpdateList.push_back(&(MPTCTrack.Sequence->Duration));
-         m_DurationUpdateList.push_back(&(MPTCTrack.Clip->Duration));
+         m_DurationUpdateList.push_back(&(MPTCTrack.Sequence->Duration.get()));
+         m_DurationUpdateList.push_back(&(MPTCTrack.Clip->Duration.get()));
 
          TrackSet<SourceClip> MPTrack =
            CreateTrackAndSequence<MaterialPackage, SourceClip>(m_HeaderPart, *m_MaterialPackage,
                                                                TrackName, clip_edit_rate, DataDefinition,
                                                                2, m_Dict);
-         m_DurationUpdateList.push_back(&(MPTrack.Sequence->Duration));
+         m_DurationUpdateList.push_back(&(MPTrack.Sequence->Duration.get()));
 
          MPTrack.Clip = new SourceClip(m_Dict);
          m_HeaderPart.AddChildObject(MPTrack.Clip);
@@ -622,7 +622,7 @@ namespace ASDCP
          MPTrack.Clip->DataDefinition = DataDefinition;
          MPTrack.Clip->SourcePackageID = SourcePackageUMID;
          MPTrack.Clip->SourceTrackID = 2;
-         m_DurationUpdateList.push_back(&(MPTrack.Clip->Duration));
+         m_DurationUpdateList.push_back(&(MPTrack.Clip->Duration.get()));
 
   
          //
@@ -640,13 +640,13 @@ namespace ASDCP
            CreateTimecodeTrack<SourcePackage>(m_HeaderPart, *m_FilePackage,
                                               tc_edit_rate, TCFrameRate,
                                               ui64_C(3600) * TCFrameRate, m_Dict);
-         m_DurationUpdateList.push_back(&(FPTCTrack.Sequence->Duration));
-         m_DurationUpdateList.push_back(&(FPTCTrack.Clip->Duration));
+         m_DurationUpdateList.push_back(&(FPTCTrack.Sequence->Duration.get()));
+         m_DurationUpdateList.push_back(&(FPTCTrack.Clip->Duration.get()));
          TrackSet<SourceClip> FPTrack =
            CreateTrackAndSequence<SourcePackage, SourceClip>(m_HeaderPart, *m_FilePackage,
                                                              TrackName, clip_edit_rate, DataDefinition,
                                                              2, m_Dict);
-         m_DurationUpdateList.push_back(&(FPTrack.Sequence->Duration));
+         m_DurationUpdateList.push_back(&(FPTrack.Sequence->Duration.get()));
 
          // Consult ST 379:2004 Sec. 6.3, "Element to track relationship" to see where "12" comes from.
          FPTrack.Track->TrackNumber = KM_i32_BE(Kumu::cp2i<ui32_t>((EssenceUL.Value() + 12)));
@@ -659,7 +659,7 @@ namespace ASDCP
          // for now we do not allow setting this value, so all files will be 'original'
          FPTrack.Clip->SourceTrackID = 0;
          FPTrack.Clip->SourcePackageID = NilUMID;
-         m_DurationUpdateList.push_back(&(FPTrack.Clip->Duration));
+         m_DurationUpdateList.push_back(&(FPTrack.Clip->Duration.get()));
 
          m_EssenceDescriptor->LinkedTrackID = FPTrack.Track->TrackID;
        }
@@ -698,14 +698,14 @@ namespace ASDCP
          TrackSet<TimecodeComponent> MPTCTrack =
            CreateTimecodeTrack<MaterialPackage>(m_HeaderPart, *m_MaterialPackage,
                                                 tc_edit_rate, tc_frame_rate, 0, m_Dict);
-         m_DurationUpdateList.push_back(&(MPTCTrack.Sequence->Duration));
-         m_DurationUpdateList.push_back(&(MPTCTrack.Clip->Duration));
+         m_DurationUpdateList.push_back(&(MPTCTrack.Sequence->Duration.get()));
+         m_DurationUpdateList.push_back(&(MPTCTrack.Clip->Duration.get()));
 
          TrackSet<DMSegment> MPTrack =
            CreateTrackAndSequence<MaterialPackage, DMSegment>(m_HeaderPart, *m_MaterialPackage,
                                                               TrackName, clip_edit_rate, DataDefinition,
                                                               2, m_Dict);
-         m_DurationUpdateList.push_back(&(MPTrack.Sequence->Duration));
+         m_DurationUpdateList.push_back(&(MPTrack.Sequence->Duration.get()));
 
          MPTrack.Clip = new DMSegment(m_Dict);
          m_HeaderPart.AddChildObject(MPTrack.Clip);
@@ -731,14 +731,14 @@ namespace ASDCP
            CreateTimecodeTrack<SourcePackage>(m_HeaderPart, *m_FilePackage,
                                               clip_edit_rate, tc_frame_rate,
                                               ui64_C(3600) * tc_frame_rate, m_Dict);
-         m_DurationUpdateList.push_back(&(FPTCTrack.Sequence->Duration));
-         m_DurationUpdateList.push_back(&(FPTCTrack.Clip->Duration));
+         m_DurationUpdateList.push_back(&(FPTCTrack.Sequence->Duration.get()));
+         m_DurationUpdateList.push_back(&(FPTCTrack.Clip->Duration.get()));
 
          TrackSet<DMSegment> FPTrack =
            CreateTrackAndSequence<SourcePackage, DMSegment>(m_HeaderPart, *m_FilePackage,
                                                             TrackName, clip_edit_rate, DataDefinition,
                                                             2, m_Dict);
-         m_DurationUpdateList.push_back(&(FPTrack.Sequence->Duration));
+         m_DurationUpdateList.push_back(&(FPTrack.Sequence->Duration.get()));
 
          FPTrack.Clip = new DMSegment(m_Dict);
          m_HeaderPart.AddChildObject(FPTrack.Clip);
index eba638f28fb13cdfc7000be9aad18143d65b3140..069d07e9f444d186cc04a7157d88bde7953df549 100644 (file)
@@ -559,7 +559,7 @@ static const ASDCP::MDDEntry s_MDD_Table[] = {
       {0x32, 0x0f}, true, "GenericPictureEssenceDescriptor_AlphaTransparency" },
   { { 0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x02, // 174
       0x04, 0x01, 0x02, 0x01, 0x01, 0x01, 0x02, 0x00 },
-      {0x32, 0x10}, true, "GenericPictureEssenceDescriptor_Gamma" },
+      {0x32, 0x10}, true, "GenericPictureEssenceDescriptor_TransferCharacteristic" },
   { { 0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x02, // 175
       0x04, 0x18, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00 },
       {0x32, 0x11}, true, "GenericPictureEssenceDescriptor_ImageAlignmentOffset" },
@@ -661,7 +661,7 @@ static const ASDCP::MDDEntry s_MDD_Table[] = {
       {0x3d, 0x0c}, true, "GenericSoundEssenceDescriptor_DialNorm" },
   { { 0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x02, // 208
       0x04, 0x02, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00 },
-      {0x3d, 0x06}, false, "GenericSoundEssenceDescriptor_SoundEssenceCompression" },
+      {0x3d, 0x06}, false, "GenericSoundEssenceDescriptor_SoundEssenceCoding" },
   { { 0x06, 0x0e, 0x2b, 0x34, 0x02, 0x53, 0x01, 0x01, // 209
       0x0d, 0x01, 0x01, 0x01, 0x01, 0x01, 0x43, 0x00 },
       {0}, false, "GenericDataEssenceDescriptor" },
@@ -1085,6 +1085,20 @@ static const ASDCP::MDDEntry s_MDD_Table[] = {
   { { 0x06, 0x0e, 0x2b, 0x34, 0x04, 0x01, 0x01, 0x0d, // 349
       0x03, 0x02, 0x03, 0x20, 0x03, 0x00, 0x00, 0x00 },
       {0}, false, "IMFAudioGroup_Dcm" },
+
+
+  { { 0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x0c, // 350
+      0x06, 0x01, 0x01, 0x04, 0x02, 0x0f, 0x00, 0x00 },
+      {0}, false, "MaterialPackage_PackageMarker" },
+  { { 0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x02, // 351
+      0x04, 0x01, 0x02, 0x01, 0x01, 0x03, 0x01, 0x00 },
+      {0}, false, "GenericPictureEssenceDescriptor_CodingEquations" },
+  { { 0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x02, // 352
+      0x04, 0x01, 0x02, 0x01, 0x01, 0x06, 0x01, 0x00 },
+      {0}, false, "GenericPictureEssenceDescriptor_ColorPrimaries" },
+
+
+
   { {0}, {0}, false, 0 }
 };
 
index 4dcb228df504d019ea6569b364207d78ba096ae5..81a1411fc4a49f8c98845b15718a61f3759a9fb1 100755 (executable)
--- a/src/MDD.h
+++ b/src/MDD.h
@@ -209,7 +209,7 @@ namespace ASDCP {
         MDD_GenericPictureEssenceDescriptor_ActiveFormatDescriptor,  // 171
         MDD_GenericPictureEssenceDescriptor_VideoLineMap,  // 172
         MDD_GenericPictureEssenceDescriptor_AlphaTransparency,  // 173
-        MDD_GenericPictureEssenceDescriptor_Gamma,  // 174
+        MDD_GenericPictureEssenceDescriptor_TransferCharacteristic,  // 174
         MDD_GenericPictureEssenceDescriptor_ImageAlignmentOffset,  // 175
         MDD_GenericPictureEssenceDescriptor_ImageStartOffset,  // 176
         MDD_GenericPictureEssenceDescriptor_ImageEndOffset,  // 177
@@ -243,7 +243,7 @@ namespace ASDCP {
         MDD_GenericSoundEssenceDescriptor_ChannelCount,  // 205
         MDD_GenericSoundEssenceDescriptor_QuantizationBits,  // 206
         MDD_GenericSoundEssenceDescriptor_DialNorm,  // 207
-        MDD_GenericSoundEssenceDescriptor_SoundEssenceCompression,  // 208
+        MDD_GenericSoundEssenceDescriptor_SoundEssenceCoding,  // 208
         MDD_GenericDataEssenceDescriptor,  // 209
         MDD_GenericDataEssenceDescriptor_DataEssenceCoding,  // 210
         MDD_MultipleDescriptor,  // 211
@@ -385,6 +385,9 @@ namespace ASDCP {
        MDD_IMFAudioGroup_MPg, // 347
        MDD_IMFAudioGroup_DVS, // 348
        MDD_IMFAudioGroup_Dcm, // 349
+       MDD_MaterialPackage_PackageMarker, // 350
+       MDD_GenericPictureEssenceDescriptor_CodingEquations, // 351
+       MDD_GenericPictureEssenceDescriptor_ColorPrimaries, // 352
         MDD_Max
 
     }; // enum MDD_t
index cf28379f7d22f84b26bbf8c5e7b406e3dd7cf2f9..dc06c7fceef1ad6e08734f601c6bb0475a846f82 100755 (executable)
--- a/src/MXF.h
+++ b/src/MXF.h
@@ -229,12 +229,15 @@ namespace ASDCP
        optional_property() : m_has_value(false) {}
        optional_property(const PropertyType& value) : m_property(value), m_has_value(false) {}
          const optional_property<PropertyType>& operator=(const PropertyType& rhs) { this->m_property = rhs; this->m_has_value = true; return *this; }
+         bool operator==(const PropertyType& rhs) const { return this->m_property == rhs; }
+         bool operator==(const optional_property<PropertyType>& rhs) const { return this->m_property == rhs.m_property; }
          operator PropertyType&() { return this->m_property; }
          void set(const PropertyType& rhs) { this->m_property = rhs; this->m_has_value = true; }
          void set_has_value(bool has_value = true) { this->m_has_value = has_value; }
          void reset(const PropertyType& rhs) { this->m_has_value = false; }
          bool empty() const { return ! m_has_value; }
          PropertyType& get() { return m_property; }
+         const PropertyType& cget() const { return m_property; }
        };
 
       // base class of all metadata objects
index 098b7286a0eeae91483788243eb136448867d74f..58c6fb703ab68dbed1bbbbc0b450d1f9ffbcd21c 100755 (executable)
@@ -227,6 +227,20 @@ ASDCP::UMID::EncodeString(char* str_buf, ui32_t buf_len) const
 //------------------------------------------------------------------------------------------
 //
 
+//
+ASDCP::MXF::UTF16String::UTF16String(const char* sz)
+{
+  if ( sz != 0 && *sz != 0 )
+    {
+      this->assign(sz);
+    }
+}
+
+ASDCP::MXF::UTF16String::UTF16String(const std::string& str)
+{
+  this->assign(str);
+}
+
 //
 const ASDCP::MXF::UTF16String&
 ASDCP::MXF::UTF16String::operator=(const char* sz)
@@ -332,6 +346,21 @@ ASDCP::MXF::UTF16String::Archive(Kumu::MemIOWriter* Writer) const
 //------------------------------------------------------------------------------------------
 //
 
+//
+ASDCP::MXF::ISO8String::ISO8String(const char* sz)
+{
+  if ( sz != 0 && *sz != 0 )
+    {
+      this->assign(sz);
+    }
+}
+
+ASDCP::MXF::ISO8String::ISO8String(const std::string& str)
+{
+  this->assign(str);
+}
+
+
 //
 const ASDCP::MXF::ISO8String&
 ASDCP::MXF::ISO8String::operator=(const char* sz)
index f76fbedbf4f5be59e29c54826c1cb7fcc6950bb5..e98a2e9d7946284b312ef35a64ee92261a3a7650 100755 (executable)
@@ -243,6 +243,8 @@ namespace ASDCP
        {
        public:
          ISO8String() {}
+         ISO8String(const char*);
+         ISO8String(const std::string&);
          ~ISO8String() {}
 
          const ISO8String& operator=(const char*);
@@ -260,6 +262,8 @@ namespace ASDCP
        {
        public:
          UTF16String() {}
+         UTF16String(const char*);
+         UTF16String(const std::string&);
          ~UTF16String() {}
 
          const UTF16String& operator=(const char*);
index 98b0edd10411f3a3fdd50185739502f0e869764d..fde8a25201650f98349675fea79649453914b328 100644 (file)
@@ -93,22 +93,27 @@ libkumu_la_LDFLAGS = -release @VERSION@
 nodist_libasdcp_la_SOURCES = Metadata_h.tt2 Metadata_cpp.tt2 \
                mxfgen.pl MXF_def.pl ullist.pl ULList.xml dict.xml DMS_Crypto.xml
 # sources for asdcp library
-libasdcp_la_SOURCES = MPEG2_Parser.cpp MPEG.cpp JP2K_Codestream_Parser.cpp \
+libasdcp_la_SOURCES = \
+       Dict.cpp \
+       MDD.cpp \
+       KLV.cpp \
+       MXFTypes.cpp \
+       MXF.cpp \
+       Metadata.cpp \
+       Index.cpp \
+       MPEG2_Parser.cpp MPEG.cpp JP2K_Codestream_Parser.cpp \
                JP2K_Sequence_Parser.cpp JP2K.cpp PCM_Parser.cpp Wav.cpp \
-               TimedText_Parser.cpp KLV.cpp Dict.cpp MXFTypes.cpp MXF.cpp \
-               Index.cpp Metadata.cpp AS_DCP.cpp AS_DCP_MXF.cpp AS_DCP_AES.cpp \
+               TimedText_Parser.cpp \
+               AS_DCP.cpp AS_DCP_MXF.cpp AS_DCP_AES.cpp \
                h__Reader.cpp h__Writer.cpp AS_DCP_MPEG2.cpp AS_DCP_JP2K.cpp \
                AS_DCP_PCM.cpp AS_DCP_TimedText.cpp PCMParserList.cpp \
-               Wav.h WavFileWriter.h MXF.h Metadata.h \
-               JP2K.h AS_DCP.h AS_DCP_internal.h KLV.h MPEG.h MXFTypes.h MDD.h \
-               PCMParserList.h S12MTimecode.h MDD.cpp \
-               AS_DCP_ATMOS.cpp  AS_DCP_DCData.cpp AS_DCP_DCData_internal.h \
+               AS_DCP_ATMOS.cpp  AS_DCP_DCData.cpp \
                DCData_ByteStream_Parser.cpp DCData_Sequence_Parser.cpp \
-               AtmosSyncChannel_Generator.cpp AtmosSyncChannel_Generator.h \
-               AtmosSyncChannel_Mixer.cpp AtmosSyncChannel_Mixer.h \
-               PCMDataProviders.cpp PCMDataProviders.h \
-               SyncEncoder.c SyncEncoder.h SyncCommon.h CRC16.c CRC16.h \
-               UUIDInformation.c UUIDInformation.h
+               AtmosSyncChannel_Generator.cpp \
+               AtmosSyncChannel_Mixer.cpp \
+               PCMDataProviders.cpp \
+               SyncEncoder.c CRC16.c CRC16.h \
+               UUIDInformation.c
 
 if DEV_HEADERS
 nodist_libasdcp_la_SOURCES += TimedText_Transform.h TimedText_Transform.cpp
index bab000395980f05bd4c942141f2500c12e4a0e36..04d839294b175beffee3b702d90c2a14708860c8 100755 (executable)
@@ -156,7 +156,10 @@ Identification::InitFromTLVSet(TLVReader& TLVSet)
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(Identification, ProductUID));
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(Identification, ModificationDate));
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(Identification, ToolkitVersion));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(Identification, Platform));
+  if ( ASDCP_SUCCESS(result) ) {
+    result = TLVSet.ReadObject(OBJ_READ_ARGS_OPT(Identification, Platform));
+    Platform.set_has_value( result == RESULT_OK );
+  }
   return result;
 }
 
@@ -174,7 +177,7 @@ Identification::WriteToTLVSet(TLVWriter& TLVSet)
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(Identification, ProductUID));
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(Identification, ModificationDate));
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(Identification, ToolkitVersion));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(Identification, Platform));
+  if ( ASDCP_SUCCESS(result)  && ! Platform.empty() ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS_OPT(Identification, Platform));
   return result;
 }
 
@@ -213,7 +216,9 @@ Identification::Dump(FILE* stream)
   fprintf(stream, "  %22s = %s\n",  "ProductUID", ProductUID.EncodeString(identbuf, IdentBufferLen));
   fprintf(stream, "  %22s = %s\n",  "ModificationDate", ModificationDate.EncodeString(identbuf, IdentBufferLen));
   fprintf(stream, "  %22s = %s\n",  "ToolkitVersion", ToolkitVersion.EncodeString(identbuf, IdentBufferLen));
-  fprintf(stream, "  %22s = %s\n",  "Platform", Platform.EncodeString(identbuf, IdentBufferLen));
+  if ( ! Platform.empty() ) {
+    fprintf(stream, "  %22s = %s\n",  "Platform", Platform.get().EncodeString(identbuf, IdentBufferLen));
+  }
 }
 
 //
@@ -316,7 +321,7 @@ ContentStorage::WriteToBuffer(ASDCP::FrameBuffer& Buffer)
 
 //
 
-EssenceContainerData::EssenceContainerData(const Dictionary*& d) : InterchangeObject(d), m_Dict(d), IndexSID(0), BodySID(0)
+EssenceContainerData::EssenceContainerData(const Dictionary*& d) : InterchangeObject(d), m_Dict(d), IndexSID(0)
 {
   assert(m_Dict);
   m_UL = m_Dict->ul(MDD_EssenceContainerData);
@@ -337,7 +342,10 @@ EssenceContainerData::InitFromTLVSet(TLVReader& TLVSet)
   assert(m_Dict);
   Result_t result = InterchangeObject::InitFromTLVSet(TLVSet);
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(EssenceContainerData, LinkedPackageUID));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi32(OBJ_READ_ARGS(EssenceContainerData, IndexSID));
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi32(OBJ_READ_ARGS_OPT(EssenceContainerData, IndexSID));
+    IndexSID.set_has_value( result == RESULT_OK );
+  }
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi32(OBJ_READ_ARGS(EssenceContainerData, BodySID));
   return result;
 }
@@ -349,7 +357,7 @@ EssenceContainerData::WriteToTLVSet(TLVWriter& TLVSet)
   assert(m_Dict);
   Result_t result = InterchangeObject::WriteToTLVSet(TLVSet);
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(EssenceContainerData, LinkedPackageUID));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS(EssenceContainerData, IndexSID));
+  if ( ASDCP_SUCCESS(result)  && ! IndexSID.empty() ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS_OPT(EssenceContainerData, IndexSID));
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS(EssenceContainerData, BodySID));
   return result;
 }
@@ -376,7 +384,9 @@ EssenceContainerData::Dump(FILE* stream)
 
   InterchangeObject::Dump(stream);
   fprintf(stream, "  %22s = %s\n",  "LinkedPackageUID", LinkedPackageUID.EncodeString(identbuf, IdentBufferLen));
-  fprintf(stream, "  %22s = %d\n",  "IndexSID", IndexSID);
+  if ( ! IndexSID.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "IndexSID", IndexSID.get());
+  }
   fprintf(stream, "  %22s = %d\n",  "BodySID", BodySID);
 }
 
@@ -413,7 +423,10 @@ GenericPackage::InitFromTLVSet(TLVReader& TLVSet)
   assert(m_Dict);
   Result_t result = InterchangeObject::InitFromTLVSet(TLVSet);
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(GenericPackage, PackageUID));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(GenericPackage, Name));
+  if ( ASDCP_SUCCESS(result) ) {
+    result = TLVSet.ReadObject(OBJ_READ_ARGS_OPT(GenericPackage, Name));
+    Name.set_has_value( result == RESULT_OK );
+  }
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(GenericPackage, PackageCreationDate));
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(GenericPackage, PackageModifiedDate));
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(GenericPackage, Tracks));
@@ -427,7 +440,7 @@ GenericPackage::WriteToTLVSet(TLVWriter& TLVSet)
   assert(m_Dict);
   Result_t result = InterchangeObject::WriteToTLVSet(TLVSet);
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(GenericPackage, PackageUID));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(GenericPackage, Name));
+  if ( ASDCP_SUCCESS(result)  && ! Name.empty() ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS_OPT(GenericPackage, Name));
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(GenericPackage, PackageCreationDate));
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(GenericPackage, PackageModifiedDate));
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(GenericPackage, Tracks));
@@ -458,7 +471,9 @@ GenericPackage::Dump(FILE* stream)
 
   InterchangeObject::Dump(stream);
   fprintf(stream, "  %22s = %s\n",  "PackageUID", PackageUID.EncodeString(identbuf, IdentBufferLen));
-  fprintf(stream, "  %22s = %s\n",  "Name", Name.EncodeString(identbuf, IdentBufferLen));
+  if ( ! Name.empty() ) {
+    fprintf(stream, "  %22s = %s\n",  "Name", Name.get().EncodeString(identbuf, IdentBufferLen));
+  }
   fprintf(stream, "  %22s = %s\n",  "PackageCreationDate", PackageCreationDate.EncodeString(identbuf, IdentBufferLen));
   fprintf(stream, "  %22s = %s\n",  "PackageModifiedDate", PackageModifiedDate.EncodeString(identbuf, IdentBufferLen));
   fprintf(stream, "  %22s:\n",  "Tracks");
@@ -491,6 +506,10 @@ MaterialPackage::InitFromTLVSet(TLVReader& TLVSet)
 {
   assert(m_Dict);
   Result_t result = GenericPackage::InitFromTLVSet(TLVSet);
+  if ( ASDCP_SUCCESS(result) ) {
+    result = TLVSet.ReadObject(OBJ_READ_ARGS_OPT(MaterialPackage, PackageMarker));
+    PackageMarker.set_has_value( result == RESULT_OK );
+  }
   return result;
 }
 
@@ -500,6 +519,7 @@ MaterialPackage::WriteToTLVSet(TLVWriter& TLVSet)
 {
   assert(m_Dict);
   Result_t result = GenericPackage::WriteToTLVSet(TLVSet);
+  if ( ASDCP_SUCCESS(result)  && ! PackageMarker.empty() ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS_OPT(MaterialPackage, PackageMarker));
   return result;
 }
 
@@ -508,6 +528,7 @@ void
 MaterialPackage::Copy(const MaterialPackage& rhs)
 {
   GenericPackage::Copy(rhs);
+  PackageMarker = rhs.PackageMarker;
 }
 
 //
@@ -521,6 +542,9 @@ MaterialPackage::Dump(FILE* stream)
     stream = stderr;
 
   GenericPackage::Dump(stream);
+  if ( ! PackageMarker.empty() ) {
+    fprintf(stream, "  %22s = %s\n",  "PackageMarker", PackageMarker.get().EncodeString(identbuf, IdentBufferLen));
+  }
 }
 
 //
@@ -632,8 +656,14 @@ GenericTrack::InitFromTLVSet(TLVReader& TLVSet)
   Result_t result = InterchangeObject::InitFromTLVSet(TLVSet);
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi32(OBJ_READ_ARGS(GenericTrack, TrackID));
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi32(OBJ_READ_ARGS(GenericTrack, TrackNumber));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(GenericTrack, TrackName));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(GenericTrack, Sequence));
+  if ( ASDCP_SUCCESS(result) ) {
+    result = TLVSet.ReadObject(OBJ_READ_ARGS_OPT(GenericTrack, TrackName));
+    TrackName.set_has_value( result == RESULT_OK );
+  }
+  if ( ASDCP_SUCCESS(result) ) {
+    result = TLVSet.ReadObject(OBJ_READ_ARGS_OPT(GenericTrack, Sequence));
+    Sequence.set_has_value( result == RESULT_OK );
+  }
   return result;
 }
 
@@ -645,8 +675,8 @@ GenericTrack::WriteToTLVSet(TLVWriter& TLVSet)
   Result_t result = InterchangeObject::WriteToTLVSet(TLVSet);
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS(GenericTrack, TrackID));
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS(GenericTrack, TrackNumber));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(GenericTrack, TrackName));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(GenericTrack, Sequence));
+  if ( ASDCP_SUCCESS(result)  && ! TrackName.empty() ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS_OPT(GenericTrack, TrackName));
+  if ( ASDCP_SUCCESS(result)  && ! Sequence.empty() ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS_OPT(GenericTrack, Sequence));
   return result;
 }
 
@@ -674,8 +704,12 @@ GenericTrack::Dump(FILE* stream)
   InterchangeObject::Dump(stream);
   fprintf(stream, "  %22s = %d\n",  "TrackID", TrackID);
   fprintf(stream, "  %22s = %d\n",  "TrackNumber", TrackNumber);
-  fprintf(stream, "  %22s = %s\n",  "TrackName", TrackName.EncodeString(identbuf, IdentBufferLen));
-  fprintf(stream, "  %22s = %s\n",  "Sequence", Sequence.EncodeString(identbuf, IdentBufferLen));
+  if ( ! TrackName.empty() ) {
+    fprintf(stream, "  %22s = %s\n",  "TrackName", TrackName.get().EncodeString(identbuf, IdentBufferLen));
+  }
+  if ( ! Sequence.empty() ) {
+    fprintf(stream, "  %22s = %s\n",  "Sequence", Sequence.get().EncodeString(identbuf, IdentBufferLen));
+  }
 }
 
 
@@ -848,7 +882,10 @@ StructuralComponent::InitFromTLVSet(TLVReader& TLVSet)
   assert(m_Dict);
   Result_t result = InterchangeObject::InitFromTLVSet(TLVSet);
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(StructuralComponent, DataDefinition));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi64(OBJ_READ_ARGS(StructuralComponent, Duration));
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi64(OBJ_READ_ARGS_OPT(StructuralComponent, Duration));
+    Duration.set_has_value( result == RESULT_OK );
+  }
   return result;
 }
 
@@ -859,7 +896,7 @@ StructuralComponent::WriteToTLVSet(TLVWriter& TLVSet)
   assert(m_Dict);
   Result_t result = InterchangeObject::WriteToTLVSet(TLVSet);
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(StructuralComponent, DataDefinition));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi64(OBJ_WRITE_ARGS(StructuralComponent, Duration));
+  if ( ASDCP_SUCCESS(result)  && ! Duration.empty() ) result = TLVSet.WriteUi64(OBJ_WRITE_ARGS_OPT(StructuralComponent, Duration));
   return result;
 }
 
@@ -884,7 +921,9 @@ StructuralComponent::Dump(FILE* stream)
 
   InterchangeObject::Dump(stream);
   fprintf(stream, "  %22s = %s\n",  "DataDefinition", DataDefinition.EncodeString(identbuf, IdentBufferLen));
-  fprintf(stream, "  %22s = %s\n",  "Duration", i64sz(Duration, identbuf));
+  if ( ! Duration.empty() ) {
+    fprintf(stream, "  %22s = %s\n",  "Duration", i64sz(Duration.get(), identbuf));
+  }
 }
 
 
@@ -1196,7 +1235,7 @@ GenericDescriptor::Dump(FILE* stream)
 
 //
 
-FileDescriptor::FileDescriptor(const Dictionary*& d) : GenericDescriptor(d), m_Dict(d), LinkedTrackID(0), ContainerDuration(0)
+FileDescriptor::FileDescriptor(const Dictionary*& d) : GenericDescriptor(d), m_Dict(d), LinkedTrackID(0)
 {
   assert(m_Dict);
   m_UL = m_Dict->ul(MDD_FileDescriptor);
@@ -1216,11 +1255,20 @@ FileDescriptor::InitFromTLVSet(TLVReader& TLVSet)
 {
   assert(m_Dict);
   Result_t result = GenericDescriptor::InitFromTLVSet(TLVSet);
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi32(OBJ_READ_ARGS(FileDescriptor, LinkedTrackID));
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi32(OBJ_READ_ARGS_OPT(FileDescriptor, LinkedTrackID));
+    LinkedTrackID.set_has_value( result == RESULT_OK );
+  }
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(FileDescriptor, SampleRate));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi64(OBJ_READ_ARGS(FileDescriptor, ContainerDuration));
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi64(OBJ_READ_ARGS_OPT(FileDescriptor, ContainerDuration));
+    ContainerDuration.set_has_value( result == RESULT_OK );
+  }
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(FileDescriptor, EssenceContainer));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(FileDescriptor, Codec));
+  if ( ASDCP_SUCCESS(result) ) {
+    result = TLVSet.ReadObject(OBJ_READ_ARGS_OPT(FileDescriptor, Codec));
+    Codec.set_has_value( result == RESULT_OK );
+  }
   return result;
 }
 
@@ -1230,11 +1278,11 @@ FileDescriptor::WriteToTLVSet(TLVWriter& TLVSet)
 {
   assert(m_Dict);
   Result_t result = GenericDescriptor::WriteToTLVSet(TLVSet);
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS(FileDescriptor, LinkedTrackID));
+  if ( ASDCP_SUCCESS(result)  && ! LinkedTrackID.empty() ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS_OPT(FileDescriptor, LinkedTrackID));
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(FileDescriptor, SampleRate));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi64(OBJ_WRITE_ARGS(FileDescriptor, ContainerDuration));
+  if ( ASDCP_SUCCESS(result)  && ! ContainerDuration.empty() ) result = TLVSet.WriteUi64(OBJ_WRITE_ARGS_OPT(FileDescriptor, ContainerDuration));
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(FileDescriptor, EssenceContainer));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(FileDescriptor, Codec));
+  if ( ASDCP_SUCCESS(result)  && ! Codec.empty() ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS_OPT(FileDescriptor, Codec));
   return result;
 }
 
@@ -1261,11 +1309,17 @@ FileDescriptor::Dump(FILE* stream)
     stream = stderr;
 
   GenericDescriptor::Dump(stream);
-  fprintf(stream, "  %22s = %d\n",  "LinkedTrackID", LinkedTrackID);
+  if ( ! LinkedTrackID.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "LinkedTrackID", LinkedTrackID.get());
+  }
   fprintf(stream, "  %22s = %s\n",  "SampleRate", SampleRate.EncodeString(identbuf, IdentBufferLen));
-  fprintf(stream, "  %22s = %s\n",  "ContainerDuration", i64sz(ContainerDuration, identbuf));
+  if ( ! ContainerDuration.empty() ) {
+    fprintf(stream, "  %22s = %s\n",  "ContainerDuration", i64sz(ContainerDuration.get(), identbuf));
+  }
   fprintf(stream, "  %22s = %s\n",  "EssenceContainer", EssenceContainer.EncodeString(identbuf, IdentBufferLen));
-  fprintf(stream, "  %22s = %s\n",  "Codec", Codec.EncodeString(identbuf, IdentBufferLen));
+  if ( ! Codec.empty() ) {
+    fprintf(stream, "  %22s = %s\n",  "Codec", Codec.get().EncodeString(identbuf, IdentBufferLen));
+  }
 }
 
 //
@@ -1309,10 +1363,21 @@ GenericSoundEssenceDescriptor::InitFromTLVSet(TLVReader& TLVSet)
   Result_t result = FileDescriptor::InitFromTLVSet(TLVSet);
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(GenericSoundEssenceDescriptor, AudioSamplingRate));
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi8(OBJ_READ_ARGS(GenericSoundEssenceDescriptor, Locked));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi8(OBJ_READ_ARGS(GenericSoundEssenceDescriptor, AudioRefLevel));
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi8(OBJ_READ_ARGS_OPT(GenericSoundEssenceDescriptor, AudioRefLevel));
+    AudioRefLevel.set_has_value( result == RESULT_OK );
+  }
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi8(OBJ_READ_ARGS_OPT(GenericSoundEssenceDescriptor, ElectroSpatialFormulation));
+    ElectroSpatialFormulation.set_has_value( result == RESULT_OK );
+  }
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi32(OBJ_READ_ARGS(GenericSoundEssenceDescriptor, ChannelCount));
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi32(OBJ_READ_ARGS(GenericSoundEssenceDescriptor, QuantizationBits));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi8(OBJ_READ_ARGS(GenericSoundEssenceDescriptor, DialNorm));
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi8(OBJ_READ_ARGS_OPT(GenericSoundEssenceDescriptor, DialNorm));
+    DialNorm.set_has_value( result == RESULT_OK );
+  }
+  if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(GenericSoundEssenceDescriptor, SoundEssenceCoding));
   return result;
 }
 
@@ -1324,10 +1389,12 @@ GenericSoundEssenceDescriptor::WriteToTLVSet(TLVWriter& TLVSet)
   Result_t result = FileDescriptor::WriteToTLVSet(TLVSet);
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(GenericSoundEssenceDescriptor, AudioSamplingRate));
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi8(OBJ_WRITE_ARGS(GenericSoundEssenceDescriptor, Locked));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi8(OBJ_WRITE_ARGS(GenericSoundEssenceDescriptor, AudioRefLevel));
+  if ( ASDCP_SUCCESS(result)  && ! AudioRefLevel.empty() ) result = TLVSet.WriteUi8(OBJ_WRITE_ARGS_OPT(GenericSoundEssenceDescriptor, AudioRefLevel));
+  if ( ASDCP_SUCCESS(result)  && ! ElectroSpatialFormulation.empty() ) result = TLVSet.WriteUi8(OBJ_WRITE_ARGS_OPT(GenericSoundEssenceDescriptor, ElectroSpatialFormulation));
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS(GenericSoundEssenceDescriptor, ChannelCount));
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS(GenericSoundEssenceDescriptor, QuantizationBits));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi8(OBJ_WRITE_ARGS(GenericSoundEssenceDescriptor, DialNorm));
+  if ( ASDCP_SUCCESS(result)  && ! DialNorm.empty() ) result = TLVSet.WriteUi8(OBJ_WRITE_ARGS_OPT(GenericSoundEssenceDescriptor, DialNorm));
+  if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(GenericSoundEssenceDescriptor, SoundEssenceCoding));
   return result;
 }
 
@@ -1339,9 +1406,11 @@ GenericSoundEssenceDescriptor::Copy(const GenericSoundEssenceDescriptor& rhs)
   AudioSamplingRate = rhs.AudioSamplingRate;
   Locked = rhs.Locked;
   AudioRefLevel = rhs.AudioRefLevel;
+  ElectroSpatialFormulation = rhs.ElectroSpatialFormulation;
   ChannelCount = rhs.ChannelCount;
   QuantizationBits = rhs.QuantizationBits;
   DialNorm = rhs.DialNorm;
+  SoundEssenceCoding = rhs.SoundEssenceCoding;
 }
 
 //
@@ -1357,10 +1426,18 @@ GenericSoundEssenceDescriptor::Dump(FILE* stream)
   FileDescriptor::Dump(stream);
   fprintf(stream, "  %22s = %s\n",  "AudioSamplingRate", AudioSamplingRate.EncodeString(identbuf, IdentBufferLen));
   fprintf(stream, "  %22s = %d\n",  "Locked", Locked);
-  fprintf(stream, "  %22s = %d\n",  "AudioRefLevel", AudioRefLevel);
+  if ( ! AudioRefLevel.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "AudioRefLevel", AudioRefLevel.get());
+  }
+  if ( ! ElectroSpatialFormulation.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "ElectroSpatialFormulation", ElectroSpatialFormulation.get());
+  }
   fprintf(stream, "  %22s = %d\n",  "ChannelCount", ChannelCount);
   fprintf(stream, "  %22s = %d\n",  "QuantizationBits", QuantizationBits);
-  fprintf(stream, "  %22s = %d\n",  "DialNorm", DialNorm);
+  if ( ! DialNorm.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "DialNorm", DialNorm.get());
+  }
+  fprintf(stream, "  %22s = %s\n",  "SoundEssenceCoding", SoundEssenceCoding.EncodeString(identbuf, IdentBufferLen));
 }
 
 //
@@ -1382,7 +1459,7 @@ GenericSoundEssenceDescriptor::WriteToBuffer(ASDCP::FrameBuffer& Buffer)
 
 //
 
-WaveAudioDescriptor::WaveAudioDescriptor(const Dictionary*& d) : GenericSoundEssenceDescriptor(d), m_Dict(d), BlockAlign(0), SequenceOffset(0), AvgBps(0)
+WaveAudioDescriptor::WaveAudioDescriptor(const Dictionary*& d) : GenericSoundEssenceDescriptor(d), m_Dict(d), BlockAlign(0), SequenceOffset(0)
 {
   assert(m_Dict);
   m_UL = m_Dict->ul(MDD_WaveAudioDescriptor);
@@ -1403,9 +1480,15 @@ WaveAudioDescriptor::InitFromTLVSet(TLVReader& TLVSet)
   assert(m_Dict);
   Result_t result = GenericSoundEssenceDescriptor::InitFromTLVSet(TLVSet);
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi16(OBJ_READ_ARGS(WaveAudioDescriptor, BlockAlign));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi8(OBJ_READ_ARGS(WaveAudioDescriptor, SequenceOffset));
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi8(OBJ_READ_ARGS_OPT(WaveAudioDescriptor, SequenceOffset));
+    SequenceOffset.set_has_value( result == RESULT_OK );
+  }
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi32(OBJ_READ_ARGS(WaveAudioDescriptor, AvgBps));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(WaveAudioDescriptor, ChannelAssignment));
+  if ( ASDCP_SUCCESS(result) ) {
+    result = TLVSet.ReadObject(OBJ_READ_ARGS_OPT(WaveAudioDescriptor, ChannelAssignment));
+    ChannelAssignment.set_has_value( result == RESULT_OK );
+  }
   return result;
 }
 
@@ -1416,9 +1499,9 @@ WaveAudioDescriptor::WriteToTLVSet(TLVWriter& TLVSet)
   assert(m_Dict);
   Result_t result = GenericSoundEssenceDescriptor::WriteToTLVSet(TLVSet);
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi16(OBJ_WRITE_ARGS(WaveAudioDescriptor, BlockAlign));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi8(OBJ_WRITE_ARGS(WaveAudioDescriptor, SequenceOffset));
+  if ( ASDCP_SUCCESS(result)  && ! SequenceOffset.empty() ) result = TLVSet.WriteUi8(OBJ_WRITE_ARGS_OPT(WaveAudioDescriptor, SequenceOffset));
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS(WaveAudioDescriptor, AvgBps));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(WaveAudioDescriptor, ChannelAssignment));
+  if ( ASDCP_SUCCESS(result)  && ! ChannelAssignment.empty() ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS_OPT(WaveAudioDescriptor, ChannelAssignment));
   return result;
 }
 
@@ -1445,9 +1528,13 @@ WaveAudioDescriptor::Dump(FILE* stream)
 
   GenericSoundEssenceDescriptor::Dump(stream);
   fprintf(stream, "  %22s = %d\n",  "BlockAlign", BlockAlign);
-  fprintf(stream, "  %22s = %d\n",  "SequenceOffset", SequenceOffset);
+  if ( ! SequenceOffset.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "SequenceOffset", SequenceOffset.get());
+  }
   fprintf(stream, "  %22s = %d\n",  "AvgBps", AvgBps);
-  fprintf(stream, "  %22s = %s\n",  "ChannelAssignment", ChannelAssignment.EncodeString(identbuf, IdentBufferLen));
+  if ( ! ChannelAssignment.empty() ) {
+    fprintf(stream, "  %22s = %s\n",  "ChannelAssignment", ChannelAssignment.get().EncodeString(identbuf, IdentBufferLen));
+  }
 }
 
 //
@@ -1469,7 +1556,7 @@ WaveAudioDescriptor::WriteToBuffer(ASDCP::FrameBuffer& Buffer)
 
 //
 
-GenericPictureEssenceDescriptor::GenericPictureEssenceDescriptor(const Dictionary*& d) : FileDescriptor(d), m_Dict(d), FrameLayout(0), StoredWidth(0), StoredHeight(0), DisplayWidth(0)
+GenericPictureEssenceDescriptor::GenericPictureEssenceDescriptor(const Dictionary*& d) : FileDescriptor(d), m_Dict(d), SignalStandard(0), SampledWidth(0), SampledXOffset(0), DisplayHeight(0), DisplayXOffset(0), DisplayF2Offset(0), AlphaTransparency(0), ImageAlignmentOffset(0), ImageEndOffset(0)
 {
   assert(m_Dict);
   m_UL = m_Dict->ul(MDD_GenericPictureEssenceDescriptor);
@@ -1489,27 +1576,91 @@ GenericPictureEssenceDescriptor::InitFromTLVSet(TLVReader& TLVSet)
 {
   assert(m_Dict);
   Result_t result = FileDescriptor::InitFromTLVSet(TLVSet);
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi8(OBJ_READ_ARGS_OPT(GenericPictureEssenceDescriptor, SignalStandard));
+    SignalStandard.set_has_value( result == RESULT_OK );
+  }
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi8(OBJ_READ_ARGS(GenericPictureEssenceDescriptor, FrameLayout));
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi32(OBJ_READ_ARGS(GenericPictureEssenceDescriptor, StoredWidth));
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi32(OBJ_READ_ARGS(GenericPictureEssenceDescriptor, StoredHeight));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(GenericPictureEssenceDescriptor, AspectRatio));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(GenericPictureEssenceDescriptor, PictureEssenceCoding));
   if ( ASDCP_SUCCESS(result) ) { 
-    result = TLVSet.ReadUi32(OBJ_READ_ARGS_OPT(GenericPictureEssenceDescriptor, DisplayWidth));
-    DisplayWidth.set_has_value( result == RESULT_OK );
+    result = TLVSet.ReadUi32(OBJ_READ_ARGS_OPT(GenericPictureEssenceDescriptor, StoredF2Offset));
+    StoredF2Offset.set_has_value( result == RESULT_OK );
+  }
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi32(OBJ_READ_ARGS_OPT(GenericPictureEssenceDescriptor, SampledWidth));
+    SampledWidth.set_has_value( result == RESULT_OK );
+  }
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi32(OBJ_READ_ARGS_OPT(GenericPictureEssenceDescriptor, SampledHeight));
+    SampledHeight.set_has_value( result == RESULT_OK );
+  }
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi32(OBJ_READ_ARGS_OPT(GenericPictureEssenceDescriptor, SampledXOffset));
+    SampledXOffset.set_has_value( result == RESULT_OK );
+  }
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi32(OBJ_READ_ARGS_OPT(GenericPictureEssenceDescriptor, SampledYOffset));
+    SampledYOffset.set_has_value( result == RESULT_OK );
   }
   if ( ASDCP_SUCCESS(result) ) { 
     result = TLVSet.ReadUi32(OBJ_READ_ARGS_OPT(GenericPictureEssenceDescriptor, DisplayHeight));
     DisplayHeight.set_has_value( result == RESULT_OK );
   }
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi32(OBJ_READ_ARGS_OPT(GenericPictureEssenceDescriptor, DisplayWidth));
+    DisplayWidth.set_has_value( result == RESULT_OK );
+  }
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi32(OBJ_READ_ARGS_OPT(GenericPictureEssenceDescriptor, DisplayXOffset));
+    DisplayXOffset.set_has_value( result == RESULT_OK );
+  }
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi32(OBJ_READ_ARGS_OPT(GenericPictureEssenceDescriptor, DisplayYOffset));
+    DisplayYOffset.set_has_value( result == RESULT_OK );
+  }
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi32(OBJ_READ_ARGS_OPT(GenericPictureEssenceDescriptor, DisplayF2Offset));
+    DisplayF2Offset.set_has_value( result == RESULT_OK );
+  }
+  if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(GenericPictureEssenceDescriptor, AspectRatio));
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi8(OBJ_READ_ARGS_OPT(GenericPictureEssenceDescriptor, ActiveFormatDescriptor));
+    ActiveFormatDescriptor.set_has_value( result == RESULT_OK );
+  }
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi8(OBJ_READ_ARGS_OPT(GenericPictureEssenceDescriptor, AlphaTransparency));
+    AlphaTransparency.set_has_value( result == RESULT_OK );
+  }
   if ( ASDCP_SUCCESS(result) ) {
-    result = TLVSet.ReadObject(OBJ_READ_ARGS_OPT(GenericPictureEssenceDescriptor, Gamma));
-    Gamma.set_has_value( result == RESULT_OK );
+    result = TLVSet.ReadObject(OBJ_READ_ARGS_OPT(GenericPictureEssenceDescriptor, TransferCharacteristic));
+    TransferCharacteristic.set_has_value( result == RESULT_OK );
+  }
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi32(OBJ_READ_ARGS_OPT(GenericPictureEssenceDescriptor, ImageAlignmentOffset));
+    ImageAlignmentOffset.set_has_value( result == RESULT_OK );
+  }
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi32(OBJ_READ_ARGS_OPT(GenericPictureEssenceDescriptor, ImageStartOffset));
+    ImageStartOffset.set_has_value( result == RESULT_OK );
+  }
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi32(OBJ_READ_ARGS_OPT(GenericPictureEssenceDescriptor, ImageEndOffset));
+    ImageEndOffset.set_has_value( result == RESULT_OK );
   }
   if ( ASDCP_SUCCESS(result) ) { 
     result = TLVSet.ReadUi8(OBJ_READ_ARGS_OPT(GenericPictureEssenceDescriptor, FieldDominance));
     FieldDominance.set_has_value( result == RESULT_OK );
   }
+  if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(GenericPictureEssenceDescriptor, PictureEssenceCoding));
+  if ( ASDCP_SUCCESS(result) ) {
+    result = TLVSet.ReadObject(OBJ_READ_ARGS_OPT(GenericPictureEssenceDescriptor, CodingEquations));
+    CodingEquations.set_has_value( result == RESULT_OK );
+  }
+  if ( ASDCP_SUCCESS(result) ) {
+    result = TLVSet.ReadObject(OBJ_READ_ARGS_OPT(GenericPictureEssenceDescriptor, ColorPrimaries));
+    ColorPrimaries.set_has_value( result == RESULT_OK );
+  }
   return result;
 }
 
@@ -1519,15 +1670,31 @@ GenericPictureEssenceDescriptor::WriteToTLVSet(TLVWriter& TLVSet)
 {
   assert(m_Dict);
   Result_t result = FileDescriptor::WriteToTLVSet(TLVSet);
+  if ( ASDCP_SUCCESS(result)  && ! SignalStandard.empty() ) result = TLVSet.WriteUi8(OBJ_WRITE_ARGS_OPT(GenericPictureEssenceDescriptor, SignalStandard));
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi8(OBJ_WRITE_ARGS(GenericPictureEssenceDescriptor, FrameLayout));
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS(GenericPictureEssenceDescriptor, StoredWidth));
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS(GenericPictureEssenceDescriptor, StoredHeight));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(GenericPictureEssenceDescriptor, AspectRatio));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(GenericPictureEssenceDescriptor, PictureEssenceCoding));
-  if ( ASDCP_SUCCESS(result)  && ! DisplayWidth.empty() ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS_OPT(GenericPictureEssenceDescriptor, DisplayWidth));
+  if ( ASDCP_SUCCESS(result)  && ! StoredF2Offset.empty() ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS_OPT(GenericPictureEssenceDescriptor, StoredF2Offset));
+  if ( ASDCP_SUCCESS(result)  && ! SampledWidth.empty() ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS_OPT(GenericPictureEssenceDescriptor, SampledWidth));
+  if ( ASDCP_SUCCESS(result)  && ! SampledHeight.empty() ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS_OPT(GenericPictureEssenceDescriptor, SampledHeight));
+  if ( ASDCP_SUCCESS(result)  && ! SampledXOffset.empty() ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS_OPT(GenericPictureEssenceDescriptor, SampledXOffset));
+  if ( ASDCP_SUCCESS(result)  && ! SampledYOffset.empty() ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS_OPT(GenericPictureEssenceDescriptor, SampledYOffset));
   if ( ASDCP_SUCCESS(result)  && ! DisplayHeight.empty() ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS_OPT(GenericPictureEssenceDescriptor, DisplayHeight));
-  if ( ASDCP_SUCCESS(result)  && ! Gamma.empty() ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS_OPT(GenericPictureEssenceDescriptor, Gamma));
+  if ( ASDCP_SUCCESS(result)  && ! DisplayWidth.empty() ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS_OPT(GenericPictureEssenceDescriptor, DisplayWidth));
+  if ( ASDCP_SUCCESS(result)  && ! DisplayXOffset.empty() ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS_OPT(GenericPictureEssenceDescriptor, DisplayXOffset));
+  if ( ASDCP_SUCCESS(result)  && ! DisplayYOffset.empty() ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS_OPT(GenericPictureEssenceDescriptor, DisplayYOffset));
+  if ( ASDCP_SUCCESS(result)  && ! DisplayF2Offset.empty() ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS_OPT(GenericPictureEssenceDescriptor, DisplayF2Offset));
+  if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(GenericPictureEssenceDescriptor, AspectRatio));
+  if ( ASDCP_SUCCESS(result)  && ! ActiveFormatDescriptor.empty() ) result = TLVSet.WriteUi8(OBJ_WRITE_ARGS_OPT(GenericPictureEssenceDescriptor, ActiveFormatDescriptor));
+  if ( ASDCP_SUCCESS(result)  && ! AlphaTransparency.empty() ) result = TLVSet.WriteUi8(OBJ_WRITE_ARGS_OPT(GenericPictureEssenceDescriptor, AlphaTransparency));
+  if ( ASDCP_SUCCESS(result)  && ! TransferCharacteristic.empty() ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS_OPT(GenericPictureEssenceDescriptor, TransferCharacteristic));
+  if ( ASDCP_SUCCESS(result)  && ! ImageAlignmentOffset.empty() ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS_OPT(GenericPictureEssenceDescriptor, ImageAlignmentOffset));
+  if ( ASDCP_SUCCESS(result)  && ! ImageStartOffset.empty() ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS_OPT(GenericPictureEssenceDescriptor, ImageStartOffset));
+  if ( ASDCP_SUCCESS(result)  && ! ImageEndOffset.empty() ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS_OPT(GenericPictureEssenceDescriptor, ImageEndOffset));
   if ( ASDCP_SUCCESS(result)  && ! FieldDominance.empty() ) result = TLVSet.WriteUi8(OBJ_WRITE_ARGS_OPT(GenericPictureEssenceDescriptor, FieldDominance));
+  if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(GenericPictureEssenceDescriptor, PictureEssenceCoding));
+  if ( ASDCP_SUCCESS(result)  && ! CodingEquations.empty() ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS_OPT(GenericPictureEssenceDescriptor, CodingEquations));
+  if ( ASDCP_SUCCESS(result)  && ! ColorPrimaries.empty() ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS_OPT(GenericPictureEssenceDescriptor, ColorPrimaries));
   return result;
 }
 
@@ -1536,15 +1703,31 @@ void
 GenericPictureEssenceDescriptor::Copy(const GenericPictureEssenceDescriptor& rhs)
 {
   FileDescriptor::Copy(rhs);
+  SignalStandard = rhs.SignalStandard;
   FrameLayout = rhs.FrameLayout;
   StoredWidth = rhs.StoredWidth;
   StoredHeight = rhs.StoredHeight;
-  AspectRatio = rhs.AspectRatio;
-  PictureEssenceCoding = rhs.PictureEssenceCoding;
-  DisplayWidth = rhs.DisplayWidth;
+  StoredF2Offset = rhs.StoredF2Offset;
+  SampledWidth = rhs.SampledWidth;
+  SampledHeight = rhs.SampledHeight;
+  SampledXOffset = rhs.SampledXOffset;
+  SampledYOffset = rhs.SampledYOffset;
   DisplayHeight = rhs.DisplayHeight;
-  Gamma = rhs.Gamma;
+  DisplayWidth = rhs.DisplayWidth;
+  DisplayXOffset = rhs.DisplayXOffset;
+  DisplayYOffset = rhs.DisplayYOffset;
+  DisplayF2Offset = rhs.DisplayF2Offset;
+  AspectRatio = rhs.AspectRatio;
+  ActiveFormatDescriptor = rhs.ActiveFormatDescriptor;
+  AlphaTransparency = rhs.AlphaTransparency;
+  TransferCharacteristic = rhs.TransferCharacteristic;
+  ImageAlignmentOffset = rhs.ImageAlignmentOffset;
+  ImageStartOffset = rhs.ImageStartOffset;
+  ImageEndOffset = rhs.ImageEndOffset;
   FieldDominance = rhs.FieldDominance;
+  PictureEssenceCoding = rhs.PictureEssenceCoding;
+  CodingEquations = rhs.CodingEquations;
+  ColorPrimaries = rhs.ColorPrimaries;
 }
 
 //
@@ -1558,23 +1741,71 @@ GenericPictureEssenceDescriptor::Dump(FILE* stream)
     stream = stderr;
 
   FileDescriptor::Dump(stream);
+  if ( ! SignalStandard.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "SignalStandard", SignalStandard.get());
+  }
   fprintf(stream, "  %22s = %d\n",  "FrameLayout", FrameLayout);
   fprintf(stream, "  %22s = %d\n",  "StoredWidth", StoredWidth);
   fprintf(stream, "  %22s = %d\n",  "StoredHeight", StoredHeight);
-  fprintf(stream, "  %22s = %s\n",  "AspectRatio", AspectRatio.EncodeString(identbuf, IdentBufferLen));
-  fprintf(stream, "  %22s = %s\n",  "PictureEssenceCoding", PictureEssenceCoding.EncodeString(identbuf, IdentBufferLen));
-  if ( ! DisplayWidth.empty() ) {
-    fprintf(stream, "  %22s = %d\n",  "DisplayWidth", DisplayWidth.get());
+  if ( ! StoredF2Offset.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "StoredF2Offset", StoredF2Offset.get());
+  }
+  if ( ! SampledWidth.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "SampledWidth", SampledWidth.get());
+  }
+  if ( ! SampledHeight.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "SampledHeight", SampledHeight.get());
+  }
+  if ( ! SampledXOffset.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "SampledXOffset", SampledXOffset.get());
+  }
+  if ( ! SampledYOffset.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "SampledYOffset", SampledYOffset.get());
   }
   if ( ! DisplayHeight.empty() ) {
     fprintf(stream, "  %22s = %d\n",  "DisplayHeight", DisplayHeight.get());
   }
-  if ( ! Gamma.empty() ) {
-    fprintf(stream, "  %22s = %s\n",  "Gamma", Gamma.get().EncodeString(identbuf, IdentBufferLen));
+  if ( ! DisplayWidth.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "DisplayWidth", DisplayWidth.get());
+  }
+  if ( ! DisplayXOffset.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "DisplayXOffset", DisplayXOffset.get());
+  }
+  if ( ! DisplayYOffset.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "DisplayYOffset", DisplayYOffset.get());
+  }
+  if ( ! DisplayF2Offset.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "DisplayF2Offset", DisplayF2Offset.get());
+  }
+  fprintf(stream, "  %22s = %s\n",  "AspectRatio", AspectRatio.EncodeString(identbuf, IdentBufferLen));
+  if ( ! ActiveFormatDescriptor.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "ActiveFormatDescriptor", ActiveFormatDescriptor.get());
+  }
+  if ( ! AlphaTransparency.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "AlphaTransparency", AlphaTransparency.get());
+  }
+  if ( ! TransferCharacteristic.empty() ) {
+    fprintf(stream, "  %22s = %s\n",  "TransferCharacteristic", TransferCharacteristic.get().EncodeString(identbuf, IdentBufferLen));
+  }
+  if ( ! ImageAlignmentOffset.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "ImageAlignmentOffset", ImageAlignmentOffset.get());
+  }
+  if ( ! ImageStartOffset.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "ImageStartOffset", ImageStartOffset.get());
+  }
+  if ( ! ImageEndOffset.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "ImageEndOffset", ImageEndOffset.get());
   }
   if ( ! FieldDominance.empty() ) {
     fprintf(stream, "  %22s = %d\n",  "FieldDominance", FieldDominance.get());
   }
+  fprintf(stream, "  %22s = %s\n",  "PictureEssenceCoding", PictureEssenceCoding.EncodeString(identbuf, IdentBufferLen));
+  if ( ! CodingEquations.empty() ) {
+    fprintf(stream, "  %22s = %s\n",  "CodingEquations", CodingEquations.get().EncodeString(identbuf, IdentBufferLen));
+  }
+  if ( ! ColorPrimaries.empty() ) {
+    fprintf(stream, "  %22s = %s\n",  "ColorPrimaries", ColorPrimaries.get().EncodeString(identbuf, IdentBufferLen));
+  }
 }
 
 //
@@ -1596,7 +1827,7 @@ GenericPictureEssenceDescriptor::WriteToBuffer(ASDCP::FrameBuffer& Buffer)
 
 //
 
-RGBAEssenceDescriptor::RGBAEssenceDescriptor(const Dictionary*& d) : GenericPictureEssenceDescriptor(d), m_Dict(d), ComponentMaxRef(0), ComponentMinRef(0)
+RGBAEssenceDescriptor::RGBAEssenceDescriptor(const Dictionary*& d) : GenericPictureEssenceDescriptor(d), m_Dict(d), ComponentMaxRef(0), AlphaMinRef(0), ScanningDirection(0)
 {
   assert(m_Dict);
   m_UL = m_Dict->ul(MDD_RGBAEssenceDescriptor);
@@ -1616,8 +1847,26 @@ RGBAEssenceDescriptor::InitFromTLVSet(TLVReader& TLVSet)
 {
   assert(m_Dict);
   Result_t result = GenericPictureEssenceDescriptor::InitFromTLVSet(TLVSet);
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi32(OBJ_READ_ARGS(RGBAEssenceDescriptor, ComponentMaxRef));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi32(OBJ_READ_ARGS(RGBAEssenceDescriptor, ComponentMinRef));
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi32(OBJ_READ_ARGS_OPT(RGBAEssenceDescriptor, ComponentMaxRef));
+    ComponentMaxRef.set_has_value( result == RESULT_OK );
+  }
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi32(OBJ_READ_ARGS_OPT(RGBAEssenceDescriptor, ComponentMinRef));
+    ComponentMinRef.set_has_value( result == RESULT_OK );
+  }
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi32(OBJ_READ_ARGS_OPT(RGBAEssenceDescriptor, AlphaMinRef));
+    AlphaMinRef.set_has_value( result == RESULT_OK );
+  }
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi32(OBJ_READ_ARGS_OPT(RGBAEssenceDescriptor, AlphaMaxRef));
+    AlphaMaxRef.set_has_value( result == RESULT_OK );
+  }
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi8(OBJ_READ_ARGS_OPT(RGBAEssenceDescriptor, ScanningDirection));
+    ScanningDirection.set_has_value( result == RESULT_OK );
+  }
   return result;
 }
 
@@ -1627,8 +1876,11 @@ RGBAEssenceDescriptor::WriteToTLVSet(TLVWriter& TLVSet)
 {
   assert(m_Dict);
   Result_t result = GenericPictureEssenceDescriptor::WriteToTLVSet(TLVSet);
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS(RGBAEssenceDescriptor, ComponentMaxRef));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS(RGBAEssenceDescriptor, ComponentMinRef));
+  if ( ASDCP_SUCCESS(result)  && ! ComponentMaxRef.empty() ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS_OPT(RGBAEssenceDescriptor, ComponentMaxRef));
+  if ( ASDCP_SUCCESS(result)  && ! ComponentMinRef.empty() ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS_OPT(RGBAEssenceDescriptor, ComponentMinRef));
+  if ( ASDCP_SUCCESS(result)  && ! AlphaMinRef.empty() ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS_OPT(RGBAEssenceDescriptor, AlphaMinRef));
+  if ( ASDCP_SUCCESS(result)  && ! AlphaMaxRef.empty() ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS_OPT(RGBAEssenceDescriptor, AlphaMaxRef));
+  if ( ASDCP_SUCCESS(result)  && ! ScanningDirection.empty() ) result = TLVSet.WriteUi8(OBJ_WRITE_ARGS_OPT(RGBAEssenceDescriptor, ScanningDirection));
   return result;
 }
 
@@ -1639,6 +1891,9 @@ RGBAEssenceDescriptor::Copy(const RGBAEssenceDescriptor& rhs)
   GenericPictureEssenceDescriptor::Copy(rhs);
   ComponentMaxRef = rhs.ComponentMaxRef;
   ComponentMinRef = rhs.ComponentMinRef;
+  AlphaMinRef = rhs.AlphaMinRef;
+  AlphaMaxRef = rhs.AlphaMaxRef;
+  ScanningDirection = rhs.ScanningDirection;
 }
 
 //
@@ -1652,8 +1907,21 @@ RGBAEssenceDescriptor::Dump(FILE* stream)
     stream = stderr;
 
   GenericPictureEssenceDescriptor::Dump(stream);
-  fprintf(stream, "  %22s = %d\n",  "ComponentMaxRef", ComponentMaxRef);
-  fprintf(stream, "  %22s = %d\n",  "ComponentMinRef", ComponentMinRef);
+  if ( ! ComponentMaxRef.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "ComponentMaxRef", ComponentMaxRef.get());
+  }
+  if ( ! ComponentMinRef.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "ComponentMinRef", ComponentMinRef.get());
+  }
+  if ( ! AlphaMinRef.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "AlphaMinRef", AlphaMinRef.get());
+  }
+  if ( ! AlphaMaxRef.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "AlphaMaxRef", AlphaMaxRef.get());
+  }
+  if ( ! ScanningDirection.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "ScanningDirection", ScanningDirection.get());
+  }
 }
 
 //
@@ -1798,7 +2066,7 @@ JPEG2000PictureSubDescriptor::WriteToBuffer(ASDCP::FrameBuffer& Buffer)
 
 //
 
-CDCIEssenceDescriptor::CDCIEssenceDescriptor(const Dictionary*& d) : GenericPictureEssenceDescriptor(d), m_Dict(d), ComponentDepth(0), HorizontalSubsampling(0), VerticalSubsampling(0), ColorSiting(0)
+CDCIEssenceDescriptor::CDCIEssenceDescriptor(const Dictionary*& d) : GenericPictureEssenceDescriptor(d), m_Dict(d), ComponentDepth(0), ColorSiting(0), PaddingBits(0), BlackRefLevel(0), ColorRange(0)
 {
   assert(m_Dict);
   m_UL = m_Dict->ul(MDD_CDCIEssenceDescriptor);
@@ -1818,10 +2086,43 @@ CDCIEssenceDescriptor::InitFromTLVSet(TLVReader& TLVSet)
 {
   assert(m_Dict);
   Result_t result = GenericPictureEssenceDescriptor::InitFromTLVSet(TLVSet);
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi32(OBJ_READ_ARGS(CDCIEssenceDescriptor, ComponentDepth));
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi32(OBJ_READ_ARGS_OPT(CDCIEssenceDescriptor, ComponentDepth));
+    ComponentDepth.set_has_value( result == RESULT_OK );
+  }
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi32(OBJ_READ_ARGS(CDCIEssenceDescriptor, HorizontalSubsampling));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi32(OBJ_READ_ARGS(CDCIEssenceDescriptor, VerticalSubsampling));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi8(OBJ_READ_ARGS(CDCIEssenceDescriptor, ColorSiting));
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi32(OBJ_READ_ARGS_OPT(CDCIEssenceDescriptor, VerticalSubsampling));
+    VerticalSubsampling.set_has_value( result == RESULT_OK );
+  }
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi8(OBJ_READ_ARGS_OPT(CDCIEssenceDescriptor, ColorSiting));
+    ColorSiting.set_has_value( result == RESULT_OK );
+  }
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi8(OBJ_READ_ARGS_OPT(CDCIEssenceDescriptor, ReversedByteOrder));
+    ReversedByteOrder.set_has_value( result == RESULT_OK );
+  }
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi16(OBJ_READ_ARGS_OPT(CDCIEssenceDescriptor, PaddingBits));
+    PaddingBits.set_has_value( result == RESULT_OK );
+  }
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi32(OBJ_READ_ARGS_OPT(CDCIEssenceDescriptor, AlphaSampleDepth));
+    AlphaSampleDepth.set_has_value( result == RESULT_OK );
+  }
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi32(OBJ_READ_ARGS_OPT(CDCIEssenceDescriptor, BlackRefLevel));
+    BlackRefLevel.set_has_value( result == RESULT_OK );
+  }
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi32(OBJ_READ_ARGS_OPT(CDCIEssenceDescriptor, WhiteReflevel));
+    WhiteReflevel.set_has_value( result == RESULT_OK );
+  }
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi32(OBJ_READ_ARGS_OPT(CDCIEssenceDescriptor, ColorRange));
+    ColorRange.set_has_value( result == RESULT_OK );
+  }
   return result;
 }
 
@@ -1831,10 +2132,16 @@ CDCIEssenceDescriptor::WriteToTLVSet(TLVWriter& TLVSet)
 {
   assert(m_Dict);
   Result_t result = GenericPictureEssenceDescriptor::WriteToTLVSet(TLVSet);
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS(CDCIEssenceDescriptor, ComponentDepth));
+  if ( ASDCP_SUCCESS(result)  && ! ComponentDepth.empty() ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS_OPT(CDCIEssenceDescriptor, ComponentDepth));
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS(CDCIEssenceDescriptor, HorizontalSubsampling));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS(CDCIEssenceDescriptor, VerticalSubsampling));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi8(OBJ_WRITE_ARGS(CDCIEssenceDescriptor, ColorSiting));
+  if ( ASDCP_SUCCESS(result)  && ! VerticalSubsampling.empty() ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS_OPT(CDCIEssenceDescriptor, VerticalSubsampling));
+  if ( ASDCP_SUCCESS(result)  && ! ColorSiting.empty() ) result = TLVSet.WriteUi8(OBJ_WRITE_ARGS_OPT(CDCIEssenceDescriptor, ColorSiting));
+  if ( ASDCP_SUCCESS(result)  && ! ReversedByteOrder.empty() ) result = TLVSet.WriteUi8(OBJ_WRITE_ARGS_OPT(CDCIEssenceDescriptor, ReversedByteOrder));
+  if ( ASDCP_SUCCESS(result)  && ! PaddingBits.empty() ) result = TLVSet.WriteUi16(OBJ_WRITE_ARGS_OPT(CDCIEssenceDescriptor, PaddingBits));
+  if ( ASDCP_SUCCESS(result)  && ! AlphaSampleDepth.empty() ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS_OPT(CDCIEssenceDescriptor, AlphaSampleDepth));
+  if ( ASDCP_SUCCESS(result)  && ! BlackRefLevel.empty() ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS_OPT(CDCIEssenceDescriptor, BlackRefLevel));
+  if ( ASDCP_SUCCESS(result)  && ! WhiteReflevel.empty() ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS_OPT(CDCIEssenceDescriptor, WhiteReflevel));
+  if ( ASDCP_SUCCESS(result)  && ! ColorRange.empty() ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS_OPT(CDCIEssenceDescriptor, ColorRange));
   return result;
 }
 
@@ -1847,6 +2154,12 @@ CDCIEssenceDescriptor::Copy(const CDCIEssenceDescriptor& rhs)
   HorizontalSubsampling = rhs.HorizontalSubsampling;
   VerticalSubsampling = rhs.VerticalSubsampling;
   ColorSiting = rhs.ColorSiting;
+  ReversedByteOrder = rhs.ReversedByteOrder;
+  PaddingBits = rhs.PaddingBits;
+  AlphaSampleDepth = rhs.AlphaSampleDepth;
+  BlackRefLevel = rhs.BlackRefLevel;
+  WhiteReflevel = rhs.WhiteReflevel;
+  ColorRange = rhs.ColorRange;
 }
 
 //
@@ -1860,10 +2173,34 @@ CDCIEssenceDescriptor::Dump(FILE* stream)
     stream = stderr;
 
   GenericPictureEssenceDescriptor::Dump(stream);
-  fprintf(stream, "  %22s = %d\n",  "ComponentDepth", ComponentDepth);
+  if ( ! ComponentDepth.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "ComponentDepth", ComponentDepth.get());
+  }
   fprintf(stream, "  %22s = %d\n",  "HorizontalSubsampling", HorizontalSubsampling);
-  fprintf(stream, "  %22s = %d\n",  "VerticalSubsampling", VerticalSubsampling);
-  fprintf(stream, "  %22s = %d\n",  "ColorSiting", ColorSiting);
+  if ( ! VerticalSubsampling.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "VerticalSubsampling", VerticalSubsampling.get());
+  }
+  if ( ! ColorSiting.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "ColorSiting", ColorSiting.get());
+  }
+  if ( ! ReversedByteOrder.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "ReversedByteOrder", ReversedByteOrder.get());
+  }
+  if ( ! PaddingBits.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "PaddingBits", PaddingBits.get());
+  }
+  if ( ! AlphaSampleDepth.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "AlphaSampleDepth", AlphaSampleDepth.get());
+  }
+  if ( ! BlackRefLevel.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "BlackRefLevel", BlackRefLevel.get());
+  }
+  if ( ! WhiteReflevel.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "WhiteReflevel", WhiteReflevel.get());
+  }
+  if ( ! ColorRange.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "ColorRange", ColorRange.get());
+  }
 }
 
 //
@@ -1885,7 +2222,7 @@ CDCIEssenceDescriptor::WriteToBuffer(ASDCP::FrameBuffer& Buffer)
 
 //
 
-MPEG2VideoDescriptor::MPEG2VideoDescriptor(const Dictionary*& d) : CDCIEssenceDescriptor(d), m_Dict(d), CodedContentType(0), LowDelay(0), BitRate(0), ProfileAndLevel(0)
+MPEG2VideoDescriptor::MPEG2VideoDescriptor(const Dictionary*& d) : CDCIEssenceDescriptor(d), m_Dict(d), CodedContentType(0), LowDelay(0), ProfileAndLevel(0)
 {
   assert(m_Dict);
   m_UL = m_Dict->ul(MDD_MPEG2VideoDescriptor);
@@ -1906,9 +2243,18 @@ MPEG2VideoDescriptor::InitFromTLVSet(TLVReader& TLVSet)
   assert(m_Dict);
   Result_t result = CDCIEssenceDescriptor::InitFromTLVSet(TLVSet);
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi8(OBJ_READ_ARGS(MPEG2VideoDescriptor, CodedContentType));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi8(OBJ_READ_ARGS(MPEG2VideoDescriptor, LowDelay));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi32(OBJ_READ_ARGS(MPEG2VideoDescriptor, BitRate));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi8(OBJ_READ_ARGS(MPEG2VideoDescriptor, ProfileAndLevel));
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi8(OBJ_READ_ARGS_OPT(MPEG2VideoDescriptor, LowDelay));
+    LowDelay.set_has_value( result == RESULT_OK );
+  }
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi32(OBJ_READ_ARGS_OPT(MPEG2VideoDescriptor, BitRate));
+    BitRate.set_has_value( result == RESULT_OK );
+  }
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi8(OBJ_READ_ARGS_OPT(MPEG2VideoDescriptor, ProfileAndLevel));
+    ProfileAndLevel.set_has_value( result == RESULT_OK );
+  }
   return result;
 }
 
@@ -1919,9 +2265,9 @@ MPEG2VideoDescriptor::WriteToTLVSet(TLVWriter& TLVSet)
   assert(m_Dict);
   Result_t result = CDCIEssenceDescriptor::WriteToTLVSet(TLVSet);
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi8(OBJ_WRITE_ARGS(MPEG2VideoDescriptor, CodedContentType));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi8(OBJ_WRITE_ARGS(MPEG2VideoDescriptor, LowDelay));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS(MPEG2VideoDescriptor, BitRate));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi8(OBJ_WRITE_ARGS(MPEG2VideoDescriptor, ProfileAndLevel));
+  if ( ASDCP_SUCCESS(result)  && ! LowDelay.empty() ) result = TLVSet.WriteUi8(OBJ_WRITE_ARGS_OPT(MPEG2VideoDescriptor, LowDelay));
+  if ( ASDCP_SUCCESS(result)  && ! BitRate.empty() ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS_OPT(MPEG2VideoDescriptor, BitRate));
+  if ( ASDCP_SUCCESS(result)  && ! ProfileAndLevel.empty() ) result = TLVSet.WriteUi8(OBJ_WRITE_ARGS_OPT(MPEG2VideoDescriptor, ProfileAndLevel));
   return result;
 }
 
@@ -1948,9 +2294,15 @@ MPEG2VideoDescriptor::Dump(FILE* stream)
 
   CDCIEssenceDescriptor::Dump(stream);
   fprintf(stream, "  %22s = %d\n",  "CodedContentType", CodedContentType);
-  fprintf(stream, "  %22s = %d\n",  "LowDelay", LowDelay);
-  fprintf(stream, "  %22s = %d\n",  "BitRate", BitRate);
-  fprintf(stream, "  %22s = %d\n",  "ProfileAndLevel", ProfileAndLevel);
+  if ( ! LowDelay.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "LowDelay", LowDelay.get());
+  }
+  if ( ! BitRate.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "BitRate", BitRate.get());
+  }
+  if ( ! ProfileAndLevel.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "ProfileAndLevel", ProfileAndLevel.get());
+  }
 }
 
 //
@@ -2616,7 +2968,7 @@ NetworkLocator::WriteToBuffer(ASDCP::FrameBuffer& Buffer)
 
 //
 
-MCALabelSubDescriptor::MCALabelSubDescriptor(const Dictionary*& d) : InterchangeObject(d), m_Dict(d), MCAChannelID(0)
+MCALabelSubDescriptor::MCALabelSubDescriptor(const Dictionary*& d) : InterchangeObject(d), m_Dict(d)
 {
   assert(m_Dict);
   m_UL = m_Dict->ul(MDD_MCALabelSubDescriptor);
@@ -2639,9 +2991,18 @@ MCALabelSubDescriptor::InitFromTLVSet(TLVReader& TLVSet)
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(MCALabelSubDescriptor, MCALabelDictionaryID));
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(MCALabelSubDescriptor, MCALinkID));
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(MCALabelSubDescriptor, MCATagSymbol));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(MCALabelSubDescriptor, MCATagName));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi32(OBJ_READ_ARGS(MCALabelSubDescriptor, MCAChannelID));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(MCALabelSubDescriptor, RFC5646SpokenLanguage));
+  if ( ASDCP_SUCCESS(result) ) {
+    result = TLVSet.ReadObject(OBJ_READ_ARGS_OPT(MCALabelSubDescriptor, MCATagName));
+    MCATagName.set_has_value( result == RESULT_OK );
+  }
+  if ( ASDCP_SUCCESS(result) ) { 
+    result = TLVSet.ReadUi32(OBJ_READ_ARGS_OPT(MCALabelSubDescriptor, MCAChannelID));
+    MCAChannelID.set_has_value( result == RESULT_OK );
+  }
+  if ( ASDCP_SUCCESS(result) ) {
+    result = TLVSet.ReadObject(OBJ_READ_ARGS_OPT(MCALabelSubDescriptor, RFC5646SpokenLanguage));
+    RFC5646SpokenLanguage.set_has_value( result == RESULT_OK );
+  }
   return result;
 }
 
@@ -2654,9 +3015,9 @@ MCALabelSubDescriptor::WriteToTLVSet(TLVWriter& TLVSet)
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(MCALabelSubDescriptor, MCALabelDictionaryID));
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(MCALabelSubDescriptor, MCALinkID));
   if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(MCALabelSubDescriptor, MCATagSymbol));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(MCALabelSubDescriptor, MCATagName));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS(MCALabelSubDescriptor, MCAChannelID));
-  if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(MCALabelSubDescriptor, RFC5646SpokenLanguage));
+  if ( ASDCP_SUCCESS(result)  && ! MCATagName.empty() ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS_OPT(MCALabelSubDescriptor, MCATagName));
+  if ( ASDCP_SUCCESS(result)  && ! MCAChannelID.empty() ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS_OPT(MCALabelSubDescriptor, MCAChannelID));
+  if ( ASDCP_SUCCESS(result)  && ! RFC5646SpokenLanguage.empty() ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS_OPT(MCALabelSubDescriptor, RFC5646SpokenLanguage));
   return result;
 }
 
@@ -2687,9 +3048,15 @@ MCALabelSubDescriptor::Dump(FILE* stream)
   fprintf(stream, "  %22s = %s\n",  "MCALabelDictionaryID", MCALabelDictionaryID.EncodeString(identbuf, IdentBufferLen));
   fprintf(stream, "  %22s = %s\n",  "MCALinkID", MCALinkID.EncodeString(identbuf, IdentBufferLen));
   fprintf(stream, "  %22s = %s\n",  "MCATagSymbol", MCATagSymbol.EncodeString(identbuf, IdentBufferLen));
-  fprintf(stream, "  %22s = %s\n",  "MCATagName", MCATagName.EncodeString(identbuf, IdentBufferLen));
-  fprintf(stream, "  %22s = %d\n",  "MCAChannelID", MCAChannelID);
-  fprintf(stream, "  %22s = %s\n",  "RFC5646SpokenLanguage", RFC5646SpokenLanguage.EncodeString(identbuf, IdentBufferLen));
+  if ( ! MCATagName.empty() ) {
+    fprintf(stream, "  %22s = %s\n",  "MCATagName", MCATagName.get().EncodeString(identbuf, IdentBufferLen));
+  }
+  if ( ! MCAChannelID.empty() ) {
+    fprintf(stream, "  %22s = %d\n",  "MCAChannelID", MCAChannelID.get());
+  }
+  if ( ! RFC5646SpokenLanguage.empty() ) {
+    fprintf(stream, "  %22s = %s\n",  "RFC5646SpokenLanguage", RFC5646SpokenLanguage.get().EncodeString(identbuf, IdentBufferLen));
+  }
 }
 
 //
index 7ee09406b45a6ef8e3ff04c1fc283b2a70dfa0d0..007f22b21604ff58ad2715c663c730bb44f1e431 100755 (executable)
@@ -57,7 +57,7 @@ namespace ASDCP
           UUID ProductUID;
           Kumu::Timestamp ModificationDate;
           VersionType ToolkitVersion;
-          UTF16String Platform;
+          optional_property<UTF16String> Platform;
 
       Identification(const Dictionary*& d);
       Identification(const Identification& rhs);
@@ -105,7 +105,7 @@ namespace ASDCP
        public:
          const Dictionary*& m_Dict;
           UMID LinkedPackageUID;
-          ui32_t IndexSID;
+          optional_property<ui32_t> IndexSID;
           ui32_t BodySID;
 
       EssenceContainerData(const Dictionary*& d);
@@ -130,7 +130,7 @@ namespace ASDCP
        public:
          const Dictionary*& m_Dict;
           UMID PackageUID;
-          UTF16String Name;
+          optional_property<UTF16String> Name;
           Kumu::Timestamp PackageCreationDate;
           Kumu::Timestamp PackageModifiedDate;
           Batch<UUID> Tracks;
@@ -154,6 +154,7 @@ namespace ASDCP
 
        public:
          const Dictionary*& m_Dict;
+          optional_property<UUID> PackageMarker;
 
       MaterialPackage(const Dictionary*& d);
       MaterialPackage(const MaterialPackage& rhs);
@@ -201,8 +202,8 @@ namespace ASDCP
          const Dictionary*& m_Dict;
           ui32_t TrackID;
           ui32_t TrackNumber;
-          UTF16String TrackName;
-          UUID Sequence;
+          optional_property<UTF16String> TrackName;
+          optional_property<UUID> Sequence;
 
       GenericTrack(const Dictionary*& d);
       GenericTrack(const GenericTrack& rhs);
@@ -270,7 +271,7 @@ namespace ASDCP
        public:
          const Dictionary*& m_Dict;
           UL DataDefinition;
-          ui64_t Duration;
+          optional_property<ui64_t> Duration;
 
       StructuralComponent(const Dictionary*& d);
       StructuralComponent(const StructuralComponent& rhs);
@@ -386,11 +387,11 @@ namespace ASDCP
 
        public:
          const Dictionary*& m_Dict;
-          ui32_t LinkedTrackID;
+          optional_property<ui32_t> LinkedTrackID;
           Rational SampleRate;
-          ui64_t ContainerDuration;
+          optional_property<ui64_t> ContainerDuration;
           UL EssenceContainer;
-          UL Codec;
+          optional_property<UL> Codec;
 
       FileDescriptor(const Dictionary*& d);
       FileDescriptor(const FileDescriptor& rhs);
@@ -415,10 +416,12 @@ namespace ASDCP
          const Dictionary*& m_Dict;
           Rational AudioSamplingRate;
           ui8_t Locked;
-          ui8_t AudioRefLevel;
+          optional_property<ui8_t> AudioRefLevel;
+          optional_property<ui8_t> ElectroSpatialFormulation;
           ui32_t ChannelCount;
           ui32_t QuantizationBits;
-          ui8_t DialNorm;
+          optional_property<ui8_t> DialNorm;
+          UL SoundEssenceCoding;
 
       GenericSoundEssenceDescriptor(const Dictionary*& d);
       GenericSoundEssenceDescriptor(const GenericSoundEssenceDescriptor& rhs);
@@ -442,9 +445,9 @@ namespace ASDCP
        public:
          const Dictionary*& m_Dict;
           ui16_t BlockAlign;
-          ui8_t SequenceOffset;
+          optional_property<ui8_t> SequenceOffset;
           ui32_t AvgBps;
-          UL ChannelAssignment;
+          optional_property<UL> ChannelAssignment;
 
       WaveAudioDescriptor(const Dictionary*& d);
       WaveAudioDescriptor(const WaveAudioDescriptor& rhs);
@@ -467,15 +470,31 @@ namespace ASDCP
 
        public:
          const Dictionary*& m_Dict;
+          optional_property<ui8_t> SignalStandard;
           ui8_t FrameLayout;
           ui32_t StoredWidth;
           ui32_t StoredHeight;
-          Rational AspectRatio;
-          UL PictureEssenceCoding;
-          optional_property<ui32_t> DisplayWidth;
+          optional_property<ui32_t> StoredF2Offset;
+          optional_property<ui32_t> SampledWidth;
+          optional_property<ui32_t> SampledHeight;
+          optional_property<ui32_t> SampledXOffset;
+          optional_property<ui32_t> SampledYOffset;
           optional_property<ui32_t> DisplayHeight;
-          optional_property<UL> Gamma;
+          optional_property<ui32_t> DisplayWidth;
+          optional_property<ui32_t> DisplayXOffset;
+          optional_property<ui32_t> DisplayYOffset;
+          optional_property<ui32_t> DisplayF2Offset;
+          Rational AspectRatio;
+          optional_property<ui8_t> ActiveFormatDescriptor;
+          optional_property<ui8_t> AlphaTransparency;
+          optional_property<UL> TransferCharacteristic;
+          optional_property<ui32_t> ImageAlignmentOffset;
+          optional_property<ui32_t> ImageStartOffset;
+          optional_property<ui32_t> ImageEndOffset;
           optional_property<ui8_t> FieldDominance;
+          UL PictureEssenceCoding;
+          optional_property<UL> CodingEquations;
+          optional_property<UL> ColorPrimaries;
 
       GenericPictureEssenceDescriptor(const Dictionary*& d);
       GenericPictureEssenceDescriptor(const GenericPictureEssenceDescriptor& rhs);
@@ -498,8 +517,11 @@ namespace ASDCP
 
        public:
          const Dictionary*& m_Dict;
-          ui32_t ComponentMaxRef;
-          ui32_t ComponentMinRef;
+          optional_property<ui32_t> ComponentMaxRef;
+          optional_property<ui32_t> ComponentMinRef;
+          optional_property<ui32_t> AlphaMinRef;
+          optional_property<ui32_t> AlphaMaxRef;
+          optional_property<ui8_t> ScanningDirection;
 
       RGBAEssenceDescriptor(const Dictionary*& d);
       RGBAEssenceDescriptor(const RGBAEssenceDescriptor& rhs);
@@ -557,10 +579,16 @@ namespace ASDCP
 
        public:
          const Dictionary*& m_Dict;
-          ui32_t ComponentDepth;
+          optional_property<ui32_t> ComponentDepth;
           ui32_t HorizontalSubsampling;
-          ui32_t VerticalSubsampling;
-          ui8_t ColorSiting;
+          optional_property<ui32_t> VerticalSubsampling;
+          optional_property<ui8_t> ColorSiting;
+          optional_property<ui8_t> ReversedByteOrder;
+          optional_property<ui16_t> PaddingBits;
+          optional_property<ui32_t> AlphaSampleDepth;
+          optional_property<ui32_t> BlackRefLevel;
+          optional_property<ui32_t> WhiteReflevel;
+          optional_property<ui32_t> ColorRange;
 
       CDCIEssenceDescriptor(const Dictionary*& d);
       CDCIEssenceDescriptor(const CDCIEssenceDescriptor& rhs);
@@ -584,9 +612,9 @@ namespace ASDCP
        public:
          const Dictionary*& m_Dict;
           ui8_t CodedContentType;
-          ui8_t LowDelay;
-          ui32_t BitRate;
-          ui8_t ProfileAndLevel;
+          optional_property<ui8_t> LowDelay;
+          optional_property<ui32_t> BitRate;
+          optional_property<ui8_t> ProfileAndLevel;
 
       MPEG2VideoDescriptor(const Dictionary*& d);
       MPEG2VideoDescriptor(const MPEG2VideoDescriptor& rhs);
@@ -807,9 +835,9 @@ namespace ASDCP
           UL MCALabelDictionaryID;
           UUID MCALinkID;
           UTF16String MCATagSymbol;
-          UTF16String MCATagName;
-          ui32_t MCAChannelID;
-          ISO8String RFC5646SpokenLanguage;
+          optional_property<UTF16String> MCATagName;
+          optional_property<ui32_t> MCAChannelID;
+          optional_property<ISO8String> RFC5646SpokenLanguage;
 
       MCALabelSubDescriptor(const Dictionary*& d);
       MCALabelSubDescriptor(const MCALabelSubDescriptor& rhs);