added aiff reader
[asdcplib.git] / src / AS_DCP_MXF.cpp
index fbf37c35b4802d2b2cad28aecdba42d6efa93848..9436273e7be18d4f95e4fd4e950ffb3bf4dec2f8 100755 (executable)
@@ -34,7 +34,6 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #include "DirScanner.h"
 #include "JP2K.h"
 #include "Wav.h"
-#include "MDD.h"
 
 
 //------------------------------------------------------------------------------------------
@@ -109,8 +108,8 @@ ASDCP::MD_to_CryptoInfo(CryptographicContext* InfoObj, WriterInfo& Info)
   memcpy(Info.ContextID, InfoObj->ContextID.Value(), UUIDlen);
   memcpy(Info.CryptographicKeyID, InfoObj->CryptographicKeyID.Value(), UUIDlen);
 
-  UL MIC_SHA1(MICAlgorithm_HMAC_SHA1);
-  UL MIC_NONE(MICAlgorithm_NONE);
+  UL MIC_SHA1(Dict::ul(MDD_MICAlgorithm_HMAC_SHA1));
+  UL MIC_NONE(Dict::ul(MDD_MICAlgorithm_NONE));
 
   if ( InfoObj->MICAlgorithm == MIC_SHA1 )
     Info.UsesHMAC = true;
@@ -127,72 +126,6 @@ ASDCP::MD_to_CryptoInfo(CryptographicContext* InfoObj, WriterInfo& Info)
   return RESULT_OK;
 }
 
-#if 0
-
-
-//
-// add DMS CryptographicFramework entry to source package
-void
-ASDCP::AddDMScrypt(PackagePtr SourcePackage, WriterInfo& Descr, const byte_t* SourceEssenceContainerLabel)
-{
-  assert(SourceEssenceContainerLabel);
-
-  TrackPtr MPDMTrack = SourcePackage->AddDMTrack(); // zero parameters = static
-  DMSegmentPtr MPDMSegment = MPDMTrack->AddDMSegment();
-
-  MDObject* Crypto_DMS_Ptr = new MDObject("CryptographicFramework");
-  MPDMSegment->AddChild("DMFramework")->MakeLink(*Crypto_DMS_Ptr);
-
-  MDObject* Crypto_DMS_BasicPtr = new MDObject("CryptographicContext");                
-  Crypto_DMS_Ptr->AddChild("ContextSR")->MakeLink(*Crypto_DMS_BasicPtr);
-
-  UUID ContextID(Descr.ContextID);
-  Crypto_DMS_BasicPtr->SetValue("ContextID", DataChunk(UUIDlen, ContextID.GetValue())); // UUID
-  Crypto_DMS_BasicPtr->SetValue("SourceEssenceContainer",
-                               DataChunk(klv_key_size, SourceEssenceContainerLabel)); // Label
-  Crypto_DMS_BasicPtr->SetValue("CipherAlgorithm", DataChunk(klv_key_size, CipherAlgorithm_AES)); // UL Key
-
-  Crypto_DMS_BasicPtr->SetValue("MICAlgorithm",
-                               DataChunk(KeyLen,
-                                         (Descr.UsesHMAC ?
-                                          MICAlgorithm_HMAC_SHA1
-                                          : MICAlgorithm_NONE))); // UL Key
-
-  UUID CryptographicKeyID(Descr.CryptographicKeyID);
-
-  Crypto_DMS_BasicPtr->SetValue("CryptographicKeyID", DataChunk(UUIDlen, CryptographicKeyID.GetValue())); // UUID
-}
-
-
-//
-//
-ASDCP::Result_t
-ASDCP::FindObject(const char* filename, const char* objname, FILE* stream)
-{
-  ASDCP_TEST_NULL_STR(filename);
-  ASDCP_TEST_NULL_STR(objname);
-
-  if ( stream == 0 )
-    stream = stderr;
-
-  ASDCP::h__Reader Reader;
-  Result_t result = Reader.OpenMXFRead(filename);
-
-  if ( ASDCP_FAILURE(result) )
-    return result;
-
-  MDObject* DescObj = Reader.GetMDObjectByType(objname);
-
-  if ( DescObj )
-    {
-      DumpMDObject(*DescObj, " ", stream);
-      return RESULT_OK;
-    }
-
-  return RESULT_FAIL;
-}
-#endif
-
 //
 //
 ASDCP::Result_t
