diff options
Diffstat (limited to 'Src/external_dependencies/libmp4v2/mp4property.h')
-rw-r--r-- | Src/external_dependencies/libmp4v2/mp4property.h | 529 |
1 files changed, 529 insertions, 0 deletions
diff --git a/Src/external_dependencies/libmp4v2/mp4property.h b/Src/external_dependencies/libmp4v2/mp4property.h new file mode 100644 index 00000000..c98ff122 --- /dev/null +++ b/Src/external_dependencies/libmp4v2/mp4property.h @@ -0,0 +1,529 @@ +/* + * The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is MPEG4IP. + * + * The Initial Developer of the Original Code is Cisco Systems Inc. + * Portions created by Cisco Systems Inc. are + * Copyright (C) Cisco Systems Inc. 2001. All Rights Reserved. + * + * Contributor(s): + * Dave Mackie dmackie@cisco.com + */ + +#ifndef __MP4_PROPERTY_INCLUDED__ +#define __MP4_PROPERTY_INCLUDED__ + +// forward declarations +class MP4Atom; +class MP4File; + +class MP4Descriptor; +MP4ARRAY_DECL(MP4Descriptor, MP4Descriptor*); + +enum MP4PropertyType { + Integer8Property, + Integer16Property, + Integer24Property, + Integer32Property, + Integer64Property, + Float32Property, + StringProperty, + BytesProperty, + TableProperty, + DescriptorProperty, +}; + +class MP4Property { +public: + MP4Property(const char *name = NULL); + + virtual ~MP4Property() { } + + MP4Atom* GetParentAtom() { + return m_pParentAtom; + } + virtual void SetParentAtom(MP4Atom* pParentAtom) { + m_pParentAtom = pParentAtom; + } + + const char *GetName() { + return m_name; + } + + virtual MP4PropertyType GetType() = 0; + + bool IsReadOnly() { + return m_readOnly; + } + void SetReadOnly(bool value = true) { + m_readOnly = value; + } + + bool IsImplicit() { + return m_implicit; + } + void SetImplicit(bool value = true) { + m_implicit = value; + } + + virtual u_int32_t GetCount() = 0; + virtual void SetCount(u_int32_t count) = 0; + + virtual void Generate() { /* default is a no-op */ }; + + virtual void Read(MP4File* pFile, u_int32_t index = 0) = 0; + + virtual void Write(MP4File* pFile, u_int32_t index = 0) = 0; + + virtual bool FindProperty(const char* name, + MP4Property** ppProperty, u_int32_t* pIndex = NULL); + +protected: + MP4Atom* m_pParentAtom; + const char* m_name; + bool m_readOnly; + bool m_implicit; +}; + +MP4ARRAY_DECL(MP4Property, MP4Property*); + +class MP4IntegerProperty : public MP4Property { +protected: + MP4IntegerProperty(char* name) + : MP4Property(name) { }; + +public: + u_int64_t GetValue(u_int32_t index = 0); + + void SetValue(u_int64_t value, u_int32_t index = 0); + + void InsertValue(u_int64_t value, u_int32_t index = 0); + + void DeleteValue(u_int32_t index = 0); + + void IncrementValue(int32_t increment = 1, u_int32_t index = 0); +}; + +template <class val_t, u_int8_t size, MP4PropertyType prop_type> +class MP4IntegerPropertyT : public MP4IntegerProperty { + public: + MP4IntegerPropertyT(char* name) + : MP4IntegerProperty(name) { + SetCount(1); + m_values[0] = 0; + } + + MP4PropertyType GetType() { + //return Integer##xsize##Property; + return prop_type; + } + + u_int32_t GetCount() { + return m_values.Size(); + } + + void SetCount(u_int32_t count) { + m_values.Resize(count); + } + + val_t GetValue(u_int32_t index = 0) { + return m_values[index]; + } + + void SetValue(val_t value, u_int32_t index = 0) + { + if (m_readOnly) { + throw new MP4Error(EACCES, "property is read-only", m_name); \ + } + m_values[index] = value; + } + void AddValue(val_t value) { + m_values.Add(value); + } + void InsertValue(val_t value, u_int32_t index) { + m_values.Insert(value, index); + } + void DeleteValue(u_int32_t index) { + m_values.Delete(index); + } + void IncrementValue(int32_t increment = 1, u_int32_t index = 0) { + m_values[index] += increment; + } + void Read(MP4File* pFile, u_int32_t index = 0) { + if (m_implicit) { + return; + } + m_values[index] = (val_t)pFile->ReadUInt(size/8); + } + + void Write(MP4File* pFile, u_int32_t index = 0) { + if (m_implicit) { + return; + } + pFile->WriteUInt((u_int64_t)m_values[index], size/8); + } + + protected: + MP4TArray<val_t> m_values; + }; + +#define MP4INTEGER_PROPERTY_DECL(val_t, xsize) typedef MP4IntegerPropertyT<val_t, xsize, Integer##xsize##Property> MP4Integer##xsize##Property; + +MP4INTEGER_PROPERTY_DECL(u_int8_t, 8); +MP4INTEGER_PROPERTY_DECL(u_int16_t, 16); +MP4INTEGER_PROPERTY_DECL(u_int32_t, 24); +MP4INTEGER_PROPERTY_DECL(u_int32_t, 32); +MP4INTEGER_PROPERTY_DECL(u_int64_t, 64); + +class MP4BitfieldProperty : public MP4Integer64Property { +public: + MP4BitfieldProperty(char* name, u_int8_t numBits) + : MP4Integer64Property(name) { + ASSERT(numBits != 0); + ASSERT(numBits <= 64); + m_numBits = numBits; + } + + u_int8_t GetNumBits() { + return m_numBits; + } + void SetNumBits(u_int8_t numBits) { + m_numBits = numBits; + } + + void Read(MP4File* pFile, u_int32_t index = 0); + void Write(MP4File* pFile, u_int32_t index = 0); + +protected: + u_int8_t m_numBits; +}; + +class MP4Float32Property : public MP4Property { +public: + MP4Float32Property(char* name) + : MP4Property(name) { + m_useFixed16Format = false; + m_useFixed32Format = false; + SetCount(1); + m_values[0] = 0.0; + } + + MP4PropertyType GetType() { + return Float32Property; + } + + u_int32_t GetCount() { + return m_values.Size(); + } + void SetCount(u_int32_t count) { + m_values.Resize(count); + } + + float GetValue(u_int32_t index = 0) { + return m_values[index]; + } + + void SetValue(float value, u_int32_t index = 0) { + if (m_readOnly) { + throw new MP4Error(EACCES, "property is read-only", m_name); + } + m_values[index] = value; + } + + void AddValue(float value) { + m_values.Add(value); + } + + void InsertValue(float value, u_int32_t index) { + m_values.Insert(value, index); + } + + bool IsFixed16Format() { + return m_useFixed16Format; + } + + void SetFixed16Format(bool useFixed16Format = true) { + m_useFixed16Format = useFixed16Format; + } + + bool IsFixed32Format() { + return m_useFixed32Format; + } + + void SetFixed32Format(bool useFixed32Format = true) { + m_useFixed32Format = useFixed32Format; + } + + void Read(MP4File* pFile, u_int32_t index = 0); + void Write(MP4File* pFile, u_int32_t index = 0); + +protected: + bool m_useFixed16Format; + bool m_useFixed32Format; + MP4Float32Array m_values; +}; + +class MP4StringProperty : public MP4Property { +public: + MP4StringProperty(char* name, + bool useCountedFormat = false, bool useUnicode = false); + + ~MP4StringProperty(); + + MP4PropertyType GetType() { + return StringProperty; + } + + u_int32_t GetCount() { + return m_values.Size(); + } + + void SetCount(u_int32_t count); + + const char* GetValue(u_int32_t index = 0) { + return m_values[index]; + } + + void SetValue(const char* value, u_int32_t index = 0); + + void AddValue(const char* value) { + u_int32_t count = GetCount(); + SetCount(count + 1); + SetValue(value, count); + } + + bool IsCountedFormat() { + return m_useCountedFormat; + } + + void SetCountedFormat(bool useCountedFormat) { + m_useCountedFormat = useCountedFormat; + } + + bool IsExpandedCountedFormat() { + return m_useExpandedCount; + } + + void SetExpandedCountedFormat(bool useExpandedCount) { + m_useExpandedCount = useExpandedCount; + } + + bool IsUnicode() { + return m_useUnicode; + } + + void SetUnicode(bool useUnicode) { + m_useUnicode = useUnicode; + } + + u_int32_t GetFixedLength() { + return m_fixedLength; + } + + void SetFixedLength(u_int32_t fixedLength) { + m_fixedLength = fixedLength; + } + + void Read(MP4File* pFile, u_int32_t index = 0); + void Write(MP4File* pFile, u_int32_t index = 0); + +protected: + bool m_useCountedFormat; + bool m_useExpandedCount; + bool m_useUnicode; + u_int32_t m_fixedLength; + + MP4StringArray m_values; +}; + +class MP4BytesProperty : public MP4Property { +public: + MP4BytesProperty(char* name, u_int32_t valueSize = 0, + u_int32_t defaultValueSize = 0); + + ~MP4BytesProperty(); + + MP4PropertyType GetType() { + return BytesProperty; + } + + u_int32_t GetCount() { + return m_values.Size(); + } + + void SetCount(u_int32_t count); + + void GetValue(u_int8_t** ppValue, u_int32_t* pValueSize, + u_int32_t index = 0) { + // N.B. caller must free memory + *ppValue = (u_int8_t*)MP4Malloc(m_valueSizes[index]); + memcpy(*ppValue, m_values[index], m_valueSizes[index]); + *pValueSize = m_valueSizes[index]; + } + + void CopyValue(u_int8_t* pValue, u_int32_t index = 0) { + // N.B. caller takes responsbility for valid pointer + // and sufficient memory at the destination + memcpy(pValue, m_values[index], m_valueSizes[index]); + } + + void SetValue(const u_int8_t* pValue, u_int32_t valueSize, + u_int32_t index = 0); + + void AddValue(const u_int8_t* pValue, u_int32_t valueSize) { + u_int32_t count = GetCount(); + SetCount(count + 1); + SetValue(pValue, valueSize, count); + } + + u_int32_t GetValueSize(u_int32_t valueSize, u_int32_t index = 0) { + return m_valueSizes[index]; + } + + void SetValueSize(u_int32_t valueSize, u_int32_t index = 0); + + u_int32_t GetFixedSize() { + return m_fixedValueSize; + } + + void SetFixedSize(u_int32_t fixedSize); + + void Read(MP4File* pFile, u_int32_t index = 0); + void Write(MP4File* pFile, u_int32_t index = 0); + +protected: + u_int32_t m_fixedValueSize; + u_int32_t m_defaultValueSize; + MP4Integer32Array m_valueSizes; + MP4BytesArray m_values; +}; + +class MP4TableProperty : public MP4Property { +public: + MP4TableProperty(char* name, MP4IntegerProperty* pCountProperty); + + ~MP4TableProperty(); + + MP4PropertyType GetType() { + return TableProperty; + } + + void SetParentAtom(MP4Atom* pParentAtom) { + m_pParentAtom = pParentAtom; + for (u_int32_t i = 0; i < m_pProperties.Size(); i++) { + m_pProperties[i]->SetParentAtom(pParentAtom); + } + } + + void AddProperty(MP4Property* pProperty); + + MP4Property* GetProperty(u_int32_t index) { + return m_pProperties[index]; + } + + virtual u_int32_t GetCount() { + return m_pCountProperty->GetValue(); + } + virtual void SetCount(u_int32_t count) { + m_pCountProperty->SetValue(count); + } + + void Read(MP4File* pFile, u_int32_t index = 0); + void Write(MP4File* pFile, u_int32_t index = 0); + + bool FindProperty(const char* name, + MP4Property** ppProperty, u_int32_t* pIndex = NULL); + +protected: + virtual void ReadEntry(MP4File* pFile, u_int32_t index); + virtual void WriteEntry(MP4File* pFile, u_int32_t index); + + bool FindContainedProperty(const char* name, + MP4Property** ppProperty, u_int32_t* pIndex); + +protected: + MP4IntegerProperty* m_pCountProperty; + MP4PropertyArray m_pProperties; +}; + +class MP4DescriptorProperty : public MP4Property { +public: + MP4DescriptorProperty(char* name = NULL, + u_int8_t tagsStart = 0, u_int8_t tagsEnd = 0, + bool mandatory = false, bool onlyOne = false); + + ~MP4DescriptorProperty(); + + MP4PropertyType GetType() { + return DescriptorProperty; + } + + void SetParentAtom(MP4Atom* pParentAtom); + + void SetSizeLimit(u_int64_t sizeLimit) { + m_sizeLimit = sizeLimit; + } + + u_int32_t GetCount() { + return m_pDescriptors.Size(); + } + void SetCount(u_int32_t count) { + m_pDescriptors.Resize(count); + } + + void SetTags(u_int8_t tagsStart, u_int8_t tagsEnd = 0) { + m_tagsStart = tagsStart; + m_tagsEnd = tagsEnd ? tagsEnd : tagsStart; + } + + MP4Descriptor* AddDescriptor(u_int8_t tag); + + void AppendDescriptor(MP4Descriptor* pDescriptor) { + m_pDescriptors.Add(pDescriptor); + } + + void DeleteDescriptor(u_int32_t index); + + void Generate(); + void Read(MP4File* pFile, u_int32_t index = 0); + void Write(MP4File* pFile, u_int32_t index = 0); + + bool FindProperty(const char* name, + MP4Property** ppProperty, u_int32_t* pIndex = NULL); + +protected: + virtual MP4Descriptor* CreateDescriptor(u_int8_t tag); + + bool FindContainedProperty(const char* name, + MP4Property** ppProperty, u_int32_t* pIndex); + +protected: + u_int8_t m_tagsStart; + u_int8_t m_tagsEnd; + u_int64_t m_sizeLimit; + bool m_mandatory; + bool m_onlyOne; + MP4DescriptorArray m_pDescriptors; +}; + +class MP4QosQualifierProperty : public MP4DescriptorProperty { +public: + MP4QosQualifierProperty(char* name = NULL, + u_int8_t tagsStart = 0, u_int8_t tagsEnd = 0, + bool mandatory = false, bool onlyOne = false) : + MP4DescriptorProperty(name, tagsStart, tagsEnd, mandatory, onlyOne) { } + +protected: + MP4Descriptor* CreateDescriptor(u_int8_t tag); +}; + +#endif /* __MP4_PROPERTY_INCLUDED__ */ |