Ap4Atom.h
Go to the documentation of this file.00001 /***************************************************************** 00002 | 00003 | AP4 - Atoms 00004 | 00005 | Copyright 2002-2008 Axiomatic Systems, LLC 00006 | 00007 | 00008 | This file is part of Bento4/AP4 (MP4 Atom Processing Library). 00009 | 00010 | Unless you have obtained Bento4 under a difference license, 00011 | this version of Bento4 is Bento4|GPL. 00012 | Bento4|GPL is free software; you can redistribute it and/or modify 00013 | it under the terms of the GNU General Public License as published by 00014 | the Free Software Foundation; either version 2, or (at your option) 00015 | any later version. 00016 | 00017 | Bento4|GPL is distributed in the hope that it will be useful, 00018 | but WITHOUT ANY WARRANTY; without even the implied warranty of 00019 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00020 | GNU General Public License for more details. 00021 | 00022 | You should have received a copy of the GNU General Public License 00023 | along with Bento4|GPL; see the file COPYING. If not, write to the 00024 | Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 00025 | 02111-1307, USA. 00026 | 00027 ****************************************************************/ 00033 #ifndef _AP4_ATOM_H_ 00034 #define _AP4_ATOM_H_ 00035 00036 /*---------------------------------------------------------------------- 00037 | includes 00038 +---------------------------------------------------------------------*/ 00039 #include "Ap4Types.h" 00040 #include "Ap4List.h" 00041 #include "Ap4ByteStream.h" 00042 #include "Ap4String.h" 00043 #include "Ap4Debug.h" 00044 #include "Ap4DynamicCast.h" 00045 00046 /*---------------------------------------------------------------------- 00047 | macros 00048 +---------------------------------------------------------------------*/ 00049 #define AP4_ATOM_TYPE(c1,c2,c3,c4) \ 00050 ((((AP4_UI32)c1)<<24) | \ 00051 (((AP4_UI32)c2)<<16) | \ 00052 (((AP4_UI32)c3)<< 8) | \ 00053 (((AP4_UI32)c4) )) 00054 00055 /*---------------------------------------------------------------------- 00056 | constants 00057 +---------------------------------------------------------------------*/ 00058 const AP4_UI32 AP4_ATOM_HEADER_SIZE = 8; 00059 const AP4_UI32 AP4_ATOM_HEADER_SIZE_64 = 16; 00060 const AP4_UI32 AP4_FULL_ATOM_HEADER_SIZE = 12; 00061 const AP4_UI32 AP4_FULL_ATOM_HEADER_SIZE_64 = 20; 00062 const AP4_UI32 AP4_ATOM_MAX_NAME_SIZE = 256; 00063 const AP4_UI32 AP4_ATOM_MAX_URI_SIZE = 512; 00064 00065 /*---------------------------------------------------------------------- 00066 | forward references 00067 +---------------------------------------------------------------------*/ 00068 class AP4_AtomParent; 00069 00070 /*---------------------------------------------------------------------- 00071 | AP4_AtomInspector 00072 +---------------------------------------------------------------------*/ 00077 class AP4_AtomInspector { 00078 public: 00079 // types 00080 typedef enum { 00081 HINT_NONE = 0, 00082 HINT_HEX = 1, 00083 HINT_BOOLEAN = 2 00084 } FormatHint; 00085 00086 // constructor and destructor 00087 AP4_AtomInspector() {} 00088 virtual ~AP4_AtomInspector() {} 00089 00090 // methods 00091 void SetVerbosity(AP4_Ordinal verbosity) { m_Verbosity = verbosity; } 00092 AP4_Ordinal GetVerbosity() { return m_Verbosity; } 00093 00094 // virtual methods 00095 virtual void StartElement(const char* /* name */, 00096 const char* /* extra = NULL */) {} 00097 virtual void EndElement() {} 00098 virtual void AddField(const char* /* name */, 00099 AP4_UI64 /* value */, 00100 FormatHint hint = HINT_NONE) { 00101 (void)hint; // gcc warning 00102 } 00103 virtual void AddFieldF(const char* /* name */, 00104 float /* value */, 00105 FormatHint hint = HINT_NONE) { 00106 (void)hint; // gcc warning 00107 } 00108 virtual void AddField(const char* /* name */, 00109 const char* /* value */, 00110 FormatHint hint = HINT_NONE) { 00111 (void)hint; // gcc warning 00112 } 00113 virtual void AddField(const char* /* name */, 00114 const unsigned char* /* bytes */, 00115 AP4_Size /* byte_count */, 00116 FormatHint hint = HINT_NONE) { 00117 (void)hint; // gcc warning 00118 } 00119 00120 protected: 00121 AP4_Ordinal m_Verbosity; 00122 }; 00123 00124 /*---------------------------------------------------------------------- 00125 | AP4_PrintInspector 00126 +---------------------------------------------------------------------*/ 00127 class AP4_PrintInspector : public AP4_AtomInspector { 00128 public: 00129 AP4_PrintInspector(AP4_ByteStream& stream, AP4_Cardinal indent=0); 00130 ~AP4_PrintInspector(); 00131 00132 // methods 00133 void StartElement(const char* name, const char* info); 00134 void EndElement(); 00135 void AddField(const char* name, AP4_UI64 value, FormatHint hint); 00136 void AddFieldF(const char* name, float value, FormatHint hint); 00137 void AddField(const char* name, const char* value, FormatHint hint); 00138 void AddField(const char* name, const unsigned char* bytes, AP4_Size size, FormatHint hint); 00139 00140 private: 00141 // members 00142 AP4_ByteStream* m_Stream; 00143 AP4_Cardinal m_Indent; 00144 }; 00145 00146 /*---------------------------------------------------------------------- 00147 | AP4_Atom 00148 +---------------------------------------------------------------------*/ 00152 class AP4_Atom { 00153 public: 00154 AP4_IMPLEMENT_DYNAMIC_CAST(AP4_Atom) 00155 00156 // types 00157 typedef AP4_UI32 Type; 00158 00159 // class methods 00160 static Type TypeFromString(const char* four_cc); 00161 static AP4_Result ReadFullHeader(AP4_ByteStream& stream, 00162 AP4_UI32& version, 00163 AP4_UI32& flags); 00164 00165 // constructors 00169 explicit AP4_Atom(Type type, AP4_UI32 size = AP4_ATOM_HEADER_SIZE); 00170 00174 explicit AP4_Atom(Type type, AP4_UI64 size, bool force_64=false); 00175 00179 explicit AP4_Atom(Type type, 00180 AP4_UI32 size, 00181 AP4_UI32 version, 00182 AP4_UI32 flags); 00183 00187 explicit AP4_Atom(Type type, 00188 AP4_UI64 size, 00189 bool force_64, 00190 AP4_UI32 version, 00191 AP4_UI32 flags); 00192 00193 // destructor 00194 virtual ~AP4_Atom() {} 00195 00196 // methods 00197 AP4_UI32 GetFlags() const { return m_Flags; } 00198 void SetFlags(AP4_UI32 flags) { m_Flags = flags; } 00199 Type GetType() const { return m_Type; } 00200 void SetType(Type type) { m_Type = type; } 00201 virtual AP4_Size GetHeaderSize() const; 00202 AP4_UI64 GetSize() const { return m_Size32 == 1?m_Size64:m_Size32; } 00203 void SetSize(AP4_UI64 size, bool force_64 = false); 00204 AP4_UI32 GetSize32() const { return m_Size32; } 00205 void SetSize32(AP4_UI32 size) { m_Size32 = size; } 00206 AP4_UI64 GetSize64() const { return m_Size64; } 00207 void SetSize64(AP4_UI64 size) { m_Size64 = size; } 00208 virtual AP4_Result Write(AP4_ByteStream& stream); 00209 virtual AP4_Result WriteHeader(AP4_ByteStream& stream); 00210 virtual AP4_Result WriteFields(AP4_ByteStream& stream) = 0; 00211 virtual AP4_Result Inspect(AP4_AtomInspector& inspector); 00212 virtual AP4_Result InspectHeader(AP4_AtomInspector& inspector); 00213 virtual AP4_Result InspectFields(AP4_AtomInspector& /* inspector */) { 00214 return AP4_SUCCESS; 00215 } 00216 00217 // parent/child relationship methods 00218 virtual AP4_Result SetParent(AP4_AtomParent* parent) { 00219 m_Parent = parent; 00220 return AP4_SUCCESS; 00221 } 00222 virtual AP4_AtomParent* GetParent() { return m_Parent; } 00223 virtual AP4_Result Detach(); 00224 00232 virtual AP4_Atom* Clone(); 00233 00234 protected: 00235 // members 00236 Type m_Type; 00237 AP4_UI32 m_Size32; 00238 AP4_UI64 m_Size64; // this is 0 if m_Size is not 1 (encoded in 32-bits) 00239 // and non-zero only if m_Size is 1 (encoded in 64-bits) 00240 bool m_IsFull; 00241 AP4_UI32 m_Version; 00242 AP4_UI32 m_Flags; 00243 AP4_AtomParent* m_Parent; 00244 }; 00245 00246 /*---------------------------------------------------------------------- 00247 | AP4_AtomParent 00248 +---------------------------------------------------------------------*/ 00253 class AP4_AtomParent { 00254 public: 00255 AP4_IMPLEMENT_DYNAMIC_CAST(AP4_AtomParent) 00256 00257 // base methods 00258 virtual ~AP4_AtomParent(); 00259 AP4_List<AP4_Atom>& GetChildren() { return m_Children; } 00260 virtual AP4_Result AddChild(AP4_Atom* child, int position = -1); 00261 virtual AP4_Result RemoveChild(AP4_Atom* child); 00262 virtual AP4_Result DeleteChild(AP4_Atom::Type type, AP4_Ordinal index = 0); 00263 virtual AP4_Atom* GetChild(AP4_Atom::Type type, AP4_Ordinal index = 0) const; 00264 virtual AP4_Atom* GetChild(const AP4_UI08* uuid, AP4_Ordinal index = 0) const; 00265 virtual AP4_Atom* FindChild(const char* path, 00266 bool auto_create = false, 00267 bool auto_create_full = false); 00268 00269 // methods designed to be overridden 00270 virtual void OnChildChanged(AP4_Atom* /* child */) {} 00271 virtual void OnChildAdded(AP4_Atom* /* child */) {} 00272 virtual void OnChildRemoved(AP4_Atom* /* child */) {} 00273 00274 protected: 00275 // members 00276 AP4_List<AP4_Atom> m_Children; 00277 }; 00278 00279 /*---------------------------------------------------------------------- 00280 | AP4_UnknownAtom 00281 +---------------------------------------------------------------------*/ 00290 class AP4_UnknownAtom : public AP4_Atom { 00291 public: 00292 // constructor and destructor 00293 AP4_UnknownAtom(AP4_Atom::Type type, 00294 AP4_UI64 size, 00295 AP4_ByteStream& stream); 00296 AP4_UnknownAtom(AP4_Atom::Type type, const AP4_UI08* payload, AP4_Size payload_size); 00297 AP4_UnknownAtom(const AP4_UnknownAtom& other); 00298 ~AP4_UnknownAtom(); 00299 00300 // methods 00301 virtual AP4_Result WriteFields(AP4_ByteStream& stream); 00302 virtual AP4_Atom* Clone(); 00303 00304 private: 00305 // members 00306 AP4_ByteStream* m_SourceStream; 00307 AP4_Position m_SourcePosition; 00308 AP4_DataBuffer m_Payload; 00309 }; 00310 00311 /*---------------------------------------------------------------------- 00312 | AP4_NullTerminatedStringAtom 00313 +---------------------------------------------------------------------*/ 00318 class AP4_NullTerminatedStringAtom : public AP4_Atom 00319 { 00320 public: 00321 AP4_IMPLEMENT_DYNAMIC_CAST_D(AP4_NullTerminatedStringAtom, AP4_Atom) 00322 00323 // constructors 00324 AP4_NullTerminatedStringAtom(AP4_Atom::Type type, AP4_UI64 size, AP4_ByteStream& stream); 00325 AP4_NullTerminatedStringAtom(AP4_Atom::Type type, const char* value); 00326 00327 // accessors 00328 const AP4_String& GetValue() { return m_Value; } 00329 00330 // methods 00331 virtual AP4_Result InspectFields(AP4_AtomInspector& inspector); 00332 virtual AP4_Result WriteFields(AP4_ByteStream& stream); 00333 00334 private: 00335 // members 00336 AP4_String m_Value; 00337 }; 00338 00339 /*---------------------------------------------------------------------- 00340 | atom types 00341 +---------------------------------------------------------------------*/ 00342 const AP4_Atom::Type AP4_ATOM_TYPE_UDTA = AP4_ATOM_TYPE('u','d','t','a'); 00343 const AP4_Atom::Type AP4_ATOM_TYPE_URL = AP4_ATOM_TYPE('u','r','l',' '); 00344 const AP4_Atom::Type AP4_ATOM_TYPE_TRAK = AP4_ATOM_TYPE('t','r','a','k'); 00345 const AP4_Atom::Type AP4_ATOM_TYPE_TRAF = AP4_ATOM_TYPE('t','r','a','f'); 00346 const AP4_Atom::Type AP4_ATOM_TYPE_TKHD = AP4_ATOM_TYPE('t','k','h','d'); 00347 const AP4_Atom::Type AP4_ATOM_TYPE_TFHD = AP4_ATOM_TYPE('t','f','h','d'); 00348 const AP4_Atom::Type AP4_ATOM_TYPE_TRUN = AP4_ATOM_TYPE('t','r','u','n'); 00349 const AP4_Atom::Type AP4_ATOM_TYPE_STTS = AP4_ATOM_TYPE('s','t','t','s'); 00350 const AP4_Atom::Type AP4_ATOM_TYPE_STSZ = AP4_ATOM_TYPE('s','t','s','z'); 00351 const AP4_Atom::Type AP4_ATOM_TYPE_STSS = AP4_ATOM_TYPE('s','t','s','s'); 00352 const AP4_Atom::Type AP4_ATOM_TYPE_STSD = AP4_ATOM_TYPE('s','t','s','d'); 00353 const AP4_Atom::Type AP4_ATOM_TYPE_STSC = AP4_ATOM_TYPE('s','t','s','c'); 00354 const AP4_Atom::Type AP4_ATOM_TYPE_STCO = AP4_ATOM_TYPE('s','t','c','o'); 00355 const AP4_Atom::Type AP4_ATOM_TYPE_CO64 = AP4_ATOM_TYPE('c','o','6','4'); 00356 const AP4_Atom::Type AP4_ATOM_TYPE_STBL = AP4_ATOM_TYPE('s','t','b','l'); 00357 const AP4_Atom::Type AP4_ATOM_TYPE_SINF = AP4_ATOM_TYPE('s','i','n','f'); 00358 const AP4_Atom::Type AP4_ATOM_TYPE_SCHM = AP4_ATOM_TYPE('s','c','h','m'); 00359 const AP4_Atom::Type AP4_ATOM_TYPE_SCHI = AP4_ATOM_TYPE('s','c','h','i'); 00360 const AP4_Atom::Type AP4_ATOM_TYPE_MVHD = AP4_ATOM_TYPE('m','v','h','d'); 00361 const AP4_Atom::Type AP4_ATOM_TYPE_MEHD = AP4_ATOM_TYPE('m','e','h','d'); 00362 const AP4_Atom::Type AP4_ATOM_TYPE_MP4S = AP4_ATOM_TYPE('m','p','4','s'); 00363 const AP4_Atom::Type AP4_ATOM_TYPE_MP4A = AP4_ATOM_TYPE('m','p','4','a'); 00364 const AP4_Atom::Type AP4_ATOM_TYPE_MP4V = AP4_ATOM_TYPE('m','p','4','v'); 00365 const AP4_Atom::Type AP4_ATOM_TYPE_AVC1 = AP4_ATOM_TYPE('a','v','c','1'); 00366 const AP4_Atom::Type AP4_ATOM_TYPE_ALAC = AP4_ATOM_TYPE('a','l','a','c'); 00367 const AP4_Atom::Type AP4_ATOM_TYPE_ENCA = AP4_ATOM_TYPE('e','n','c','a'); 00368 const AP4_Atom::Type AP4_ATOM_TYPE_ENCV = AP4_ATOM_TYPE('e','n','c','v'); 00369 const AP4_Atom::Type AP4_ATOM_TYPE_MOOV = AP4_ATOM_TYPE('m','o','o','v'); 00370 const AP4_Atom::Type AP4_ATOM_TYPE_MOOF = AP4_ATOM_TYPE('m','o','o','f'); 00371 const AP4_Atom::Type AP4_ATOM_TYPE_MVEX = AP4_ATOM_TYPE('m','v','e','x'); 00372 const AP4_Atom::Type AP4_ATOM_TYPE_TREX = AP4_ATOM_TYPE('t','r','e','x'); 00373 const AP4_Atom::Type AP4_ATOM_TYPE_MINF = AP4_ATOM_TYPE('m','i','n','f'); 00374 const AP4_Atom::Type AP4_ATOM_TYPE_META = AP4_ATOM_TYPE('m','e','t','a'); 00375 const AP4_Atom::Type AP4_ATOM_TYPE_MDHD = AP4_ATOM_TYPE('m','d','h','d'); 00376 const AP4_Atom::Type AP4_ATOM_TYPE_MFHD = AP4_ATOM_TYPE('m','f','h','d'); 00377 const AP4_Atom::Type AP4_ATOM_TYPE_ILST = AP4_ATOM_TYPE('i','l','s','t'); 00378 const AP4_Atom::Type AP4_ATOM_TYPE_HDLR = AP4_ATOM_TYPE('h','d','l','r'); 00379 const AP4_Atom::Type AP4_ATOM_TYPE_FTYP = AP4_ATOM_TYPE('f','t','y','p'); 00380 const AP4_Atom::Type AP4_ATOM_TYPE_IODS = AP4_ATOM_TYPE('i','o','d','s'); 00381 const AP4_Atom::Type AP4_ATOM_TYPE_ESDS = AP4_ATOM_TYPE('e','s','d','s'); 00382 const AP4_Atom::Type AP4_ATOM_TYPE_EDTS = AP4_ATOM_TYPE('e','d','t','s'); 00383 const AP4_Atom::Type AP4_ATOM_TYPE_DRMS = AP4_ATOM_TYPE('d','r','m','s'); 00384 const AP4_Atom::Type AP4_ATOM_TYPE_DRMI = AP4_ATOM_TYPE('d','r','m','i'); 00385 const AP4_Atom::Type AP4_ATOM_TYPE_DREF = AP4_ATOM_TYPE('d','r','e','f'); 00386 const AP4_Atom::Type AP4_ATOM_TYPE_DINF = AP4_ATOM_TYPE('d','i','n','f'); 00387 const AP4_Atom::Type AP4_ATOM_TYPE_CTTS = AP4_ATOM_TYPE('c','t','t','s'); 00388 const AP4_Atom::Type AP4_ATOM_TYPE_MDIA = AP4_ATOM_TYPE('m','d','i','a'); 00389 const AP4_Atom::Type AP4_ATOM_TYPE_ELST = AP4_ATOM_TYPE('e','l','s','t'); 00390 const AP4_Atom::Type AP4_ATOM_TYPE_VMHD = AP4_ATOM_TYPE('v','m','h','d'); 00391 const AP4_Atom::Type AP4_ATOM_TYPE_SMHD = AP4_ATOM_TYPE('s','m','h','d'); 00392 const AP4_Atom::Type AP4_ATOM_TYPE_NMHD = AP4_ATOM_TYPE('n','m','h','d'); 00393 const AP4_Atom::Type AP4_ATOM_TYPE_HMHD = AP4_ATOM_TYPE('h','m','h','d'); 00394 const AP4_Atom::Type AP4_ATOM_TYPE_FRMA = AP4_ATOM_TYPE('f','r','m','a'); 00395 const AP4_Atom::Type AP4_ATOM_TYPE_MDAT = AP4_ATOM_TYPE('m','d','a','t'); 00396 const AP4_Atom::Type AP4_ATOM_TYPE_FREE = AP4_ATOM_TYPE('f','r','e','e'); 00397 const AP4_Atom::Type AP4_ATOM_TYPE_TIMS = AP4_ATOM_TYPE('t','i','m','s'); 00398 const AP4_Atom::Type AP4_ATOM_TYPE_RTP_ = AP4_ATOM_TYPE('r','t','p',' '); 00399 const AP4_Atom::Type AP4_ATOM_TYPE_HNTI = AP4_ATOM_TYPE('h','n','t','i'); 00400 const AP4_Atom::Type AP4_ATOM_TYPE_SDP_ = AP4_ATOM_TYPE('s','d','p',' '); 00401 const AP4_Atom::Type AP4_ATOM_TYPE_IKMS = AP4_ATOM_TYPE('i','K','M','S'); 00402 const AP4_Atom::Type AP4_ATOM_TYPE_ISFM = AP4_ATOM_TYPE('i','S','F','M'); 00403 const AP4_Atom::Type AP4_ATOM_TYPE_ISLT = AP4_ATOM_TYPE('i','S','L','T'); 00404 const AP4_Atom::Type AP4_ATOM_TYPE_TREF = AP4_ATOM_TYPE('t','r','e','f'); 00405 const AP4_Atom::Type AP4_ATOM_TYPE_HINT = AP4_ATOM_TYPE('h','i','n','t'); 00406 const AP4_Atom::Type AP4_ATOM_TYPE_CDSC = AP4_ATOM_TYPE('c','d','s','c'); 00407 const AP4_Atom::Type AP4_ATOM_TYPE_MPOD = AP4_ATOM_TYPE('m','p','o','d'); 00408 const AP4_Atom::Type AP4_ATOM_TYPE_IPIR = AP4_ATOM_TYPE('i','p','i','r'); 00409 const AP4_Atom::Type AP4_ATOM_TYPE_CHAP = AP4_ATOM_TYPE('c','h','a','p'); 00410 const AP4_Atom::Type AP4_ATOM_TYPE_ALIS = AP4_ATOM_TYPE('a','l','i','s'); 00411 const AP4_Atom::Type AP4_ATOM_TYPE_SYNC = AP4_ATOM_TYPE('s','y','n','c'); 00412 const AP4_Atom::Type AP4_ATOM_TYPE_DPND = AP4_ATOM_TYPE('d','p','n','d'); 00413 const AP4_Atom::Type AP4_ATOM_TYPE_ODRM = AP4_ATOM_TYPE('o','d','r','m'); 00414 const AP4_Atom::Type AP4_ATOM_TYPE_ODKM = AP4_ATOM_TYPE('o','d','k','m'); 00415 const AP4_Atom::Type AP4_ATOM_TYPE_OHDR = AP4_ATOM_TYPE('o','h','d','r'); 00416 const AP4_Atom::Type AP4_ATOM_TYPE_ODDA = AP4_ATOM_TYPE('o','d','d','a'); 00417 const AP4_Atom::Type AP4_ATOM_TYPE_ODHE = AP4_ATOM_TYPE('o','d','h','e'); 00418 const AP4_Atom::Type AP4_ATOM_TYPE_ODAF = AP4_ATOM_TYPE('o','d','a','f'); 00419 const AP4_Atom::Type AP4_ATOM_TYPE_GRPI = AP4_ATOM_TYPE('g','r','p','i'); 00420 const AP4_Atom::Type AP4_ATOM_TYPE_IPRO = AP4_ATOM_TYPE('i','p','r','o'); 00421 const AP4_Atom::Type AP4_ATOM_TYPE_MDRI = AP4_ATOM_TYPE('m','d','r','i'); 00422 const AP4_Atom::Type AP4_ATOM_TYPE_AVCC = AP4_ATOM_TYPE('a','v','c','C'); 00423 const AP4_Atom::Type AP4_ATOM_TYPE_WAVE = AP4_ATOM_TYPE('w','a','v','e'); 00424 const AP4_Atom::Type AP4_ATOM_TYPE_WIDE = AP4_ATOM_TYPE('w','i','d','e'); 00425 const AP4_Atom::Type AP4_ATOM_TYPE_UUID = AP4_ATOM_TYPE('u','u','i','d'); 00426 const AP4_Atom::Type AP4_ATOM_TYPE_8ID_ = AP4_ATOM_TYPE('8','i','d',' '); 00427 const AP4_Atom::Type AP4_ATOM_TYPE_8BDL = AP4_ATOM_TYPE('8','b','d','l'); 00428 const AP4_Atom::Type AP4_ATOM_TYPE_AC_3 = AP4_ATOM_TYPE('a','c','-','3'); 00429 const AP4_Atom::Type AP4_ATOM_TYPE_EC_3 = AP4_ATOM_TYPE('e','c','-','3'); 00430 const AP4_Atom::Type AP4_ATOM_TYPE_MFRA = AP4_ATOM_TYPE('m','f','r','a'); 00431 const AP4_Atom::Type AP4_ATOM_TYPE_TFRA = AP4_ATOM_TYPE('t','f','r','a'); 00432 const AP4_Atom::Type AP4_ATOM_TYPE_MFRO = AP4_ATOM_TYPE('m','f','r','o'); 00433 00434 /*---------------------------------------------------------------------- 00435 | AP4_AtomListInspector 00436 +---------------------------------------------------------------------*/ 00437 class AP4_AtomListInspector : public AP4_List<AP4_Atom>::Item::Operator 00438 { 00439 public: 00440 AP4_AtomListInspector(AP4_AtomInspector& inspector) : 00441 m_Inspector(inspector) {} 00442 AP4_Result Action(AP4_Atom* atom) const { 00443 atom->Inspect(m_Inspector); 00444 return AP4_SUCCESS; 00445 } 00446 00447 private: 00448 AP4_AtomInspector& m_Inspector; 00449 }; 00450 00451 /*---------------------------------------------------------------------- 00452 | AP4_AtomListWriter 00453 +---------------------------------------------------------------------*/ 00454 class AP4_AtomListWriter : public AP4_List<AP4_Atom>::Item::Operator 00455 { 00456 public: 00457 AP4_AtomListWriter(AP4_ByteStream& stream) : 00458 m_Stream(stream) {} 00459 AP4_Result Action(AP4_Atom* atom) const; 00460 00461 private: 00462 AP4_ByteStream& m_Stream; 00463 }; 00464 00465 /*---------------------------------------------------------------------- 00466 | AP4_AtomFinder 00467 +---------------------------------------------------------------------*/ 00468 class AP4_AtomFinder : public AP4_List<AP4_Atom>::Item::Finder 00469 { 00470 public: 00471 AP4_AtomFinder(AP4_Atom::Type type, AP4_Ordinal index = 0) : 00472 m_Type(type), m_Index(index) {} 00473 AP4_Result Test(AP4_Atom* atom) const { 00474 if (atom->GetType() == m_Type) { 00475 if (m_Index-- == 0) { 00476 return AP4_SUCCESS; 00477 } else { 00478 return AP4_FAILURE; 00479 } 00480 } else { 00481 return AP4_FAILURE; 00482 } 00483 } 00484 private: 00485 AP4_Atom::Type m_Type; 00486 mutable AP4_Ordinal m_Index; 00487 }; 00488 00489 /*---------------------------------------------------------------------- 00490 | AP4_AtomSizeAdder 00491 +---------------------------------------------------------------------*/ 00492 class AP4_AtomSizeAdder : public AP4_List<AP4_Atom>::Item::Operator { 00493 public: 00494 AP4_AtomSizeAdder(AP4_UI64& size) : m_Size(size) {} 00495 00496 private: 00497 AP4_Result Action(AP4_Atom* atom) const { 00498 m_Size += atom->GetSize(); 00499 return AP4_SUCCESS; 00500 } 00501 AP4_UI64& m_Size; 00502 }; 00503 00504 #endif // _AP4_ATOM_H_
Generated on Thu May 13 16:36:31 2010 for Bento4 MP4 SDK by
