Adds a ContainerConstraintsSubDescriptor to ACES files (mandatory per ST 379-2) 18/head
authorWolfgang Ruppel <imftool@t-online.de>
Mon, 2 Dec 2019 20:48:30 +0000 (21:48 +0100)
committerWolfgang Ruppel <imftool@t-online.de>
Mon, 2 Dec 2019 20:48:30 +0000 (21:48 +0100)
src/AS_02_ACES.cpp
src/MDD.cpp
src/MDD.h
src/Metadata.cpp
src/Metadata.h
src/as-02-wrap.cpp

index 040e05969dadec1e92aab7288049b44ac501764b..9a847ccf99a27c20fb9778ada7daaa6ba4dc436f 100644 (file)
@@ -559,7 +559,10 @@ AS_02::Result_t AS_02::ACES::MXFWriter::h__Writer::OpenWrite(const std::string &
     ASDCP::MXF::InterchangeObject_list_t::iterator i;
     for ( i = essence_sub_descriptor_list.begin(); i != essence_sub_descriptor_list.end(); ++i )
     {
-      if ( ( (*i)->GetUL() != UL(m_Dict->ul(MDD_ACESPictureSubDescriptor)) ) && ( (*i)->GetUL() != UL(m_Dict->ul(MDD_TargetFrameSubDescriptor)) ) )
+      if ( ( (*i)->GetUL() != UL(m_Dict->ul(MDD_ACESPictureSubDescriptor)) )
+               && ( (*i)->GetUL() != UL(m_Dict->ul(MDD_TargetFrameSubDescriptor)) )
+               && ( (*i)->GetUL() != UL(m_Dict->ul(MDD_ContainerConstraintsSubDescriptor)) )
+                         )
         {
           DefaultLogSink().Error("Essence sub-descriptor is not an ACESPictureSubDescriptor or a TargetFrameSubDescriptor.\n");
           (*i)->Dump();
index c8de0040752cb8e0f40de5ca1c364f62271be153..06887d5fa923824df352c268749428daba4b89ba 100644 (file)
@@ -1156,12 +1156,12 @@ static const ASDCP::MDDEntry s_MDD_Table[] = {
      {0}, false, "DBOXMotionCodeSecondaryStream" },
 
    //  379-2, Sec. 7: Encoders that conform to this specification shall add a
-   // ContainerConstraintSubDescriptor to the GenericDescriptor::SubDescriptors
+   // ContainerConstraintsSubDescriptor to the GenericDescriptor::SubDescriptors
    // property of the top-most File Descriptor that describes the essence
    // container.
    { { 0x06, 0x0e, 0x2b, 0x34, 0x02, 0x53, 0x01, 0x01, // 373
        0x0d, 0x01, 0x01, 0x01, 0x01, 0x01, 0x67, 0x00 },
-     {0}, false, "ContainerConstraintSubDescriptor" },
+     {0}, false, "ContainerConstraintsSubDescriptor" },
 
    // protype for high dynamic range, values recorded in Dolby registry
    { { 0x06, 0x0e, 0x2b, 0x34, 0x04, 0x01, 0x01, 0x05, // 374
index 23d6730d673081ea5c0de2f3dcac894a76261c5d..7e83ef7bea1c4dbe78d3ff1ac14cab7cdac314ba 100755 (executable)
--- a/src/MDD.h
+++ b/src/MDD.h
@@ -408,7 +408,7 @@ namespace ASDCP {
        MDD_WAVWrappingClip, // 370
        MDD_DBOXMotionCodePrimaryStream, // 371
        MDD_DBOXMotionCodeSecondaryStream, // 372
-       MDD_ContainerConstraintSubDescriptor, // 373
+       MDD_ContainerConstraintsSubDescriptor, // 373
        MDD_PHDRImageMetadataWrappingFrame, // 374
        MDD_PHDRImageMetadataItem, // 375
        MDD_PHDRMetadataTrackSubDescriptor, // 376
index b21dc23ba5ce19d6c4e9ea2096718bbe187cb737..2a1e1f2b2c57847b9abff0e84caf5e194c18a390 100755 (executable)
@@ -70,7 +70,7 @@ static InterchangeObject* GenericDataEssenceDescriptor_Factory(const Dictionary*
 static InterchangeObject* TimedTextDescriptor_Factory(const Dictionary*& Dict) { return new TimedTextDescriptor(Dict); }
 static InterchangeObject* TimedTextResourceSubDescriptor_Factory(const Dictionary*& Dict) { return new TimedTextResourceSubDescriptor(Dict); }
 static InterchangeObject* StereoscopicPictureSubDescriptor_Factory(const Dictionary*& Dict) { return new StereoscopicPictureSubDescriptor(Dict); }
-static InterchangeObject* ContainerConstraintSubDescriptor_Factory(const Dictionary*& Dict) { return new ContainerConstraintSubDescriptor(Dict); }
+static InterchangeObject* ContainerConstraintsSubDescriptor_Factory(const Dictionary*& Dict) { return new ContainerConstraintsSubDescriptor(Dict); }
 static InterchangeObject* NetworkLocator_Factory(const Dictionary*& Dict) { return new NetworkLocator(Dict); }
 static InterchangeObject* MCALabelSubDescriptor_Factory(const Dictionary*& Dict) { return new MCALabelSubDescriptor(Dict); }
 static InterchangeObject* AudioChannelLabelSubDescriptor_Factory(const Dictionary*& Dict) { return new AudioChannelLabelSubDescriptor(Dict); }
@@ -123,7 +123,7 @@ ASDCP::MXF::Metadata_InitTypes(const Dictionary*& Dict)
   SetObjectFactory(Dict->ul(MDD_TimedTextDescriptor), TimedTextDescriptor_Factory);
   SetObjectFactory(Dict->ul(MDD_TimedTextResourceSubDescriptor), TimedTextResourceSubDescriptor_Factory);
   SetObjectFactory(Dict->ul(MDD_StereoscopicPictureSubDescriptor), StereoscopicPictureSubDescriptor_Factory);
-  SetObjectFactory(Dict->ul(MDD_ContainerConstraintSubDescriptor), ContainerConstraintSubDescriptor_Factory);
+  SetObjectFactory(Dict->ul(MDD_ContainerConstraintsSubDescriptor), ContainerConstraintsSubDescriptor_Factory);
   SetObjectFactory(Dict->ul(MDD_NetworkLocator), NetworkLocator_Factory);
   SetObjectFactory(Dict->ul(MDD_MCALabelSubDescriptor), MCALabelSubDescriptor_Factory);
   SetObjectFactory(Dict->ul(MDD_AudioChannelLabelSubDescriptor), AudioChannelLabelSubDescriptor_Factory);
@@ -3287,27 +3287,27 @@ StereoscopicPictureSubDescriptor::WriteToBuffer(ASDCP::FrameBuffer& Buffer)
 }
 
 //------------------------------------------------------------------------------------------
-// ContainerConstraintSubDescriptor
+// ContainerConstraintsSubDescriptor
 
 //
 
-ContainerConstraintSubDescriptor::ContainerConstraintSubDescriptor(const Dictionary*& d) : InterchangeObject(d), m_Dict(d)
+ContainerConstraintsSubDescriptor::ContainerConstraintsSubDescriptor(const Dictionary*& d) : InterchangeObject(d), m_Dict(d)
 {
   assert(m_Dict);
-  m_UL = m_Dict->ul(MDD_ContainerConstraintSubDescriptor);
+  m_UL = m_Dict->ul(MDD_ContainerConstraintsSubDescriptor);
 }
 
-ContainerConstraintSubDescriptor::ContainerConstraintSubDescriptor(const ContainerConstraintSubDescriptor& rhs) : InterchangeObject(rhs.m_Dict), m_Dict(rhs.m_Dict)
+ContainerConstraintsSubDescriptor::ContainerConstraintsSubDescriptor(const ContainerConstraintsSubDescriptor& rhs) : InterchangeObject(rhs.m_Dict), m_Dict(rhs.m_Dict)
 {
   assert(m_Dict);
-  m_UL = m_Dict->ul(MDD_ContainerConstraintSubDescriptor);
+  m_UL = m_Dict->ul(MDD_ContainerConstraintsSubDescriptor);
   Copy(rhs);
 }
 
 
 //
 ASDCP::Result_t
-ContainerConstraintSubDescriptor::InitFromTLVSet(TLVReader& TLVSet)
+ContainerConstraintsSubDescriptor::InitFromTLVSet(TLVReader& TLVSet)
 {
   assert(m_Dict);
   Result_t result = InterchangeObject::InitFromTLVSet(TLVSet);
@@ -3316,7 +3316,7 @@ ContainerConstraintSubDescriptor::InitFromTLVSet(TLVReader& TLVSet)
 
 //
 ASDCP::Result_t
-ContainerConstraintSubDescriptor::WriteToTLVSet(TLVWriter& TLVSet)
+ContainerConstraintsSubDescriptor::WriteToTLVSet(TLVWriter& TLVSet)
 {
   assert(m_Dict);
   Result_t result = InterchangeObject::WriteToTLVSet(TLVSet);
@@ -3325,14 +3325,14 @@ ContainerConstraintSubDescriptor::WriteToTLVSet(TLVWriter& TLVSet)
 
 //
 void
-ContainerConstraintSubDescriptor::Copy(const ContainerConstraintSubDescriptor& rhs)
+ContainerConstraintsSubDescriptor::Copy(const ContainerConstraintsSubDescriptor& rhs)
 {
   InterchangeObject::Copy(rhs);
 }
 
 //
 void
-ContainerConstraintSubDescriptor::Dump(FILE* stream)
+ContainerConstraintsSubDescriptor::Dump(FILE* stream)
 {
   char identbuf[IdentBufferLen];
   *identbuf = 0;
@@ -3345,14 +3345,14 @@ ContainerConstraintSubDescriptor::Dump(FILE* stream)
 
 //
 ASDCP::Result_t
-ContainerConstraintSubDescriptor::InitFromBuffer(const byte_t* p, ui32_t l)
+ContainerConstraintsSubDescriptor::InitFromBuffer(const byte_t* p, ui32_t l)
 {
   return InterchangeObject::InitFromBuffer(p, l);
 }
 
 //
 ASDCP::Result_t
-ContainerConstraintSubDescriptor::WriteToBuffer(ASDCP::FrameBuffer& Buffer)
+ContainerConstraintsSubDescriptor::WriteToBuffer(ASDCP::FrameBuffer& Buffer)
 {
   return InterchangeObject::WriteToBuffer(Buffer);
 }
index b2466ef07a4bc652a0255159a6503a533ff5e755..6601d649315af43a440f3e742b3f314ff08b44f6 100755 (executable)
@@ -869,21 +869,21 @@ namespace ASDCP
       virtual Result_t WriteToBuffer(ASDCP::FrameBuffer&);
        };
 
-      //
-      class ContainerConstraintSubDescriptor : public InterchangeObject
+      // A ContainerConstraintsSubDescriptor is required to be present in the top level File Descriptor for the Constrained Generic Container per ST 379-2
+      class ContainerConstraintsSubDescriptor : public InterchangeObject
        {
-         ContainerConstraintSubDescriptor();
+         ContainerConstraintsSubDescriptor();
 
        public:
          const Dictionary*& m_Dict;
 
-      ContainerConstraintSubDescriptor(const Dictionary*& d);
-      ContainerConstraintSubDescriptor(const ContainerConstraintSubDescriptor& rhs);
-      virtual ~ContainerConstraintSubDescriptor() {}
+      ContainerConstraintsSubDescriptor(const Dictionary*& d);
+      ContainerConstraintsSubDescriptor(const ContainerConstraintsSubDescriptor& rhs);
+      virtual ~ContainerConstraintsSubDescriptor() {}
 
-      const ContainerConstraintSubDescriptor& operator=(const ContainerConstraintSubDescriptor& rhs) { Copy(rhs); return *this; }
-      virtual void Copy(const ContainerConstraintSubDescriptor& rhs);
-      virtual const char* HasName() { return "ContainerConstraintSubDescriptor"; }
+      const ContainerConstraintsSubDescriptor& operator=(const ContainerConstraintsSubDescriptor& rhs) { Copy(rhs); return *this; }
+      virtual void Copy(const ContainerConstraintsSubDescriptor& rhs);
+      virtual const char* HasName() { return "ContainerConstraintsSubDescriptor"; }
       virtual Result_t InitFromTLVSet(TLVReader& TLVSet);
       virtual Result_t WriteToTLVSet(TLVWriter& TLVSet);
       virtual void     Dump(FILE* = 0);
index a4984741a5d7345a57f955d1fa1a77c5b7a2b9b1..db76e193bdfe0ce3489b94c4b702df6a3a40075b 100755 (executable)
@@ -1240,6 +1240,9 @@ write_ACES_file(CommandOptions& Options)
     ASDCP::MXF::ACESPictureSubDescriptor* aces_picture_subdescriptor = new ASDCP::MXF::ACESPictureSubDescriptor(g_dict);
     Kumu::GenRandomValue(aces_picture_subdescriptor->InstanceUID);
     result = AS_02::ACES::ACES_PDesc_to_MD(PDesc, *g_dict, *tmp_dscr);
+    ASDCP::MXF::ContainerConstraintsSubDescriptor* gc_subdescriptor = new ASDCP::MXF::ContainerConstraintsSubDescriptor(g_dict);
+    Kumu::GenRandomValue(gc_subdescriptor->InstanceUID);
+    essence_sub_descriptors.push_back(gc_subdescriptor);
 
     if (ASDCP_SUCCESS(result))
     {