Add PCMParserList.h to list of extra exported headers.
[asdcplib.git] / src / h__Reader.cpp
index 268f3086624f74e038484cd68bfdaea2cb2bccef..d329e603bc474bed6023f9a4da15c4060b39fe4c 100755 (executable)
@@ -108,19 +108,23 @@ ASDCP::h__Reader::OpenMXFRead(const char* filename)
   if ( ASDCP_SUCCESS(result) )
     result = m_HeaderPart.InitFromFile(m_File);
 
-  // if this is a three partition file, go to the body
-  // partition and read off the partition pack
-  if ( m_HeaderPart.m_RIP.PairArray.size() == 3 )
+  if ( ASDCP_SUCCESS(result) )
     {
-      Array<RIP::Pair>::iterator r_i = m_HeaderPart.m_RIP.PairArray.begin();
-      r_i++;
-      m_File.Seek((*r_i).ByteOffset);
+      // if this is a three partition file, go to the body
+      // partition and read the partition pack
+      if ( m_HeaderPart.m_RIP.PairArray.size() > 2 )
+       {
+         Array<RIP::Pair>::iterator r_i = m_HeaderPart.m_RIP.PairArray.begin();
+         r_i++;
+         m_File.Seek((*r_i).ByteOffset);
 
-      result = m_BodyPart.InitFromFile(m_File);
+         result = m_BodyPart.InitFromFile(m_File);
+       }
+
+      m_EssenceStart = m_File.Tell();
     }
 
-  m_EssenceStart = m_File.Tell();
-  return RESULT_OK;
+  return result;
 }
 
 
@@ -146,54 +150,42 @@ ASDCP::h__Reader::InitMXFIndex()
 }
 
 //
-class KLReader : public ASDCP::KLVPacket
+Result_t
+ASDCP::KLReader::ReadKLFromFile(Kumu::FileReader& Reader)
 {
-  ASDCP_NO_COPY_CONSTRUCT(KLReader);
-  byte_t m_KeyBuf[32];
-
-public:
-  KLReader() {}
-  ~KLReader() {}
-
-  inline const byte_t* Key() { return m_KeyBuf; }
-  inline const ui64_t  Length() { return m_ValueLength; }
-  inline const ui64_t  KLLength() { return m_KLLength; }
-
-  Result_t ReadKLFromFile(Kumu::FileReader& Reader)
-  {
-    ui32_t read_count;
-    ui32_t header_length = SMPTE_UL_LENGTH + MXF_BER_LENGTH;
-    Result_t result = Reader.Read(m_KeyBuf, header_length, &read_count);
+  ui32_t read_count;
+  ui32_t header_length = SMPTE_UL_LENGTH + MXF_BER_LENGTH;
+  Result_t result = Reader.Read(m_KeyBuf, header_length, &read_count);
 
-    if ( read_count != header_length )
-      return RESULT_READFAIL;
+  if ( ASDCP_SUCCESS(result) )
+    {
+      if ( read_count != header_length )
+       result = RESULT_READFAIL;
   
-    if ( ASDCP_SUCCESS(result) )
-      result = InitFromBuffer(m_KeyBuf, header_length);
-
-    return result;
-  }
-};
+      else
+       result = InitFromBuffer(m_KeyBuf, header_length);
+    }
 
+  return result;
+}
 
 // standard method of reading a plaintext or encrypted frame
 Result_t
