allow suppression of xml formatting spaces
[asdcplib.git] / src / AS_DCP_MXF.cpp
index 1e0e2f8288a123d99e34c259fc1f98e88a320d1f..f3ad310ed2bde3effb793e13f11a7b62213ee12b 100755 (executable)
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2004-2009, John Hurst
+Copyright (c) 2004-2013, John Hurst
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -163,12 +163,14 @@ ASDCP::MD_to_CryptoInfo(CryptographicContext* InfoObj, WriterInfo& Info, const D
 ASDCP::Result_t
 ASDCP::EssenceType(const char* filename, EssenceType_t& type)
 {
-  // TODO
-  Dictionary m_Dict;
+  const Dictionary* m_Dict = &DefaultCompositeDict();
+  InterchangeObject* md_object = 0;
+
+  assert(m_Dict);
 
   ASDCP_TEST_NULL_STR(filename);
   Kumu::FileReader   Reader;
-  OPAtomHeader TestHeader(m_Dict);
+  OP1aHeader TestHeader(m_Dict);
 
   Result_t result = Reader.OpenRead(filename);
 
@@ -178,19 +180,48 @@ ASDCP::EssenceType(const char* filename, EssenceType_t& type)
   if ( ASDCP_SUCCESS(result) )
     {
       type = ESS_UNKNOWN;
-      if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(RGBAEssenceDescriptor))) )
+      if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(JPEG2000PictureSubDescriptor))) )
        {
          if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(StereoscopicPictureSubDescriptor))) )
-           type = ESS_JPEG_2000_S;
+           {
+             type = ESS_JPEG_2000_S;
+           }
          else
-           type = ESS_JPEG_2000;
+           {
+             type = ESS_JPEG_2000;
+           }
+       }
+      else if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(WaveAudioDescriptor), &md_object)) )
+       {
+         assert(md_object);
+         if ( static_cast<ASDCP::MXF::WaveAudioDescriptor*>(md_object)->AudioSamplingRate == SampleRate_96k )
+           {
+             type = ESS_PCM_24b_96k;
+           }
+         else
+           {
+             type = ESS_PCM_24b_48k;
+           }
        }
-      else if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(WaveAudioDescriptor))) )
-       type = ESS_PCM_24b_48k;
       else if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(MPEG2VideoDescriptor))) )
+       {
        type = ESS_MPEG2_VES;
+       }
       else if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(TimedTextDescriptor))) )
+       {
        type = ESS_TIMED_TEXT;
+       }
+      else if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(DCDataDescriptor))) )
+       {
+         if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(DolbyAtmosSubDescriptor))) )
+           {
+             type = ESS_DCDATA_DOLBY_ATMOS;
+           }
+         else
+           {
+             type = ESS_DCDATA_UNKNOWN;
+           }
+       }
     }
 
   return result;
@@ -205,6 +236,7 @@ ASDCP::RawEssenceType(const char* filename, EssenceType_t& type)
   ASDCP::FrameBuffer FB;
   Kumu::FileReader Reader;
   ASDCP::Wav::SimpleWaveHeader WavHeader;
+  ASDCP::RF64::SimpleRF64Header RF64Header;
   ASDCP::AIFF::SimpleAIFFHeader AIFFHeader;
   Kumu::XMLElement TmpElement("Tmp");
 
@@ -234,7 +266,11 @@ ASDCP::RawEssenceType(const char* filename, EssenceType_t& type)
            {
              type = ESS_MPEG2_VES;
            }
-         else if ( ASDCP_SUCCESS(WavHeader.ReadFromBuffer(p, read_count, &data_offset)) )
+         else if ( memcmp(FB.RoData(), ASDCP::JP2K::Magic, sizeof(ASDCP::JP2K::Magic)) == 0 )
+           {
+             type = ESS_JPEG_2000;
+           }
+         else if ( ASDCP_SUCCESS(WavHeader.ReadFromBuffer(FB.RoData(), read_count, &data_offset)) )
            {
              switch ( WavHeader.samplespersec )
                {
@@ -244,14 +280,28 @@ ASDCP::RawEssenceType(const char* filename, EssenceType_t& type)
                  return RESULT_FORMAT;
                }
            }
