Added BER length minimum value
authorjhurst <jhurst@cinecert.com>
Sat, 13 Oct 2018 21:50:44 +0000 (21:50 +0000)
committerjhurst <>
Sat, 13 Oct 2018 21:50:44 +0000 (21:50 +0000)
13 files changed:
src/AS_02_ACES.cpp
src/AS_02_ISXD.cpp
src/AS_02_JP2K.cpp
src/AS_02_PHDR.cpp
src/AS_02_TimedText.cpp
src/AS_02_internal.h
src/AS_DCP_DCData.cpp
src/AS_DCP_JP2K.cpp
src/AS_DCP_MPEG2.cpp
src/AS_DCP_PCM.cpp
src/AS_DCP_TimedText.cpp
src/h__02_Writer.cpp
src/h__Writer.cpp

index cac72c4cc579e035a47d521ef706e38ebf9e2957..040e05969dadec1e92aab7288049b44ac501764b 100644 (file)
@@ -634,7 +634,7 @@ AS_02::Result_t AS_02::ACES::MXFWriter::h__Writer::WriteFrame(const AS_02::ACES:
 
   if(KM_SUCCESS(result))
   {
-    result = WriteEKLVPacket(FrameBuf, m_EssenceUL, Ctx, HMAC);
+    result = WriteEKLVPacket(FrameBuf, m_EssenceUL, MXF_BER_LENGTH, Ctx, HMAC);
     m_FramesWritten++;
   }
 
@@ -694,7 +694,9 @@ AS_02::Result_t AS_02::ACES::MXFWriter::h__Writer::WriteAncillaryResource(const
   {
     ui64_t this_stream_offset = m_StreamOffset; // m_StreamOffset will be changed by the call to Write_EKLV_Packet
 
-    result = Write_EKLV_Packet(m_File, *m_Dict, m_HeaderPart, m_Info, m_CtFrameBuf, m_FramesWritten, m_StreamOffset, FrameBuf, GenericStream_DataElement.Value(), Ctx, HMAC);
+    result = Write_EKLV_Packet(m_File, *m_Dict, m_HeaderPart, m_Info, m_CtFrameBuf, m_FramesWritten,
+                              m_StreamOffset, FrameBuf, GenericStream_DataElement.Value(),
+                              MXF_BER_LENGTH, Ctx, HMAC);
   }
   return result;
 }
index 55c937d8287724e675a6abd62efafa84672d5be4..1483bfb43dbb789afe72139eb755d75278239c55 100644 (file)
@@ -373,7 +373,7 @@ AS_02::ISXD::MXFWriter::h__Writer::WriteFrame(const ASDCP::FrameBuffer& FrameBuf
 
   if ( KM_SUCCESS(result) )
     {
-      result = WriteEKLVPacket(FrameBuf, m_EssenceUL, Ctx, HMAC);
+      result = WriteEKLVPacket(FrameBuf, m_EssenceUL, MXF_BER_LENGTH, Ctx, HMAC);
       m_FramesWritten++;
     }
 
index 2d8bfa59e132c1712971cbae87ade85406dcbf40..321abfc3ad9d1411ba0dcc443dd27f2fb318c4fa 100644 (file)
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2011-2016, Robert Scheler, Heiko Sparenberg Fraunhofer IIS,
+Copyright (c) 2011-2018, Robert Scheler, Heiko Sparenberg Fraunhofer IIS,
 John Hurst
 
 All rights reserved.
@@ -399,7 +399,7 @@ AS_02::JP2K::MXFWriter::h__Writer::WriteFrame(const ASDCP::JP2K::FrameBuffer& Fr
 
   if ( KM_SUCCESS(result) )
     {
-      result = WriteEKLVPacket(FrameBuf, m_EssenceUL, Ctx, HMAC);
+      result = WriteEKLVPacket(FrameBuf, m_EssenceUL, MXF_BER_LENGTH, Ctx, HMAC);
       m_FramesWritten++;
     }
 
index 61795a34f33dc595f473c9e2a66aa745cd1fd58b..c08efd0bddadf23306173e95842274652537f9dc 100644 (file)
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2011-2016, John Hurst
+Copyright (c) 2011-2018, John Hurst
 
 All rights reserved.
 
@@ -572,7 +572,7 @@ AS_02::PHDR::MXFWriter::h__Writer::WriteFrame(const AS_02::PHDR::FrameBuffer& Fr
       ui64_t this_stream_offset = m_StreamOffset; // m_StreamOffset will be changed by the call to Write_EKLV_Packet
 
       result = Write_EKLV_Packet(m_File, *m_Dict, m_HeaderPart, m_Info, m_CtFrameBuf, m_FramesWritten,
-                                m_StreamOffset, FrameBuf, m_EssenceUL, Ctx, HMAC);
+                                m_StreamOffset, FrameBuf, m_EssenceUL, MXF_BER_LENGTH, Ctx, HMAC);
       
       if ( KM_SUCCESS(result) )
        {
@@ -582,7 +582,8 @@ AS_02::PHDR::MXFWriter::h__Writer::WriteFrame(const AS_02::PHDR::FrameBuffer& Fr
          
          
          result = Write_EKLV_Packet(m_File, *m_Dict, m_HeaderPart, m_Info, m_CtFrameBuf, m_FramesWritten,
-                                    m_StreamOffset, metadata_buffer_wrapper, m_MetadataUL, Ctx, HMAC);
+                                    m_StreamOffset, metadata_buffer_wrapper, m_MetadataUL,
+                                    MXF_BER_LENGTH, Ctx, HMAC);
        }
       
       if ( KM_SUCCESS(result) )
@@ -667,7 +668,8 @@ AS_02::PHDR::MXFWriter::h__Writer::Finalize(const std::string& PHDR_master_metad
              tmp_buf.Size(PHDR_master_metadata.size());
 
              result = Write_EKLV_Packet(m_File, *m_Dict, m_HeaderPart, m_Info, m_CtFrameBuf, m_FramesWritten,
-                                        m_StreamOffset, tmp_buf, GenericStream_DataElement.Value(), 0, 0);
+                                        m_StreamOffset, tmp_buf, GenericStream_DataElement.Value(),
+                                        MXF_BER_LENGTH, 0, 0);
            }
        }
 
index 085d34f0a198c290a5aa46ac7310e5fd6d4a25b5..68683954959b463dfd5139588409eff2a752a8a2 100644 (file)
@@ -523,7 +523,7 @@ AS_02::TimedText::MXFWriter::h__Writer::WriteTimedTextResource(const std::string
       index_entry.StreamOffset = m_StreamOffset;
       
       result = Write_EKLV_Packet(m_File, *m_Dict, m_HeaderPart, m_Info, m_CtFrameBuf, m_FramesWritten,
-                                m_StreamOffset, FrameBuf, m_EssenceUL, Ctx, HMAC);
+                                m_StreamOffset, FrameBuf, m_EssenceUL, MXF_BER_LENGTH, Ctx, HMAC);
     }
 
   if ( KM_SUCCESS(result) )
