Forgot a fix.
[asdcplib.git] / src / AS_DCP_MXF.cpp
index 5c8fc16af8a9440a8b606736c2100e59e47f4d28..192965d78416c8f4d905a4cb8328bf8589594429 100755 (executable)
@@ -1,5 +1,5 @@
 /*
-Copyright (c) 2004-2006, John Hurst
+Copyright (c) 2004-2007, John Hurst
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
@@ -30,8 +30,10 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
 #include <KM_fileio.h>
+#include <KM_xml.h>
 #include "AS_DCP_internal.h"
 #include "JP2K.h"
+#include "MPEG.h"
 #include "Wav.h"
 
 
@@ -146,17 +148,18 @@ ASDCP::EssenceType(const char* filename, EssenceType_t& type)
     {
       type = ESS_UNKNOWN;
       if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(RGBAEssenceDescriptor))) )
-       type = ESS_JPEG_2000;
-      else
        {
-         if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(WaveAudioDescriptor))) )
-           type = ESS_PCM_24b_48k;
+         if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(StereoscopicPictureSubDescriptor))) )
+           type = ESS_JPEG_2000_S;
          else
-           {
-             if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(MPEG2VideoDescriptor))) )
-               type = ESS_MPEG2_VES;
-           }
+           type = ESS_JPEG_2000;
        }
+      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;
     }
 
   return result;
@@ -170,6 +173,11 @@ ASDCP::RawEssenceType(const char* filename, EssenceType_t& type)
   type = ESS_UNKNOWN;
   ASDCP::FrameBuffer FB;
   Kumu::FileReader Reader;
+  ASDCP::Wav::SimpleWaveHeader WavHeader;
+  ASDCP::AIFF::SimpleAIFFHeader AIFFHeader;
+  Kumu::XMLElement TmpElement("Tmp");
+
+  ui32_t data_offset;
   ui32_t read_count;
   Result_t result = FB.Capacity(Wav::MaxWavHeader); // using Wav max because everything else is much smaller
 
@@ -185,12 +193,13 @@ 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();
+         FB.Size(read_count);
+
+         ui32_t i = 0;
+         while ( p[i] == 0 ) i++;
 
-         if ( p[0] == 0 &&  p[1] == 0 &&  p[2] == 1 &&  (p[3] == 0xb3 || p[3] == 0) )
+         if ( i > 1 && p[i] == 1 &&  (p[i+1] == ASDCP::MPEG2::SEQ_START || p[i+1] == ASDCP::MPEG2::PIC_START) )
            type = ESS_MPEG2_VES;
 
          else if ( ASDCP_SUCCESS(WavHeader.ReadFromBuffer(p, read_count, &data_offset)) )
@@ -198,6 +207,9 @@ ASDCP::RawEssenceType(const char* filename, EssenceType_t& type)
 
          else if ( ASDCP_SUCCESS(AIFFHeader.ReadFromBuffer(p, read_count, &data_offset)) )
            type = ESS_PCM_24b_48k;
+
+         else if ( Kumu::StringIsXML((const char*)p, FB.Size()) )
+           type = ESS_TIMED_TEXT;
        }
     }
   else if ( Kumu::PathIsDirectory(filename) )
@@ -224,9 +236,14 @@ ASDCP::RawEssenceType(const char* filename, EssenceType_t& type)
                  Reader.Close();
                }
 
-             if ( ASDCP_SUCCESS(result)
-                  && ( memcmp(FB.RoData(), ASDCP::JP2K::Magic, sizeof(ASDCP::JP2K::Magic)) == 0 ) )
-               type = ESS_JPEG_2000;
+             if ( ASDCP_SUCCESS(result) )
+               {
+                 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)) )
+                   type = ESS_PCM_24b_48k;
+               }
 
              break;
            }