mp4atom.h
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:5k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is MPEG4IP.
  13.  * 
  14.  * The Initial Developer of the Original Code is Cisco Systems Inc.
  15.  * Portions created by Cisco Systems Inc. are
  16.  * Copyright (C) Cisco Systems Inc. 2001.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  * Dave Mackie dmackie@cisco.com
  20.  */
  21. #ifndef __MP4_ATOM_INCLUDED__
  22. #define __MP4_ATOM_INCLUDED__
  23. class MP4Atom;
  24. MP4ARRAY_DECL(MP4Atom, MP4Atom*);
  25. #define Required true
  26. #define Optional false
  27. #define OnlyOne true
  28. #define Many false
  29. #define Counted true
  30. /* helper class */
  31. class MP4AtomInfo {
  32. public:
  33. MP4AtomInfo() {
  34. m_name = NULL;
  35. }
  36. MP4AtomInfo(const char* name, bool mandatory, bool onlyOne);
  37. const char* m_name;
  38. bool m_mandatory;
  39. bool m_onlyOne;
  40. u_int32_t m_count;
  41. };
  42. MP4ARRAY_DECL(MP4AtomInfo, MP4AtomInfo*);
  43. class MP4Atom {
  44. public:
  45. MP4Atom(const char* type = NULL);
  46. virtual ~MP4Atom();
  47. static MP4Atom* ReadAtom(MP4File* pFile, MP4Atom* pParentAtom);
  48. static MP4Atom* CreateAtom(const char* type);
  49. static bool IsReasonableType(const char* type);
  50. MP4File* GetFile() {
  51. return m_pFile;
  52. };
  53. void SetFile(MP4File* pFile) {
  54. m_pFile = pFile;
  55. };
  56. u_int64_t GetStart() {
  57. return m_start;
  58. };
  59. void SetStart(u_int64_t pos) {
  60. m_start = pos;
  61. };
  62. u_int64_t GetEnd() {
  63. return m_end;
  64. };
  65. void SetEnd(u_int64_t pos) {
  66. m_end = pos;
  67. };
  68. u_int64_t GetSize() {
  69. return m_size;
  70. }
  71. void SetSize(u_int64_t size) {
  72. m_size = size;
  73. }
  74. const char* GetType() {
  75. return m_type;
  76. };
  77. void SetType(const char* type) {
  78. if (type) {
  79. ASSERT(strlen(type) == 4);
  80. memcpy(m_type, type, 4);
  81. m_type[4] = '';
  82. } else {
  83. memset(m_type, 0, 5);
  84. }
  85. }
  86. void GetExtendedType(u_int8_t* pExtendedType) {
  87. memcpy(pExtendedType, m_extendedType, sizeof(m_extendedType));
  88. };
  89. void SetExtendedType(u_int8_t* pExtendedType) {
  90. memcpy(m_extendedType, pExtendedType, sizeof(m_extendedType));
  91. };
  92. bool IsUnknownType() {
  93. return m_unknownType;
  94. }
  95. void SetUnknownType(bool unknownType = true) {
  96. m_unknownType = unknownType;
  97. }
  98. bool IsRootAtom() {
  99. return m_type[0] == '';
  100. }
  101. MP4Atom* GetParentAtom() {
  102. return m_pParentAtom;
  103. }
  104. void SetParentAtom(MP4Atom* pParentAtom) {
  105. m_pParentAtom = pParentAtom;
  106. }
  107. void AddChildAtom(MP4Atom* pChildAtom) {
  108. pChildAtom->SetFile(m_pFile);
  109. pChildAtom->SetParentAtom(this);
  110. m_pChildAtoms.Add(pChildAtom);
  111. }
  112. void InsertChildAtom(MP4Atom* pChildAtom, u_int32_t index) {
  113. pChildAtom->SetFile(m_pFile);
  114. pChildAtom->SetParentAtom(this);
  115. m_pChildAtoms.Insert(pChildAtom, index);
  116. }
  117. void DeleteChildAtom(MP4Atom* pChildAtom) {
  118. for (MP4ArrayIndex i = 0; i < m_pChildAtoms.Size(); i++) {
  119. if (m_pChildAtoms[i] == pChildAtom) {
  120. m_pChildAtoms.Delete(i);
  121. return;
  122. }
  123. }
  124. }
  125. u_int32_t GetNumberOfChildAtoms() {
  126. return m_pChildAtoms.Size();
  127. }
  128. MP4Atom* GetChildAtom(u_int32_t index) {
  129. return m_pChildAtoms[index];
  130. }
  131. MP4Property* GetProperty(u_int32_t index) {
  132. return m_pProperties[index];
  133. }
  134. MP4Atom* FindAtom(const char* name);
  135. MP4Atom* FindChildAtom(const char* name);
  136. bool FindProperty(const char* name, 
  137. MP4Property** ppProperty, u_int32_t* pIndex = NULL);
  138. u_int32_t GetFlags();
  139. void SetFlags(u_int32_t flags);
  140. u_int8_t GetDepth();
  141. void Skip();
  142. virtual void Generate();
  143. virtual void Read();
  144. virtual void BeginWrite(bool use64 = false);
  145. virtual void Write();
  146. virtual void FinishWrite(bool use64 = false);
  147. virtual void Dump(FILE* pFile, u_int8_t indent, bool dumpImplicits);
  148. protected:
  149. void AddProperty(MP4Property* pProperty);
  150. void AddVersionAndFlags();
  151. void AddReserved(char* name, u_int32_t size);
  152. void ExpectChildAtom(const char* name, 
  153. bool mandatory, bool onlyOne = true);
  154. MP4AtomInfo* FindAtomInfo(const char* name);
  155. bool IsMe(const char* name);
  156. bool FindContainedProperty(const char* name, 
  157. MP4Property** ppProperty, u_int32_t* pIndex);
  158. void ReadProperties(
  159. u_int32_t startIndex = 0, u_int32_t count = 0xFFFFFFFF);
  160. void ReadChildAtoms();
  161. void WriteProperties(
  162. u_int32_t startIndex = 0, u_int32_t count = 0xFFFFFFFF);
  163. void WriteChildAtoms();
  164. u_int8_t GetVersion();
  165. void SetVersion(u_int8_t version);
  166. /* debugging aid */
  167. u_int32_t GetVerbosity();
  168. protected:
  169. MP4File* m_pFile;
  170. u_int64_t m_start;
  171. u_int64_t m_end;
  172. u_int64_t m_size;
  173. char m_type[5];
  174. bool m_unknownType;
  175. u_int8_t m_extendedType[16];
  176. MP4Atom* m_pParentAtom;
  177. u_int8_t m_depth;
  178. MP4PropertyArray m_pProperties;
  179. MP4AtomInfoArray  m_pChildAtomInfos;
  180. MP4AtomArray m_pChildAtoms;
  181. };
  182. inline u_int32_t ATOMID(const char* type) {
  183. return STRTOINT32(type);
  184. }
  185. #endif /* __MP4_ATOM_INCLUDED__ */