/*
-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
*/
#include <KM_fileio.h>
+#include <KM_xml.h>
#include "AS_DCP_internal.h"
#include "JP2K.h"
+#include "MPEG.h"
#include "Wav.h"
{
if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(MPEG2VideoDescriptor))) )
type = ESS_MPEG2_VES;
+ else
+ {
+ if ( ASDCP_SUCCESS(TestHeader.GetMDObjectByType(OBJ_TYPE_ARGS(DCTimedTextDescriptor))) )
+ type = ESS_TIMED_TEXT;
+ }
}
}
}
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
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);
- if ( p[0] == 0 && p[1] == 0 && p[2] == 1 && (p[3] == 0xb3 || p[3] == 0) )
+ ui32_t i = 0;
+ while ( p[i] == 0 ) i++;
+
+ 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 ( Kumu::StringIsXML((const char*)p, FB.Size()) )
+ type = ESS_TIMED_TEXT;
+
else if ( ASDCP_SUCCESS(WavHeader.ReadFromBuffer(p, read_count, &data_offset)) )
type = ESS_PCM_24b_48k;
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;
}