Forgot a fix.
[asdcplib.git] / src / AS_DCP_PCM.cpp
index ef16f2b64618e354f5e8296c35536e5e5b311fde..e32445ba2462bcdb3929747e912067558b2f033d 100755 (executable)
@@ -67,7 +67,8 @@ MD_to_PCM_ADesc(MXF::WaveAudioDescriptor* ADescObj, PCM::AudioDescriptor& ADesc)
   ADesc.BlockAlign = ADescObj->BlockAlign;
   ADesc.AvgBps = ADescObj->AvgBps;
   ADesc.LinkedTrackID = ADescObj->LinkedTrackID;
-  ADesc.ContainerDuration = ADescObj->ContainerDuration;
+  assert(ADescObj->ContainerDuration <= 0xFFFFFFFFL);
+  ADesc.ContainerDuration = (ui32_t) ADescObj->ContainerDuration;
   return RESULT_OK;
 }
 
@@ -78,15 +79,15 @@ ASDCP::PCM::AudioDescriptorDump(const AudioDescriptor& ADesc, FILE* stream)
     stream = stderr;
 
   fprintf(stream, "\
-        SampleRate: %lu/%lu\n\
- AudioSamplingRate: %lu/%lu\n\
-            Locked: %lu\n\
-      ChannelCount: %lu\n\
-  QuantizationBits: %lu\n\
-        BlockAlign: %lu\n\
-            AvgBps: %lu\n\
-     LinkedTrackID: %lu\n\
- ContainerDuration: %lu\n",
+        SampleRate: %d/%d\n\
+ AudioSamplingRate: %d/%d\n\
+            Locked: %u\n\
+      ChannelCount: %u\n\
+  QuantizationBits: %u\n\
+        BlockAlign: %u\n\
+            AvgBps: %u\n\
+     LinkedTrackID: %u\n\
+ ContainerDuration: %u\n",
          ADesc.SampleRate.Numerator ,ADesc.SampleRate.Denominator,
          ADesc.AudioSamplingRate.Numerator ,ADesc.AudioSamplingRate.Denominator,
          ADesc.Locked,
@@ -160,7 +161,8 @@ ASDCP::PCM::MXFReader::h__Reader::OpenRead(const char* filename)
     }
 
   // check for sample/frame rate sanity
