summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/AS_DCP_ATMOS.cpp227
-rw-r--r--src/AS_DCP_DCData.cpp137
-rw-r--r--src/KM_fileio.cpp4
-rw-r--r--src/MDD.cpp13
-rwxr-xr-xsrc/MDD.h3
-rw-r--r--src/Makefile.am2
-rwxr-xr-xsrc/Metadata.cpp20
-rw-r--r--src/TimedText_Parser.cpp5
-rw-r--r--src/as-02-info.cpp1
-rw-r--r--src/info.in5
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 }
};
diff --git a/src/MDD.h b/src/MDD.h
index f03e51f..2b274ab 100755
--- a/src/MDD.h
+++ b/src/MDD.h
@@ -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