ReadFileIntoString() modified to return OK when the file is empty
[asdcplib.git] / src / AS_02_JP2K.cpp
index a8eff1a4e91060e5bfefb0d4326fd386be49a159..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.
@@ -55,8 +55,6 @@ class AS_02::JP2K::MXFReader::h__Reader : public AS_02::h__AS02Reader
   ASDCP_NO_COPY_CONSTRUCT(h__Reader);
 
 public:
-  PictureDescriptor m_PDesc;        // codestream parameter list
-
   h__Reader(const Dictionary& d) :
     AS_02::h__AS02Reader(d) {}
 
@@ -70,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) )
     {
@@ -225,11 +223,31 @@ 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);
+    }
+}
 
 //------------------------------------------------------------------------------------------
 
 //
-class AS_02::JP2K::MXFWriter::h__Writer : public AS_02::h__AS02Writer
+class AS_02::JP2K::MXFWriter::h__Writer : public AS_02::h__AS02WriterFrame
 {
   ASDCP_NO_COPY_CONSTRUCT(h__Writer);
   h__Writer();
@@ -237,10 +255,9 @@ class AS_02::JP2K::MXFWriter::h__Writer : public AS_02::h__AS02Writer
   JPEG2000PictureSubDescriptor* m_EssenceSubDescriptor;
 
 public:
-  PictureDescriptor m_PDesc;
   byte_t            m_EssenceUL[SMPTE_UL_LENGTH];
 
-  h__Writer(const Dictionary& d) : h__AS02Writer(d), m_EssenceSubDescriptor(0) {
+  h__Writer(const Dictionary& d) : h__AS02WriterFrame(d), m_EssenceSubDescriptor(0) {
     memset(m_EssenceUL, 0, SMPTE_UL_LENGTH);
   }
 
@@ -267,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 )
@@ -322,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);
@@ -331,9 +350,26 @@ 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);
+       }
     }
 
   return result;
@@ -363,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++;
     }
 
@@ -376,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();