Modify to test email notice.
[asdcplib.git] / src / PCM_Parser.cpp
index 70cc277e0bc27b0a15a47e3da150b8e65f8c4e20..072c2356a96c00163fd718aac3917b0227c5e381 100755 (executable)
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2004, John Hurst
+Copyright (c) 2004-2011, John Hurst
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -31,10 +31,13 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 #include <Wav.h>
 #include <assert.h>
+#include <KM_log.h>
+using Kumu::DefaultLogSink;
 
 using namespace ASDCP;
 using namespace ASDCP::PCM;
 using namespace ASDCP::Wav;
+using namespace ASDCP::RF64;
 
 
 //------------------------------------------------------------------------------------------
@@ -42,11 +45,11 @@ using namespace ASDCP::Wav;
 //
 class ASDCP::PCM::WAVParser::h__WAVParser
 {
-  FileReader       m_FileReader;
+  Kumu::FileReader m_FileReader;
   bool             m_EOF;
   ui32_t           m_DataStart;
-  ui32_t           m_DataLength;
-  ui32_t           m_ReadCount;
+  ui64_t           m_DataLength;
+  ui64_t           m_ReadCount;
   ui32_t           m_FrameBufferSize;
   ui32_t           m_FramesRead;
   Rational         m_PictureRate;
@@ -66,10 +69,11 @@ public:
     Close();
    }
 
-  Result_t OpenRead(const char* filename, const Rational& PictureRate);
+  Result_t OpenRead(const std::string& filename, const Rational& PictureRate);
   void     Close();
   void     Reset();
   Result_t ReadFrame(FrameBuffer&);
+  Result_t Seek(ui32_t frame_number);
 };
 
 
@@ -91,23 +95,57 @@ ASDCP::PCM::WAVParser::h__WAVParser::Reset()
 
 //
 ASDCP::Result_t
