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 This PVA_FF_MediaAtom Class contains all the objects that declare information
20 about the media data within the stream.
21 */
22
23 #define IMPLEMENT_MediaAtom_H__
24
25 #include "mediaatom.h"
26 #include "a_atomdefs.h"
27 #include "atomutils.h"
28
29 // Constructor
PVA_FF_MediaAtom(int32 mediaType,int32 codecType,uint32 fileAuthoringFlags,uint32 protocol,uint8 profile,uint8 profileComp,uint8 level)30 PVA_FF_MediaAtom::PVA_FF_MediaAtom(int32 mediaType,
31 int32 codecType,
32 uint32 fileAuthoringFlags,
33 uint32 protocol,
34 uint8 profile,
35 uint8 profileComp,
36 uint8 level)
37
38 : PVA_FF_Atom(MEDIA_ATOM)
39 {
40 PV_MP4_FF_NEW(fp->auditCB, PVA_FF_MediaHeaderAtom, (), _pmediaHeader);
41
42 PV_MP4_FF_NEW(fp->auditCB, PVA_FF_HandlerAtom, (mediaType, (uint8)0, (uint8)0), _phandler);
43
44 PV_MP4_FF_NEW(fp->auditCB, PVA_FF_MediaInformationAtom, (mediaType,
45 codecType,
46 fileAuthoringFlags,
47 protocol, profile,
48 profileComp, level), _pmediaInformation);
49
50 recomputeSize();
51 _pmediaHeader->setParent(this);
52 _phandler->setParent(this);
53 _pmediaInformation->setParent(this);
54 }
55
56 // Destructor
~PVA_FF_MediaAtom()57 PVA_FF_MediaAtom::~PVA_FF_MediaAtom()
58 {
59 PV_MP4_FF_DELETE(NULL, PVA_FF_MediaHeaderAtom, _pmediaHeader);
60 PV_MP4_FF_DELETE(NULL, PVA_FF_HandlerAtom, _phandler);
61 PV_MP4_FF_DELETE(NULL, PVA_FF_MediaInformationAtom, _pmediaInformation);
62 }
63
64 void
nextSample(int32 mediaType,void * psample,uint32 size,uint32 ts,uint8 flags,uint32 baseOffset,bool oChunkStart)65 PVA_FF_MediaAtom::nextSample(int32 mediaType,
66 void *psample,
67 uint32 size,
68 uint32 ts,
69 uint8 flags,
70 uint32 baseOffset,
71 bool oChunkStart)
72 {
73 _pmediaInformation->nextSample(mediaType, psample, size, ts,
74 flags, baseOffset, oChunkStart);
75 _pmediaHeader->addSample(ts);
76 }
77
78 void
nextTextSample(int32 mediaType,void * psample,uint32 size,uint32 ts,uint8 flags,int32 index,uint32 baseOffset,bool oChunkStart)79 PVA_FF_MediaAtom::nextTextSample(int32 mediaType,
80 void *psample,
81 uint32 size,
82 uint32 ts,
83 uint8 flags,
84 int32 index,
85 uint32 baseOffset,
86 bool oChunkStart)
87 {
88 _pmediaInformation->nextTextSample(mediaType, psample, size, ts,
89 flags, index, baseOffset, oChunkStart);
90 _pmediaHeader->addSample(ts);
91 }
92
93 void
nextSample(int32 mediaType,Oscl_Vector<OsclMemoryFragment,OsclMemAllocator> & fragmentList,uint32 size,uint32 ts,uint8 flags,uint32 baseOffset,bool oChunkStart)94 PVA_FF_MediaAtom::nextSample(int32 mediaType,
95 Oscl_Vector <OsclMemoryFragment, OsclMemAllocator>& fragmentList,
96 uint32 size,
97 uint32 ts,
98 uint8 flags,
99 uint32 baseOffset,
100 bool oChunkStart)
101 {
102 _pmediaInformation->nextSample(mediaType, fragmentList, size, ts,
103 flags, baseOffset, oChunkStart);
104
105 _pmediaHeader->addSample(ts);
106 }
107
108 void
nextTextSample(int32 mediaType,Oscl_Vector<OsclMemoryFragment,OsclMemAllocator> & fragmentList,uint32 size,uint32 ts,uint8 flags,int32 index,uint32 baseOffset,bool oChunkStart)109 PVA_FF_MediaAtom::nextTextSample(int32 mediaType,
110 Oscl_Vector <OsclMemoryFragment, OsclMemAllocator>& fragmentList,
111 uint32 size,
112 uint32 ts,
113 uint8 flags,
114 int32 index,
115 uint32 baseOffset,
116 bool oChunkStart)
117 {
118 _pmediaInformation->nextTextSample(mediaType, fragmentList, size, ts,
119 flags, index, baseOffset, oChunkStart);
120
121 _pmediaHeader->addSample(ts);
122 }
123
124 bool
reAuthorFirstSample(uint32 size,uint32 baseOffset)125 PVA_FF_MediaAtom::reAuthorFirstSample(uint32 size,
126 uint32 baseOffset)
127 {
128 return(
129 _pmediaInformation->reAuthorFirstSample(size,
130 baseOffset));
131 }
132
133 // in movie fragment mode set the actual duration of
134 // last sample
135 void
updateLastTSEntry(uint32 ts)136 PVA_FF_MediaAtom::updateLastTSEntry(uint32 ts)
137 {
138
139 _pmediaInformation->updateLastTSEntry(ts);
140
141 _pmediaHeader->updateLastTSEntry(ts);
142 }
143
144
145 void
recomputeSize()146 PVA_FF_MediaAtom::recomputeSize()
147 {
148 int32 size = getDefaultSize(); // Get size of base class members
149
150 // Include sizes of all members
151 size += _pmediaHeader->getSize();
152 size += _phandler->getSize();
153 size += _pmediaInformation->getSize();
154
155 _size = size;
156
157 // Update size of parent atom if it exists
158 if (_pparent != NULL)
159 {
160 _pparent->recomputeSize();
161 }
162 }
163
164 // Rendering the PVA_FF_Atom in proper format (bitlengths, etc.) to an ostream
165 bool
renderToFileStream(MP4_AUTHOR_FF_FILE_IO_WRAP * fp)166 PVA_FF_MediaAtom::renderToFileStream(MP4_AUTHOR_FF_FILE_IO_WRAP *fp)
167 {
168 int32 rendered = 0; // Keep track of number of bytes rendered
169
170 // Render PVA_FF_Atom type and size
171 if (!renderAtomBaseMembers(fp))
172 {
173 return false;
174 }
175 rendered += getDefaultSize();
176
177 // Render all member atoms
178 if (!_pmediaHeader->renderToFileStream(fp))
179 {
180 return false;
181 }
182 rendered += _pmediaHeader->getSize();
183
184 if (!_phandler->renderToFileStream(fp))
185 {
186 return false;
187 }
188 rendered += _phandler->getSize();
189
190 if (!_pmediaInformation->renderToFileStream(fp))
191 {
192 return false;
193 }
194 rendered += _pmediaInformation->getSize();
195
196 return true;
197 }
198
199 void
SetMaxSampleSize(uint32 aSize)200 PVA_FF_MediaAtom::SetMaxSampleSize(uint32 aSize)
201 {
202 _pmediaInformation->SetMaxSampleSize(aSize);
203 }
204
205 void
writeMaxSampleSize(MP4_AUTHOR_FF_FILE_IO_WRAP * _afp)206 PVA_FF_MediaAtom::writeMaxSampleSize(MP4_AUTHOR_FF_FILE_IO_WRAP *_afp)
207 {
208 _pmediaInformation->writeMaxSampleSize(_afp);
209 }
210