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 #define IMPLEMENT_TrackFragmentRunAtom
19
20 #include "trackfragmentrunatom.h"
21 typedef Oscl_Vector<PVA_FF_TrackRunSample, OsclMemAllocator> PVA_FF_TrackRunSampleVecType;
22
23
24 // constructor
PVA_FF_TrackFragmentRunAtom()25 PVA_FF_TrackFragmentRunAtom::PVA_FF_TrackFragmentRunAtom()
26 : PVA_FF_FullAtom(TRACK_RUN_ATOM, (uint8)0, (uint32)TRACK_RUN_ATOM_FLAGS)
27 {
28
29 _currentTimestamp = 0;
30 _firstEntry = true;
31
32 _sampleCount = 0;
33 _dataOffset = 0;
34 _firstSampleFlags = 0;
35 _lastTSupdated = false;
36
37 // initialise vectors to store sample parameters
38 PV_MP4_FF_NEW(fp->auditCB, PVA_FF_TrackRunSampleVecType, (), _psampleEntriesVec);
39
40 recomputeSize();
41 }
42
43
44 // destructor
~PVA_FF_TrackFragmentRunAtom()45 PVA_FF_TrackFragmentRunAtom::~PVA_FF_TrackFragmentRunAtom()
46 {
47 // Delete sample parameter vectors
48 PV_MP4_FF_TEMPLATED_DELETE(NULL, PVA_FF_TrackRunSampleVecType, Oscl_Vector, _psampleEntriesVec);
49
50 }
51
52 // will be used to set tf_flags and denotes sample parameter present
53 void
setFlags(uint32 flags)54 PVA_FF_TrackFragmentRunAtom::setFlags(uint32 flags)
55 {
56
57 // currently not in use. only flags specified by TRACK_RUN_ATOM_FLAGS macro are present
58 OSCL_UNUSED_ARG(flags);
59 }
60
61
62 void
setDataOffset(uint32 offset)63 PVA_FF_TrackFragmentRunAtom::setDataOffset(uint32 offset)
64 {
65 _dataOffset = offset;
66 }
67
68
69 // add new sample entry
70 void
addSample(uint32 size,uint32 ts,uint8 flags)71 PVA_FF_TrackFragmentRunAtom::addSample(uint32 size, uint32 ts, uint8 flags)
72 {
73 _sampleCount++;
74
75 PVA_FF_TrackRunSample sampleEntry;
76 sampleEntry.sampleDuration = 0;
77
78 if (_firstEntry)
79 {
80 _currentTimestamp = ts;
81 _firstEntry = false;
82 }
83 else
84 {
85 // Calculate delta
86 int32 delta = ts - _currentTimestamp;
87 _currentTimestamp = ts;
88
89 uint32 size = _psampleEntriesVec->size();
90
91 (*_psampleEntriesVec)[size-1].sampleDuration = delta; // add sample duration for last sample.. same as second last sample
92 // last sample duration added while rendering
93 }
94 //Store meta data params
95 sampleEntry.sampleSize = size;
96
97 uint8 codingType = (uint8)((flags >> 2) & 0x03);
98 if (codingType == CODING_TYPE_I)
99 {
100 sampleEntry.sampleFlags = KEY_FRAME_ENTRY;
101 }
102 else
103 {
104 sampleEntry.sampleFlags = 0;
105 }
106
107 _psampleEntriesVec->push_back(sampleEntry);
108
109 recomputeSize();
110 }
111
112
113 // recompute size of atom
114 void
recomputeSize()115 PVA_FF_TrackFragmentRunAtom::recomputeSize()
116 {
117 int32 size = getDefaultSize();
118
119 size += 4; // sample count;
120 size += 4; // data offset
121
122 if (_psampleEntriesVec->size() != 0)
123 {
124 for (uint32 ii = 0; ii < _psampleEntriesVec->size(); ii++)
125 {
126 size += 4; // sample duration
127 size += 4; // sample vector
128 size += 4; // sample flags
129 }
130 }
131 _size = size;
132
133 // Update the parent atom size
134 if (_pparent != NULL)
135 {
136 _pparent->recomputeSize();
137 }
138 }
139
140
141
142 // update duration for last entry
143 void
updateLastTSEntry(uint32 ts)144 PVA_FF_TrackFragmentRunAtom::updateLastTSEntry(uint32 ts)
145 {
146 uint32 delta = ts - _currentTimestamp;
147 uint32 size = _psampleEntriesVec->size();
148 (*_psampleEntriesVec)[size -1].sampleDuration = delta;
149
150 _lastTSupdated = true;
151 }
152
153
154
155 // write atom to target file
156 bool
renderToFileStream(MP4_AUTHOR_FF_FILE_IO_WRAP * fp)157 PVA_FF_TrackFragmentRunAtom::renderToFileStream(MP4_AUTHOR_FF_FILE_IO_WRAP* fp)
158 {
159 uint32 rendered = 0;
160 uint32 temp = 0;
161
162 if (!renderAtomBaseMembers(fp))
163 {
164 return false;
165 }
166 rendered += getDefaultSize();
167
168 if (!PVA_FF_AtomUtils::render32(fp, _sampleCount))
169 {
170 return false;
171 }
172 rendered += 4;
173
174 if (!PVA_FF_AtomUtils::render32(fp, _dataOffset))
175 {
176 return false;
177 }
178 rendered += 4;
179
180 // update last sample duration (for last MOOF only)
181 if (!_lastTSupdated)
182 {
183 temp = (*_psampleEntriesVec)[ _sampleCount - 2].sampleDuration;
184 (*_psampleEntriesVec)[ _sampleCount - 1].sampleDuration = temp;
185 }
186
187 if (_psampleEntriesVec->size() < _sampleCount)
188 {
189 return false;
190 }
191 for (uint32 ii = 0; ii < _sampleCount; ii++)
192 {
193
194 temp = (*_psampleEntriesVec)[ii].sampleDuration;
195 if (!PVA_FF_AtomUtils::render32(fp, temp))
196 {
197 return false;
198 }
199 rendered += 4;
200
201 temp = (*_psampleEntriesVec)[ii].sampleSize;
202 if (!PVA_FF_AtomUtils::render32(fp, temp))
203 {
204 return false;
205 }
206 rendered += 4;
207
208 temp = (*_psampleEntriesVec)[ii].sampleFlags;
209 if (!PVA_FF_AtomUtils::render32(fp, temp))
210 {
211 return false;
212 }
213 rendered += 4;
214
215 }
216
217 return true;
218 }
219