summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjhurst <jhurst@cinecert.com>2013-07-02 02:05:16 +0000
committerjhurst <>2013-07-02 02:05:16 +0000
commitf2ecb6822ff3db70b40adb19a37eab6456e28ed8 (patch)
tree8f103329888eddc2cbcff8da0f844750377b3e33 /src
parent904abc4a05a4663bb97a30197841f81cfd59278b (diff)
optional properties, take 1
Diffstat (limited to 'src')
-rwxr-xr-xsrc/MXF.cpp28
-rwxr-xr-xsrc/MXF.h26
-rwxr-xr-xsrc/MXFTypes.h2
-rwxr-xr-xsrc/Metadata.cpp48
-rwxr-xr-xsrc/Metadata.h16
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 PropertyType>
+ 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<PropertyType>& 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<UUID> 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<ui32_t> ObjectModelVersion;
+ optional_property<UUID> PrimaryPackage;
Batch<UUID> Identifications;
UUID ContentStorage;
UL OperationalPattern;
Batch<UL> EssenceContainers;
Batch<UL> DMSchemes;
+ optional_property<Batch<UL> > 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<ui32_t> DisplayWidth;
+ optional_property<ui32_t> DisplayHeight;
+ optional_property<UL> Gamma;
+ optional_property<ui8_t> 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);