From f2ecb6822ff3db70b40adb19a37eab6456e28ed8 Mon Sep 17 00:00:00 2001 From: jhurst Date: Tue, 2 Jul 2013 02:05:16 +0000 Subject: [PATCH] optional properties, take 1 --- src/MXF.cpp | 28 ++++++++++++++++++---------- src/MXF.h | 26 +++++++++++++++++++++++--- src/MXFTypes.h | 2 ++ src/Metadata.cpp | 48 +++++++++++++++++++++++++++++++++++++++++------- src/Metadata.h | 16 ++++++++++------ 5 files changed, 94 insertions(+), 26 deletions(-) diff --git a/src/MXF.cpp b/src/MXF.cpp index d3351ef..15a9ba0 100755 --- a/src/MXF.cpp +++ b/src/MXF.cpp @@ -586,10 +586,11 @@ ASDCP::MXF::Primer::Dump(FILE* stream) // ASDCP::MXF::Preface::Preface(const Dictionary*& d) : - InterchangeObject(d), m_Dict(d), Version(258), ObjectModelVersion(0) + InterchangeObject(d), m_Dict(d), Version(258) { assert(m_Dict); m_UL = m_Dict->Type(MDD_Preface).ul; + ObjectModelVersion = 0; } // @@ -616,8 +617,8 @@ ASDCP::MXF::Preface::InitFromTLVSet(TLVReader& TLVSet) Result_t result = InterchangeObject::InitFromTLVSet(TLVSet); if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(Preface, LastModifiedDate)); if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi16(OBJ_READ_ARGS(Preface, Version)); - if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi32(OBJ_READ_ARGS(Preface, ObjectModelVersion)); - if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(Preface, PrimaryPackage)); + if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi32(OBJ_READ_ARGS_OPT(Preface, ObjectModelVersion)); + if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS_OPT(Preface, PrimaryPackage)); if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(Preface, Identifications)); if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(Preface, ContentStorage)); if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(Preface, OperationalPattern)); @@ -633,8 +634,8 @@ ASDCP::MXF::Preface::WriteToTLVSet(TLVWriter& TLVSet) Result_t result = InterchangeObject::WriteToTLVSet(TLVSet); if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(Preface, LastModifiedDate)); if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi16(OBJ_WRITE_ARGS(Preface, Version)); - if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS(Preface, ObjectModelVersion)); - if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(Preface, PrimaryPackage)); + if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS_OPT(Preface, ObjectModelVersion)); + if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS_OPT(Preface, PrimaryPackage)); if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(Preface, Identifications)); if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(Preface, ContentStorage)); if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(Preface, OperationalPattern)); @@ -669,8 +670,13 @@ ASDCP::MXF::Preface::Dump(FILE* stream) InterchangeObject::Dump(stream); fprintf(stream, " %22s = %s\n", "LastModifiedDate", LastModifiedDate.EncodeString(identbuf, IdentBufferLen)); fprintf(stream, " %22s = %hu\n", "Version", Version); - fprintf(stream, " %22s = %u\n", "ObjectModelVersion", ObjectModelVersion); - fprintf(stream, " %22s = %s\n", "PrimaryPackage", PrimaryPackage.EncodeHex(identbuf, IdentBufferLen)); + + if ( ! ObjectModelVersion.empty() ) + fprintf(stream, " %22s = %u\n", "ObjectModelVersion", ObjectModelVersion.get()); + + if ( ! PrimaryPackage.empty() ) + fprintf(stream, " %22s = %s\n", "PrimaryPackage", PrimaryPackage.get().EncodeHex(identbuf, IdentBufferLen)); + fprintf(stream, " %22s:\n", "Identifications"); Identifications.Dump(stream); fprintf(stream, " %22s = %s\n", "ContentStorage", ContentStorage.EncodeHex(identbuf, IdentBufferLen)); fprintf(stream, " %22s = %s\n", "OperationalPattern", OperationalPattern.EncodeString(identbuf, IdentBufferLen)); @@ -1290,7 +1296,7 @@ ASDCP::MXF::InterchangeObject::InitFromTLVSet(TLVReader& TLVSet) { Result_t result = TLVSet.ReadObject(OBJ_READ_ARGS(InterchangeObject, InstanceUID)); if ( ASDCP_SUCCESS(result) ) - result = TLVSet.ReadObject(OBJ_READ_ARGS(GenerationInterchangeObject, GenerationUID)); + result = TLVSet.ReadObject(OBJ_READ_ARGS_OPT(GenerationInterchangeObject, GenerationUID)); return result; } @@ -1300,7 +1306,7 @@ ASDCP::MXF::InterchangeObject::WriteToTLVSet(TLVWriter& TLVSet) { Result_t result = TLVSet.WriteObject(OBJ_WRITE_ARGS(InterchangeObject, InstanceUID)); if ( ASDCP_SUCCESS(result) ) - result = TLVSet.WriteObject(OBJ_WRITE_ARGS(GenerationInterchangeObject, GenerationUID)); + result = TLVSet.WriteObject(OBJ_WRITE_ARGS_OPT(GenerationInterchangeObject, GenerationUID)); return result; } @@ -1360,7 +1366,9 @@ ASDCP::MXF::InterchangeObject::Dump(FILE* stream) fputc('\n', stream); KLVPacket::Dump(stream, *m_Dict, false); fprintf(stream, " InstanceUID = %s\n", InstanceUID.EncodeHex(identbuf, IdentBufferLen)); - fprintf(stream, " GenerationUID = %s\n", GenerationUID.EncodeHex(identbuf, IdentBufferLen)); + + if ( ! GenerationUID.empty() ) + fprintf(stream, " GenerationUID = %s\n", GenerationUID.get().EncodeHex(identbuf, IdentBufferLen)); } // diff --git a/src/MXF.h b/src/MXF.h index cda4408..cf28379 100755 --- a/src/MXF.h +++ b/src/MXF.h @@ -218,7 +218,26 @@ namespace ASDCP virtual void Dump(FILE* = 0); }; + // wrapper object manages optional properties + template + class optional_property + { + PropertyType m_property; + bool m_has_value; + + public: + optional_property() : m_has_value(false) {} + optional_property(const PropertyType& value) : m_property(value), m_has_value(false) {} + const optional_property& operator=(const PropertyType& rhs) { this->m_property = rhs; this->m_has_value = true; return *this; } + operator PropertyType&() { return this->m_property; } + void set(const PropertyType& rhs) { this->m_property = rhs; this->m_has_value = true; } + void set_has_value(bool has_value = true) { this->m_has_value = has_value; } + void reset(const PropertyType& rhs) { this->m_has_value = false; } + bool empty() const { return ! m_has_value; } + PropertyType& get() { return m_property; } + }; + // base class of all metadata objects // class InterchangeObject : public ASDCP::KLVPacket { @@ -228,7 +247,7 @@ namespace ASDCP const Dictionary*& m_Dict; IPrimerLookup* m_Lookup; UUID InstanceUID; - UUID GenerationUID; + optional_property GenerationUID; InterchangeObject(const Dictionary*& d) : m_Dict(d), m_Lookup(0) {} virtual ~InterchangeObject() {} @@ -256,13 +275,14 @@ namespace ASDCP const Dictionary*& m_Dict; Kumu::Timestamp LastModifiedDate; ui16_t Version; - ui32_t ObjectModelVersion; - UUID PrimaryPackage; + optional_property ObjectModelVersion; + optional_property PrimaryPackage; Batch Identifications; UUID ContentStorage; UL OperationalPattern; Batch
    EssenceContainers; Batch
      DMSchemes; + optional_property > ApplicationSchemes; Preface(const Dictionary*& d); virtual ~Preface() {} diff --git a/src/MXFTypes.h b/src/MXFTypes.h index 05672d6..f76fbed 100755 --- a/src/MXFTypes.h +++ b/src/MXFTypes.h @@ -43,6 +43,8 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // these are used below to manufacture arguments #define OBJ_READ_ARGS(s,l) m_Dict->Type(MDD_##s##_##l), &l #define OBJ_WRITE_ARGS(s,l) m_Dict->Type(MDD_##s##_##l), &l +#define OBJ_READ_ARGS_OPT(s,l) m_Dict->Type(MDD_##s##_##l), &l.get() +#define OBJ_WRITE_ARGS_OPT(s,l) m_Dict->Type(MDD_##s##_##l), &l.get() #define OBJ_TYPE_ARGS(t) m_Dict->Type(MDD_##t).ul diff --git a/src/Metadata.cpp b/src/Metadata.cpp index 3507ba0..bab0003 100755 --- a/src/Metadata.cpp +++ b/src/Metadata.cpp @@ -1469,7 +1469,7 @@ WaveAudioDescriptor::WriteToBuffer(ASDCP::FrameBuffer& Buffer) // -GenericPictureEssenceDescriptor::GenericPictureEssenceDescriptor(const Dictionary*& d) : FileDescriptor(d), m_Dict(d), FrameLayout(0), StoredWidth(0), StoredHeight(0) +GenericPictureEssenceDescriptor::GenericPictureEssenceDescriptor(const Dictionary*& d) : FileDescriptor(d), m_Dict(d), FrameLayout(0), StoredWidth(0), StoredHeight(0), DisplayWidth(0) { assert(m_Dict); m_UL = m_Dict->ul(MDD_GenericPictureEssenceDescriptor); @@ -1494,6 +1494,22 @@ GenericPictureEssenceDescriptor::InitFromTLVSet(TLVReader& TLVSet) if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadUi32(OBJ_READ_ARGS(GenericPictureEssenceDescriptor, StoredHeight)); if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(GenericPictureEssenceDescriptor, AspectRatio)); if ( ASDCP_SUCCESS(result) ) result = TLVSet.ReadObject(OBJ_READ_ARGS(GenericPictureEssenceDescriptor, PictureEssenceCoding)); + if ( ASDCP_SUCCESS(result) ) { + result = TLVSet.ReadUi32(OBJ_READ_ARGS_OPT(GenericPictureEssenceDescriptor, DisplayWidth)); + DisplayWidth.set_has_value( result == RESULT_OK ); + } + if ( ASDCP_SUCCESS(result) ) { + result = TLVSet.ReadUi32(OBJ_READ_ARGS_OPT(GenericPictureEssenceDescriptor, DisplayHeight)); + DisplayHeight.set_has_value( result == RESULT_OK ); + } + if ( ASDCP_SUCCESS(result) ) { + result = TLVSet.ReadObject(OBJ_READ_ARGS_OPT(GenericPictureEssenceDescriptor, Gamma)); + Gamma.set_has_value( result == RESULT_OK ); + } + if ( ASDCP_SUCCESS(result) ) { + result = TLVSet.ReadUi8(OBJ_READ_ARGS_OPT(GenericPictureEssenceDescriptor, FieldDominance)); + FieldDominance.set_has_value( result == RESULT_OK ); + } return result; } @@ -1508,6 +1524,10 @@ GenericPictureEssenceDescriptor::WriteToTLVSet(TLVWriter& TLVSet) if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS(GenericPictureEssenceDescriptor, StoredHeight)); if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(GenericPictureEssenceDescriptor, AspectRatio)); if ( ASDCP_SUCCESS(result) ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS(GenericPictureEssenceDescriptor, PictureEssenceCoding)); + if ( ASDCP_SUCCESS(result) && ! DisplayWidth.empty() ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS_OPT(GenericPictureEssenceDescriptor, DisplayWidth)); + if ( ASDCP_SUCCESS(result) && ! DisplayHeight.empty() ) result = TLVSet.WriteUi32(OBJ_WRITE_ARGS_OPT(GenericPictureEssenceDescriptor, DisplayHeight)); + if ( ASDCP_SUCCESS(result) && ! Gamma.empty() ) result = TLVSet.WriteObject(OBJ_WRITE_ARGS_OPT(GenericPictureEssenceDescriptor, Gamma)); + if ( ASDCP_SUCCESS(result) && ! FieldDominance.empty() ) result = TLVSet.WriteUi8(OBJ_WRITE_ARGS_OPT(GenericPictureEssenceDescriptor, FieldDominance)); return result; } @@ -1521,6 +1541,10 @@ GenericPictureEssenceDescriptor::Copy(const GenericPictureEssenceDescriptor& rhs StoredHeight = rhs.StoredHeight; AspectRatio = rhs.AspectRatio; PictureEssenceCoding = rhs.PictureEssenceCoding; + DisplayWidth = rhs.DisplayWidth; + DisplayHeight = rhs.DisplayHeight; + Gamma = rhs.Gamma; + FieldDominance = rhs.FieldDominance; } // @@ -1539,6 +1563,18 @@ GenericPictureEssenceDescriptor::Dump(FILE* stream) fprintf(stream, " %22s = %d\n", "StoredHeight", StoredHeight); fprintf(stream, " %22s = %s\n", "AspectRatio", AspectRatio.EncodeString(identbuf, IdentBufferLen)); fprintf(stream, " %22s = %s\n", "PictureEssenceCoding", PictureEssenceCoding.EncodeString(identbuf, IdentBufferLen)); + if ( ! DisplayWidth.empty() ) { + fprintf(stream, " %22s = %d\n", "DisplayWidth", DisplayWidth.get()); + } + if ( ! DisplayHeight.empty() ) { + fprintf(stream, " %22s = %d\n", "DisplayHeight", DisplayHeight.get()); + } + if ( ! Gamma.empty() ) { + fprintf(stream, " %22s = %s\n", "Gamma", Gamma.get().EncodeString(identbuf, IdentBufferLen)); + } + if ( ! FieldDominance.empty() ) { + fprintf(stream, " %22s = %d\n", "FieldDominance", FieldDominance.get()); + } } // @@ -2910,21 +2946,20 @@ DCDataDescriptor::DCDataDescriptor(const DCDataDescriptor& rhs) : GenericDataEss Copy(rhs); } + // ASDCP::Result_t DCDataDescriptor::InitFromTLVSet(TLVReader& TLVSet) { - // NOTE (this function can be removed if no attributes are defined for this descriptor) - assert(m_Dict); - Result_t result = GenericDataEssenceDescriptor::InitFromTLVSet(TLVSet); - return result; + assert(m_Dict); + Result_t result = GenericDataEssenceDescriptor::InitFromTLVSet(TLVSet); + return result; } // ASDCP::Result_t DCDataDescriptor::WriteToTLVSet(TLVWriter& TLVSet) { - // NOTE (this function can be removed if no attributes are defined for this descriptor) assert(m_Dict); Result_t result = GenericDataEssenceDescriptor::WriteToTLVSet(TLVSet); return result; @@ -3055,7 +3090,6 @@ DolbyAtmosSubDescriptor::WriteToBuffer(ASDCP::FrameBuffer& Buffer) return InterchangeObject::WriteToBuffer(Buffer); } - // // end Metadata.cpp // diff --git a/src/Metadata.h b/src/Metadata.h index 6b9a50c..7ee0940 100755 --- a/src/Metadata.h +++ b/src/Metadata.h @@ -472,6 +472,10 @@ namespace ASDCP ui32_t StoredHeight; Rational AspectRatio; UL PictureEssenceCoding; + optional_property DisplayWidth; + optional_property DisplayHeight; + optional_property
        Gamma; + optional_property FieldDominance; GenericPictureEssenceDescriptor(const Dictionary*& d); GenericPictureEssenceDescriptor(const GenericPictureEssenceDescriptor& rhs); @@ -890,7 +894,7 @@ namespace ASDCP }; // - class DCDataDescriptor : public GenericDataEssenceDescriptor + class DCDataDescriptor : public GenericDataEssenceDescriptor { DCDataDescriptor(); @@ -918,11 +922,11 @@ namespace ASDCP public: const Dictionary*& m_Dict; - UUID AtmosID; - ui32_t FirstFrame; - ui16_t MaxChannelCount; - ui16_t MaxObjectCount; - ui8_t AtmosVersion; + UUID AtmosID; + ui32_t FirstFrame; + ui16_t MaxChannelCount; + ui16_t MaxObjectCount; + ui8_t AtmosVersion; DolbyAtmosSubDescriptor(const Dictionary*& d); DolbyAtmosSubDescriptor(const DolbyAtmosSubDescriptor& rhs); -- 2.30.2