Merge pull request #20 from cinecert/htj2c
[asdcplib.git] / src / AS_02_PHDR.cpp
index d856c601e28e0e3f13b82f7b6c890ab0279b6d13..c08efd0bddadf23306173e95842274652537f9dc 100644 (file)
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2011-2014, 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 )
@@ -193,7 +193,6 @@ AS_02::PHDR::MXFReader::h__Reader::OpenRead(const std::string& filename, std::st
        }
     }
 
-  m_IndexAccess.Dump();
   return result;
 }
 
@@ -221,6 +220,11 @@ AS_02::PHDR::MXFReader::h__Reader::ReadFrame(ui32_t FrameNum, AS_02::PHDR::Frame
        {
          FrameBuf.OpaqueMetadata.assign((const char*)tmp_metadata_buffer.RoData(), tmp_metadata_buffer.Size());
        }
+      else
+       {
+         DefaultLogSink().Error("Metadata packet not found at frame %d.\n", FrameNum);
+         result = RESULT_OK;
+       }
     }
 
   return result;
@@ -441,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);
 
@@ -481,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;
 
@@ -496,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;
@@ -526,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));
 
@@ -563,18 +569,48 @@ AS_02::PHDR::MXFWriter::h__Writer::WriteFrame(const AS_02::PHDR::FrameBuffer& Fr
 
   if ( KM_SUCCESS(result) )
     {
-      result = WriteEKLVPacket(FrameBuf, m_EssenceUL, Ctx, HMAC);
-    }
-
-  if ( KM_SUCCESS(result) )
-    {
-      ASDCP::FrameBuffer metadata_buffer_wrapper;
-      metadata_buffer_wrapper.SetData((byte_t*)(FrameBuf.OpaqueMetadata.c_str()), FrameBuf.OpaqueMetadata.size());
-      metadata_buffer_wrapper.Size(FrameBuf.OpaqueMetadata.size());
-
+      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, metadata_buffer_wrapper, m_MetadataUL, Ctx, HMAC);
+                                m_StreamOffset, FrameBuf, m_EssenceUL, MXF_BER_LENGTH, Ctx, HMAC);
+      
+      if ( KM_SUCCESS(result) )
+       {
+         ASDCP::FrameBuffer metadata_buffer_wrapper;
+         metadata_buffer_wrapper.SetData((byte_t*)(FrameBuf.OpaqueMetadata.c_str()), FrameBuf.OpaqueMetadata.size());
+         metadata_buffer_wrapper.Size(FrameBuf.OpaqueMetadata.size());
+         
+         
+         result = Write_EKLV_Packet(m_File, *m_Dict, m_HeaderPart, m_Info, m_CtFrameBuf, m_FramesWritten,
+                                    m_StreamOffset, metadata_buffer_wrapper, m_MetadataUL,
+                                    MXF_BER_LENGTH, Ctx, HMAC);
+       }
+      
+      if ( KM_SUCCESS(result) )
+       {  
+         IndexTableSegment::IndexEntry Entry;
+         Entry.StreamOffset = this_stream_offset;
+         m_IndexWriter.PushIndexEntry(Entry);
+       }
+
+      if ( m_FramesWritten > 1 && ( ( m_FramesWritten + 1 ) % m_PartitionSpace ) == 0 )
+       {
+         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::PartitionPair(1, body_part.ThisPartition));
+       }
     }
 
   if ( KM_SUCCESS(result) )
@@ -591,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() )
        {
@@ -613,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));
@@ -632,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);
            }
        }