• 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 #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