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_FACTORY_H_
00030 #define _AP4_ATOM_FACTORY_H_
00031
00032
00033
00034
00035 #include "Ap4Types.h"
00036 #include "Ap4Atom.h"
00037 #include "Ap4Array.h"
00038
00039
00040
00041
00042 class AP4_ByteStream;
00043
00044
00045
00046
00047 class AP4_AtomFactory {
00048 public:
00049
00050 class TypeHandler {
00051 public:
00052 virtual ~TypeHandler() {};
00053 virtual AP4_Result CreateAtom(AP4_Atom::Type type,
00054 AP4_UI32 size,
00055 AP4_ByteStream& stream,
00056 AP4_Atom::Type context,
00057 AP4_Atom*& atom) = 0;
00058 };
00059
00060
00061 AP4_AtomFactory() {}
00062
00063
00064 ~AP4_AtomFactory();
00065
00066
00067 AP4_Result AddTypeHandler(TypeHandler* handler);
00068 AP4_Result RemoveTypeHandler(TypeHandler* handler);
00069 AP4_Result CreateAtomFromStream(AP4_ByteStream& stream,
00070 AP4_LargeSize& bytes_available,
00071 AP4_Atom*& atom);
00072 AP4_Result CreateAtomFromStream(AP4_ByteStream& stream,
00073 AP4_Atom*& atom);
00074 AP4_Result CreateAtomsFromStream(AP4_ByteStream& stream,
00075 AP4_AtomParent& atoms);
00076 AP4_Result CreateAtomsFromStream(AP4_ByteStream& stream,
00077 AP4_LargeSize bytes_available,
00078 AP4_AtomParent& atoms);
00079
00080
00081 void PushContext(AP4_Atom::Type context);
00082 void PopContext();
00083 AP4_Atom::Type GetContext(AP4_Ordinal depth=0);
00084
00085 private:
00086
00087 AP4_Array<AP4_Atom::Type> m_ContextStack;
00088 AP4_List<TypeHandler> m_TypeHandlers;
00089 };
00090
00091
00092
00093
00094 class AP4_DefaultAtomFactory : public AP4_AtomFactory {
00095 public:
00096
00097 static AP4_DefaultAtomFactory Instance;
00098
00099
00100 AP4_DefaultAtomFactory();
00101 };
00102
00103 #endif // _AP4_ATOM_FACTORY_H_