/*
-Copyright (c) 2004-2016, John Hurst
+Copyright (c) 2004-2018, John Hurst
All rights reserved.
Redistribution and use in source and binary forms, with or without
class ASDCP::DCData::MXFReader::h__Reader : public ASDCP::h__ASDCPReader
{
- bool m_AtmosLabelCompatibilityMode;
- MXF::DCDataDescriptor* m_EssenceDescriptor;
+ bool m_PrivateLabelCompatibilityMode;
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(const Dictionary& d) : ASDCP::h__ASDCPReader(d), m_PrivateLabelCompatibilityMode(false), 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);
+ Result_t MD_to_DCData_DDesc(const MXF::DCDataDescriptor& descriptor_object, DCData::DCDataDescriptor& DDesc);
+ Result_t MD_to_DCData_DDesc(const MXF::PrivateDCDataDescriptor& descriptor_object, DCData::DCDataDescriptor& DDesc);
};
+//
+ASDCP::Result_t
+ASDCP::DCData::MXFReader::h__Reader::MD_to_DCData_DDesc(const MXF::DCDataDescriptor& descriptor_object,
+ DCData::DCDataDescriptor& DDesc)
+{
+ DDesc.EditRate = descriptor_object.SampleRate;
+ assert(descriptor_object.ContainerDuration.const_get() <= 0xFFFFFFFFL);
+ DDesc.ContainerDuration = static_cast<ui32_t>(descriptor_object.ContainerDuration.const_get());
+ memcpy(DDesc.DataEssenceCoding, descriptor_object.DataEssenceCoding.Value(), SMPTE_UL_LENGTH);
+ return RESULT_OK;
+}
+//
ASDCP::Result_t
-ASDCP::DCData::MXFReader::h__Reader::MD_to_DCData_DDesc(DCData::DCDataDescriptor& DDesc)
+ASDCP::DCData::MXFReader::h__Reader::MD_to_DCData_DDesc(const MXF::PrivateDCDataDescriptor& descriptor_object,
+ 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);
+ DDesc.EditRate = descriptor_object.SampleRate;
+ assert(descriptor_object.ContainerDuration.const_get() <= 0xFFFFFFFFL);
+ DDesc.ContainerDuration = static_cast<ui32_t>(descriptor_object.ContainerDuration.const_get());
+ memcpy(DDesc.DataEssenceCoding, descriptor_object.DataEssenceCoding.Value(), SMPTE_UL_LENGTH);
return RESULT_OK;
}
ASDCP::DCData::MXFReader::h__Reader::OpenRead(const std::string& filename)
{
Result_t result = OpenMXFRead(filename);
- m_EssenceDescriptor = 0;
if( KM_SUCCESS(result) )
{
InterchangeObject* iObj = 0;
result = m_HeaderPart.GetMDObjectByType(OBJ_TYPE_ARGS(DCDataDescriptor), &iObj);
- if ( KM_FAILURE(result) )
+ if ( KM_SUCCESS(result) )
{
- result = m_HeaderPart.GetMDObjectByType(OBJ_TYPE_ARGS(DolbyAtmosDCDataDescriptor), &iObj);
+ const MXF::DCDataDescriptor* p = dynamic_cast<const MXF::DCDataDescriptor*>(iObj);
+ assert(p);
+ result = MD_to_DCData_DDesc(*p, m_DDesc);
+ }
+ else
+ {
+ result = m_HeaderPart.GetMDObjectByType(OBJ_TYPE_ARGS(PrivateDCDataDescriptor), &iObj);
if ( KM_SUCCESS(result) )
{
- m_AtmosLabelCompatibilityMode = true;
+ m_PrivateLabelCompatibilityMode = true;
+ const MXF::PrivateDCDataDescriptor* p = dynamic_cast<const MXF::PrivateDCDataDescriptor*>(iObj);
+ assert(p);
+ result = MD_to_DCData_DDesc(*p, m_DDesc);
}
}
- if ( KM_SUCCESS(result) )
+ if ( KM_FAILURE(result) )
{
- m_EssenceDescriptor = static_cast<MXF::DCDataDescriptor*>(iObj);
+ DefaultLogSink().Error("DCDataDescriptor object not found in ST 429-14 file.\n");
+ result = RESULT_FORMAT;
}
}
- 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 )
+ && 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
+ && m_DDesc.EditRate != EditRate_192
+ && m_DDesc.EditRate != EditRate_200
+ && m_DDesc.EditRate != EditRate_240 )
{
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_INIT;
assert(m_Dict);
- if ( m_AtmosLabelCompatibilityMode )
+ if ( m_PrivateLabelCompatibilityMode )
{
- return ReadEKLVFrame(FrameNum, FrameBuf, m_Dict->ul(MDD_DolbyAtmosDCDataEssence), Ctx, HMAC);
+ return ReadEKLVFrame(FrameNum, FrameBuf, m_Dict->ul(MDD_PrivateDCDataEssence), Ctx, HMAC);
}
return ReadEKLVFrame(FrameNum, FrameBuf, m_Dict->ul(MDD_DCDataEssence), Ctx, HMAC);
&& DDesc.EditRate != EditRate_60
&& DDesc.EditRate != EditRate_96
&& DDesc.EditRate != EditRate_100
- && DDesc.EditRate != EditRate_120 )
+ && DDesc.EditRate != EditRate_120
+ && DDesc.EditRate != EditRate_192
+ && DDesc.EditRate != EditRate_200
+ && DDesc.EditRate != EditRate_240 )
{
DefaultLogSink().Error("DCDataDescriptor.EditRate is not a supported value: %d/%d\n",
DDesc.EditRate.Numerator, DDesc.EditRate.Denominator);
ui64_t StreamOffset = m_StreamOffset;
if ( ASDCP_SUCCESS(result) )
- result = WriteEKLVPacket(FrameBuf, m_EssenceUL, Ctx, HMAC);
+ result = WriteEKLVPacket(FrameBuf, m_EssenceUL, MXF_BER_LENGTH, Ctx, HMAC);
if ( ASDCP_SUCCESS(result) )
{