00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef _AP4_ATOM_H_
00030 #define _AP4_ATOM_H_
00031
00032
00033
00034
00035 #include "Ap4Types.h"
00036 #include "Ap4List.h"
00037 #include "Ap4ByteStream.h"
00038 #include "Ap4Debug.h"
00039
00040
00041
00042
00043 #define AP4_ATOM_TYPE(a,b,c,d) \
00044 ((((unsigned long)a)<<24) | \
00045 (((unsigned long)b)<<16) | \
00046 (((unsigned long)c)<< 8) | \
00047 (((unsigned long)d) ))
00048
00049
00050
00051
00052 const int AP4_ATOM_HEADER_SIZE = 8;
00053 const int AP4_FULL_ATOM_HEADER_SIZE = 12;
00054 const int AP4_ATOM_MAX_NAME_SIZE = 256;
00055 const int AP4_ATOM_MAX_URI_SIZE = 512;
00056
00057
00058
00059
00060 class AP4_AtomParent;
00061
00062
00063
00064
00065 class AP4_AtomInspector {
00066 public:
00067
00068 typedef enum {
00069 HINT_NONE,
00070 HINT_HEX,
00071 HINT_BOOLEAN
00072 } FormatHint;
00073
00074
00075 AP4_AtomInspector() {}
00076 virtual ~AP4_AtomInspector() {}
00077
00078
00079 virtual void StartElement(const char* name, const char* extra = NULL) {}
00080 virtual void EndElement() {}
00081 virtual void AddField(const char* name, AP4_UI32 value, FormatHint hint = HINT_NONE) {}
00082 virtual void AddField(const char* name, const char* value, FormatHint hint = HINT_NONE) {}
00083 };
00084
00085
00086
00087
00088 class AP4_Atom {
00089 public:
00090
00091 typedef AP4_UI32 Type;
00092
00093
00094 AP4_Atom(Type type,
00095 bool is_full = false);
00096 AP4_Atom(Type type,
00097 AP4_Size size,
00098 bool is_full = false);
00099 AP4_Atom(Type type,
00100 AP4_Size size,
00101 bool is_full,
00102 AP4_ByteStream& stream);
00103 virtual ~AP4_Atom() {}
00104 Type GetType() { return m_Type; }
00105 void SetType(Type type) { m_Type = type; }
00106 AP4_Size GetHeaderSize();
00107 virtual AP4_Size GetSize() { return m_Size; }
00108 virtual AP4_Result Write(AP4_ByteStream& stream);
00109 virtual AP4_Result WriteHeader(AP4_ByteStream& stream);
00110 virtual AP4_Result WriteFields(AP4_ByteStream& stream) = 0;
00111 virtual AP4_Result Inspect(AP4_AtomInspector& inspector);
00112 virtual AP4_Result InspectHeader(AP4_AtomInspector& inspector);
00113 virtual AP4_Result InspectFields(AP4_AtomInspector& inspector) {
00114 return AP4_SUCCESS;
00115 }
00116
00117
00118 virtual AP4_Result SetParent(AP4_AtomParent* parent) {
00119 m_Parent = parent;
00120 return AP4_SUCCESS;
00121 }
00122 virtual AP4_AtomParent* GetParent() { return m_Parent; }
00123 virtual AP4_Result Detach();
00124
00125
00126 virtual AP4_Atom* Clone() { return NULL; }
00127
00128 protected:
00129
00130 Type m_Type;
00131 AP4_Size m_Size;
00132 bool m_IsFull;
00133 AP4_UI32 m_Version;
00134 AP4_UI32 m_Flags;
00135 AP4_AtomParent* m_Parent;
00136 };
00137
00138
00139
00140
00141 class AP4_AtomParent {
00142 public:
00143
00144 virtual ~AP4_AtomParent();
00145 AP4_List<AP4_Atom>& GetChildren() { return m_Children; }
00146 virtual AP4_Result AddChild(AP4_Atom* child, int position = -1);
00147 virtual AP4_Result RemoveChild(AP4_Atom* child);
00148 virtual AP4_Result DeleteChild(AP4_Atom::Type type);
00149 virtual AP4_Atom* GetChild(AP4_Atom::Type type, AP4_Ordinal index = 0);
00150 virtual AP4_Atom* FindChild(const char* path,
00151 bool auto_create = false);
00152
00153
00154 virtual void OnChildChanged(AP4_Atom* child) {}
00155 virtual void OnChildAdded(AP4_Atom* child) {}
00156 virtual void OnChildRemoved(AP4_Atom* child) {}
00157
00158 protected:
00159
00160 AP4_List<AP4_Atom> m_Children;
00161 };
00162
00163
00164
00165
00166 class AP4_UnknownAtom : public AP4_Atom {
00167 public:
00168
00169 AP4_UnknownAtom(AP4_Atom::Type type,
00170 AP4_Size size,
00171 bool is_full,
00172 AP4_ByteStream& stream);
00173 ~AP4_UnknownAtom();
00174
00175
00176 virtual AP4_Result WriteFields(AP4_ByteStream& stream);
00177
00178 private:
00179
00180 AP4_ByteStream* m_SourceStream;
00181 AP4_Offset m_SourceOffset;
00182 };
00183
00184
00185
00186
00187 const AP4_Atom::Type AP4_ATOM_TYPE_UDTA = AP4_ATOM_TYPE('u','d','t','a');
00188 const AP4_Atom::Type AP4_ATOM_TYPE_URL = AP4_ATOM_TYPE('u','r','l',' ');
00189 const AP4_Atom::Type AP4_ATOM_TYPE_TRAK = AP4_ATOM_TYPE('t','r','a','k');
00190 const AP4_Atom::Type AP4_ATOM_TYPE_TKHD = AP4_ATOM_TYPE('t','k','h','d');
00191 const AP4_Atom::Type AP4_ATOM_TYPE_STTS = AP4_ATOM_TYPE('s','t','t','s');
00192 const AP4_Atom::Type AP4_ATOM_TYPE_STSZ = AP4_ATOM_TYPE('s','t','s','z');
00193 const AP4_Atom::Type AP4_ATOM_TYPE_STSS = AP4_ATOM_TYPE('s','t','s','s');
00194 const AP4_Atom::Type AP4_ATOM_TYPE_STSD = AP4_ATOM_TYPE('s','t','s','d');
00195 const AP4_Atom::Type AP4_ATOM_TYPE_STSC = AP4_ATOM_TYPE('s','t','s','c');
00196 const AP4_Atom::Type AP4_ATOM_TYPE_STCO = AP4_ATOM_TYPE('s','t','c','o');
00197 const AP4_Atom::Type AP4_ATOM_TYPE_CO64 = AP4_ATOM_TYPE('c','o','6','4');
00198 const AP4_Atom::Type AP4_ATOM_TYPE_STBL = AP4_ATOM_TYPE('s','t','b','l');
00199 const AP4_Atom::Type AP4_ATOM_TYPE_SINF = AP4_ATOM_TYPE('s','i','n','f');
00200 const AP4_Atom::Type AP4_ATOM_TYPE_SCHM = AP4_ATOM_TYPE('s','c','h','m');
00201 const AP4_Atom::Type AP4_ATOM_TYPE_SCHI = AP4_ATOM_TYPE('s','c','h','i');
00202 const AP4_Atom::Type AP4_ATOM_TYPE_MVHD = AP4_ATOM_TYPE('m','v','h','d');
00203 const AP4_Atom::Type AP4_ATOM_TYPE_MP4S = AP4_ATOM_TYPE('m','p','4','s');
00204 const AP4_Atom::Type AP4_ATOM_TYPE_MP4A = AP4_ATOM_TYPE('m','p','4','a');
00205 const AP4_Atom::Type AP4_ATOM_TYPE_MP4V = AP4_ATOM_TYPE('m','p','4','v');
00206 const AP4_Atom::Type AP4_ATOM_TYPE_AVC1 = AP4_ATOM_TYPE('a','v','c','1');
00207 const AP4_Atom::Type AP4_ATOM_TYPE_ENCA = AP4_ATOM_TYPE('e','n','c','a');
00208 const AP4_Atom::Type AP4_ATOM_TYPE_ENCV = AP4_ATOM_TYPE('e','n','c','v');
00209 const AP4_Atom::Type AP4_ATOM_TYPE_MOOV = AP4_ATOM_TYPE('m','o','o','v');
00210 const AP4_Atom::Type AP4_ATOM_TYPE_MINF = AP4_ATOM_TYPE('m','i','n','f');
00211 const AP4_Atom::Type AP4_ATOM_TYPE_META = AP4_ATOM_TYPE('m','e','t','a');
00212 const AP4_Atom::Type AP4_ATOM_TYPE_MDHD = AP4_ATOM_TYPE('m','d','h','d');
00213 const AP4_Atom::Type AP4_ATOM_TYPE_ILST = AP4_ATOM_TYPE('i','l','s','t');
00214 const AP4_Atom::Type AP4_ATOM_TYPE_HDLR = AP4_ATOM_TYPE('h','d','l','r');
00215 const AP4_Atom::Type AP4_ATOM_TYPE_FTYP = AP4_ATOM_TYPE('f','t','y','p');
00216 const AP4_Atom::Type AP4_ATOM_TYPE_ESDS = AP4_ATOM_TYPE('e','s','d','s');
00217 const AP4_Atom::Type AP4_ATOM_TYPE_EDTS = AP4_ATOM_TYPE('e','d','t','s');
00218 const AP4_Atom::Type AP4_ATOM_TYPE_DRMS = AP4_ATOM_TYPE('d','r','m','s');
00219 const AP4_Atom::Type AP4_ATOM_TYPE_DREF = AP4_ATOM_TYPE('d','r','e','f');
00220 const AP4_Atom::Type AP4_ATOM_TYPE_DINF = AP4_ATOM_TYPE('d','i','n','f');
00221 const AP4_Atom::Type AP4_ATOM_TYPE_CTTS = AP4_ATOM_TYPE('c','t','t','s');
00222 const AP4_Atom::Type AP4_ATOM_TYPE_MDIA = AP4_ATOM_TYPE('m','d','i','a');
00223 const AP4_Atom::Type AP4_ATOM_TYPE_VMHD = AP4_ATOM_TYPE('v','m','h','d');
00224 const AP4_Atom::Type AP4_ATOM_TYPE_SMHD = AP4_ATOM_TYPE('s','m','h','d');
00225 const AP4_Atom::Type AP4_ATOM_TYPE_NMHD = AP4_ATOM_TYPE('n','m','h','d');
00226 const AP4_Atom::Type AP4_ATOM_TYPE_HMHD = AP4_ATOM_TYPE('h','m','h','d');
00227 const AP4_Atom::Type AP4_ATOM_TYPE_FRMA = AP4_ATOM_TYPE('f','r','m','a');
00228 const AP4_Atom::Type AP4_ATOM_TYPE_MDAT = AP4_ATOM_TYPE('m','d','a','t');
00229 const AP4_Atom::Type AP4_ATOM_TYPE_FREE = AP4_ATOM_TYPE('f','r','e','e');
00230 const AP4_Atom::Type AP4_ATOM_TYPE_TIMS = AP4_ATOM_TYPE('t','i','m','s');
00231 const AP4_Atom::Type AP4_ATOM_TYPE_RTP = AP4_ATOM_TYPE('r','t','p',' ');
00232 const AP4_Atom::Type AP4_ATOM_TYPE_HNTI = AP4_ATOM_TYPE('h','n','t','i');
00233 const AP4_Atom::Type AP4_ATOM_TYPE_SDP = AP4_ATOM_TYPE('s','d','p',' ');
00234 const AP4_Atom::Type AP4_ATOM_TYPE_IKMS = AP4_ATOM_TYPE('i','K','M','S');
00235 const AP4_Atom::Type AP4_ATOM_TYPE_ISFM = AP4_ATOM_TYPE('i','S','F','M');
00236 const AP4_Atom::Type AP4_ATOM_TYPE_HINT = AP4_ATOM_TYPE('h','i','n','t');
00237 const AP4_Atom::Type AP4_ATOM_TYPE_TREF = AP4_ATOM_TYPE('t','r','e','f');
00238
00239 const AP4_Atom::Type AP4_ATOM_TYPE_AVCC = AP4_ATOM_TYPE('a','v','c','C');
00240 const AP4_Atom::Type AP4_ATOM_TYPE_TEXT = AP4_ATOM_TYPE('t','e','x','t');
00241 const AP4_Atom::Type AP4_ATOM_TYPE_TX3G = AP4_ATOM_TYPE('t','x','3','g');
00242 const AP4_Atom::Type AP4_ATOM_TYPE_FTAB = AP4_ATOM_TYPE('f','t','a','b');
00243 const AP4_Atom::Type AP4_ATOM_TYPE_S263 = AP4_ATOM_TYPE('s','2','6','3');
00244 const AP4_Atom::Type AP4_ATOM_TYPE_SAMR = AP4_ATOM_TYPE('s','a','m','r');
00245 const AP4_Atom::Type AP4_ATOM_TYPE_CHPL = AP4_ATOM_TYPE('c','h','p','l');
00246 const AP4_Atom::Type AP4_ATOM_TYPE_NAM = AP4_ATOM_TYPE(169,'n','a','m');
00247 const AP4_Atom::Type AP4_ATOM_TYPE_ART = AP4_ATOM_TYPE(169,'A','R','T');
00248 const AP4_Atom::Type AP4_ATOM_TYPE_WRT = AP4_ATOM_TYPE(169,'w','r','t');
00249 const AP4_Atom::Type AP4_ATOM_TYPE_ALB = AP4_ATOM_TYPE(169,'a','l','b');
00250 const AP4_Atom::Type AP4_ATOM_TYPE_DAY = AP4_ATOM_TYPE(169,'d','a','y');
00251 const AP4_Atom::Type AP4_ATOM_TYPE_TOO = AP4_ATOM_TYPE(169,'t','o','o');
00252 const AP4_Atom::Type AP4_ATOM_TYPE_CMT = AP4_ATOM_TYPE(169,'c','m','t');
00253 const AP4_Atom::Type AP4_ATOM_TYPE_GEN = AP4_ATOM_TYPE(169,'g','e','n');
00254 const AP4_Atom::Type AP4_ATOM_TYPE_TRKN = AP4_ATOM_TYPE('t','r','k','n');
00255
00256
00257
00258
00259
00260
00261 const AP4_Atom::Type AP4_ATOM_TYPE_DATA = AP4_ATOM_TYPE('d','a','t','a');
00262
00263
00264
00265
00266 class AP4_AtomListInspector : public AP4_List<AP4_Atom>::Item::Operator
00267 {
00268 public:
00269 AP4_AtomListInspector(AP4_AtomInspector& inspector) :
00270 m_Inspector(inspector) {}
00271 AP4_Result Action(AP4_Atom* atom) const {
00272 atom->Inspect(m_Inspector);
00273 return AP4_SUCCESS;
00274 }
00275
00276 private:
00277 AP4_AtomInspector& m_Inspector;
00278 };
00279
00280
00281
00282
00283 class AP4_AtomListWriter : public AP4_List<AP4_Atom>::Item::Operator
00284 {
00285 public:
00286 AP4_AtomListWriter(AP4_ByteStream& stream) :
00287 m_Stream(stream) {}
00288 AP4_Result Action(AP4_Atom* atom) const {
00289 atom->Write(m_Stream);
00290 return AP4_SUCCESS;
00291 }
00292
00293 private:
00294 AP4_ByteStream& m_Stream;
00295 };
00296
00297
00298
00299
00300 class AP4_AtomFinder : public AP4_List<AP4_Atom>::Item::Finder
00301 {
00302 public:
00303 AP4_AtomFinder(AP4_Atom::Type type, AP4_Ordinal index = 0) :
00304 m_Type(type), m_Index(index) {}
00305 AP4_Result Test(AP4_Atom* atom) const {
00306 if (atom->GetType() == m_Type) {
00307 if (m_Index-- == 0) {
00308 return AP4_SUCCESS;
00309 } else {
00310 return AP4_FAILURE;
00311 }
00312 } else {
00313 return AP4_FAILURE;
00314 }
00315 }
00316 private:
00317 AP4_Atom::Type m_Type;
00318 mutable AP4_Ordinal m_Index;
00319 };
00320
00321
00322
00323
00324 class AP4_AtomSizeAdder : public AP4_List<AP4_Atom>::Item::Operator {
00325 public:
00326 AP4_AtomSizeAdder(AP4_Size& size) : m_Size(size) {}
00327
00328 private:
00329 AP4_Result Action(AP4_Atom* atom) const {
00330 m_Size += atom->GetSize();
00331 return AP4_SUCCESS;
00332 }
00333 AP4_Size& m_Size;
00334 };
00335
00336 #endif // _AP4_ATOM_H_