version bump
[asdcplib.git] / src / AS_02_PHDR.cpp
index c6017efe5d8944bc24ebce538e7d31638fb7f076..db9228a8fa32159883d49c96a1d13e3808284f63 100644 (file)
@@ -57,7 +57,12 @@ AS_02::PHDR::FrameBuffer::Dump(FILE* stream, ui32_t dump_bytes) const
   if ( stream == 0 )
     stream = stderr;
 
-  fprintf(stream, "Hello, HDR world!\n");
+  fprintf(stream, "Frame %d, %d bytes (metadata: %zd bytes)\n", FrameNumber(), Size(), OpaqueMetadata.size());
+
+  if ( dump_bytes > 0 )
+    {
+      Kumu::hexdump(RoData(), Kumu::xmin(dump_bytes, Size()), stream);
+    }
 }
 
 
@@ -188,8 +193,6 @@ AS_02::PHDR::MXFReader::h__Reader::OpenRead(const std::string& filename, std::st
        }
     }
 
-  m_IndexAccess.Dump();
-
   return result;
 }
 
@@ -217,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;
@@ -390,7 +398,7 @@ AS_02::PHDR::MXFWriter::h__Writer::OpenWrite(const std::string& filename,
   if ( KM_SUCCESS(result) )
     {
       m_IndexStrategy = IndexStrategy;
-      m_PartitionSpace = PartitionSpace_sec; // later converted to edit units by SetSourceStream()
+      m_PartitionSpace = PartitionSpace_sec; // later converted to edit units by WritePHDRHeader()
       m_HeaderSize = HeaderSize;
 
       if ( essence_descriptor->GetUL() != UL(m_Dict->ul(MDD_RGBAEssenceDescriptor))
@@ -446,7 +454,7 @@ AS_02::PHDR::MXFWriter::h__Writer::WritePHDRHeader(const std::string& PackageLab
     CreateTrackAndSequence<SourcePackage, SourceClip>(m_HeaderPart, *m_FilePackage,
                                                      MD_DEF_LABEL, EditRate,
                                                      UL(m_Dict->ul(MDD_PHDRImageMetadataItem)),
-                                                     3, m_Dict);
+                                                     3 /* track id */, m_Dict);
 
   metdata_track.Sequence->Duration.set_has_value();
   m_DurationUpdateList.push_back(&(metdata_track.Sequence->Duration.get()));
@@ -559,18 +567,46 @@ 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, 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, 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 )
+       {
+         m_IndexWriter.ThisPartition = m_File.Tell();
+         m_IndexWriter.WriteToFile(m_File);
+         m_RIP.PairArray.push_back(RIP::Pair(0, m_IndexWriter.ThisPartition));
+
+         UL body_ul(m_Dict->ul(MDD_ClosedCompleteBodyPartition));
+         Partition body_part(m_Dict);
+         body_part.BodySID = 1;
+         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));
+       }
     }
 
   if ( KM_SUCCESS(result) )
@@ -629,8 +665,6 @@ AS_02::PHDR::MXFWriter::h__Writer::Finalize(const std::string& PHDR_master_metad
 
              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_FramesWritten++;
            }
        }