@@ -620,7 +620,8 @@ AS_02::TimedText::MXFWriter::h__Writer::WriteAncillaryResource(const ASDCP::Time
   if ( KM_SUCCESS(result) )
     {
       result = Write_EKLV_Packet(m_File, *m_Dict, m_HeaderPart, m_Info, m_CtFrameBuf, m_FramesWritten,
-                                m_StreamOffset, FrameBuf, GenericStream_DataElement.Value(), Ctx, HMAC);
+                                m_StreamOffset, FrameBuf, GenericStream_DataElement.Value(),
+                                MXF_BER_LENGTH, Ctx, HMAC);
     }
 
   m_FramesWritten++;
index c4aee7e2b9b40ba031c7d7dd0b6dcd6533d809f0..4be764d8935a30907a0248ca18d6dcbfb90ca579 100644 (file)
@@ -309,6 +309,7 @@ namespace AS_02
       virtual ~h__AS02WriterFrame();
 
       Result_t WriteEKLVPacket(const ASDCP::FrameBuffer& FrameBuf,const byte_t* EssenceUL,
+                              const ui32_t& MinEssenceElementBerLength,
                               AESEncContext* Ctx, HMACContext* HMAC);
     };
 
index 818af2c630e97da32484e975ca910554213944f6..245b46b5240f8db6a65b46439febad0e5e9b18db 100644 (file)
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2004-2016, John Hurst
+Copyright (c) 2004-2018, John Hurst
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -495,7 +495,7 @@ ASDCP::DCData::MXFWriter::h__Writer::WriteFrame(const FrameBuffer& FrameBuf,
   ui64_t 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) )
   {
index 25d452fc32db73a2bd711caffa93c8d7320d5a64..a4bffc67eeefc4c1af7e0e9e3a2b52bf2e9bfcdf 100755 (executable)
@@ -1064,7 +1064,7 @@ lh__Writer::WriteFrame(const JP2K::FrameBuffer& FrameBuf, bool add_index,
   ui64_t 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) && add_index )
     {  
index b7877b54549be8a135afcd77432619bdc55ae2f8..8afa8bc529ee60c34b1af552b18f02c55a9a2113 100755 (executable)
@@ -594,7 +594,7 @@ ASDCP::MPEG2::MXFWriter::h__Writer::WriteFrame(const FrameBuffer& FrameBuf, AESE
   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_FAILURE(result) )
     return result;
index 6cf1d42baa5d7266110f6d81cf35495769d81e73..e7fbff362b81756a8c4386d52158cc0ccc36f54b 100755 (executable)
@@ -627,7 +627,7 @@ ASDCP::PCM::MXFWriter::h__Writer::WriteFrame(const FrameBuffer& FrameBuf, AESEnc
     result = m_State.Goto_RUNNING(); // first time through
 
   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) )
     m_FramesWritten++;