@@ -210,7 +143,7 @@ ASDCP::EssenceType(const char* filename, EssenceType_t& type)
   if ( ASDCP_SUCCESS(result) )
     {
       type = ESS_UNKNOWN;
-      if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(JPEG2000PictureSubDescriptor))) )
+      if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(RGBAEssenceDescriptor))) )
        type = ESS_JPEG_2000;
       else
        {
@@ -252,6 +185,7 @@ ASDCP::RawEssenceType(const char* filename, EssenceType_t& type)
       if ( ASDCP_SUCCESS(result) )
        {
          ASDCP::Wav::SimpleWaveHeader WavHeader;
+         ASDCP::AIFF::SimpleAIFFHeader AIFFHeader;
          ui32_t data_offset;
          const byte_t* p = FB.RoData();
 
@@ -260,6 +194,9 @@ ASDCP::RawEssenceType(const char* filename, EssenceType_t& type)
 
          else if ( ASDCP_SUCCESS(WavHeader.ReadFromBuffer(p, read_count, &data_offset)) )
            type = ESS_PCM_24b_48k;
+
+         else if ( ASDCP_SUCCESS(AIFFHeader.ReadFromBuffer(p, read_count, &data_offset)) )
+           type = ESS_PCM_24b_48k;
        }
     }
   else if ( ASDCP::PathIsDirectory(filename) )
@@ -437,33 +374,33 @@ ASDCP::IntegrityPack::CalcValues(const ASDCP::FrameBuffer& FB, byte_t* AssetID,
   byte_t* p = Data;
   HMAC->Reset();
 
-  static byte_t ber_4[klv_length_size] = {0x83, 0};
+  static byte_t ber_4[MXF_BER_LENGTH] = {0x83, 0};
 
   // update HMAC with essence data
   HMAC->Update(FB.RoData(), FB.Size());
 
   // track file ID length
-  memcpy(p, ber_4, klv_length_size);
+  memcpy(p, ber_4, MXF_BER_LENGTH);
   *(p+3) = UUIDlen;;
-  p += klv_length_size;
+  p += MXF_BER_LENGTH;
 
   // track file ID
   memcpy(p, AssetID, UUIDlen);
   p += UUIDlen;
 
   // sequence length
-  memcpy(p, ber_4, klv_length_size);
+  memcpy(p, ber_4, MXF_BER_LENGTH);
   *(p+3) = sizeof(ui64_t);
-  p += klv_length_size;
+  p += MXF_BER_LENGTH;
 
   // sequence number
   i2p<ui64_t>(ASDCP_i64_BE(sequence), p);
   p += sizeof(ui64_t);
 
   // HMAC length
-  memcpy(p, ber_4, klv_length_size);
+  memcpy(p, ber_4, MXF_BER_LENGTH);
   *(p+3) = HMAC_SIZE;
-  p += klv_length_size;
+  p += MXF_BER_LENGTH;
 
   // update HMAC with intpack values
   HMAC->Update(Data, klv_intpack_size - HMAC_SIZE);
@@ -536,24 +473,34 @@ ASDCP::Result_t
 ASDCP::KLVReader::ReadKLFromFile(ASDCP::FileReader& Reader)
 {
   ui32_t read_count;
-  m_HeaderLength = klv_key_size + klv_length_size;
+  m_HeaderLength = SMPTE_UL_LENGTH + MXF_BER_LENGTH;
   Result_t result = Reader.Read(m_Key, m_HeaderLength, &read_count);
   assert(read_count == m_HeaderLength);
 
   if ( ASDCP_SUCCESS(result) )
     {
-      m_BERLength = BER_length(m_Key + klv_key_size);
+      m_BERLength = BER_length(m_Key + SMPTE_UL_LENGTH);
       
-      if ( m_BERLength != klv_length_size )
+      if ( m_BERLength == 0 )
        {
+         char intbuf[IntBufferLen];
+         ASDCP::DefaultLogSink().Error("KLV format error, zero BER length not allowed at file position %s\n",
+                                       i64szx((Reader.Tell() - (fpos_t)SMPTE_UL_LENGTH), 8, intbuf));
+         return RESULT_FAIL;
+       }
+
+      if ( m_BERLength != MXF_BER_LENGTH )
+       {
+
          ASDCP::DefaultLogSink().Error("Found packet with BER length %lu; being less efficient...\n",
                                        m_BERLength);
          // TODO: recover the correct BER value
          // and reposition the file pointer
+         ASDCP::DefaultLogSink().Error("please finish me\n");
          assert(0);
        }
 
-      if ( ! read_BER(m_Key + klv_key_size, &m_Length) )
+      if ( ! read_BER(m_Key + SMPTE_UL_LENGTH, &m_Length) )
        return RESULT_FAIL;
     }