Merge pull request #25 from remia/fix/non-pod-variadic-warning
[asdcplib.git] / src / AS_02_JP2K.cpp
index 48b98fec44d44fd7538b754dc9728fbf447cc8c9..321abfc3ad9d1411ba0dcc443dd27f2fb318c4fa 100644 (file)
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2011-2013, Robert Scheler, Heiko Sparenberg Fraunhofer IIS,
+Copyright (c) 2011-2018, Robert Scheler, Heiko Sparenberg Fraunhofer IIS,
 John Hurst
 
 All rights reserved.
@@ -68,7 +68,7 @@ public:
 Result_t
 AS_02::JP2K::MXFReader::h__Reader::OpenRead(const std::string& filename)
 {
-  Result_t result = OpenMXFRead(filename.c_str());
+  Result_t result = OpenMXFRead(filename);
 
   if( KM_SUCCESS(result) )
     {
@@ -223,6 +223,26 @@ AS_02::JP2K::MXFReader::FillWriterInfo(WriterInfo& Info) const
   return RESULT_INIT;
 }
 
+//
+void
+AS_02::JP2K::MXFReader::DumpHeaderMetadata(FILE* stream) const
+{
+  if ( m_Reader && m_Reader->m_File.IsOpen() )
+    {
+      m_Reader->m_HeaderPart.Dump(stream);
+    }
+}
+
+
+//
+void
+AS_02::JP2K::MXFReader::DumpIndex(FILE* stream) const
+{
+  if ( m_Reader && m_Reader->m_File.IsOpen() )
+    {
+      m_Reader->m_IndexAccess.Dump(stream);
+    }
+}
 
 //------------------------------------------------------------------------------------------
 
@@ -264,7 +284,8 @@ AS_02::JP2K::MXFWriter::h__Writer::OpenWrite(const std::string& filename,
 {
   if ( ! m_State.Test_BEGIN() )
     {
-      return RESULT_STATE;
+      KM_RESULT_STATE_HERE();
+       return RESULT_STATE;
     }
 
   if ( m_IndexStrategy != AS_02::IS_FOLLOW )
@@ -319,7 +340,8 @@ AS_02::JP2K::MXFWriter::h__Writer::SetSourceStream(const std::string& label, con
   assert(m_Dict);
   if ( ! m_State.Test_INIT() )
     {
-      return RESULT_STATE;
+      KM_RESULT_STATE_HERE();
+       return RESULT_STATE;
     }
 
   memcpy(m_EssenceUL, m_Dict->ul(MDD_JPEG2000Essence), SMPTE_UL_LENGTH);
@@ -328,13 +350,25 @@ AS_02::JP2K::MXFWriter::h__Writer::SetSourceStream(const std::string& label, con
 
   if ( KM_SUCCESS(result) )
     {
-      result = WriteAS02Header(label, UL(m_Dict->ul(MDD_JPEG_2000WrappingFrame)),
+      UL wrapping_label = UL(m_Dict->ul(MDD_MXFGCP1FrameWrappedPictureElement));
+
+      CDCIEssenceDescriptor *cdci_descriptor = dynamic_cast<CDCIEssenceDescriptor*>(m_EssenceDescriptor);
+      if ( cdci_descriptor )
+       {
+         if ( cdci_descriptor->FrameLayout ) // 0 == progressive, 1 == interlace
+           {
+             wrapping_label = UL(m_Dict->ul(MDD_MXFGCI1FrameWrappedPictureElement));
+           }
+       }
+
+      result = WriteAS02Header(label, wrapping_label,
                               PICT_DEF_LABEL, UL(m_EssenceUL), UL(m_Dict->ul(MDD_PictureDataDef)),
                               edit_rate, derive_timecode_rate_from_edit_rate(edit_rate));
 
       if ( KM_SUCCESS(result) )
        {
          this->m_IndexWriter.SetPrimerLookup(&this->m_HeaderPart.m_Primer);
+         this->m_IndexWriter.SetEditRate(m_EssenceDescriptor->SampleRate);
        }
     }
 
@@ -365,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++;
     }
 
@@ -378,7 +412,10 @@ Result_t
 AS_02::JP2K::MXFWriter::h__Writer::Finalize()
 {
   if ( ! m_State.Test_RUNNING() )
-    return RESULT_STATE;
+    {
+      KM_RESULT_STATE_HERE();
+       return RESULT_STATE;
+    }
 
   Result_t result = m_State.Goto_FINAL();