aboutsummaryrefslogtreecommitdiff
path: root/src/mp4atom.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mp4atom.h')
-rw-r--r--src/mp4atom.h267
1 files changed, 267 insertions, 0 deletions
diff --git a/src/mp4atom.h b/src/mp4atom.h
new file mode 100644
index 0000000..c6c1ea3
--- /dev/null
+++ b/src/mp4atom.h
@@ -0,0 +1,267 @@
+/*
+ * 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 - 2004. All Rights Reserved.
+ *
+ * 3GPP features implementation is based on 3GPP's TS26.234-v5.60,
+ * and was contributed by Ximpo Group Ltd.
+ *
+ * Portions created by Ximpo Group Ltd. are
+ * Copyright (C) Ximpo Group Ltd. 2003, 2004. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Dave Mackie dmackie@cisco.com
+ * Ximpo Group Ltd. mp4v2@ximpo.com
+ */
+
+#ifndef MP4V2_IMPL_MP4ATOM_H
+#define MP4V2_IMPL_MP4ATOM_H
+
+namespace mp4v2 { namespace impl {
+
+///////////////////////////////////////////////////////////////////////////////
+
+class MP4Atom;
+MP4ARRAY_DECL(MP4Atom, MP4Atom*);
+
+#define Required true
+#define Optional false
+#define OnlyOne true
+#define Many false
+#define Counted true
+
+/* helper class */
+class MP4AtomInfo {
+public:
+ MP4AtomInfo() {
+ m_name = NULL;
+ }
+ MP4AtomInfo(const char* name, bool mandatory, bool onlyOne);
+
+ const char* m_name;
+ bool m_mandatory;
+ bool m_onlyOne;
+ uint32_t m_count;
+};
+
+MP4ARRAY_DECL(MP4AtomInfo, MP4AtomInfo*);
+
+class MP4Atom
+{
+public:
+ static MP4Atom* ReadAtom( MP4File* pFile, MP4Atom* pParentAtom );
+ static MP4Atom* CreateAtom( MP4Atom* parent, const char* type );
+ static bool IsReasonableType( const char* type );
+
+private:
+ static MP4Atom* factory( MP4Atom* parent, const char* type );
+ static bool descendsFrom( MP4Atom* parent, const char* type );
+
+public:
+ MP4Atom(const char* type = NULL);
+ virtual ~MP4Atom();
+
+ MP4File* GetFile() {
+ return m_pFile;
+ };
+ void SetFile(MP4File* pFile) {
+ m_pFile = pFile;
+ };
+
+ uint64_t GetStart() {
+ return m_start;
+ };
+ void SetStart(uint64_t pos) {
+ m_start = pos;
+ };
+
+ uint64_t GetEnd() {
+ return m_end;
+ };
+ void SetEnd(uint64_t pos) {
+ m_end = pos;
+ };
+
+ uint64_t GetSize() {
+ return m_size;
+ }
+ void SetSize(uint64_t size) {
+ m_size = size;
+ }
+
+ const char* GetType() {
+ return m_type;
+ };
+ void SetType(const char* type) {
+ if (type && *type != '\0') {
+ // not needed ASSERT(strlen(type) == 4);
+ memcpy(m_type, type, 4);
+ m_type[4] = '\0';
+ } else {
+ memset(m_type, 0, 5);
+ }
+ }
+
+ void GetExtendedType(uint8_t* pExtendedType) {
+ memcpy(pExtendedType, m_extendedType, sizeof(m_extendedType));
+ };
+ void SetExtendedType(uint8_t* pExtendedType) {
+ memcpy(m_extendedType, pExtendedType, sizeof(m_extendedType));
+ };
+
+ bool IsUnknownType() {
+ return m_unknownType;
+ }
+ void SetUnknownType(bool unknownType = true) {
+ m_unknownType = unknownType;
+ }
+
+ bool IsRootAtom() {
+ return m_type[0] == '\0';
+ }
+
+ MP4Atom* GetParentAtom() {
+ return m_pParentAtom;
+ }
+ void SetParentAtom(MP4Atom* pParentAtom) {
+ m_pParentAtom = pParentAtom;
+ }
+
+ void AddChildAtom(MP4Atom* pChildAtom) {
+ pChildAtom->SetFile(m_pFile);
+ pChildAtom->SetParentAtom(this);
+ m_pChildAtoms.Add(pChildAtom);
+ }
+
+ void InsertChildAtom(MP4Atom* pChildAtom, uint32_t index) {
+ pChildAtom->SetFile(m_pFile);
+ pChildAtom->SetParentAtom(this);
+ m_pChildAtoms.Insert(pChildAtom, index);
+ }
+
+ void DeleteChildAtom(MP4Atom* pChildAtom) {
+ for (MP4ArrayIndex i = 0; i < m_pChildAtoms.Size(); i++) {
+ if (m_pChildAtoms[i] == pChildAtom) {
+ m_pChildAtoms.Delete(i);
+ return;
+ }
+ }
+ }
+
+ uint32_t GetNumberOfChildAtoms() {
+ return m_pChildAtoms.Size();
+ }
+
+ MP4Atom* GetChildAtom(uint32_t index) {
+ return m_pChildAtoms[index];
+ }
+
+ MP4Property* GetProperty(uint32_t index) {
+ return m_pProperties[index];
+ }
+
+ uint32_t GetCount() {
+ return m_pProperties.Size();
+ }
+
+ MP4Atom* FindAtom(const char* name);
+
+ MP4Atom* FindChildAtom(const char* name);
+
+ bool FindProperty(const char* name,
+ MP4Property** ppProperty, uint32_t* pIndex = NULL);
+
+ uint32_t GetFlags();
+ void SetFlags(uint32_t flags);
+
+ uint8_t GetDepth();
+
+ void Skip();
+
+ virtual void Generate();
+ virtual void Read();
+ virtual void BeginWrite(bool use64 = false);
+ virtual void Write();
+ virtual void Rewrite();
+ virtual void FinishWrite(bool use64 = false);
+ virtual void Dump(FILE* pFile, uint8_t indent, bool dumpImplicits);
+
+ bool GetLargesizeMode();
+
+protected:
+ void AddProperty(MP4Property* pProperty);
+
+ void AddVersionAndFlags();
+
+ void AddReserved(const char* name, uint32_t size);
+
+ void ExpectChildAtom(const char* name,
+ bool mandatory, bool onlyOne = true);
+
+ MP4AtomInfo* FindAtomInfo(const char* name);
+
+ bool IsMe(const char* name);
+
+ bool FindContainedProperty(const char* name,
+ MP4Property** ppProperty, uint32_t* pIndex);
+
+ void ReadProperties(
+ uint32_t startIndex = 0, uint32_t count = 0xFFFFFFFF);
+ void ReadChildAtoms();
+
+ void WriteProperties(
+ uint32_t startIndex = 0, uint32_t count = 0xFFFFFFFF);
+ void WriteChildAtoms();
+
+ uint8_t GetVersion();
+ void SetVersion(uint8_t version);
+
+ /* debugging aid */
+ uint32_t GetVerbosity();
+
+ void SetLargesizeMode( bool );
+
+protected:
+ MP4File* m_pFile;
+ uint64_t m_start;
+ uint64_t m_end;
+ bool m_largesizeMode; // true if largesize mode
+ uint64_t m_size;
+ char m_type[5];
+ bool m_unknownType;
+ uint8_t m_extendedType[16];
+
+ MP4Atom* m_pParentAtom;
+ uint8_t m_depth;
+
+ MP4PropertyArray m_pProperties;
+ MP4AtomInfoArray m_pChildAtomInfos;
+ MP4AtomArray m_pChildAtoms;
+};
+
+inline uint32_t ATOMID(const char* type) {
+ return STRTOINT32(type);
+}
+
+// inverse ATOMID - 32 bit id to string
+inline void IDATOM(uint32_t type, char *s) {
+ INT32TOSTR(type, s);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+}} // namespace mp4v2::impl
+
+#endif // MP4V2_IMPL_MP4ATOM_H