1 /* ------------------------------------------------------------------
2 * Copyright (C) 1998-2009 PacketVideo
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13 * express or implied.
14 * See the License for the specific language governing permissions
15 * and limitations under the License.
16 * -------------------------------------------------------------------
17 */
18 /*********************************************************************************/
19 /* ------------------------------------------------------------------- */
20 /* MPEG-4 TrackHeaderAtom Class */
21 /* ------------------------------------------------------------------- */
22 /*********************************************************************************/
23 /*
24 This TrackHeaderAtom Class specifies the characteristics of a single MPEG-4
25 track.
26 */
27
28
29 #define IMPLEMENT_TrackHeaderAtom
30
31 #include "trackheaderatom.h"
32 #include "atomutils.h"
33 #include "atomdefs.h"
34
35 // Stream-in Constructor
TrackHeaderAtom(MP4_FF_FILE * fp,uint32 size,uint32 type)36 TrackHeaderAtom::TrackHeaderAtom(MP4_FF_FILE *fp, uint32 size, uint32 type)
37 : FullAtom(fp, size, type)
38 {
39 _layer = 0;
40 _alternateGroup = 0;
41 _width = 0;
42 _height = 0;
43 _tx = 0;
44 _ty = 0;
45
46 if (_success)
47 {
48 _pparent = NULL;
49 if (getVersion() == 1)
50 {
51 if (!AtomUtils::read64(fp, _creationTime64))
52 _success = false;
53 if (!AtomUtils::read64(fp, _modificationTime64))
54 _success = false;
55 if (!AtomUtils::read32(fp, _trackID))
56 _success = false;
57
58 if (!AtomUtils::read32(fp, _reserved1))
59 _success = false;
60
61 if (!AtomUtils::read64(fp, _duration64))
62 _success = false;
63 }
64 else
65 {
66 if (!AtomUtils::read32(fp, _creationTime))
67 _success = false;
68 if (!AtomUtils::read32(fp, _modificationTime))
69 _success = false;
70 if (!AtomUtils::read32(fp, _trackID))
71 _success = false;
72
73 if (!AtomUtils::read32(fp, _reserved1))
74 _success = false;
75
76 if (!AtomUtils::read32(fp, _duration))
77 _success = false;
78
79 }
80
81 if (!AtomUtils::read32(fp, _reserved2[0]))
82 _success = false;
83 if (!AtomUtils::read32(fp, _reserved2[1]))
84 _success = false;
85 if (!AtomUtils::read32(fp, _reserved2[2]))
86 _success = false;
87 if (!AtomUtils::read16(fp, _reserved3))
88 _success = false;
89 if (!AtomUtils::read16(fp, _reserved4))
90 _success = false;
91 if (!AtomUtils::read32(fp, _reserved5[0]))
92 _success = false;
93 if (!AtomUtils::read32(fp, _reserved5[1]))
94 _success = false;
95 if (!AtomUtils::read32(fp, _reserved5[2]))
96 _success = false;
97 if (!AtomUtils::read32(fp, _reserved5[3]))
98 _success = false;
99 if (!AtomUtils::read32(fp, _reserved5[4]))
100 _success = false;
101 if (!AtomUtils::read32(fp, _reserved5[5]))
102 _success = false;
103 if (!AtomUtils::read32(fp, _reserved5[6]))
104 _success = false;
105 if (!AtomUtils::read32(fp, _reserved5[7]))
106 _success = false;
107 if (!AtomUtils::read32(fp, _reserved5[8]))
108 _success = false;
109 if (!AtomUtils::read32(fp, _reserved6))
110 _success = false;
111 if (!AtomUtils::read32(fp, _reserved7))
112 _success = false;
113
114
115 if (_success)
116 {
117 if (_reserved3 == 0x0100)
118 {
119 // Check flags for audio track
120 _mediaType = MEDIA_TYPE_AUDIO;
121 }
122 else if ((_reserved6 == 0x01400000) && (_reserved7 == 0x00f00000))
123 {
124 // Check flags for visual track
125 _mediaType = MEDIA_TYPE_VISUAL;
126 }
127 else
128 {
129 /*
130 * Store these parameters, just in case
131 * the track later on turn out to be a text one
132 * Also Width, Height, XOffset & YOffsets are stored
133 * as 16.16 fixed point values, with lower 16 bits
134 * always set to zero
135 */
136
137 _width = ((_reserved6 >> 16) & 0xFFFF);
138 _height = ((_reserved7 >> 16) & 0xFFFF);
139
140 _layer = (int16)((_reserved2[2] >> 16) & 0xFF);
141 _alternateGroup =
142 (uint16)((_reserved2[2]) & 0xFF);
143
144 _tx = ((_reserved5[6] >> 16) & 0xFFFF);
145 _ty = ((_reserved5[7] >> 16) & 0xFFFF);
146
147 _mediaType = MEDIA_TYPE_UNKNOWN;
148 }
149 }
150 else
151 {
152 _mp4ErrorCode = READ_TRACK_HEADER_ATOM_FAILED;
153 }
154 }
155 else
156 {
157 if (_mp4ErrorCode != ATOM_VERSION_NOT_SUPPORTED)
158 _mp4ErrorCode = READ_TRACK_HEADER_ATOM_FAILED;
159 }
160
161 }
162
163 // Destructor
~TrackHeaderAtom()164 TrackHeaderAtom::~TrackHeaderAtom()
165 {
166 // Empty
167 }
168
169