Made Duration, EventStartPosition, and EventComment properties optional, as per ST377
[asdcplib.git] / src / AS_DCP_PCM.cpp
index 88ccd1f5d671e5247134022f0fd30f48572144ca..e7fbff362b81756a8c4386d52158cc0ccc36f54b 100755 (executable)
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2004-2013, John Hurst
+Copyright (c) 2004-2016, John Hurst
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -170,7 +170,7 @@ ASDCP::PCM::operator << (std::ostream& strm, const AudioDescriptor& ADesc)
       break;
 
     case CF_CFG_6:
-      strm << "Config 6 (ST 377-1 MCA)";
+      strm << "Config 6 (ST 377-4 MCA)";
       break;
   }
   strm << std::endl;
@@ -276,6 +276,12 @@ ASDCP::PCM::MXFReader::h__Reader::OpenRead(const std::string& filename)
        }
     }
 
+  if ( m_ADesc.ContainerDuration == 0 )
+    {
+      DefaultLogSink().Error("ContainerDuration unset.\n");
+      return RESULT_FORMAT;
+    }
+
   // check for sample/frame rate sanity
   if ( ASDCP_SUCCESS(result)
        && m_ADesc.EditRate != EditRate_24
@@ -287,6 +293,9 @@ ASDCP::PCM::MXFReader::h__Reader::OpenRead(const std::string& filename)
        && m_ADesc.EditRate != EditRate_96
        && m_ADesc.EditRate != EditRate_100
        && m_ADesc.EditRate != EditRate_120
+       && m_ADesc.EditRate != EditRate_192
+       && m_ADesc.EditRate != EditRate_200
+       && m_ADesc.EditRate != EditRate_240
        && m_ADesc.EditRate != EditRate_16
        && m_ADesc.EditRate != EditRate_18
        && m_ADesc.EditRate != EditRate_20
@@ -297,14 +306,14 @@ ASDCP::PCM::MXFReader::h__Reader::OpenRead(const std::string& filename)
                             m_ADesc.EditRate.Numerator, m_ADesc.EditRate.Denominator);
 
       // oh, they gave us the audio sampling rate instead, assume 24/1
-      if ( m_ADesc.EditRate == SampleRate_48k )
+      if ( m_ADesc.EditRate == SampleRate_48k || m_ADesc.EditRate == SampleRate_96k )
        {
          DefaultLogSink().Warn("adjusting EditRate to 24/1\n"); 
          m_ADesc.EditRate = EditRate_24;
        }
       else
        {
-      DefaultLogSink().Error("PCM EditRate not in expected value range.\n");
+         DefaultLogSink().Error("PCM EditRate not in expected value range.\n");
          // or we just drop the hammer
          return RESULT_FORMAT;
        }
@@ -325,6 +334,11 @@ ASDCP::PCM::MXFReader::h__Reader::ReadFrame(ui32_t FrameNum, FrameBuffer& FrameB
   if ( ! m_File.IsOpen() )
     return RESULT_INIT;
 
+  if ( (FrameNum+1) > m_ADesc.ContainerDuration )
+    {
+      return RESULT_RANGE;
+    }
+
   assert(m_Dict);
   return ReadEKLVFrame(FrameNum, FrameBuf, m_Dict->ul(MDD_WAVEssence), Ctx, HMAC);
 }
@@ -556,6 +570,9 @@ ASDCP::PCM::MXFWriter::h__Writer::SetSourceStream(const AudioDescriptor& ADesc)
        && ADesc.EditRate != EditRate_96
        && ADesc.EditRate != EditRate_100
        && ADesc.EditRate != EditRate_120
+       && ADesc.EditRate != EditRate_192
+       && ADesc.EditRate != EditRate_200
+       && ADesc.EditRate != EditRate_240
        && ADesc.EditRate != EditRate_16
        && ADesc.EditRate != EditRate_18
        && ADesc.EditRate != EditRate_20
@@ -610,7 +627,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, m_EssenceUL, Ctx, HMAC);
+    result = WriteEKLVPacket(FrameBuf, m_EssenceUL, MXF_BER_LENGTH, Ctx, HMAC);
 
   if ( ASDCP_SUCCESS(result) )
     m_FramesWritten++;