diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/AS_DCP_ATMOS.cpp | 227 | ||||
| -rw-r--r-- | src/AS_DCP_DCData.cpp | 137 | ||||
| -rw-r--r-- | src/KM_fileio.cpp | 4 | ||||
| -rw-r--r-- | src/MDD.cpp | 13 | ||||
| -rwxr-xr-x | src/MDD.h | 3 | ||||
| -rw-r--r-- | src/Makefile.am | 2 | ||||
| -rwxr-xr-x | src/Metadata.cpp | 20 | ||||
| -rw-r--r-- | src/TimedText_Parser.cpp | 5 | ||||
| -rw-r--r-- | src/as-02-info.cpp | 1 | ||||
| -rw-r--r-- | src/info.in | 5 |
10 files changed, 335 insertions, 82 deletions
diff --git a/src/AS_DCP_ATMOS.cpp b/src/AS_DCP_ATMOS.cpp index 7fa8c09..e1eb612 100644 --- a/src/AS_DCP_ATMOS.cpp +++ b/src/AS_DCP_ATMOS.cpp @@ -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 @@ -33,7 +33,6 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <iostream> #include "AS_DCP.h" -#include "AS_DCP_DCData_internal.h" #include "AS_DCP_internal.h" namespace ASDCP @@ -104,25 +103,42 @@ ASDCP::ATMOS::IsDolbyAtmos(const std::string& filename) //------------------------------------------------------------------------------------------ +typedef std::list<MXF::InterchangeObject*> SubDescriptorList_t; -class ASDCP::ATMOS::MXFReader::h__Reader : public ASDCP::DCData::h__Reader +class ASDCP::ATMOS::MXFReader::h__Reader : public ASDCP::h__ASDCPReader { + MXF::DCDataDescriptor* m_EssenceDescriptor; MXF::DolbyAtmosSubDescriptor* m_EssenceSubDescriptor; - ASDCP_NO_COPY_CONSTRUCT(h__Reader); + KM_NO_COPY_CONSTRUCT(h__Reader); h__Reader(); public: + ASDCP::DCData::DCDataDescriptor m_DDesc; AtmosDescriptor m_ADesc; - h__Reader(const Dictionary& d) : DCData::h__Reader(d), m_EssenceSubDescriptor(NULL), - m_ADesc() {} + h__Reader(const Dictionary& d) : + ASDCP::h__ASDCPReader(d), m_EssenceDescriptor(0), m_EssenceSubDescriptor(0) {} virtual ~h__Reader() {} Result_t OpenRead(const std::string&); + Result_t ReadFrame(ui32_t, FrameBuffer&, AESDecContext*, HMACContext*); + Result_t MD_to_DCData_DDesc(ASDCP::DCData::DCDataDescriptor& DDesc); Result_t MD_to_Atmos_ADesc(ATMOS::AtmosDescriptor& ADesc); }; ASDCP::Result_t +ASDCP::ATMOS::MXFReader::h__Reader::MD_to_DCData_DDesc(ASDCP::DCData::DCDataDescriptor& DDesc) +{ + ASDCP_TEST_NULL(m_EssenceDescriptor); + MXF::DCDataDescriptor* DDescObj = m_EssenceDescriptor; + DDesc.EditRate = DDescObj->SampleRate; + assert(DDescObj->ContainerDuration <= 0xFFFFFFFFL); + DDesc.ContainerDuration = static_cast<ui32_t>(DDescObj->ContainerDuration); + memcpy(DDesc.DataEssenceCoding, DDescObj->DataEssenceCoding.Value(), SMPTE_UL_LENGTH); + return RESULT_OK; +} + +ASDCP::Result_t ASDCP::ATMOS::MXFReader::h__Reader::MD_to_Atmos_ADesc(ATMOS::AtmosDescriptor& ADesc) { ASDCP_TEST_NULL(m_EssenceSubDescriptor); @@ -144,7 +160,48 @@ ASDCP::ATMOS::MXFReader::h__Reader::MD_to_Atmos_ADesc(ATMOS::AtmosDescriptor& AD ASDCP::Result_t ASDCP::ATMOS::MXFReader::h__Reader::OpenRead(const std::string& filename) { - Result_t result = DCData::h__Reader::OpenRead(filename); + Result_t result = OpenMXFRead(filename); + m_EssenceDescriptor = 0; + + if ( KM_SUCCESS(result) ) + { + InterchangeObject* iObj = 0; + result = m_HeaderPart.GetMDObjectByType(OBJ_TYPE_ARGS(DolbyAtmosDCDataDescriptor), &iObj); + + if ( KM_SUCCESS(result) ) + { + m_EssenceDescriptor = static_cast<MXF::DCDataDescriptor*>(iObj); + } + } + + if ( m_EssenceDescriptor == 0 ) + { + DefaultLogSink().Error("DCDataDescriptor object not found.\n"); + result = RESULT_FORMAT; + } + + if ( KM_SUCCESS(result) ) + { + result = MD_to_DCData_DDesc(m_DDesc); + } + + // check for sample/frame rate sanity + if ( ASDCP_SUCCESS(result) + && m_DDesc.EditRate != EditRate_24 + && m_DDesc.EditRate != EditRate_25 + && m_DDesc.EditRate != EditRate_30 + && m_DDesc.EditRate != EditRate_48 + && m_DDesc.EditRate != EditRate_50 + && m_DDesc.EditRate != EditRate_60 + && m_DDesc.EditRate != EditRate_96 + && m_DDesc.EditRate != EditRate_100 + && m_DDesc.EditRate != EditRate_120 ) + { + DefaultLogSink().Error("DC Data file EditRate is not a supported value: %d/%d\n", // lu + m_DDesc.EditRate.Numerator, m_DDesc.EditRate.Denominator); + + return RESULT_FORMAT; + } if( ASDCP_SUCCESS(result) ) { @@ -171,6 +228,18 @@ ASDCP::ATMOS::MXFReader::h__Reader::OpenRead(const std::string& filename) return result; } +// +ASDCP::Result_t +ASDCP::ATMOS::MXFReader::h__Reader::ReadFrame(ui32_t FrameNum, FrameBuffer& FrameBuf, + AESDecContext* Ctx, HMACContext* HMAC) +{ + if ( ! m_File.IsOpen() ) + return RESULT_INIT; + + assert(m_Dict); + return ReadEKLVFrame(FrameNum, FrameBuf, m_Dict->ul(MDD_DolbyAtmosDCDataEssence), Ctx, HMAC); +} + //------------------------------------------------------------------------------------------ @@ -319,8 +388,10 @@ ASDCP::ATMOS::MXFReader::Close() const //------------------------------------------------------------------------------------------ // -class ASDCP::ATMOS::MXFWriter::h__Writer : public DCData::h__Writer +class ASDCP::ATMOS::MXFWriter::h__Writer : public ASDCP::h__ASDCPWriter { + ASDCP::DCData::DCDataDescriptor m_DDesc; + byte_t m_EssenceUL[SMPTE_UL_LENGTH]; MXF::DolbyAtmosSubDescriptor* m_EssenceSubDescriptor; ASDCP_NO_COPY_CONSTRUCT(h__Writer); @@ -329,17 +400,37 @@ class ASDCP::ATMOS::MXFWriter::h__Writer : public DCData::h__Writer public: AtmosDescriptor m_ADesc; - h__Writer(const Dictionary& d) : DCData::h__Writer(d), - m_EssenceSubDescriptor(NULL), m_ADesc() {} + h__Writer(const Dictionary& d) : ASDCP::h__ASDCPWriter(d), + m_EssenceSubDescriptor(0), m_ADesc() { + memset(m_EssenceUL, 0, SMPTE_UL_LENGTH); + } virtual ~h__Writer(){} Result_t OpenWrite(const std::string&, ui32_t HeaderSize, const AtmosDescriptor& ADesc); + Result_t SetSourceStream(const DCData::DCDataDescriptor&, const byte_t*, const std::string&, const std::string&); + Result_t WriteFrame(const FrameBuffer&, AESEncContext* = 0, HMACContext* = 0); + Result_t Finalize(); + Result_t DCData_DDesc_to_MD(ASDCP::DCData::DCDataDescriptor& DDesc); Result_t Atmos_ADesc_to_MD(const AtmosDescriptor& ADesc); }; // ASDCP::Result_t +ASDCP::ATMOS::MXFWriter::h__Writer::DCData_DDesc_to_MD(ASDCP::DCData::DCDataDescriptor& DDesc) +{ + ASDCP_TEST_NULL(m_EssenceDescriptor); + MXF::DCDataDescriptor* DDescObj = static_cast<MXF::DCDataDescriptor *>(m_EssenceDescriptor); + + DDescObj->SampleRate = DDesc.EditRate; + DDescObj->ContainerDuration = DDesc.ContainerDuration; + DDescObj->DataEssenceCoding.Set(DDesc.DataEssenceCoding); + + return RESULT_OK; +} + +// +ASDCP::Result_t ASDCP::ATMOS::MXFWriter::h__Writer::Atmos_ADesc_to_MD(const AtmosDescriptor& ADesc) { ASDCP_TEST_NULL(m_EssenceDescriptor); @@ -357,11 +448,30 @@ ASDCP::ATMOS::MXFWriter::h__Writer::Atmos_ADesc_to_MD(const AtmosDescriptor& ADe ASDCP::Result_t ASDCP::ATMOS::MXFWriter::h__Writer::OpenWrite(const std::string& filename, ui32_t HeaderSize, const AtmosDescriptor& ADesc) { + if ( ! m_State.Test_BEGIN() ) + return RESULT_STATE; + + Result_t result = m_File.OpenWrite(filename); + + if ( ASDCP_SUCCESS(result) ) + { + m_HeaderSize = HeaderSize; + m_EssenceDescriptor = new MXF::DCDataDescriptor(m_Dict); + m_EssenceSubDescriptor = new DolbyAtmosSubDescriptor(m_Dict); + SubDescriptorList_t subDescriptors; + subDescriptors.push_back(m_EssenceSubDescriptor); + + SubDescriptorList_t::const_iterator sDObj; + SubDescriptorList_t::const_iterator lastDescriptor = subDescriptors.end(); + for (sDObj = subDescriptors.begin(); sDObj != lastDescriptor; ++sDObj) + { + m_EssenceSubDescriptorList.push_back(*sDObj); + GenRandomValue((*sDObj)->InstanceUID); + m_EssenceDescriptor->SubDescriptors.push_back((*sDObj)->InstanceUID); + } + result = m_State.Goto_INIT(); + } - m_EssenceSubDescriptor = new DolbyAtmosSubDescriptor(m_Dict); - DCData::SubDescriptorList_t subDescriptors; - subDescriptors.push_back(m_EssenceSubDescriptor); - Result_t result = DCData::h__Writer::OpenWrite(filename, HeaderSize, subDescriptors); if ( ASDCP_FAILURE(result) ) delete m_EssenceSubDescriptor; @@ -375,6 +485,93 @@ ASDCP::ATMOS::MXFWriter::h__Writer::OpenWrite(const std::string& filename, ui32_ return result; } +// +ASDCP::Result_t +ASDCP::ATMOS::MXFWriter::h__Writer::SetSourceStream(ASDCP::DCData::DCDataDescriptor const& DDesc, + const byte_t * essenceCoding, + const std::string& packageLabel, + const std::string& defLabel) +{ + if ( ! m_State.Test_INIT() ) + return RESULT_STATE; + + if ( DDesc.EditRate != EditRate_24 + && DDesc.EditRate != EditRate_25 + && DDesc.EditRate != EditRate_30 + && DDesc.EditRate != EditRate_48 + && DDesc.EditRate != EditRate_50 + && DDesc.EditRate != EditRate_60 + && DDesc.EditRate != EditRate_96 + && DDesc.EditRate != EditRate_100 + && DDesc.EditRate != EditRate_120 ) + { + DefaultLogSink().Error("DCDataDescriptor.EditRate is not a supported value: %d/%d\n", + DDesc.EditRate.Numerator, DDesc.EditRate.Denominator); + return RESULT_RAW_FORMAT; + } + + assert(m_Dict); + m_DDesc = DDesc; + if (NULL != essenceCoding) + memcpy(m_DDesc.DataEssenceCoding, essenceCoding, SMPTE_UL_LENGTH); + Result_t result = DCData_DDesc_to_MD(m_DDesc); + + if ( ASDCP_SUCCESS(result) ) + { + memcpy(m_EssenceUL, m_Dict->ul(MDD_DolbyAtmosDCDataEssence), SMPTE_UL_LENGTH); + m_EssenceUL[SMPTE_UL_LENGTH-1] = 1; // first (and only) essence container + result = m_State.Goto_READY(); + } + + if ( ASDCP_SUCCESS(result) ) + { + ui32_t TCFrameRate = m_DDesc.EditRate.Numerator; + + result = WriteASDCPHeader(packageLabel, UL(m_Dict->ul(MDD_DolbyAtmosDCDataWrappingFrame)), + defLabel, UL(m_EssenceUL), UL(m_Dict->ul(MDD_DataDataDef)), + m_DDesc.EditRate, TCFrameRate); + } + + return result; +} + +// +ASDCP::Result_t +ASDCP::ATMOS::MXFWriter::h__Writer::WriteFrame(const FrameBuffer& FrameBuf, + ASDCP::AESEncContext* Ctx, ASDCP::HMACContext* HMAC) +{ + Result_t result = RESULT_OK; + + if ( m_State.Test_READY() ) + result = m_State.Goto_RUNNING(); // first time through + + ui64_t StreamOffset = m_StreamOffset; + + if ( ASDCP_SUCCESS(result) ) + result = WriteEKLVPacket(FrameBuf, m_EssenceUL, Ctx, HMAC); + + if ( ASDCP_SUCCESS(result) ) + { + IndexTableSegment::IndexEntry Entry; + Entry.StreamOffset = StreamOffset; + m_FooterPart.PushIndexEntry(Entry); + m_FramesWritten++; + } + return result; +} + +// Closes the MXF file, writing the index and other closing information. +// +ASDCP::Result_t +ASDCP::ATMOS::MXFWriter::h__Writer::Finalize() +{ + if ( ! m_State.Test_RUNNING() ) + return RESULT_STATE; + + m_State.Goto_FINAL(); + + return WriteASDCPFooter(); +} @@ -453,7 +650,7 @@ ASDCP::ATMOS::MXFWriter::OpenWrite(const std::string& filename, const WriterInfo if ( ASDCP_SUCCESS(result) ) result = m_Writer->SetSourceStream(ADesc, ATMOS_ESSENCE_CODING, ATMOS_PACKAGE_LABEL, ATMOS_DEF_LABEL); - + if ( ASDCP_FAILURE(result) ) m_Writer.release(); diff --git a/src/AS_DCP_DCData.cpp b/src/AS_DCP_DCData.cpp index e145e1f..5db1482 100644 --- a/src/AS_DCP_DCData.cpp +++ b/src/AS_DCP_DCData.cpp @@ -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 @@ -32,16 +32,15 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include <iostream> #include "AS_DCP.h" -#include "AS_DCP_DCData_internal.h" #include "AS_DCP_internal.h" namespace ASDCP { -namespace DCData -{ - static std::string DC_DATA_PACKAGE_LABEL = "File Package: SMPTE-GC frame wrapping of D-Cinema Generic data"; - static std::string DC_DATA_DEF_LABEL = "D-Cinema Generic Data Track"; -} // namespace DCData + namespace DCData + { + static std::string DC_DATA_PACKAGE_LABEL = "File Package: SMPTE-GC frame wrapping of D-Cinema Generic data"; + static std::string DC_DATA_DEF_LABEL = "D-Cinema Generic Data Track"; + } // namespace DCData } // namespace ASDCP // @@ -75,9 +74,28 @@ ASDCP::DCData::DCDataDescriptorDump(const DCDataDescriptor& DDesc, FILE* stream) //------------------------------------------------------------------------------------------ +typedef std::list<MXF::InterchangeObject*> SubDescriptorList_t; + +class ASDCP::DCData::MXFReader::h__Reader : public ASDCP::h__ASDCPReader +{ + bool m_AtmosLabelCompatibilityMode; + MXF::DCDataDescriptor* m_EssenceDescriptor; + ASDCP_NO_COPY_CONSTRUCT(h__Reader); + h__Reader(); + + public: + DCDataDescriptor m_DDesc; + + h__Reader(const Dictionary& d) : ASDCP::h__ASDCPReader(d), m_AtmosLabelCompatibilityMode(false), m_EssenceDescriptor(0), m_DDesc() {} + ~h__Reader() {} + Result_t OpenRead(const std::string&); + Result_t ReadFrame(ui32_t, FrameBuffer&, AESDecContext*, HMACContext*); + Result_t MD_to_DCData_DDesc(DCData::DCDataDescriptor& DDesc); +}; + ASDCP::Result_t -ASDCP::DCData::h__Reader::MD_to_DCData_DDesc(DCData::DCDataDescriptor& DDesc) +ASDCP::DCData::MXFReader::h__Reader::MD_to_DCData_DDesc(DCData::DCDataDescriptor& DDesc) { ASDCP_TEST_NULL(m_EssenceDescriptor); MXF::DCDataDescriptor* DDescObj = m_EssenceDescriptor; @@ -91,31 +109,43 @@ ASDCP::DCData::h__Reader::MD_to_DCData_DDesc(DCData::DCDataDescriptor& DDesc) // // ASDCP::Result_t -ASDCP::DCData::h__Reader::OpenRead(const std::string& filename) +ASDCP::DCData::MXFReader::h__Reader::OpenRead(const std::string& filename) { Result_t result = OpenMXFRead(filename); + m_EssenceDescriptor = 0; - if( ASDCP_SUCCESS(result) ) + if( KM_SUCCESS(result) ) { - if (NULL == m_EssenceDescriptor) - { - InterchangeObject* iObj = NULL; - result = m_HeaderPart.GetMDObjectByType(OBJ_TYPE_ARGS(DCDataDescriptor), &iObj); - m_EssenceDescriptor = static_cast<MXF::DCDataDescriptor*>(iObj); + InterchangeObject* iObj = 0; + result = m_HeaderPart.GetMDObjectByType(OBJ_TYPE_ARGS(DCDataDescriptor), &iObj); - if ( m_EssenceDescriptor == 0 ) + if ( KM_FAILURE(result) ) + { + result = m_HeaderPart.GetMDObjectByType(OBJ_TYPE_ARGS(DolbyAtmosDCDataDescriptor), &iObj); + + if ( KM_SUCCESS(result) ) { - DefaultLogSink().Error("DCDataDescriptor object not found.\n"); - return RESULT_FORMAT; + m_AtmosLabelCompatibilityMode = true; } } - if ( ASDCP_SUCCESS(result) ) + if ( KM_SUCCESS(result) ) { - result = MD_to_DCData_DDesc(m_DDesc); + m_EssenceDescriptor = static_cast<MXF::DCDataDescriptor*>(iObj); } } + if ( m_EssenceDescriptor == 0 ) + { + DefaultLogSink().Error("DCDataDescriptor object not found.\n"); + result = RESULT_FORMAT; + } + + if ( KM_SUCCESS(result) ) + { + result = MD_to_DCData_DDesc(m_DDesc); + } + // check for sample/frame rate sanity if ( ASDCP_SUCCESS(result) && m_DDesc.EditRate != EditRate_24 @@ -140,30 +170,22 @@ ASDCP::DCData::h__Reader::OpenRead(const std::string& filename) // // ASDCP::Result_t -ASDCP::DCData::h__Reader::ReadFrame(ui32_t FrameNum, FrameBuffer& FrameBuf, +ASDCP::DCData::MXFReader::h__Reader::ReadFrame(ui32_t FrameNum, FrameBuffer& FrameBuf, AESDecContext* Ctx, HMACContext* HMAC) { if ( ! m_File.IsOpen() ) return RESULT_INIT; assert(m_Dict); + if ( m_AtmosLabelCompatibilityMode ) + { + return ReadEKLVFrame(FrameNum, FrameBuf, m_Dict->ul(MDD_DolbyAtmosDCDataEssence), Ctx, HMAC); + } + return ReadEKLVFrame(FrameNum, FrameBuf, m_Dict->ul(MDD_DCDataEssence), Ctx, HMAC); } -// -//------------------------------------------------------------------------------------------ - -class ASDCP::DCData::MXFReader::h__Reader : public DCData::h__Reader -{ - ASDCP_NO_COPY_CONSTRUCT(h__Reader); - h__Reader(); - - public: - h__Reader(const Dictionary& d) : DCData::h__Reader(d) {} - virtual ~h__Reader() {} -}; - //------------------------------------------------------------------------------------------ @@ -330,9 +352,32 @@ ASDCP::DCData::MXFReader::Close() const //------------------------------------------------------------------------------------------ +class ASDCP::DCData::MXFWriter::h__Writer : public ASDCP::h__ASDCPWriter +{ + ASDCP_NO_COPY_CONSTRUCT(h__Writer); + h__Writer(); + +public: + DCDataDescriptor m_DDesc; + byte_t m_EssenceUL[SMPTE_UL_LENGTH]; + + h__Writer(const Dictionary& d) : ASDCP::h__ASDCPWriter(d) { + memset(m_EssenceUL, 0, SMPTE_UL_LENGTH); + } + + ~h__Writer(){} + + Result_t OpenWrite(const std::string&, ui32_t HeaderSize, const SubDescriptorList_t& subDescriptors); + Result_t SetSourceStream(const DCDataDescriptor&, const byte_t*, const std::string&, const std::string&); + Result_t WriteFrame(const FrameBuffer&, AESEncContext* = 0, HMACContext* = 0); + Result_t Finalize(); + Result_t DCData_DDesc_to_MD(DCData::DCDataDescriptor& DDesc); +}; + + // ASDCP::Result_t -ASDCP::DCData::h__Writer::DCData_DDesc_to_MD(DCData::DCDataDescriptor& DDesc) +ASDCP::DCData::MXFWriter::h__Writer::DCData_DDesc_to_MD(DCData::DCDataDescriptor& DDesc) { ASDCP_TEST_NULL(m_EssenceDescriptor); MXF::DCDataDescriptor* DDescObj = static_cast<MXF::DCDataDescriptor *>(m_EssenceDescriptor); @@ -346,7 +391,7 @@ ASDCP::DCData::h__Writer::DCData_DDesc_to_MD(DCData::DCDataDescriptor& DDesc) // ASDCP::Result_t -ASDCP::DCData::h__Writer::OpenWrite(const std::string& filename, ui32_t HeaderSize, +ASDCP::DCData::MXFWriter::h__Writer::OpenWrite(const std::string& filename, ui32_t HeaderSize, const SubDescriptorList_t& subDescriptors) { if ( ! m_State.Test_BEGIN() ) @@ -374,7 +419,7 @@ ASDCP::DCData::h__Writer::OpenWrite(const std::string& filename, ui32_t HeaderSi // ASDCP::Result_t -ASDCP::DCData::h__Writer::SetSourceStream(DCDataDescriptor const& DDesc, +ASDCP::DCData::MXFWriter::h__Writer::SetSourceStream(DCDataDescriptor const& DDesc, const byte_t * essenceCoding, const std::string& packageLabel, const std::string& defLabel) @@ -424,7 +469,7 @@ ASDCP::DCData::h__Writer::SetSourceStream(DCDataDescriptor const& DDesc, // ASDCP::Result_t -ASDCP::DCData::h__Writer::WriteFrame(const FrameBuffer& FrameBuf, +ASDCP::DCData::MXFWriter::h__Writer::WriteFrame(const FrameBuffer& FrameBuf, ASDCP::AESEncContext* Ctx, ASDCP::HMACContext* HMAC) { Result_t result = RESULT_OK; @@ -450,7 +495,7 @@ ASDCP::DCData::h__Writer::WriteFrame(const FrameBuffer& FrameBuf, // Closes the MXF file, writing the index and other closing information. // ASDCP::Result_t -ASDCP::DCData::h__Writer::Finalize() +ASDCP::DCData::MXFWriter::h__Writer::Finalize() { if ( ! m_State.Test_RUNNING() ) return RESULT_STATE; @@ -461,20 +506,6 @@ ASDCP::DCData::h__Writer::Finalize() } -// -//------------------------------------------------------------------------------------------ - - -class ASDCP::DCData::MXFWriter::h__Writer : public DCData::h__Writer -{ - ASDCP_NO_COPY_CONSTRUCT(h__Writer); - h__Writer(); - - public: - h__Writer(const Dictionary& d) : DCData::h__Writer(d) {} - virtual ~h__Writer() {} -}; - //------------------------------------------------------------------------------------------ diff --git a/src/KM_fileio.cpp b/src/KM_fileio.cpp index 2a217af..9c57fbe 100644 --- a/src/KM_fileio.cpp +++ b/src/KM_fileio.cpp @@ -1214,7 +1214,7 @@ Kumu::ReadFileIntoObject(const std::string& Filename, Kumu::IArchive& Object, ui if ( KM_SUCCESS(result) ) { ui32_t read_count = 0; - FileWriter Reader; + FileReader Reader; result = Reader.OpenRead(Filename); @@ -1274,7 +1274,7 @@ Kumu::ReadFileIntoBuffer(const std::string& Filename, Kumu::ByteString& Buffer, if ( KM_SUCCESS(result) ) { ui32_t read_count = 0; - FileWriter Reader; + FileReader Reader; result = Reader.OpenRead(Filename); diff --git a/src/MDD.cpp b/src/MDD.cpp index 7ccbf66..116caab 100644 --- a/src/MDD.cpp +++ b/src/MDD.cpp @@ -1185,6 +1185,19 @@ static const ASDCP::MDDEntry s_MDD_Table[] = { { { 0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x0e, // 380 0x04, 0x01, 0x06, 0x03, 0x0e, 0x00, 0x00, 0x00 }, {0}, true, "JPEG2000PictureSubDescriptor_J2CLayout" }, + + // Old DCData UL values, needed for continued support of Atmos + // + { { 0x06, 0x0e, 0x2b, 0x34, 0x04, 0x01, 0x01, 0x05, // 381 + 0x0e, 0x09, 0x06, 0x05, 0x00, 0x00, 0x00, 0x00 }, + {0}, false, "DolbyAtmosDCDataWrappingFrame" }, + { { 0x06, 0x0e, 0x2b, 0x34, 0x01, 0x02, 0x01, 0x05, // 382 + 0x0e, 0x09, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00 }, + {0}, false, "DolbyAtmosDCDataEssence" }, + { { 0x06, 0x0e, 0x2b, 0x34, 0x02, 0x53, 0x01, 0x05, // 383 + 0x0e, 0x09, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00 }, + {0}, false, "DolbyAtmosDCDataDescriptor" }, + { {0}, {0}, false, 0 } }; @@ -416,6 +416,9 @@ namespace ASDCP { MDD_PHDRMetadataTrackSubDescriptor_SourceTrackID, // 378 MDD_PHDRMetadataTrackSubDescriptor_SimplePayloadSID, // 379 MDD_JPEG2000PictureSubDescriptor_J2CLayout, // 380 + MDD_DolbyAtmosDCDataWrappingFrame, // 381 + MDD_DolbyAtmosDCDataEssence, // 382 + MDD_DolbyAtmosDCDataDescriptor, // 383 MDD_Max }; // enum MDD_t diff --git a/src/Makefile.am b/src/Makefile.am index 306d5ca..f903eb9 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -119,7 +119,7 @@ libasdcp_la_SOURCES = MPEG2_Parser.cpp MPEG.cpp JP2K_Codestream_Parser.cpp \ Wav.h WavFileWriter.h MXF.h Metadata.h \ JP2K.h AS_DCP.h AS_DCP_internal.h KLV.h MPEG.h MXFTypes.h MDD.h \ PCMParserList.h S12MTimecode.h MDD.cpp \ - AS_DCP_ATMOS.cpp AS_DCP_DCData.cpp AS_DCP_DCData_internal.h \ + AS_DCP_ATMOS.cpp AS_DCP_DCData.cpp info.in\ DCData_ByteStream_Parser.cpp DCData_Sequence_Parser.cpp \ AtmosSyncChannel_Generator.cpp AtmosSyncChannel_Generator.h \ AtmosSyncChannel_Mixer.cpp AtmosSyncChannel_Mixer.h \ diff --git a/src/Metadata.cpp b/src/Metadata.cpp index af32e5b..7839f4f 100755 --- a/src/Metadata.cpp +++ b/src/Metadata.cpp @@ -1,5 +1,5 @@ /* -Copyright (c) 2005-2015, John Hurst +Copyright (c) 2005-2012, John Hurst All rights reserved. Redistribution and use in source and binary forms, with or without @@ -325,7 +325,7 @@ ContentStorage::WriteToBuffer(ASDCP::FrameBuffer& Buffer) // -EssenceContainerData::EssenceContainerData(const Dictionary*& d) : InterchangeObject(d), m_Dict(d), IndexSID(0) +EssenceContainerData::EssenceContainerData(const Dictionary*& d) : InterchangeObject(d), m_Dict(d), BodySID(0) { assert(m_Dict); m_UL = m_Dict->ul(MDD_EssenceContainerData); @@ -871,7 +871,7 @@ Track::WriteToBuffer(ASDCP::FrameBuffer& Buffer) // StructuralComponent // -StructuralComponent::StructuralComponent(const Dictionary*& d) : InterchangeObject(d), m_Dict(d), Duration(0) {} +StructuralComponent::StructuralComponent(const Dictionary*& d) : InterchangeObject(d), m_Dict(d) {} StructuralComponent::StructuralComponent(const StructuralComponent& rhs) : InterchangeObject(rhs.m_Dict), m_Dict(rhs.m_Dict) { @@ -1239,7 +1239,7 @@ GenericDescriptor::Dump(FILE* stream) // -FileDescriptor::FileDescriptor(const Dictionary*& d) : GenericDescriptor(d), m_Dict(d), LinkedTrackID(0) +FileDescriptor::FileDescriptor(const Dictionary*& d) : GenericDescriptor(d), m_Dict(d) { assert(m_Dict); m_UL = m_Dict->ul(MDD_FileDescriptor); @@ -1345,7 +1345,7 @@ FileDescriptor::WriteToBuffer(ASDCP::FrameBuffer& Buffer) // -GenericSoundEssenceDescriptor::GenericSoundEssenceDescriptor(const Dictionary*& d) : FileDescriptor(d), m_Dict(d), Locked(0), AudioRefLevel(0), ChannelCount(0), QuantizationBits(0), DialNorm(0) +GenericSoundEssenceDescriptor::GenericSoundEssenceDescriptor(const Dictionary*& d) : FileDescriptor(d), m_Dict(d), Locked(0), ChannelCount(0), QuantizationBits(0) { assert(m_Dict); m_UL = m_Dict->ul(MDD_GenericSoundEssenceDescriptor); @@ -1463,7 +1463,7 @@ GenericSoundEssenceDescriptor::WriteToBuffer(ASDCP::FrameBuffer& Buffer) // -WaveAudioDescriptor::WaveAudioDescriptor(const Dictionary*& d) : GenericSoundEssenceDescriptor(d), m_Dict(d), BlockAlign(0), SequenceOffset(0) +WaveAudioDescriptor::WaveAudioDescriptor(const Dictionary*& d) : GenericSoundEssenceDescriptor(d), m_Dict(d), BlockAlign(0), AvgBps(0) { assert(m_Dict); m_UL = m_Dict->ul(MDD_WaveAudioDescriptor); @@ -1578,7 +1578,7 @@ WaveAudioDescriptor::WriteToBuffer(ASDCP::FrameBuffer& Buffer) // -GenericPictureEssenceDescriptor::GenericPictureEssenceDescriptor(const Dictionary*& d) : FileDescriptor(d), m_Dict(d), SignalStandard(0), SampledWidth(0), SampledXOffset(0), DisplayHeight(0), DisplayXOffset(0), DisplayF2Offset(0), AlphaTransparency(0), ImageAlignmentOffset(0), ImageEndOffset(0), ActiveHeight(0), ActiveYOffset(0) +GenericPictureEssenceDescriptor::GenericPictureEssenceDescriptor(const Dictionary*& d) : FileDescriptor(d), m_Dict(d), FrameLayout(0), StoredWidth(0), StoredHeight(0) { assert(m_Dict); m_UL = m_Dict->ul(MDD_GenericPictureEssenceDescriptor); @@ -1894,7 +1894,7 @@ GenericPictureEssenceDescriptor::WriteToBuffer(ASDCP::FrameBuffer& Buffer) // -RGBAEssenceDescriptor::RGBAEssenceDescriptor(const Dictionary*& d) : GenericPictureEssenceDescriptor(d), m_Dict(d), ComponentMaxRef(0), AlphaMinRef(0), ScanningDirection(0) +RGBAEssenceDescriptor::RGBAEssenceDescriptor(const Dictionary*& d) : GenericPictureEssenceDescriptor(d), m_Dict(d) { assert(m_Dict); m_UL = m_Dict->ul(MDD_RGBAEssenceDescriptor); @@ -2157,7 +2157,7 @@ JPEG2000PictureSubDescriptor::WriteToBuffer(ASDCP::FrameBuffer& Buffer) // -CDCIEssenceDescriptor::CDCIEssenceDescriptor(const Dictionary*& d) : GenericPictureEssenceDescriptor(d), m_Dict(d), ComponentDepth(0), HorizontalSubsampling(0), VerticalSubsampling(0), ReversedByteOrder(0), AlphaSampleDepth(0), WhiteReflevel(0) +CDCIEssenceDescriptor::CDCIEssenceDescriptor(const Dictionary*& d) : GenericPictureEssenceDescriptor(d), m_Dict(d), ComponentDepth(0), HorizontalSubsampling(0) { assert(m_Dict); m_UL = m_Dict->ul(MDD_CDCIEssenceDescriptor); @@ -2308,7 +2308,7 @@ CDCIEssenceDescriptor::WriteToBuffer(ASDCP::FrameBuffer& Buffer) // -MPEG2VideoDescriptor::MPEG2VideoDescriptor(const Dictionary*& d) : CDCIEssenceDescriptor(d), m_Dict(d), SingleSequence(0), CodedContentType(0), ClosedGOP(0), MaxGOP(0), BitRate(0) +MPEG2VideoDescriptor::MPEG2VideoDescriptor(const Dictionary*& d) : CDCIEssenceDescriptor(d), m_Dict(d) { assert(m_Dict); m_UL = m_Dict->ul(MDD_MPEG2VideoDescriptor); diff --git a/src/TimedText_Parser.cpp b/src/TimedText_Parser.cpp index b6b2cc7..5aeacf1 100644 --- a/src/TimedText_Parser.cpp +++ b/src/TimedText_Parser.cpp @@ -246,7 +246,10 @@ ASDCP::TimedText::DCSubtitleParser::h__SubtitleParser::OpenRead() && m_TDesc.EditRate != EditRate_30 && m_TDesc.EditRate != EditRate_48 && m_TDesc.EditRate != EditRate_50 - && m_TDesc.EditRate != EditRate_60 ) + && m_TDesc.EditRate != EditRate_60 + && m_TDesc.EditRate != EditRate_96 + && m_TDesc.EditRate != EditRate_100 + && m_TDesc.EditRate != EditRate_120 ) { DefaultLogSink(). Error("Unexpected EditRate: %d/%d\n", m_TDesc.EditRate.Numerator, m_TDesc.EditRate.Denominator); diff --git a/src/as-02-info.cpp b/src/as-02-info.cpp index 7c68c41..19109e8 100644 --- a/src/as-02-info.cpp +++ b/src/as-02-info.cpp @@ -371,6 +371,7 @@ class MyAudioDescriptor : public PCM::AudioDescriptor if ( m_WaveAudioDescriptor != 0 ) { AudioSamplingRate = m_WaveAudioDescriptor->SampleRate; + ContainerDuration = m_WaveAudioDescriptor->ContainerDuration; } else { diff --git a/src/info.in b/src/info.in new file mode 100644 index 0000000..31870fd --- /dev/null +++ b/src/info.in @@ -0,0 +1,5 @@ +#define VERSION_MAJOR "@VERSION_MAJOR@" +#define VERSION_MINOR "@VERSION_MINOR@" +#define VERSION_PATCH "@VERSION_PATCH@" +#define PROJECT_NAME "@PROJECT_NAME@" +#define BUILD_TYPE "@CMAKE_BUILD_TYPE@"
\ No newline at end of file |
