Merge pull request #25 from remia/fix/non-pod-variadic-warning
[asdcplib.git] / src / AS_02_PHDR.cpp
index dd413f968eb620502adb548aac30611426bb5510..c08efd0bddadf23306173e95842274652537f9dc 100644 (file)
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2011-2015, John Hurst
+Copyright (c) 2011-2018, John Hurst
 
 All rights reserved.
 
@@ -144,8 +144,8 @@ AS_02::PHDR::MXFReader::h__Reader::OpenRead(const std::string& filename, std::st
   // if PHDRSimplePayload exists, go get it
   if ( KM_SUCCESS(result) && SimplePayloadSID )
     {
-      Array<RIP::Pair>::const_iterator pi;
-      RIP::Pair TmpPair;
+      RIP::const_pair_iterator pi;
+      RIP::PartitionPair TmpPair;
       
       // Look up the partition start in the RIP using the SID.
       for ( pi = m_RIP.PairArray.begin(); pi != m_RIP.PairArray.end(); ++pi )
@@ -445,7 +445,7 @@ AS_02::PHDR::MXFWriter::h__Writer::WritePHDRHeader(const std::string& PackageLab
       return RESULT_PARAM;
     }
   
-  InitHeader();
+  InitHeader(MXFVersion_2011);
   
   AddSourceClip(EditRate, EditRate/*TODO: for a moment*/, TCFrameRate, TrackName, EssenceUL, DataDefinition, PackageLabel);
 
@@ -485,7 +485,7 @@ AS_02::PHDR::MXFWriter::h__Writer::WritePHDRHeader(const std::string& PackageLab
   AddEssenceDescriptor(WrappingUL);
 
   m_IndexWriter.SetPrimerLookup(&m_HeaderPart.m_Primer);
-  m_RIP.PairArray.push_back(RIP::Pair(0, 0)); // Header partition RIP entry
+  m_RIP.PairArray.push_back(RIP::PartitionPair(0, 0)); // Header partition RIP entry
   m_IndexWriter.OperationalPattern = m_HeaderPart.OperationalPattern;
   m_IndexWriter.EssenceContainers = m_HeaderPart.EssenceContainers;
 
@@ -500,11 +500,13 @@ AS_02::PHDR::MXFWriter::h__Writer::WritePHDRHeader(const std::string& PackageLab
       UL body_ul(m_Dict->ul(MDD_ClosedCompleteBodyPartition));
       Partition body_part(m_Dict);
       body_part.BodySID = 1;
+      body_part.MajorVersion = m_HeaderPart.MajorVersion;
+      body_part.MinorVersion = m_HeaderPart.MinorVersion;
       body_part.OperationalPattern = m_HeaderPart.OperationalPattern;
       body_part.EssenceContainers = m_HeaderPart.EssenceContainers;
       body_part.ThisPartition = m_ECStart;
       result = body_part.WriteToFile(m_File, body_ul);
-      m_RIP.PairArray.push_back(RIP::Pair(1, body_part.ThisPartition)); // Second RIP Entry
+      m_RIP.PairArray.push_back(RIP::PartitionPair(1, body_part.ThisPartition)); // Second RIP Entry
     }
 
   return result;
@@ -530,7 +532,7 @@ AS_02::PHDR::MXFWriter::h__Writer::SetSourceStream(const std::string& label, con
 
   if ( KM_SUCCESS(result) )
     {
-      result = WritePHDRHeader(label, UL(m_Dict->ul(MDD_JPEG_2000WrappingFrame)),
+      result = WritePHDRHeader(label, UL(m_Dict->ul(MDD_MXFGCFUFrameWrappedPictureElement)),
                               PICT_DEF_LABEL, UL(m_EssenceUL), UL(m_Dict->ul(MDD_PictureDataDef)),
                               edit_rate, derive_timecode_rate_from_edit_rate(edit_rate));
 
@@ -570,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) )
        {
@@ -580,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) )
@@ -592,20 +595,21 @@ AS_02::PHDR::MXFWriter::h__Writer::WriteFrame(const AS_02::PHDR::FrameBuffer& Fr
 
       if ( m_FramesWritten > 1 && ( ( m_FramesWritten + 1 ) % m_PartitionSpace ) == 0 )
        {
-         m_IndexWriter.ThisPartition = m_File.Tell();
-         m_IndexWriter.WriteToFile(m_File);
-         m_RIP.PairArray.push_back(RIP::Pair(0, m_IndexWriter.ThisPartition));
+         assert(m_IndexWriter.GetDuration() > 0);
+         FlushIndexPartition();
 
          UL body_ul(m_Dict->ul(MDD_ClosedCompleteBodyPartition));
          Partition body_part(m_Dict);
          body_part.BodySID = 1;
+         body_part.MajorVersion = m_HeaderPart.MajorVersion;
+         body_part.MinorVersion = m_HeaderPart.MinorVersion;
          body_part.OperationalPattern = m_HeaderPart.OperationalPattern;
          body_part.EssenceContainers = m_HeaderPart.EssenceContainers;
          body_part.ThisPartition = m_File.Tell();
 
          body_part.BodyOffset = m_StreamOffset;
          result = body_part.WriteToFile(m_File, body_ul);
-         m_RIP.PairArray.push_back(RIP::Pair(1, body_part.ThisPartition));
+         m_RIP.PairArray.push_back(RIP::PartitionPair(1, body_part.ThisPartition));
        }
     }
 
@@ -623,18 +627,16 @@ Result_t
 AS_02::PHDR::MXFWriter::h__Writer::Finalize(const std::string& PHDR_master_metadata)
 {
   if ( ! m_State.Test_RUNNING() )
-    return RESULT_STATE;
+    {
+      KM_RESULT_STATE_HERE();
+      return RESULT_STATE;
+    }
 
   Result_t result = m_State.Goto_FINAL();
 
   if ( KM_SUCCESS(result) )
     {
-      if ( m_IndexWriter.GetDuration() > 0 )
-       {
-         m_IndexWriter.ThisPartition = this->m_File.Tell();
-         m_IndexWriter.WriteToFile(this->m_File);
-         m_RIP.PairArray.push_back(RIP::Pair(0, this->m_IndexWriter.ThisPartition));
-       }
+      FlushIndexPartition();
 
       if ( ! PHDR_master_metadata.empty() )
        {
@@ -645,13 +647,15 @@ AS_02::PHDR::MXFWriter::h__Writer::Finalize(const std::string& PHDR_master_metad
          static UL GenericStream_DataElement(m_Dict->ul(MDD_GenericStream_DataElement));
          ASDCP::MXF::Partition GSPart(m_Dict);
 
+         GSPart.MajorVersion = m_HeaderPart.MajorVersion;
+         GSPart.MinorVersion = m_HeaderPart.MinorVersion;
          GSPart.ThisPartition = here;
          GSPart.PreviousPartition = m_RIP.PairArray.back().ByteOffset;
          GSPart.OperationalPattern = m_HeaderPart.OperationalPattern;
          GSPart.BodySID = 2;
          m_MetadataTrackSubDescriptor->SimplePayloadSID = 2;
 
-         m_RIP.PairArray.push_back(RIP::Pair(2, here));
+         m_RIP.PairArray.push_back(RIP::PartitionPair(2, here));
          GSPart.EssenceContainers = m_HeaderPart.EssenceContainers;
 
          static UL gs_part_ul(m_Dict->ul(MDD_GenericStreamPartition));
@@ -664,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);
            }
        }