-ASDCP::h__Reader::ReadEKLVPacket(ui32_t FrameNum, ASDCP::FrameBuffer& FrameBuf,
-                                const byte_t* EssenceUL, AESDecContext* Ctx, HMACContext* HMAC)
+ASDCP::h__Reader::ReadEKLVFrame(ui32_t FrameNum, ASDCP::FrameBuffer& FrameBuf,
+                               const byte_t* EssenceUL, AESDecContext* Ctx, HMACContext* HMAC)
 {
   // look up frame index node
   IndexTableSegment::IndexEntry TmpEntry;
 
   if ( ASDCP_FAILURE(m_FooterPart.Lookup(FrameNum, TmpEntry)) )
     {
-      DefaultLogSink().Error("Frame value out of range: %lu\n", FrameNum);
+      DefaultLogSink().Error("Frame value out of range: %u\n", FrameNum);
       return RESULT_RANGE;
     }
 
   // get frame position and go read the frame's key and length
-  Result_t result = RESULT_OK;
-  KLReader Reader;
   Kumu::fpos_t FilePosition = m_EssenceStart + TmpEntry.StreamOffset;
+  Result_t result = RESULT_OK;
 
   if ( FilePosition != m_LastPosition )
     {
@@ -201,8 +193,19 @@ ASDCP::h__Reader::ReadEKLVPacket(ui32_t FrameNum, ASDCP::FrameBuffer& FrameBuf,
       result = m_File.Seek(FilePosition);
     }
 
-  if ( ASDCP_SUCCESS(result) )
-    result = Reader.ReadKLFromFile(m_File);
+  if( ASDCP_SUCCESS(result) )
+    result = ReadEKLVPacket(FrameNum, FrameNum + 1, FrameBuf, EssenceUL, Ctx, HMAC);
+
+  return result;
+}
+
+
+Result_t
+ASDCP::h__Reader::ReadEKLVPacket(ui32_t FrameNum, ui32_t SequenceNum, ASDCP::FrameBuffer& FrameBuf,
+                                const byte_t* EssenceUL, AESDecContext* Ctx, HMACContext* HMAC)
+{
+  KLReader Reader;
+  Result_t result = Reader.ReadKLFromFile(m_File);
 
   if ( ASDCP_FAILURE(result) )
     return result;
@@ -221,9 +224,11 @@ ASDCP::h__Reader::ReadEKLVPacket(ui32_t FrameNum, ASDCP::FrameBuffer& FrameBuf,
        }
 
       // read encrypted triplet value into internal buffer
-      m_CtFrameBuf.Capacity(PacketLength);
+      assert(PacketLength <= 0xFFFFFFFFL);
+      m_CtFrameBuf.Capacity((ui32_t) PacketLength);
       ui32_t read_count;
-      result = m_File.Read(m_CtFrameBuf.Data(), PacketLength, &read_count);
+      result = m_File.Read(m_CtFrameBuf.Data(), (ui32_t) PacketLength,
+                          &read_count);
 
       if ( ASDCP_FAILURE(result) )
        return result;
@@ -234,7 +239,7 @@ ASDCP::h__Reader::ReadEKLVPacket(ui32_t FrameNum, ASDCP::FrameBuffer& FrameBuf,
           return RESULT_FORMAT;
         }
 
-      m_CtFrameBuf.Size(PacketLength);
+      m_CtFrameBuf.Size((ui32_t) PacketLength);
 
       // should be const but mxflib::ReadBER is not
       byte_t* ess_p = m_CtFrameBuf.Data();
@@ -285,7 +290,7 @@ ASDCP::h__Reader::ReadEKLVPacket(ui32_t FrameNum, ASDCP::FrameBuffer& FrameBuf,
          
       if ( FrameBuf.Capacity() < SourceLength )
        {
-         DefaultLogSink().Error("FrameBuf.Capacity: %lu SourceLength: %lu\n", FrameBuf.Capacity(), SourceLength);
+         DefaultLogSink().Error("FrameBuf.Capacity: %u SourceLength: %u\n", FrameBuf.Capacity(), SourceLength);
          return RESULT_SMALLBUF;
        }
 
@@ -294,7 +299,7 @@ ASDCP::h__Reader::ReadEKLVPacket(ui32_t FrameNum, ASDCP::FrameBuffer& FrameBuf,
       // read ESV length
       if ( ! Kumu::read_test_BER(&ess_p, esv_length) )
        {
-         DefaultLogSink().Error("read_test_BER did not return %lu\n", esv_length);
+         DefaultLogSink().Error("read_test_BER did not return %u\n", esv_length);
          return RESULT_FORMAT;
        }
 
@@ -323,13 +328,18 @@ ASDCP::h__Reader::ReadEKLVPacket(ui32_t FrameNum, ASDCP::FrameBuffer& FrameBuf,
          if ( ASDCP_SUCCESS(result) && m_Info.UsesHMAC && HMAC )
            {
              IntegrityPack IntPack;
-             result = IntPack.TestValues(TmpWrapper, m_Info.AssetUUID, FrameNum + 1, HMAC);
+             result = IntPack.TestValues(TmpWrapper, m_Info.AssetUUID, SequenceNum, HMAC);
            }
        }
       else // return ciphertext to caller
        {
          if ( FrameBuf.Capacity() < tmp_len )
-           return RESULT_SMALLBUF;
+           {
+             char intbuf[IntBufferLen];
+             DefaultLogSink().Error("FrameBuf.Capacity: %u FrameLength: %s\n",
+                                    FrameBuf.Capacity(), ui64sz(PacketLength, intbuf));
+             return RESULT_SMALLBUF;
+           }
 
          memcpy(FrameBuf.Data(), ess_p, tmp_len);
          FrameBuf.Size(tmp_len);
@@ -342,14 +352,15 @@ ASDCP::h__Reader::ReadEKLVPacket(ui32_t FrameNum, ASDCP::FrameBuffer& FrameBuf,
        if ( FrameBuf.Capacity() < PacketLength )
        {
          char intbuf[IntBufferLen];
-         DefaultLogSink().Error("FrameBuf.Capacity: %lu FrameLength: %s\n",
+         DefaultLogSink().Error("FrameBuf.Capacity: %u FrameLength: %s\n",
                                 FrameBuf.Capacity(), ui64sz(PacketLength, intbuf));
          return RESULT_SMALLBUF;
        }
 
       // read the data into the supplied buffer
       ui32_t read_count;
-      result = m_File.Read(FrameBuf.Data(), PacketLength, &read_count);
+      assert(PacketLength <= 0xFFFFFFFFL);
+      result = m_File.Read(FrameBuf.Data(), (ui32_t) PacketLength, &read_count);
          
       if ( ASDCP_FAILURE(result) )
        return result;