-         else if ( ASDCP_SUCCESS(AIFFHeader.ReadFromBuffer(p, read_count, &data_offset)) )
+         else if ( ASDCP_SUCCESS(RF64Header.ReadFromBuffer(FB.RoData(), read_count, &data_offset)) )
+           {
+             switch ( RF64Header.samplespersec )
+               {
+               case 48000: type = ESS_PCM_24b_48k; break;
+               case 96000: type = ESS_PCM_24b_96k; break;
+               default:
+                 return RESULT_FORMAT;
+               }
+           }
+         else if ( ASDCP_SUCCESS(AIFFHeader.ReadFromBuffer(FB.RoData(), read_count, &data_offset)) )
            {
              type = ESS_PCM_24b_48k;
            }
-         else if ( Kumu::StringIsXML((const char*)p, FB.Size()) )
+         else if ( Kumu::StringIsXML((const char*)FB.RoData(), FB.Size()) )
            {
              type = ESS_TIMED_TEXT;
            }
+         else if ( ASDCP::ATMOS::IsDolbyAtmos(filename) )
+           {
+             type = ESS_DCDATA_DOLBY_ATMOS;
+           }
        }
     }
   else if ( Kumu::PathIsDirectory(filename) )
@@ -281,12 +331,35 @@ ASDCP::RawEssenceType(const char* filename, EssenceType_t& type)
              if ( ASDCP_SUCCESS(result) )
                {
                  if ( memcmp(FB.RoData(), ASDCP::JP2K::Magic, sizeof(ASDCP::JP2K::Magic)) == 0 )
-                   type = ESS_JPEG_2000;
-
+                   {
+                     type = ESS_JPEG_2000;
+                   }
                  else if ( ASDCP_SUCCESS(WavHeader.ReadFromBuffer(FB.RoData(), read_count, &data_offset)) )
-                   type = ESS_PCM_24b_48k;
+                   {
+                     switch ( WavHeader.samplespersec )
+                       {
+                       case 48000: type = ESS_PCM_24b_48k; break;
+                       case 96000: type = ESS_PCM_24b_96k; break;
+                       default:
+                         return RESULT_FORMAT;
+                       }
+                   }
+                 else if ( ASDCP_SUCCESS(RF64Header.ReadFromBuffer(FB.RoData(), read_count, &data_offset)) )
+                   {
+                     switch ( RF64Header.samplespersec )
+                       {
+                       case 48000: type = ESS_PCM_24b_48k; break;
+                       case 96000: type = ESS_PCM_24b_96k; break;
+                       default:
+                         return RESULT_FORMAT;
+                       }
+                   }
+                 else if ( ASDCP::ATMOS::IsDolbyAtmos(Str.c_str()) )
+                   {
+                     type = ESS_DCDATA_DOLBY_ATMOS;
+                   }
                }
-
+             
              break;
            }
        }
@@ -426,7 +499,7 @@ ASDCP::DecryptFrameBuffer(const ASDCP::FrameBuffer& FBin, ASDCP::FrameBuffer& FB
 
 //
 Result_t
-ASDCP::IntegrityPack::CalcValues(const ASDCP::FrameBuffer& FB, byte_t* AssetID,
+ASDCP::IntegrityPack::CalcValues(const ASDCP::FrameBuffer& FB, const byte_t* AssetID,
                                 ui32_t sequence, HMACContext* HMAC)
 {
   ASDCP_TEST_NULL(AssetID);
@@ -476,7 +549,7 @@ ASDCP::IntegrityPack::CalcValues(const ASDCP::FrameBuffer& FB, byte_t* AssetID,
 
 
 Result_t
-ASDCP::IntegrityPack::TestValues(const ASDCP::FrameBuffer& FB, byte_t* AssetID,
+ASDCP::IntegrityPack::TestValues(const ASDCP::FrameBuffer& FB, const byte_t* AssetID,
                                 ui32_t sequence, HMACContext* HMAC)
 {
   ASDCP_TEST_NULL(AssetID);