Reverting const accessor for class optional_property
[asdcplib.git] / src / AS_DCP_TimedText.cpp
index e6f386998099baf9ceeccad001b8d14c7b238b82..0cc3748873411a377d59addc88fd186a0b9a58be 100644 (file)
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2008-2016, John Hurst
+Copyright (c) 2008-2018, John Hurst
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -160,6 +160,7 @@ ASDCP::TimedText::MXFReader::h__Reader::MD_to_TimedText_TDesc(TimedText::TimedTe
   memcpy(TDesc.AssetID, TDescObj->ResourceID.Value(), UUIDlen);
   TDesc.NamespaceName = TDescObj->NamespaceURI;
   TDesc.EncodingName = TDescObj->UCSEncoding;
+  TDesc.ResourceList.clear();
 
   Array<UUID>::const_iterator sdi = TDescObj->SubDescriptors.begin();
   TimedTextResourceSubDescriptor* DescObject = 0;
@@ -244,7 +245,7 @@ ASDCP::TimedText::MXFReader::h__Reader::ReadTimedTextResource(FrameBuffer& Frame
 
 //
 ASDCP::Result_t
-ASDCP::TimedText::MXFReader::h__Reader::ReadAncillaryResource(const byte_t* uuid, FrameBuffer& FrameBuf,
+ASDCP::TimedText::MXFReader::h__Reader::ReadAncillaryResource(const byte_t* uuid, FrameBuffer& frame_buf,
                                                              AESDecContext* Ctx, HMACContext* HMAC)
 {
   KM_TEST_NULL_L(uuid);
@@ -258,68 +259,21 @@ ASDCP::TimedText::MXFReader::h__Reader::ReadAncillaryResource(const byte_t* uuid
       return RESULT_RANGE;
     }
 
-  TimedTextResourceSubDescriptor* DescObject = 0;
   // get the subdescriptor
   InterchangeObject* tmp_iobj = 0;
   Result_t result = m_HeaderPart.GetMDObjectByID((*ri).second, &tmp_iobj);
-  DescObject = static_cast<TimedTextResourceSubDescriptor*>(tmp_iobj);
+  TimedTextResourceSubDescriptor* desc_object = dynamic_cast<TimedTextResourceSubDescriptor*>(tmp_iobj);
 
   if ( KM_SUCCESS(result) )
     {
-      RIP::const_pair_iterator pi;
-      RIP::PartitionPair TmpPair;
-      ui32_t sequence = 0;
-
-      // Look up the partition start in the RIP using the SID.
-      // Count the sequence length in because this is the sequence
-      // value needed to  complete the HMAC.
-      for ( pi = m_RIP.PairArray.begin(); pi != m_RIP.PairArray.end(); ++pi, ++sequence )
-       {
-         if ( (*pi).BodySID == DescObject->EssenceStreamID )
-           {
-             TmpPair = *pi;
-             break;
-           }
-       }
-
-      if ( TmpPair.ByteOffset == 0 )
-       {
-         DefaultLogSink().Error("Body SID not found in RIP set: %d\n", DescObject->EssenceStreamID);
-         return RESULT_FORMAT;
-       }
+      assert(desc_object);
+      result = ReadGenericStreamPartitionPayload(desc_object->EssenceStreamID, frame_buf, Ctx, HMAC);
+    }
 
-      if ( KM_SUCCESS(result) )
-       {
-         FrameBuf.AssetID(uuid);
-         FrameBuf.MIMEType(DescObject->MIMEMediaType);
-
-         // seek tp the start of the partition
-         if ( (Kumu::fpos_t)TmpPair.ByteOffset != m_LastPosition )
-           {
-             m_LastPosition = TmpPair.ByteOffset;
-             result = m_File.Seek(TmpPair.ByteOffset);
-           }
-
-         // read the partition header
-         MXF::Partition GSPart(m_Dict);
-         result = GSPart.InitFromFile(m_File);
-
-         if( ASDCP_SUCCESS(result) )
-           {
-             // check the SID
-             if ( DescObject->EssenceStreamID != GSPart.BodySID )
-               {
-                 char buf[64];
-                 DefaultLogSink().Error("Generic stream partition body differs: %s\n", RID.EncodeHex(buf, 64));
-                 return RESULT_FORMAT;
-               }
-
-             // read the essence packet
-             assert(m_Dict);
-             if( ASDCP_SUCCESS(result) )
-               result = ReadEKLVPacket(0, sequence, FrameBuf, m_Dict->ul(MDD_GenericStream_DataElement), Ctx, HMAC);
-           }
-       }
+  if ( KM_SUCCESS(result) )
+    {
+      frame_buf.AssetID(uuid);
+      frame_buf.MIMEType(desc_object->MIMEMediaType);
     }
 
   return result;
@@ -580,7 +534,7 @@ ASDCP::TimedText::MXFWriter::h__Writer::SetSourceStream(ASDCP::TimedText::TimedT
 
   if ( ASDCP_SUCCESS(result) )
     {
-      InitHeader();
+      InitHeader(MXFVersion_2004);
 
       // First RIP Entry
       if ( m_Info.LabelSetType == LS_MXF_SMPTE )  // ERK
@@ -594,11 +548,10 @@ ASDCP::TimedText::MXFWriter::h__Writer::SetSourceStream(ASDCP::TimedText::TimedT
        }
 
       // timecode rate and essence rate are the same
-      AddDMSegment(m_TDesc.EditRate, m_TDesc.EditRate, derive_timecode_rate_from_edit_rate(m_TDesc.EditRate), TIMED_TEXT_DEF_LABEL,
-                  UL(m_Dict->ul(MDD_DataDataDef)), TIMED_TEXT_PACKAGE_LABEL);
+      AddSourceClip(m_TDesc.EditRate, m_TDesc.EditRate, derive_timecode_rate_from_edit_rate(m_TDesc.EditRate),
+                   TIMED_TEXT_DEF_LABEL, m_EssenceUL, UL(m_Dict->ul(MDD_DataDataDef)), TIMED_TEXT_PACKAGE_LABEL);
 
       AddEssenceDescriptor(UL(m_Dict->ul(MDD_TimedTextWrappingClip)));
-
       result = m_HeaderPart.WriteToFile(m_File, m_HeaderSize);
       
       if ( KM_SUCCESS(result) )
@@ -634,9 +587,7 @@ ASDCP::TimedText::MXFWriter::h__Writer::WriteTimedTextResource(const std::string
 
       IndexTableSegment::IndexEntry Entry;
       Entry.StreamOffset = m_StreamOffset;
-      
-      if ( ASDCP_SUCCESS(result) )
-       result = WriteEKLVPacket(FrameBuf, m_EssenceUL, Ctx, HMAC);
+      result = WriteEKLVPacket(FrameBuf, m_EssenceUL, MXF_BER_LENGTH, Ctx, HMAC);
 
       if ( ASDCP_SUCCESS(result) )
        {
@@ -670,12 +621,12 @@ ASDCP::TimedText::MXFWriter::h__Writer::WriteAncillaryResource(const ASDCP::Time
   GSPart.OperationalPattern = m_HeaderPart.OperationalPattern;
 
   m_RIP.PairArray.push_back(RIP::PartitionPair(m_EssenceStreamID++, here));
-  GSPart.EssenceContainers.push_back(UL(m_Dict->ul(MDD_TimedTextEssence)));
+  GSPart.EssenceContainers = m_HeaderPart.EssenceContainers;
   UL TmpUL(m_Dict->ul(MDD_GenericStreamPartition));
   Result_t result = GSPart.WriteToFile(m_File, TmpUL);
 
   if ( ASDCP_SUCCESS(result) )
-    result = WriteEKLVPacket(FrameBuf, GenericStream_DataElement.Value(), Ctx, HMAC);
+    result = WriteEKLVPacket(FrameBuf, GenericStream_DataElement.Value(), MXF_BER_LENGTH, Ctx, HMAC);
 
   m_FramesWritten++;
   return result;