-  if ( m_ADesc.SampleRate != EditRate_24
+  if ( ASDCP_SUCCESS(result)
+       && m_ADesc.SampleRate != EditRate_24
        && m_ADesc.SampleRate != EditRate_48
        && m_ADesc.SampleRate != EditRate_23_98 )
     {
@@ -185,7 +187,7 @@ ASDCP::PCM::MXFReader::h__Reader::OpenRead(const char* filename)
     result = InitMXFIndex();
 
   if( ASDCP_SUCCESS(result) )
-    result = InitInfo(m_Info);
+    result = InitInfo();
 
   // TODO: test file for sane CBR index BytesPerEditUnit
 
@@ -202,7 +204,7 @@ ASDCP::PCM::MXFReader::h__Reader::ReadFrame(ui32_t FrameNum, FrameBuffer& FrameB
   if ( ! m_File.IsOpen() )
     return RESULT_INIT;
 
-  return ReadEKLVPacket(FrameNum, FrameBuf, Dict::ul(MDD_WAVEssence), Ctx, HMAC);
+  return ReadEKLVFrame(FrameNum, FrameBuf, Dict::ul(MDD_WAVEssence), Ctx, HMAC);
 }
 
 //------------------------------------------------------------------------------------------
@@ -215,11 +217,11 @@ ASDCP::PCM::FrameBuffer::Dump(FILE* stream, ui32_t dump_len) const
   if ( stream == 0 )
     stream = stderr;
 
-  fprintf(stream, "Frame: %06lu, %7lu bytes\n",
+  fprintf(stream, "Frame: %06u, %7u bytes\n",
          m_FrameNumber, m_Size);
 
   if ( dump_len )
-    hexdump(m_Data, dump_len, stream);
+    Kumu::hexdump(m_Data, dump_len, stream);
 }
 
 //------------------------------------------------------------------------------------------
@@ -312,10 +314,15 @@ class ASDCP::PCM::MXFWriter::h__Writer : public ASDCP::h__Writer
 {
 public:
   AudioDescriptor m_ADesc;
+  byte_t          m_EssenceUL[SMPTE_UL_LENGTH];
+
 
   ASDCP_NO_COPY_CONSTRUCT(h__Writer);
   
-  h__Writer(){}
+  h__Writer(){
+    memset(m_EssenceUL, 0, SMPTE_UL_LENGTH);
+  }
+
   ~h__Writer(){}
 
   Result_t OpenWrite(const char*, ui32_t HeaderSize);
@@ -358,14 +365,14 @@ ASDCP::PCM::MXFWriter::h__Writer::SetSourceStream(const AudioDescriptor& ADesc)
        && ADesc.SampleRate != EditRate_48
        && ADesc.SampleRate != EditRate_23_98 )
     {
-      DefaultLogSink().Error("AudioDescriptor.SampleRate is not 24/1, 48/1 or 24000/1001: %lu/%lu\n",
+      DefaultLogSink().Error("AudioDescriptor.SampleRate is not 24/1, 48/1 or 24000/1001: %d/%d\n",
                             ADesc.SampleRate.Numerator, ADesc.SampleRate.Denominator);
       return RESULT_RAW_FORMAT;
     }
 
   if ( ADesc.AudioSamplingRate != SampleRate_48k )
     {
-      DefaultLogSink().Error("AudioDescriptor.AudioSamplingRate is not 48000/1: %lu/%lu\n",
+      DefaultLogSink().Error("AudioDescriptor.AudioSamplingRate is not 48000/1: %d/%d\n",
                             ADesc.AudioSamplingRate.Numerator, ADesc.AudioSamplingRate.Denominator);
       return RESULT_RAW_FORMAT;
     }
@@ -379,7 +386,11 @@ ASDCP::PCM::MXFWriter::h__Writer::SetSourceStream(const AudioDescriptor& ADesc)
                              m_ADesc.SampleRate, 24 /* TCFrameRate */, calc_CBR_frame_size(m_Info, m_ADesc));
 
   if ( ASDCP_SUCCESS(result) )
-    result = m_State.Goto_READY();
+    {
+      memcpy(m_EssenceUL, Dict::ul(MDD_WAVEssence), SMPTE_UL_LENGTH);
+      m_EssenceUL[SMPTE_UL_LENGTH-1] = 1; // first (and only) essence container
+      result = m_State.Goto_READY();
+    }
 
   return result;
 }
@@ -397,7 +408,7 @@ ASDCP::PCM::MXFWriter::h__Writer::WriteFrame(const FrameBuffer& FrameBuf, AESEnc
     result = m_State.Goto_RUNNING(); // first time through
 
   if ( ASDCP_SUCCESS(result) )
-    result = WriteEKLVPacket(FrameBuf, Dict::ul(MDD_WAVEssence), Ctx, HMAC);
+    result = WriteEKLVPacket(FrameBuf, m_EssenceUL, Ctx, HMAC);
 
   if ( ASDCP_SUCCESS(result) )
     m_FramesWritten++;
@@ -440,14 +451,12 @@ ASDCP::PCM::MXFWriter::OpenWrite(const char* filename, const WriterInfo& Info,
                                 const AudioDescriptor& ADesc, ui32_t HeaderSize)
 {
   m_Writer = new h__Writer;
+  m_Writer->m_Info = Info;
   
   Result_t result = m_Writer->OpenWrite(filename, HeaderSize);
 
   if ( ASDCP_SUCCESS(result) )
-    {
-      m_Writer->m_Info = Info;
-      result = m_Writer->SetSourceStream(ADesc);
-    }
+    result = m_Writer->SetSourceStream(ADesc);
 
   if ( ASDCP_FAILURE(result) )
     m_Writer.release();