index bf0e25637afb81a7344ce0c121523a9899658201..d3c0fa8b425fcb53ecfe698228145d6f7db99ea4 100644 (file)
@@ -586,7 +586,7 @@ ASDCP::TimedText::MXFWriter::h__Writer::WriteTimedTextResource(const std::string
 
       IndexTableSegment::IndexEntry Entry;
       Entry.StreamOffset = m_StreamOffset;
-      result = WriteEKLVPacket(FrameBuf, m_EssenceUL, Ctx, HMAC);
+      result = WriteEKLVPacket(FrameBuf, m_EssenceUL, MXF_BER_LENGTH, Ctx, HMAC);
 
       if ( ASDCP_SUCCESS(result) )
        {
@@ -625,7 +625,7 @@ ASDCP::TimedText::MXFWriter::h__Writer::WriteAncillaryResource(const ASDCP::Time
   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;
index 41765de5609f88cfc175c98b1d7fff24f85f6011..9b1c6c6d27625db4d94b3e77825ae455b62d6038 100644 (file)
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2011-2016, Robert Scheler, Heiko Sparenberg Fraunhofer IIS,
+Copyright (c) 2011-2018, Robert Scheler, Heiko Sparenberg Fraunhofer IIS,
 John Hurst
 
 All rights reserved.
@@ -183,12 +183,14 @@ AS_02::h__AS02WriterFrame::~h__AS02WriterFrame() {}
 
 //
 Result_t
-AS_02::h__AS02WriterFrame::WriteEKLVPacket(const ASDCP::FrameBuffer& FrameBuf,const byte_t* EssenceUL, AESEncContext* Ctx, HMACContext* HMAC)
+AS_02::h__AS02WriterFrame::WriteEKLVPacket(const ASDCP::FrameBuffer& FrameBuf,const byte_t* EssenceUL,
+                                          const ui32_t& MinEssenceElementBerLength,
+                                          AESEncContext* Ctx, HMACContext* HMAC)
 {
   ui64_t this_stream_offset = m_StreamOffset; // m_StreamOffset will be changed by the call to Write_EKLV_Packet
 
   Result_t result = Write_EKLV_Packet(m_File, *m_Dict, m_HeaderPart, m_Info, m_CtFrameBuf, m_FramesWritten,
-                                     m_StreamOffset, FrameBuf, EssenceUL, Ctx, HMAC);
+                                     m_StreamOffset, FrameBuf, EssenceUL, MinEssenceElementBerLength, Ctx, HMAC);
 
   if ( KM_SUCCESS(result) )
     {  
index 99d835a449306ec4d8c5bd338cfa4fffa33a485c..71e9ce63bc268897cbd1fe1b712b2424738b77a5 100755 (executable)
@@ -285,6 +285,11 @@ ASDCP::h__ASDCPWriter::WriteASDCPHeader(const std::string& PackageLabel, const U
   AddSourceClip(EditRate, EditRate, TCFrameRate, TrackName, EssenceUL, DataDefinition, PackageLabel);
   AddEssenceDescriptor(WrappingUL);
 
+#ifdef ASDCP_GCMULTI_PATCH
+  UL GenericContainerUL(m_Dict->ul(MDD_GCMulti));
+  m_HeaderPart.EssenceContainers.push_back(GenericContainerUL);
+#endif
+
   Result_t result = m_HeaderPart.WriteToFile(m_File, m_HeaderSize);
 
   if ( KM_SUCCESS(result) )
@@ -296,10 +301,12 @@ ASDCP::h__ASDCPWriter::WriteASDCPHeader(const std::string& PackageLabel, const U
 //
 Result_t
 ASDCP::h__ASDCPWriter::WriteEKLVPacket(const ASDCP::FrameBuffer& FrameBuf,const byte_t* EssenceUL,
+                                      const ui32_t& MinEssenceElementBerLength,               
                                       AESEncContext* Ctx, HMACContext* HMAC)
 {
   return Write_EKLV_Packet(m_File, *m_Dict, m_HeaderPart, m_Info, m_CtFrameBuf, m_FramesWritten,
-                          m_StreamOffset, FrameBuf, EssenceUL, Ctx, HMAC);
+                          m_StreamOffset, FrameBuf, EssenceUL, MinEssenceElementBerLength,
+                          Ctx, HMAC);
 }
 
 // standard method of writing the header and footer of a completed MXF file
@@ -358,6 +365,7 @@ Result_t
 ASDCP::Write_EKLV_Packet(Kumu::FileWriter& File, const ASDCP::Dictionary& Dict, const MXF::OP1aHeader& HeaderPart,
                         const ASDCP::WriterInfo& Info, ASDCP::FrameBuffer& CtFrameBuf, ui32_t& FramesWritten,
                         ui64_t & StreamOffset, const ASDCP::FrameBuffer& FrameBuf, const byte_t* EssenceUL,
+                        const ui32_t& MinEssenceElementBerLength,
                         AESEncContext* Ctx, HMACContext* HMAC)
 {
   Result_t result = RESULT_OK;
@@ -396,7 +404,7 @@ ASDCP::Write_EKLV_Packet(Kumu::FileWriter& File, const ASDCP::Dictionary& Dict,
 
          // construct encrypted triplet header
          ui32_t ETLength = klv_cryptinfo_size + CtFrameBuf.Size();
-         ui32_t BER_length = MXF_BER_LENGTH;
+         ui32_t essence_element_BER_length = MinEssenceElementBerLength;
 
          if ( Info.UsesHMAC )
            ETLength += klv_intpack_size;
@@ -405,18 +413,18 @@ ASDCP::Write_EKLV_Packet(Kumu::FileWriter& File, const ASDCP::Dictionary& Dict,
 
          if ( ETLength > 0x00ffffff ) // Need BER integer longer than MXF_BER_LENGTH bytes
            {
-             BER_length = Kumu::get_BER_length_for_value(ETLength);
+             essence_element_BER_length = Kumu::get_BER_length_for_value(ETLength);
 
              // the packet is longer by the difference in expected vs. actual BER length
-             ETLength += BER_length - MXF_BER_LENGTH;
+             ETLength += essence_element_BER_length - MXF_BER_LENGTH;
 
-             if ( BER_length == 0 )
+             if ( essence_element_BER_length == 0 )
                result = RESULT_KLV_CODING;
            }
 
          if ( ASDCP_SUCCESS(result) )
            {
-             if ( ! ( Overhead.WriteBER(ETLength, BER_length)                      // write encrypted triplet length
+             if ( ! ( Overhead.WriteBER(ETLength, essence_element_BER_length)                      // write encrypted triplet length
                       && Overhead.WriteBER(UUIDlen, MXF_BER_LENGTH)                // write ContextID length
                       && Overhead.WriteRaw(Info.ContextID, UUIDlen)              // write ContextID
                       && Overhead.WriteBER(sizeof(ui64_t), MXF_BER_LENGTH)         // write PlaintextOffset length
@@ -425,7 +433,7 @@ ASDCP::Write_EKLV_Packet(Kumu::FileWriter& File, const ASDCP::Dictionary& Dict,
                       && Overhead.WriteRaw((byte_t*)EssenceUL, SMPTE_UL_LENGTH)    // write the essence UL
                       && Overhead.WriteBER(sizeof(ui64_t), MXF_BER_LENGTH)         // write SourceLength length
                       && Overhead.WriteUi64BE(FrameBuf.Size())                     // write SourceLength
-                      && Overhead.WriteBER(CtFrameBuf.Size(), BER_length) ) )    // write ESV length
+                      && Overhead.WriteBER(CtFrameBuf.Size(), essence_element_BER_length) ) )    // write ESV length
                {
                  result = RESULT_KLV_CODING;
                }
@@ -467,18 +475,18 @@ ASDCP::Write_EKLV_Packet(Kumu::FileWriter& File, const ASDCP::Dictionary& Dict,
     }
   else
     {
-      ui32_t BER_length = MXF_BER_LENGTH;
+      ui32_t essence_element_BER_length = MinEssenceElementBerLength;
 
       if ( FrameBuf.Size() > 0x00ffffff ) // Need BER integer longer than MXF_BER_LENGTH bytes
        {
-         BER_length = Kumu::get_BER_length_for_value(FrameBuf.Size());
+         essence_element_BER_length = Kumu::get_BER_length_for_value(FrameBuf.Size());
 
-         if ( BER_length == 0 )
+         if ( essence_element_BER_length == 0 )
            result = RESULT_KLV_CODING;
        }
 
       Overhead.WriteRaw((byte_t*)EssenceUL, SMPTE_UL_LENGTH);
-      Overhead.WriteBER(FrameBuf.Size(), BER_length);
+      Overhead.WriteBER(FrameBuf.Size(), essence_element_BER_length);
 
       if ( ASDCP_SUCCESS(result) )
        result = File.Writev(Overhead.Data(), Overhead.Length());