annotate Plugins/Input/aac/libmp4v2/INTERNALS @ 199:0a2ad94e8607 trunk

[svn] Synced with bmp-mp4. Build system is fragile, but should work now.
author chainsaw
date Wed, 16 Nov 2005 16:21:11 -0800
parents fa848bd484d8
children f2dc045d2327
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1 January 7, 2002
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
2
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
3 MP4V2 LIBRARY INTERNALS
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
4 =======================
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
5
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
6 This document provides an overview of the internals of the mp4v2 library
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
7 to aid those who wish to modify and extend it. Before reading this document,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
8 I recommend familiarizing yourself with the MP4 (or Quicktime) file format
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
9 standard and the mp4v2 library API. The API is described in a set of man pages
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
10 in mpeg4ip/doc/mp4v2, or if you prefer by looking at mp4.h.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
11
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
12 All the library code is written in C++, however the library API follows uses
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
13 C calling conventions hence is linkable by both C and C++ programs. The
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
14 library has been compiled and used on Linux, BSD, Windows, and Mac OS X.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
15 Other than libc, the library has no external dependencies, and hence can
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
16 be used independently of the mpeg4ip package if desired. The library is
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
17 used for both real-time recording and playback in mpeg4ip, and its runtime
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
18 performance is up to those tasks. On the IA32 architecture compiled with gcc,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
19 the stripped library is approximately 600 KB code and initialized data.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
20
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
21 It is useful to think of the mp4v2 library as consisting of four layers:
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
22 infrastructure, file format, generic tracks, and type specific track helpers.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
23 A description of each layer follows, from the fundamental to the optional.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
24
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
25
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
26 Infrastructure
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
27 ==============
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
28
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
29 The infrastructure layer provides basic file I/O, memory allocation,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
30 error handling, string utilities, and protected arrays. The source files
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
31 for this layer are mp4file_io, mp4util, and mp4array.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
32
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
33 Note that the array classes uses preprocessor macros instead of C++
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
34 templates. The rationale for this is to increase portability given the
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
35 sometimes incomplete support by some compilers for templates.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
36
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
37
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
38 File Format
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
39 ===========
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
40
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
41 The file format layer provides the translation from the on-disk MP4 file
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
42 format to in-memory C++ structures and back to disk. It is intended
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
43 to exactly match the MP4 specification in syntax and semantics. It
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
44 represents the majority of the code.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
45
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
46 There are three key structures at the file format layer: atoms, properties,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
47 and descriptors.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
48
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
49 Atoms are the primary containers within an mp4 file. They can contain
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
50 any combination of properties, other atoms, or descriptors.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
51
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
52 The mp4atom files contain the base class for all the atoms, and provide
199
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
53 generic functions that cover most cases. However, each atom has it's own
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
54 subclass contained in file atom_<name>.cpp, where <name> is the four
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
55 letter name of the atom defined in the MP4 specification. Typically this
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
56 atom file just specifies the properties of the atom or the possible child
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
57 atoms in the case of a container atom. In more specialized cases the atom
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
58 specific file provides routines to initialize, read, or write the atom.
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
59
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
60 Properties are the atomic pieces of information. The basic types of
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
61 properties are integers, floats, strings, and byte arrays. For integers
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
62 and floats there are subclasses that represent the different storage sizes,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
63 e.g. 8, 16, 24, 32, and 64 bit integers. For strings, there is 1 property
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
64 class with a number of options regarding exact storage details, e.g. null
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
65 terminated, fixed length, counted.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
66
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
67 For implementation reasons, there are also two special properties, table
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
68 and descriptor, that are actually containers for groups of properties.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
69 I.e by making these containers provide a property interface much code can
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
70 be written in a generic fashion.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
71
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
72 The mp4property files contain all the property related classes.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
73
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
74 Descriptors are containers that derive from the MPEG conventions and use
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
75 different encoding rules than the atoms derived from the QuickTime file
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
76 format. This means more use of bitfields and conditional existence with
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
77 an emphasis on bit efficiency at the cost of encoding/decoding complexity.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
78 Descriptors can contain other descriptors and/or properties.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
79
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
80 The mp4descriptor files contain the generic base class for descriptors.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
81 Also the mp4property files have a descriptor wrapper class that allows a
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
82 descriptor to behave as if it were a property. The specific descriptors
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
83 are implemented as subclasses of the base class descriptor in manner similar
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
84 to that of atoms. The descriptors, ocidescriptors, and qosqualifiers files
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
85 contain these implementations.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
86
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
87 Each atom/property/descriptor has a name closely related to that in the
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
88 MP4 specification. The difference being that the mp4v2 library doesn't
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
89 use '-' or '_' in property names and capitalizes the first letter of each
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
90 word, e.g. "thisIsAPropertyName". A complete name specifies the complete
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
91 container path. The names follow the C/C++ syntax for elements and array
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
92 indices.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
93
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
94 Examples are:
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
95 "moov.mvhd.duration"
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
96 "moov.trak[2].tkhd.duration"
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
97 "moov.trak[3].minf.mdia.stbl.stsz[101].sampleSize"
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
98
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
99 Note "*" can be used as a wildcard for an atom name (only). This is most
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
100 useful when dealing with the stsd atom which contains child atoms with
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
101 various names, but shared property names.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
102
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
103 Note that internally when performance matters the code looks up a property
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
104 by name once, and then stores the returned pointer to the property class.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
105
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
106
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
107 Generic Tracks
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
108 ==============
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
109
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
110 The two entities at this level are the mp4 file as a whole and the tracks
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
111 which are contained with it. The mp4file and mp4track files contain the
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
112 implementation.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
113
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
114 The critical work done by this layer is to map the collection of atoms,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
115 properties, and descriptors that represent a media track into a useful,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
116 and consistent set of operations. For example, reading or writing a media
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
117 sample of a track is a relatively simple operation from the library API
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
118 perspective. However there are numerous pieces of information in the mp4
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
119 file that need to be properly used and updated to do this. This layer
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
120 handles all those details.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
121
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
122 Given familiarity with the mp4 spec, the code should be straight-forward.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
123 What may not be immediately obvious are the functions to handle chunks of
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
124 media samples. These exist to allow optimization of the mp4 file layout by
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
125 reordering the chunks on disk to interleave the media sample chunks of
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
126 multiple tracks in time order. (See MP4Optimize API doc).
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
127
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
128
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
129 Type Specific Track Helpers
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
130 ===========================
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
131
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
132 This specialized code goes beyond the meta-information about tracks in
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
133 the mp4 file to understanding and manipulating the information in the
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
134 track samples. There are currently two helpers in the library:
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
135 the MPEG-4 Systems Helper, and the RTP Hint Track Helper.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
136
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
137 The MPEG-4 Systems Helper is currently limited to creating the OD, BIFS,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
138 and SDP information about a minimal audio/video scene consistent with
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
139 the Internet Streaming Media Alliance (ISMA) specifications. We will be
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
140 evaluating how best to generalize the library's helper functions for
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
141 MPEG-4 Systems without overburdening the implementation. The code for
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
142 this helper is found in the isma and odcommands files.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
143
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
144 The RTP Hint Track Helper is more extensive in its support. The hint
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
145 tracks contain the track packetization information needed to build
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
146 RTP packets for streaming. The library can construct RTP packets based
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
147 on the hint track making RTP based servers significantly easier to write.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
148
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
149 All code related to rtp hint tracks is in the rtphint files. It would also
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
150 be useful to look at test/mp4broadcaster and mpeg4ip/server/mp4creator for
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
151 examples of how this part of the library API can be used.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
152
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
153
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
154 Library API
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
155 ===========
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
156
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
157 The library API is defined and implemented in the mp4 files. The API uses
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
158 C linkage conventions, and the mp4.h file adapts itself according to whether
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
159 C or C++ is the compilation mode.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
160
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
161 All API calls are implemented in mp4.cpp and basically pass thru's to the
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
162 MP4File member functions. This ensures that the library has internal access
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
163 to the same functions as available via the API. All the calls in mp4.cpp use
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
164 C++ try/catch blocks to protect against any runtime errors in the library.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
165 Upon error the library will print a diagnostic message if the verbostiy level
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
166 has MP4_DETAILS_ERROR set, and return a distinguished error value, typically
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
167 0 or -1.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
168
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
169 The test and util subdirectories contain useful examples of how to
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
170 use the library. Also the mp4creator and mp4live programs within
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
171 mpeg4ip demonstrate more complete usage of the library API.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
172
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
173
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
174 Debugging
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
175 =========
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
176
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
177 Since mp4 files are fairly complicated, extensive debugging support is
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
178 built into the library. Multi-level diagnostic messages are available
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
179 under the control of a verbosity bitmask described in the API.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
180
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
181 Also the library provides the MP4Dump() call which provides an ASCII
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
182 version of the mp4 file meta-information. The mp4dump utilitity is a
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
183 wrapper executable around this function.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
184
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
185 The mp4extract program is also provided in the utilities directory
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
186 which is useful for extracting a track from an mp4file and putting the
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
187 media data back into it's own file. It can also extract each sample of
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
188 a track into its own file it that is desired.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
189
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
190 When all else fails, mp4 files are amenable to debugging by direct
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
191 examination. Since the atom names are four letter ASCII codes finding
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
192 reference points in a hex dump is feasible. On UNIX, the od command
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
193 is your friend: "od -t x1z -A x [-j 0xXXXXXX] foo.mp4" will print
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
194 a hex and ASCII dump, with hex addresses, starting optionally from
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
195 a specified offset. The library diagnostic messages can provide
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
196 information on where the library is reading or writing.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
197
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
198
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
199 General caveats
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
200 ===============
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
201
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
202 The coding convention is to use the C++ throw operator whenever an
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
203 unrecoverable error occurs. This throw is caught at the API layer
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
204 in mp4.cpp and translated into an error value.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
205
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
206 Be careful about indices. Internally, we follow the C/C++ convention
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
207 to use zero-based indices. However the MP4 spec uses one-based indices
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
208 for things like samples and hence the library API uses this convention.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
209