-ASDCP::PCM::WAVParser::h__WAVParser::OpenRead(const char* filename, const Rational& PictureRate)
+ASDCP::PCM::WAVParser::h__WAVParser::OpenRead(const std::string& filename, const Rational& PictureRate)
 {
-  ASDCP_TEST_NULL_STR(filename);
-  SimpleWaveHeader WavHeader;
-
   Result_t result = m_FileReader.OpenRead(filename);
 
-  if ( ASDCP_SUCCESS(result) )
-    result = WavHeader.ReadFromFile(m_FileReader, &m_DataStart);
-  
   if ( ASDCP_SUCCESS(result) )
     {
-      WavHeader.FillADesc(m_ADesc, PictureRate);
-      m_FrameBufferSize = ASDCP::PCM::CalcFrameBufferSize(m_ADesc);
-      m_DataLength = WavHeader.data_len;
-      m_ADesc.ContainerDuration = m_DataLength / m_FrameBufferSize;
-      Reset();
+      SimpleWaveHeader WavHeader;
+      result = WavHeader.ReadFromFile(m_FileReader, &m_DataStart);
+  
+      if ( ASDCP_SUCCESS(result) )
+       {
+         WavHeader.FillADesc(m_ADesc, PictureRate);
+         m_FrameBufferSize = ASDCP::PCM::CalcFrameBufferSize(m_ADesc);
+         m_DataLength = WavHeader.data_len;
+         m_ADesc.ContainerDuration = m_DataLength / m_FrameBufferSize;
+         m_ADesc.ChannelFormat = PCM::CF_NONE;
+         Reset();
+       }
+      else
+       {
+         ASDCP::AIFF::SimpleAIFFHeader AIFFHeader;
+         m_FileReader.Seek(0);
+
+         result = AIFFHeader.ReadFromFile(m_FileReader, &m_DataStart);
+
+         if ( ASDCP_SUCCESS(result) )
+           {
+             AIFFHeader.FillADesc(m_ADesc, PictureRate);
+             m_FrameBufferSize = ASDCP::PCM::CalcFrameBufferSize(m_ADesc);
+             m_DataLength = AIFFHeader.data_len;
+             m_ADesc.ContainerDuration = m_DataLength / m_FrameBufferSize;
+             m_ADesc.ChannelFormat = PCM::CF_NONE;
+             Reset();
+           }
+         else
+           {
+             SimpleRF64Header RF64Header;
+             m_FileReader.Seek(0);
+             result = RF64Header.ReadFromFile(m_FileReader, &m_DataStart);
+
+             if ( ASDCP_SUCCESS(result) )
+               {
+                 RF64Header.FillADesc(m_ADesc, PictureRate);
+                 m_FrameBufferSize = ASDCP::PCM::CalcFrameBufferSize(m_ADesc);
+                 m_DataLength = RF64Header.data_len;
+                 m_ADesc.ContainerDuration = m_DataLength / m_FrameBufferSize;
+                 m_ADesc.ChannelFormat = PCM::CF_NONE;
+                 Reset();
+               }
+           }
+       }
     }
 
   return result;
@@ -119,12 +157,14 @@ ASDCP::PCM::WAVParser::h__WAVParser::ReadFrame(FrameBuffer& FB)
 {
   FB.Size(0);
 
-  if ( m_EOF || m_ReadCount >= m_DataLength )
-    return RESULT_ENDOFFILE;
+  if ( m_EOF )
+    {
+      return RESULT_ENDOFFILE;
+    }
 
   if ( FB.Capacity() < m_FrameBufferSize )
     {
-      DefaultLogSink().Error("FrameBuf.Capacity: %lu FrameLength: %lu\n",
+      DefaultLogSink().Error("FrameBuf.Capacity: %u FrameLength: %u\n",
                             FB.Capacity(), m_FrameBufferSize);
       return RESULT_SMALLBUF;
     }
@@ -137,7 +177,9 @@ ASDCP::PCM::WAVParser::h__WAVParser::ReadFrame(FrameBuffer& FB)
       m_EOF = true;
 
       if ( read_count > 0 )
-       result = RESULT_OK;
+       {
+         result = RESULT_OK;
+       }
     }
 
   if ( ASDCP_SUCCESS(result) )
@@ -145,11 +187,24 @@ ASDCP::PCM::WAVParser::h__WAVParser::ReadFrame(FrameBuffer& FB)
       m_ReadCount += read_count;
       FB.Size(read_count);
       FB.FrameNumber(m_FramesRead++);
+
+      if ( read_count < FB.Capacity() )
+       {
+         memset(FB.Data() + FB.Size(), 0, FB.Capacity() - FB.Size());
+       }
     }
 
   return result;
 }
 
+//
+ASDCP::Result_t ASDCP::PCM::WAVParser::h__WAVParser::Seek(ui32_t frame_number)
+{
+  m_FramesRead = frame_number - 1;
+  m_ReadCount = 0;
+  return m_FileReader.Seek(m_DataStart + m_FrameBufferSize * frame_number);
+}
+
 
 //------------------------------------------------------------------------------------------
 
@@ -164,7 +219,7 @@ ASDCP::PCM::WAVParser::~WAVParser()
 // Opens the stream for reading, parses enough data to provide a complete
 // set of stream metadata for the MXFWriter below.
 ASDCP::Result_t
-ASDCP::PCM::WAVParser::OpenRead(const char* filename, const Rational& PictureRate) const
+ASDCP::PCM::WAVParser::OpenRead(const std::string& filename, const Rational& PictureRate) const
 {
   const_cast<ASDCP::PCM::WAVParser*>(this)->m_Parser = new h__WAVParser;
 
@@ -208,6 +263,13 @@ ASDCP::PCM::WAVParser::FillAudioDescriptor(AudioDescriptor& ADesc) const
   return RESULT_OK;
 }
 
+ASDCP::Result_t ASDCP::PCM::WAVParser::Seek(ui32_t frame_number) const
+{
+  if ( m_Parser.empty() )
+    return RESULT_INIT;
+
+  return m_Parser->Seek(frame_number);;
+}
 
 //
 // end PCM_Parser.cpp