annotate Plugins/Input/aac/libmp4v2/mp4atom.cpp @ 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 /*
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
2 * The contents of this file are subject to the Mozilla Public
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
3 * License Version 1.1 (the "License"); you may not use this file
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
4 * except in compliance with the License. You may obtain a copy of
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
5 * the License at http://www.mozilla.org/MPL/
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
6 *
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
7 * Software distributed under the License is distributed on an "AS
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
8 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
9 * implied. See the License for the specific language governing
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
10 * rights and limitations under the License.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
11 *
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
12 * The Original Code is MPEG4IP.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
13 *
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
14 * The Initial Developer of the Original Code is Cisco Systems Inc.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
15 * Portions created by Cisco Systems Inc. are
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
16 * Copyright (C) Cisco Systems Inc. 2001 - 2004. All Rights Reserved.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
17 *
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
18 * 3GPP features implementation is based on 3GPP's TS26.234-v5.60,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
19 * and was contributed by Ximpo Group Ltd.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
20 *
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
21 * Portions created by Ximpo Group Ltd. are
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
22 * Copyright (C) Ximpo Group Ltd. 2003, 2004. All Rights Reserved.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
23 *
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
24 * Contributor(s):
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
25 * Dave Mackie dmackie@cisco.com
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
26 * Alix Marchandise-Franquet alix@cisco.com
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
27 * Ximpo Group Ltd. mp4v2@ximpo.com
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
28 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
29
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
30 #include "mp4common.h"
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
31 #include "atoms.h"
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
32
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
33 MP4AtomInfo::MP4AtomInfo(const char* name, bool mandatory, bool onlyOne)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
34 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
35 m_name = name;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
36 m_mandatory = mandatory;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
37 m_onlyOne = onlyOne;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
38 m_count = 0;
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 MP4Atom::MP4Atom(const char* type)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
42 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
43 SetType(type);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
44 m_unknownType = FALSE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
45 m_pFile = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
46 m_start = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
47 m_end = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
48 m_size = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
49 m_pParentAtom = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
50 m_depth = 0xFF;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
51 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
52
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
53 MP4Atom::~MP4Atom()
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
54 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
55 u_int32_t i;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
56
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
57 for (i = 0; i < m_pProperties.Size(); i++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
58 delete m_pProperties[i];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
59 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
60 for (i = 0; i < m_pChildAtomInfos.Size(); i++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
61 delete m_pChildAtomInfos[i];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
62 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
63 for (i = 0; i < m_pChildAtoms.Size(); i++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
64 delete m_pChildAtoms[i];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
65 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
66 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
67
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
68 MP4Atom* MP4Atom::CreateAtom(const char* type)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
69 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
70 MP4Atom* pAtom = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
71
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
72 if (type == NULL) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
73 pAtom = new MP4RootAtom();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
74 } else {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
75 switch((uint8_t)type[0]) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
76 case 'a':
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
77 if (ATOMID(type) == ATOMID("avc1")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
78 pAtom = new MP4Avc1Atom();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
79 } else if (ATOMID(type) == ATOMID("avcC")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
80 pAtom = new MP4AvcCAtom();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
81 } else if (ATOMID(type) == ATOMID("alis")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
82 pAtom = new MP4UrlAtom("alis");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
83 } else if (ATOMID(type) == ATOMID("alaw")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
84 pAtom = new MP4SoundAtom("alaw");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
85 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
86 break;
199
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
87 case 'b':
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
88 if (ATOMID(type) == ATOMID("bitr")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
89 pAtom = new MP4BitrAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
90 } else if (ATOMID(type) == ATOMID("btrt")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
91 pAtom = new MP4BtrtAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
92 }
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
93 break;
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
94 case 'c':
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
95 if (ATOMID(type) == ATOMID("ctts")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
96 pAtom = new MP4CttsAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
97 } else if (ATOMID(type) == ATOMID("co64")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
98 pAtom = new MP4Co64Atom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
99 } else if (ATOMID(type) == ATOMID("cprt")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
100 pAtom = new MP4CprtAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
101 } else if (ATOMID(type) == ATOMID("cpil")) { /* Apple iTunes */
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
102 pAtom = new MP4CpilAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
103 } else if (ATOMID(type) == ATOMID("covr")) { /* Apple iTunes */
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
104 pAtom = new MP4CovrAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
105 }
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
106 break;
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
107 case 'd':
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
108 if (ATOMID(type) == ATOMID("d263")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
109 pAtom = new MP4D263Atom();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
110 } else if (ATOMID(type) == ATOMID("damr")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
111 pAtom = new MP4DamrAtom();
199
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
112 } else if (ATOMID(type) == ATOMID("dinf")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
113 pAtom = new MP4DinfAtom();
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
114 } else if (ATOMID(type) == ATOMID("dref")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
115 pAtom = new MP4DrefAtom();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
116 } else if (ATOMID(type) == ATOMID("dpnd")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
117 pAtom = new MP4TrefTypeAtom(type);
199
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
118 } else if (ATOMID(type) == ATOMID("dmed")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
119 pAtom = new MP4DmedAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
120 } else if (ATOMID(type) == ATOMID("dimm")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
121 pAtom = new MP4DimmAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
122 } else if (ATOMID(type) == ATOMID("drep")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
123 pAtom = new MP4DrepAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
124 } else if (ATOMID(type) == ATOMID("dmax")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
125 pAtom = new MP4DmaxAtom();
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
126 } else if (ATOMID(type) == ATOMID("data")) { /* Apple iTunes */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
127 pAtom = new MP4DataAtom();
199
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
128 } else if (ATOMID(type) == ATOMID("disk")) { /* Apple iTunes */
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
129 pAtom = new MP4DiskAtom();
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
130 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
131 break;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
132 case 'e':
199
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
133 if (ATOMID(type) == ATOMID("esds")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
134 pAtom = new MP4EsdsAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
135 } else if (ATOMID(type) == ATOMID("edts")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
136 pAtom = new MP4EdtsAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
137 } else if (ATOMID(type) == ATOMID("elst")) {
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
138 pAtom = new MP4ElstAtom();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
139 } else if (ATOMID(type) == ATOMID("enca")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
140 pAtom = new MP4EncaAtom();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
141 } else if (ATOMID(type) == ATOMID("encv")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
142 pAtom = new MP4EncvAtom();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
143 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
144 break;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
145 case 'f':
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
146 if (ATOMID(type) == ATOMID("free")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
147 pAtom = new MP4FreeAtom();
199
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
148 } else if (ATOMID(type) == ATOMID("frma")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
149 pAtom = new MP4FrmaAtom();
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
150 } else if (ATOMID(type) == ATOMID("ftyp")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
151 pAtom = new MP4FtypAtom();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
152 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
153 break;
199
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
154 case 'g':
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
155 if (ATOMID(type) == ATOMID("gnre")) { // Apple iTunes
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
156 pAtom = new MP4GnreAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
157 }
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
158 break;
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
159 case 'h':
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
160 if (ATOMID(type) == ATOMID("hdlr")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
161 pAtom = new MP4HdlrAtom();
199
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
162 } else if (ATOMID(type) == ATOMID("hmhd")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
163 pAtom = new MP4HmhdAtom();
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
164 } else if (ATOMID(type) == ATOMID("hint")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
165 pAtom = new MP4TrefTypeAtom(type);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
166 } else if (ATOMID(type) == ATOMID("hnti")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
167 pAtom = new MP4HntiAtom();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
168 } else if (ATOMID(type) == ATOMID("hinf")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
169 pAtom = new MP4HinfAtom();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
170 } else if (ATOMID(type) == ATOMID("h263")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
171 pAtom = new MP4VideoAtom("h263");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
172 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
173 break;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
174 case 'i':
199
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
175 if (ATOMID(type) == ATOMID("iKMS")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
176 pAtom = new MP4IKMSAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
177 } else if (ATOMID(type) == ATOMID("iSFM")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
178 pAtom = new MP4ISFMAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
179 } else if (ATOMID(type) == ATOMID("iods")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
180 pAtom = new MP4IodsAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
181 } else if (ATOMID(type) == ATOMID("ipir")) {
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
182 pAtom = new MP4TrefTypeAtom(type);
199
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
183 } else if (ATOMID(type) == ATOMID("ilst")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
184 pAtom = new MP4IlstAtom();
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
185 } else if (ATOMID(type) == ATOMID("ima4")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
186 pAtom = new MP4SoundAtom("ima4");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
187 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
188 break;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
189 case 'j':
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
190 if (ATOMID(type) == ATOMID("jpeg")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
191 pAtom = new MP4VideoAtom("jpeg");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
192 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
193 break;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
194 case 'm':
199
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
195 if (ATOMID(type) == ATOMID("mdia")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
196 pAtom = new MP4MdiaAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
197 } else if (ATOMID(type) == ATOMID("minf")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
198 pAtom = new MP4MinfAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
199 } else if (ATOMID(type) == ATOMID("mdhd")) {
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
200 pAtom = new MP4MdhdAtom();
199
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
201 } else if (ATOMID(type) == ATOMID("mdat")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
202 pAtom = new MP4MdatAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
203 } else if (ATOMID(type) == ATOMID("moov")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
204 pAtom = new MP4MoovAtom();
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
205 } else if (ATOMID(type) == ATOMID("mvhd")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
206 pAtom = new MP4MvhdAtom();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
207 } else if (ATOMID(type) == ATOMID("mpod")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
208 pAtom = new MP4TrefTypeAtom(type);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
209 } else if (ATOMID(type) == ATOMID("mp4a")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
210 pAtom = new MP4Mp4aAtom();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
211 } else if (ATOMID(type) == ATOMID("mp4s")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
212 pAtom = new MP4Mp4sAtom();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
213 } else if (ATOMID(type) == ATOMID("mp4v")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
214 pAtom = new MP4Mp4vAtom();
199
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
215 } else if (ATOMID(type) == ATOMID("moof")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
216 pAtom = new MP4MoofAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
217 } else if (ATOMID(type) == ATOMID("mfhd")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
218 pAtom = new MP4MfhdAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
219 } else if (ATOMID(type) == ATOMID("mvex")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
220 pAtom = new MP4MvexAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
221 } else if (ATOMID(type) == ATOMID("maxr")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
222 pAtom = new MP4MaxrAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
223 } else if (ATOMID(type) == ATOMID("meta")) { // iTunes
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
224 pAtom = new MP4MetaAtom();
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
225 } else if (ATOMID(type) == ATOMID("mean")) { // iTunes
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
226 pAtom = new MP4MeanAtom();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
227 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
228 break;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
229 case 'n':
199
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
230 if (ATOMID(type) == ATOMID("nmhd")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
231 pAtom = new MP4NmhdAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
232 } else if (ATOMID(type) == ATOMID("nump")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
233 pAtom = new MP4NumpAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
234 } else if (ATOMID(type) == ATOMID("name")) { // iTunes
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
235 pAtom = new MP4NameAtom();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
236 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
237 break;
199
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
238 case 'p':
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
239 if (ATOMID(type) == ATOMID("pmax")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
240 pAtom = new MP4PmaxAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
241 } else if (ATOMID(type) == ATOMID("payt")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
242 pAtom = new MP4PaytAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
243 }
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
244 break;
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
245 case 'r':
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
246 if (ATOMID(type) == ATOMID("rtp ")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
247 pAtom = new MP4RtpAtom();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
248 } else if (ATOMID(type) == ATOMID("raw ")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
249 pAtom = new MP4VideoAtom("raw ");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
250 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
251 break;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
252 case 's':
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
253 if (ATOMID(type) == ATOMID("s263")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
254 pAtom = new MP4S263Atom();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
255 } else if (ATOMID(type) == ATOMID("samr")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
256 pAtom = new MP4AmrAtom("samr");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
257 } else if (ATOMID(type) == ATOMID("sawb")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
258 pAtom = new MP4AmrAtom("sawb");
199
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
259 } else if (ATOMID(type) == ATOMID("schi")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
260 pAtom = new MP4SchiAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
261 } else if (ATOMID(type) == ATOMID("schm")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
262 pAtom = new MP4SchmAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
263 } else if (ATOMID(type) == ATOMID("sinf")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
264 pAtom = new MP4SinfAtom();
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
265 } else if (ATOMID(type) == ATOMID("stbl")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
266 pAtom = new MP4StblAtom();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
267 } else if (ATOMID(type) == ATOMID("stsd")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
268 pAtom = new MP4StsdAtom();
199
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
269 } else if (ATOMID(type) == ATOMID("stts")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
270 pAtom = new MP4SttsAtom();
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
271 } else if (ATOMID(type) == ATOMID("stsz")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
272 pAtom = new MP4StszAtom();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
273 } else if (ATOMID(type) == ATOMID("stsc")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
274 pAtom = new MP4StscAtom();
199
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
275 } else if (ATOMID(type) == ATOMID("stco")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
276 pAtom = new MP4StcoAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
277 } else if (ATOMID(type) == ATOMID("stss")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
278 pAtom = new MP4StssAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
279 } else if (ATOMID(type) == ATOMID("stsh")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
280 pAtom = new MP4StshAtom();
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
281 } else if (ATOMID(type) == ATOMID("stdp")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
282 pAtom = new MP4StdpAtom();
199
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
283 } else if (ATOMID(type) == ATOMID("smhd")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
284 pAtom = new MP4SmhdAtom();
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
285 } else if (ATOMID(type) == ATOMID("sdp ")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
286 pAtom = new MP4SdpAtom();
199
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
287 } else if (ATOMID(type) == ATOMID("snro")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
288 pAtom = new MP4SnroAtom();
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
289 } else if (ATOMID(type) == ATOMID("sync")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
290 pAtom = new MP4TrefTypeAtom(type);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
291 } else if (ATOMID(type) == ATOMID("skip")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
292 pAtom = new MP4FreeAtom();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
293 pAtom->SetType("skip");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
294 } else if (ATOMID(type) == ATOMID("sowt")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
295 pAtom = new MP4SoundAtom("sowt");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
296 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
297 break;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
298 case 't':
199
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
299 if (ATOMID(type) == ATOMID("trak")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
300 pAtom = new MP4TrakAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
301 } else if (ATOMID(type) == ATOMID("tkhd")) {
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
302 pAtom = new MP4TkhdAtom();
199
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
303 } else if (ATOMID(type) == ATOMID("tref")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
304 pAtom = new MP4TrefAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
305 } else if (ATOMID(type) == ATOMID("traf")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
306 pAtom = new MP4TrafAtom();
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
307 } else if (ATOMID(type) == ATOMID("tfhd")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
308 pAtom = new MP4TfhdAtom();
199
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
309 } else if (ATOMID(type) == ATOMID("trex")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
310 pAtom = new MP4TrexAtom();
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
311 } else if (ATOMID(type) == ATOMID("trun")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
312 pAtom = new MP4TrunAtom();
199
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
313 } else if (ATOMID(type) == ATOMID("tmin")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
314 pAtom = new MP4TminAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
315 } else if (ATOMID(type) == ATOMID("tmax")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
316 pAtom = new MP4TmaxAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
317 } else if (ATOMID(type) == ATOMID("trpy")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
318 pAtom = new MP4TrpyAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
319 } else if (ATOMID(type) == ATOMID("tpyl")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
320 pAtom = new MP4TpylAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
321 } else if (ATOMID(type) == ATOMID("tims")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
322 pAtom = new MP4TimsAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
323 } else if (ATOMID(type) == ATOMID("tsro")) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
324 pAtom = new MP4TsroAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
325 } else if (ATOMID(type) == ATOMID("trkn")) { // iTunes
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
326 pAtom = new MP4TrknAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
327 } else if (ATOMID(type) == ATOMID("tmpo")) { // iTunes
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
328 pAtom = new MP4TmpoAtom();
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
329 } else if (ATOMID(type) == ATOMID("twos")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
330 pAtom = new MP4SoundAtom("twos");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
331 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
332 break;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
333 case 'u':
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
334 if (ATOMID(type) == ATOMID("udta")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
335 pAtom = new MP4UdtaAtom();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
336 } else if (ATOMID(type) == ATOMID("url ")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
337 pAtom = new MP4UrlAtom();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
338 } else if (ATOMID(type) == ATOMID("urn ")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
339 pAtom = new MP4UrnAtom();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
340 } else if (ATOMID(type) == ATOMID("ulaw")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
341 pAtom = new MP4SoundAtom("ulaw");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
342 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
343 break;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
344 case 'v':
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
345 if (ATOMID(type) == ATOMID("vmhd")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
346 pAtom = new MP4VmhdAtom();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
347 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
348 break;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
349 case 'y':
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
350 if (ATOMID(type) == ATOMID("yuv2")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
351 pAtom = new MP4VideoAtom("yuv2");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
352 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
353 break;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
354 case 'S':
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
355 if (ATOMID(type) == ATOMID("SVQ3")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
356 pAtom = new MP4VideoAtom("SVQ3");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
357 } else if (ATOMID(type) == ATOMID("SMI ")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
358 pAtom = new MP4SmiAtom();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
359 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
360 break;
199
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
361 case 0251: { // copyright symbol
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
362 static const char name[5]={0251,'n', 'a', 'm', '\0'};
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
363 static const char art[5]={0251,'A', 'R', 'T', '\0'};
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
364 static const char wrt[5]={0251,'w', 'r', 't', '\0'};
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
365 static const char alb[5]={0251,'a', 'l', 'b', '\0'};
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
366 static const char day[5]={0251,'d', 'a', 'y', '\0'};
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
367 static const char too[5]={0251,'t', 'o', 'o', '\0'};
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
368 static const char cmt[5]={0251,'c', 'm', 't', '\0'};
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
369 static const char gen[5]={0251,'g', 'e', 'n', '\0'};
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
370 if (ATOMID(type) == ATOMID(name)) {
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
371 pAtom = new MP4NamAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
372 } else if (ATOMID(type) == ATOMID(art)) { /* Apple iTunes */
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
373 pAtom = new MP4ArtAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
374 } else if (ATOMID(type) == ATOMID(wrt)) { /* Apple iTunes */
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
375 pAtom = new MP4WrtAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
376 } else if (ATOMID(type) == ATOMID(alb)) { /* Apple iTunes */
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
377 pAtom = new MP4AlbAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
378 } else if (ATOMID(type) == ATOMID(day)) { /* Apple iTunes */
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
379 pAtom = new MP4DayAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
380 } else if (ATOMID(type) == ATOMID(too)) { /* Apple iTunes */
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
381 pAtom = new MP4TooAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
382 } else if (ATOMID(type) == ATOMID(cmt)) { /* Apple iTunes */
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
383 pAtom = new MP4CmtAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
384 } else if (ATOMID(type) == ATOMID(gen)) { /* Apple iTunes */
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
385 pAtom = new MP4GenAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
386 }
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
387 break;
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
388 }
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
389 case '-':
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
390 if (ATOMID(type) == ATOMID("----")) { /* Apple iTunes */
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
391 pAtom = new MP4DashAtom();
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
392 }
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
393 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
394 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
395
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
396 if (pAtom == NULL) {
199
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
397 pAtom = new MP4Atom(type);
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
398 pAtom->SetUnknownType(true);
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
399 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
400
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
401 ASSERT(pAtom);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
402 return pAtom;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
403 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
404
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
405 // generate a skeletal self
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
406
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
407 void MP4Atom::Generate()
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
408 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
409 u_int32_t i;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
410
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
411 // for all properties
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
412 for (i = 0; i < m_pProperties.Size(); i++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
413 // ask it to self generate
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
414 m_pProperties[i]->Generate();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
415 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
416
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
417 // for all mandatory, single child atom types
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
418 for (i = 0; i < m_pChildAtomInfos.Size(); i++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
419 if (m_pChildAtomInfos[i]->m_mandatory
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
420 && m_pChildAtomInfos[i]->m_onlyOne) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
421
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
422 // create the mandatory, single child atom
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
423 MP4Atom* pChildAtom =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
424 CreateAtom(m_pChildAtomInfos[i]->m_name);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
425
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
426 AddChildAtom(pChildAtom);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
427
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
428 // and ask it to self generate
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
429 pChildAtom->Generate();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
430 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
431 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
432 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
433
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
434 MP4Atom* MP4Atom::ReadAtom(MP4File* pFile, MP4Atom* pParentAtom)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
435 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
436 u_int8_t hdrSize = 8;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
437 u_int8_t extendedType[16];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
438
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
439 u_int64_t pos = pFile->GetPosition();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
440
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
441 VERBOSE_READ(pFile->GetVerbosity(),
199
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
442 printf("ReadAtom: pos = 0x"X64"\n", pos));
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
443
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
444 u_int64_t dataSize = pFile->ReadUInt32();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
445
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
446 char type[5];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
447 pFile->ReadBytes((u_int8_t*)&type[0], 4);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
448 type[4] = '\0';
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
449
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
450 // extended size
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
451 if (dataSize == 1) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
452 dataSize = pFile->ReadUInt64();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
453 hdrSize += 8;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
454 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
455
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
456 // extended type
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
457 if (ATOMID(type) == ATOMID("uuid")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
458 pFile->ReadBytes(extendedType, sizeof(extendedType));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
459 hdrSize += sizeof(extendedType);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
460 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
461
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
462 if (dataSize == 0) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
463 // extends to EOF
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
464 dataSize = pFile->GetSize() - pos;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
465 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
466
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
467 dataSize -= hdrSize;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
468
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
469 VERBOSE_READ(pFile->GetVerbosity(),
199
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
470 printf("ReadAtom: type = %s data-size = "U64" (0x"X64")\n",
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
471 type, dataSize, dataSize));
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
472
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
473 if (pos + hdrSize + dataSize > pParentAtom->GetEnd()) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
474 VERBOSE_ERROR(pFile->GetVerbosity(),
199
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
475 printf("ReadAtom: invalid atom size, extends outside parent atom - skipping to end of %s \"%s\"\n",
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
476 pParentAtom->GetType(), type));
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
477 VERBOSE_READ(pFile->GetVerbosity(),
199
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
478 printf("parent %s ("U64") pos "U64" hdr %d data "U64" sum "U64"\n",
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
479 pParentAtom->GetType(),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
480 pParentAtom->GetEnd(),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
481 pos,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
482 hdrSize,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
483 dataSize,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
484 pos + hdrSize + dataSize));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
485 #if 0
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
486 throw new MP4Error("invalid atom size", "ReadAtom");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
487 #else
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
488 // skip to end of atom
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
489 dataSize = pParentAtom->GetEnd() - pos - hdrSize;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
490 #endif
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
491 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
492
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
493
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
494 MP4Atom* pAtom = CreateAtom(type);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
495 pAtom->SetFile(pFile);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
496 pAtom->SetStart(pos);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
497 pAtom->SetEnd(pos + hdrSize + dataSize);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
498 pAtom->SetSize(dataSize);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
499 if (ATOMID(type) == ATOMID("uuid")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
500 pAtom->SetExtendedType(extendedType);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
501 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
502 if (pAtom->IsUnknownType()) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
503 if (!IsReasonableType(pAtom->GetType())) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
504 VERBOSE_READ(pFile->GetVerbosity(),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
505 printf("Warning: atom type %s is suspect\n", pAtom->GetType()));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
506 } else {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
507 VERBOSE_READ(pFile->GetVerbosity(),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
508 printf("Info: atom type %s is unknown\n", pAtom->GetType()));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
509 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
510
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
511 if (dataSize > 0) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
512 pAtom->AddProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
513 new MP4BytesProperty("data", dataSize));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
514 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
515 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
516
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
517 pAtom->SetParentAtom(pParentAtom);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
518
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
519 pAtom->Read();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
520
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
521 return pAtom;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
522 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
523
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
524 bool MP4Atom::IsReasonableType(const char* type)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
525 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
526 for (u_int8_t i = 0; i < 4; i++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
527 if (isalnum(type[i])) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
528 continue;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
529 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
530 if (i == 3 && type[i] == ' ') {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
531 continue;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
532 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
533 return false;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
534 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
535 return true;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
536 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
537
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
538 // generic read
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
539 void MP4Atom::Read()
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
540 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
541 ASSERT(m_pFile);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
542
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
543 if (ATOMID(m_type) != 0 && m_size > 1000000) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
544 VERBOSE_READ(GetVerbosity(),
199
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
545 printf("Warning: %s atom size "U64" is suspect\n",
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
546 m_type, m_size));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
547 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
548
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
549 ReadProperties();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
550
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
551 // read child atoms, if we expect there to be some
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
552 if (m_pChildAtomInfos.Size() > 0) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
553 ReadChildAtoms();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
554 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
555
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
556 Skip(); // to end of atom
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
557 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
558
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
559 void MP4Atom::Skip()
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
560 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
561 if (m_pFile->GetPosition() != m_end) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
562 VERBOSE_READ(m_pFile->GetVerbosity(),
199
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
563 printf("Skip: "U64" bytes\n", m_end - m_pFile->GetPosition()));
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
564 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
565 m_pFile->SetPosition(m_end);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
566 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
567
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
568 MP4Atom* MP4Atom::FindAtom(const char* name)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
569 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
570 if (!IsMe(name)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
571 return NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
572 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
573
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
574 if (!IsRootAtom()) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
575 VERBOSE_FIND(m_pFile->GetVerbosity(),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
576 printf("FindAtom: matched %s\n", name));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
577
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
578 name = MP4NameAfterFirst(name);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
579
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
580 // I'm the sought after atom
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
581 if (name == NULL) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
582 return this;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
583 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
584 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
585
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
586 // else it's one of my children
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
587 return FindChildAtom(name);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
588 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
589
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
590 bool MP4Atom::FindProperty(const char *name,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
591 MP4Property** ppProperty, u_int32_t* pIndex)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
592 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
593 if (!IsMe(name)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
594 return false;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
595 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
596
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
597 if (!IsRootAtom()) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
598 VERBOSE_FIND(m_pFile->GetVerbosity(),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
599 printf("FindProperty: matched %s\n", name));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
600
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
601 name = MP4NameAfterFirst(name);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
602
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
603 // no property name given
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
604 if (name == NULL) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
605 return false;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
606 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
607 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
608
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
609 return FindContainedProperty(name, ppProperty, pIndex);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
610 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
611
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
612 bool MP4Atom::IsMe(const char* name)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
613 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
614 if (name == NULL) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
615 return false;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
616 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
617
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
618 // root atom always matches
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
619 if (!strcmp(m_type, "")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
620 return true;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
621 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
622
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
623 // check if our atom name is specified as the first component
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
624 if (!MP4NameFirstMatches(m_type, name)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
625 return false;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
626 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
627
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
628 return true;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
629 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
630
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
631 MP4Atom* MP4Atom::FindChildAtom(const char* name)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
632 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
633 u_int32_t atomIndex = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
634
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
635 // get the index if we have one, e.g. moov.trak[2].mdia...
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
636 MP4NameFirstIndex(name, &atomIndex);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
637
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
638 // need to get to the index'th child atom of the right type
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
639 for (u_int32_t i = 0; i < m_pChildAtoms.Size(); i++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
640 if (MP4NameFirstMatches(m_pChildAtoms[i]->GetType(), name)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
641 if (atomIndex == 0) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
642 // this is the one, ask it to match
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
643 return m_pChildAtoms[i]->FindAtom(name);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
644 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
645 atomIndex--;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
646 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
647 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
648
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
649 return NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
650 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
651
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
652 bool MP4Atom::FindContainedProperty(const char *name,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
653 MP4Property** ppProperty, u_int32_t* pIndex)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
654 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
655 u_int32_t numProperties = m_pProperties.Size();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
656 u_int32_t i;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
657 // check all of our properties
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
658 for (i = 0; i < numProperties; i++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
659 if (m_pProperties[i]->FindProperty(name, ppProperty, pIndex)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
660 return true;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
661 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
662 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
663
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
664 // not one of our properties,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
665 // presumably one of our children's properties
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
666 // check child atoms...
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
667
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
668 // check if we have an index, e.g. trak[2].mdia...
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
669 u_int32_t atomIndex = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
670 MP4NameFirstIndex(name, &atomIndex);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
671
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
672 // need to get to the index'th child atom of the right type
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
673 for (i = 0; i < m_pChildAtoms.Size(); i++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
674 if (MP4NameFirstMatches(m_pChildAtoms[i]->GetType(), name)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
675 if (atomIndex == 0) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
676 // this is the one, ask it to match
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
677 return m_pChildAtoms[i]->FindProperty(name, ppProperty, pIndex);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
678 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
679 atomIndex--;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
680 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
681 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
682
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
683 VERBOSE_FIND(m_pFile->GetVerbosity(),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
684 printf("FindProperty: no match for %s\n", name));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
685 return false;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
686 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
687
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
688 void MP4Atom::ReadProperties(u_int32_t startIndex, u_int32_t count)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
689 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
690 u_int32_t numProperties = MIN(count, m_pProperties.Size() - startIndex);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
691
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
692 // read any properties of the atom
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
693 for (u_int32_t i = startIndex; i < startIndex + numProperties; i++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
694
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
695 m_pProperties[i]->Read(m_pFile);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
696
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
697 if (m_pFile->GetPosition() > m_end) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
698 VERBOSE_READ(GetVerbosity(),
199
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
699 printf("ReadProperties: insufficient data for property: %s pos 0x"X64" atom end 0x"X64"\n",
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
700 m_pProperties[i]->GetName(),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
701 m_pFile->GetPosition(), m_end));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
702
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
703 throw new MP4Error("atom is too small", "Atom ReadProperties");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
704 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
705
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
706 if (m_pProperties[i]->GetType() == TableProperty) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
707 VERBOSE_READ_TABLE(GetVerbosity(),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
708 printf("Read: "); m_pProperties[i]->Dump(stdout, 0, true));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
709 } else if (m_pProperties[i]->GetType() != DescriptorProperty) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
710 VERBOSE_READ(GetVerbosity(),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
711 printf("Read: "); m_pProperties[i]->Dump(stdout, 0, true));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
712 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
713 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
714 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
715
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
716 void MP4Atom::ReadChildAtoms()
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
717 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
718 bool this_is_udta = ATOMID(m_type) == ATOMID("udta");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
719
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
720 VERBOSE_READ(GetVerbosity(),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
721 printf("ReadChildAtoms: of %s\n", m_type[0] ? m_type : "root"));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
722 for (u_int64_t position = m_pFile->GetPosition();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
723 position < m_end;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
724 position = m_pFile->GetPosition()) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
725 // make sure that we have enough to read at least 8 bytes
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
726 // size and type.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
727 if (m_end - position < 2 * sizeof(uint32_t)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
728 // if we're reading udta, it's okay to have 4 bytes of 0
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
729 if (this_is_udta &&
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
730 m_end - position == sizeof(uint32_t)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
731 u_int32_t mbz = m_pFile->ReadUInt32();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
732 if (mbz != 0) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
733 VERBOSE_WARNING(GetVerbosity(),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
734 printf("Error: In udta atom, end value is not zero %x\n",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
735 mbz));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
736 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
737 continue;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
738 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
739 // otherwise, output a warning, but don't care
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
740 VERBOSE_WARNING(GetVerbosity(),
199
0a2ad94e8607 [svn] Synced with bmp-mp4. Build system is fragile, but should work now.
chainsaw
parents: 61
diff changeset
741 printf("Error: In %s atom, extra "D64" bytes at end of atom\n",
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
742 m_type, (m_end - position)));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
743 for (uint64_t ix = 0; ix < m_end - position; ix++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
744 m_pFile->ReadUInt8();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
745 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
746 continue;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
747 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
748 MP4Atom* pChildAtom = MP4Atom::ReadAtom(m_pFile, this);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
749
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
750 AddChildAtom(pChildAtom);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
751
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
752 MP4AtomInfo* pChildAtomInfo = FindAtomInfo(pChildAtom->GetType());
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
753
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
754 // if child atom is of known type
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
755 // but not expected here print warning
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
756 if (pChildAtomInfo == NULL && !pChildAtom->IsUnknownType()) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
757 VERBOSE_READ(GetVerbosity(),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
758 printf("Warning: In atom %s unexpected child atom %s\n",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
759 GetType(), pChildAtom->GetType()));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
760 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
761
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
762 // if child atoms should have just one instance
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
763 // and this is more than one, print warning
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
764 if (pChildAtomInfo) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
765 pChildAtomInfo->m_count++;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
766
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
767 if (pChildAtomInfo->m_onlyOne && pChildAtomInfo->m_count > 1) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
768 VERBOSE_READ(GetVerbosity(),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
769 printf("Warning: In atom %s multiple child atoms %s\n",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
770 GetType(), pChildAtom->GetType()));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
771 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
772 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
773
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
774 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
775
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
776 // if mandatory child atom doesn't exist, print warning
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
777 u_int32_t numAtomInfo = m_pChildAtomInfos.Size();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
778 for (u_int32_t i = 0; i < numAtomInfo; i++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
779 if (m_pChildAtomInfos[i]->m_mandatory
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
780 && m_pChildAtomInfos[i]->m_count == 0) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
781 VERBOSE_READ(GetVerbosity(),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
782 printf("Warning: In atom %s missing child atom %s\n",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
783 GetType(), m_pChildAtomInfos[i]->m_name));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
784 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
785 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
786
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
787 VERBOSE_READ(GetVerbosity(),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
788 printf("ReadChildAtoms: finished %s\n", m_type));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
789 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
790
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
791 MP4AtomInfo* MP4Atom::FindAtomInfo(const char* name)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
792 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
793 u_int32_t numAtomInfo = m_pChildAtomInfos.Size();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
794 for (u_int32_t i = 0; i < numAtomInfo; i++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
795 if (ATOMID(m_pChildAtomInfos[i]->m_name) == ATOMID(name)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
796 return m_pChildAtomInfos[i];
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
797 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
798 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
799 return NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
800 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
801
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
802 // generic write
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
803 void MP4Atom::Write()
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
804 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
805 ASSERT(m_pFile);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
806
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
807 BeginWrite();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
808
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
809 WriteProperties();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
810
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
811 WriteChildAtoms();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
812
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
813 FinishWrite();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
814 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
815
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
816 void MP4Atom::Rewrite()
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
817 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
818 ASSERT(m_pFile);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
819
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
820 if (!m_end) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
821 // This atom hasn't been written yet...
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
822 return;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
823 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
824
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
825 u_int64_t fPos = m_pFile->GetPosition();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
826 m_pFile->SetPosition(GetStart());
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
827 Write();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
828 m_pFile->SetPosition(fPos);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
829 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
830
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
831 void MP4Atom::BeginWrite(bool use64)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
832 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
833 m_start = m_pFile->GetPosition();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
834 //use64 = m_pFile->Use64Bits();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
835 if (use64) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
836 m_pFile->WriteUInt32(1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
837 } else {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
838 m_pFile->WriteUInt32(0);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
839 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
840 m_pFile->WriteBytes((u_int8_t*)&m_type[0], 4);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
841 if (use64) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
842 m_pFile->WriteUInt64(0);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
843 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
844 if (ATOMID(m_type) == ATOMID("uuid")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
845 m_pFile->WriteBytes(m_extendedType, sizeof(m_extendedType));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
846 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
847 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
848
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
849 void MP4Atom::FinishWrite(bool use64)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
850 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
851 m_end = m_pFile->GetPosition();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
852 m_size = (m_end - m_start);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
853 //use64 = m_pFile->Use64Bits();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
854 if (use64) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
855 m_pFile->SetPosition(m_start + 8);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
856 m_pFile->WriteUInt64(m_size);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
857 } else {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
858 ASSERT(m_size <= (u_int64_t)0xFFFFFFFF);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
859 m_pFile->SetPosition(m_start);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
860 m_pFile->WriteUInt32(m_size);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
861 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
862 m_pFile->SetPosition(m_end);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
863
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
864 // adjust size to just reflect data portion of atom
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
865 m_size -= (use64 ? 16 : 8);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
866 if (ATOMID(m_type) == ATOMID("uuid")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
867 m_size -= sizeof(m_extendedType);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
868 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
869 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
870
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
871 void MP4Atom::WriteProperties(u_int32_t startIndex, u_int32_t count)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
872 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
873 u_int32_t numProperties = MIN(count, m_pProperties.Size() - startIndex);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
874
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
875 VERBOSE_WRITE(GetVerbosity(),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
876 printf("Write: type %s\n", m_type));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
877
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
878 for (u_int32_t i = startIndex; i < startIndex + numProperties; i++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
879 m_pProperties[i]->Write(m_pFile);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
880
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
881 if (m_pProperties[i]->GetType() == TableProperty) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
882 VERBOSE_WRITE_TABLE(GetVerbosity(),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
883 printf("Write: "); m_pProperties[i]->Dump(stdout, 0, false));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
884 } else {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
885 VERBOSE_WRITE(GetVerbosity(),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
886 printf("Write: "); m_pProperties[i]->Dump(stdout, 0, false));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
887 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
888 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
889 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
890
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
891 void MP4Atom::WriteChildAtoms()
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
892 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
893 u_int32_t size = m_pChildAtoms.Size();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
894 for (u_int32_t i = 0; i < size; i++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
895 m_pChildAtoms[i]->Write();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
896 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
897
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
898 VERBOSE_WRITE(GetVerbosity(),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
899 printf("Write: finished %s\n", m_type));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
900 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
901
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
902 void MP4Atom::AddProperty(MP4Property* pProperty)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
903 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
904 ASSERT(pProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
905 m_pProperties.Add(pProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
906 pProperty->SetParentAtom(this);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
907 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
908
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
909 void MP4Atom::AddVersionAndFlags()
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
910 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
911 AddProperty(new MP4Integer8Property("version"));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
912 AddProperty(new MP4Integer24Property("flags"));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
913 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
914
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
915 void MP4Atom::AddReserved(char* name, u_int32_t size)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
916 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
917 MP4BytesProperty* pReserved = new MP4BytesProperty(name, size);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
918 pReserved->SetReadOnly();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
919 AddProperty(pReserved);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
920 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
921
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
922 void MP4Atom::ExpectChildAtom(const char* name, bool mandatory, bool onlyOne)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
923 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
924 m_pChildAtomInfos.Add(new MP4AtomInfo(name, mandatory, onlyOne));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
925 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
926
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
927 u_int8_t MP4Atom::GetVersion()
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
928 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
929 if (strcmp("version", m_pProperties[0]->GetName())) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
930 return 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
931 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
932 return ((MP4Integer8Property*)m_pProperties[0])->GetValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
933 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
934
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
935 void MP4Atom::SetVersion(u_int8_t version)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
936 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
937 if (strcmp("version", m_pProperties[0]->GetName())) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
938 return;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
939 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
940 ((MP4Integer8Property*)m_pProperties[0])->SetValue(version);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
941 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
942
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
943 u_int32_t MP4Atom::GetFlags()
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
944 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
945 if (strcmp("flags", m_pProperties[1]->GetName())) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
946 return 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
947 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
948 return ((MP4Integer24Property*)m_pProperties[1])->GetValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
949 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
950
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
951 void MP4Atom::SetFlags(u_int32_t flags)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
952 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
953 if (strcmp("flags", m_pProperties[1]->GetName())) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
954 return;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
955 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
956 ((MP4Integer24Property*)m_pProperties[1])->SetValue(flags);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
957 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
958
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
959 void MP4Atom::Dump(FILE* pFile, u_int8_t indent, bool dumpImplicits)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
960 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
961 if (m_type[0] != '\0') {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
962 Indent(pFile, indent);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
963 fprintf(pFile, "type %s\n", m_type);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
964 fflush(pFile);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
965 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
966
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
967 u_int32_t i;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
968 u_int32_t size;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
969
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
970 // dump our properties
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
971 size = m_pProperties.Size();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
972 for (i = 0; i < size; i++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
973
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
974 /* skip details of tables unless we're told to be verbose */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
975 if (m_pProperties[i]->GetType() == TableProperty
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
976 && !(GetVerbosity() & MP4_DETAILS_TABLE)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
977 Indent(pFile, indent + 1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
978 fprintf(pFile, "<table entries suppressed>\n");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
979 continue;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
980 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
981
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
982 m_pProperties[i]->Dump(pFile, indent + 1, dumpImplicits);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
983 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
984
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
985 // dump our children
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
986 size = m_pChildAtoms.Size();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
987 for (i = 0; i < size; i++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
988 m_pChildAtoms[i]->Dump(pFile, indent + 1, dumpImplicits);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
989 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
990 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
991
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
992 u_int32_t MP4Atom::GetVerbosity()
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
993 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
994 ASSERT(m_pFile);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
995 return m_pFile->GetVerbosity();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
996 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
997
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
998 u_int8_t MP4Atom::GetDepth()
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
999 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1000 if (m_depth < 0xFF) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1001 return m_depth;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1002 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1003
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1004 MP4Atom *pAtom = this;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1005 m_depth = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1006
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1007 while ((pAtom = pAtom->GetParentAtom()) != NULL) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1008 m_depth++;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1009 ASSERT(m_depth < 255);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1010 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1011 return m_depth;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1012 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1013