• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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