1 /*
2 * Copyright (C) 2011 The Android Open Source Project
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 express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 /**
18 ******************************************************************************
19 * @file M4MP4W_Utils.c
20 * @brief Utilities and private functions for the MP4 writer
21 ******************************************************************************
22 */
23
24 #include "NXPSW_CompilerSwitches.h"
25
26 #ifndef _M4MP4W_USE_CST_MEMORY_WRITER
27
28 #include "M4MP4W_Utils.h"
29 #include "M4OSA_Error.h"
30 #include "M4MP4W_Types.h"
31
32 #define ERR_CHECK(exp, err) if (!(exp)) { return err; }
33
34 /*******************************************************************************/
M4MP4W_putByte(M4OSA_UChar c,M4OSA_FileWriterPointer * fileFunction,M4OSA_Context context)35 M4OSA_ERR M4MP4W_putByte(M4OSA_UChar c, M4OSA_FileWriterPointer* fileFunction,
36 M4OSA_Context context)
37 /*******************************************************************************/
38 {
39 M4OSA_ERR err = fileFunction->writeData(context, (M4OSA_MemAddr8)&c, 1);
40 return err;
41 }
42
43 /*******************************************************************************/
M4MP4W_putBE16(M4OSA_UInt32 val,M4OSA_FileWriterPointer * fileFunction,M4OSA_Context context)44 M4OSA_ERR M4MP4W_putBE16(M4OSA_UInt32 val, M4OSA_FileWriterPointer* fileFunction,
45 M4OSA_Context context)
46 /*******************************************************************************/
47 {
48 M4OSA_ERR err;
49 err = M4MP4W_putByte((M4OSA_UChar)(val >> 8), fileFunction, context);
50 ERR_CHECK(err == M4NO_ERROR, err);
51 err = M4MP4W_putByte((M4OSA_UChar)val, fileFunction, context);
52 return err;
53 }
54
55 /*******************************************************************************/
M4MP4W_putBE24(M4OSA_UInt32 val,M4OSA_FileWriterPointer * fileFunction,M4OSA_Context context)56 M4OSA_ERR M4MP4W_putBE24(M4OSA_UInt32 val, M4OSA_FileWriterPointer* fileFunction,
57 M4OSA_Context context)
58 /*******************************************************************************/
59 {
60 M4OSA_ERR err;
61 err = M4MP4W_putByte((M4OSA_UChar)(val >> 16), fileFunction, context);
62 ERR_CHECK(err == M4NO_ERROR, err);
63 err = M4MP4W_putByte((M4OSA_UChar)(val >> 8), fileFunction, context);
64 ERR_CHECK(err == M4NO_ERROR, err);
65 err = M4MP4W_putByte((M4OSA_UChar)val, fileFunction, context);
66 return err;
67 }
68
69 /*******************************************************************************/
M4MP4W_putBE32(M4OSA_UInt32 val,M4OSA_FileWriterPointer * fileFunction,M4OSA_Context context)70 M4OSA_ERR M4MP4W_putBE32(M4OSA_UInt32 val, M4OSA_FileWriterPointer* fileFunction,
71 M4OSA_Context context)
72 /*******************************************************************************/
73 {
74 M4OSA_ERR err;
75 err = M4MP4W_putByte((M4OSA_UChar)(val >> 24), fileFunction, context);
76 ERR_CHECK(err == M4NO_ERROR, err);
77 err = M4MP4W_putByte((M4OSA_UChar)(val >> 16), fileFunction, context);
78 ERR_CHECK(err == M4NO_ERROR, err);
79 err = M4MP4W_putByte((M4OSA_UChar)(val >> 8), fileFunction, context);
80 ERR_CHECK(err == M4NO_ERROR, err);
81 err = M4MP4W_putByte((M4OSA_UChar)val, fileFunction, context);
82 return err;
83 }
84
85 /*******************************************************************************/
M4MP4W_putBlock(const M4OSA_UChar * Block,M4OSA_UInt32 size,M4OSA_FileWriterPointer * fileFunction,M4OSA_Context context)86 M4OSA_ERR M4MP4W_putBlock(const M4OSA_UChar* Block, M4OSA_UInt32 size,
87 M4OSA_FileWriterPointer* fileFunction, M4OSA_Context context)
88 /*******************************************************************************/
89 {
90 M4OSA_ERR err = fileFunction->writeData(context, (M4OSA_MemAddr8)Block, size);
91 return err;
92 }
93
94 /*******************************************************************************/
M4MP4W_convertInt32BE(M4OSA_UInt32 * valPtr)95 void M4MP4W_convertInt32BE(M4OSA_UInt32* valPtr)
96 /*******************************************************************************/
97 {
98 M4OSA_UChar a, b;
99 M4OSA_UChar* c = (M4OSA_UChar*)valPtr;
100 a = *(c);
101 b = *(c+1);
102 *(c) = *(c+3);
103 *(c+1) = *(c+2);
104 *(c+2) = b;
105 *(c+3) = a;
106 }
107
108 /*******************************************************************************/
M4MP4W_table32ToBE(M4OSA_UInt32 * tab,M4OSA_UInt32 nb)109 void M4MP4W_table32ToBE(M4OSA_UInt32* tab, M4OSA_UInt32 nb)
110 /*******************************************************************************/
111 {
112 M4OSA_UInt32 i;
113 for (i=0; i<nb; i++)
114 M4MP4W_convertInt32BE(&(tab)[i]);
115 }
116
117 /*******************************************************************************/
M4MP4W_realloc(M4OSA_MemAddr32 ptr,M4OSA_UInt32 oldSize,M4OSA_UInt32 newSize)118 void* M4MP4W_realloc(M4OSA_MemAddr32 ptr, M4OSA_UInt32 oldSize, M4OSA_UInt32 newSize)
119 /*******************************************************************************/
120 {
121 M4OSA_MemAddr32 ptr2 = (M4OSA_MemAddr32)M4OSA_32bitAlignedMalloc(newSize, M4MP4_WRITER,
122 (M4OSA_Char *)"realloc");
123 if (M4OSA_NULL != ptr2)
124 {
125 memcpy((void *)ptr2, (void *)ptr, oldSize);
126 }
127 free(ptr);
128 return ptr2;
129 }
130
131 /*******************************************************************************/
M4MP4W_freeContext(M4OSA_Context context)132 M4OSA_ERR M4MP4W_freeContext(M4OSA_Context context)
133 /*******************************************************************************/
134 {
135 #ifdef _M4MP4W_MOOV_FIRST
136 M4OSA_UInt32 i;
137 #endif /*_M4MP4W_MOOV_FIRST*/
138 M4MP4W_Mp4FileData* mMp4FileDataPtr = (M4MP4W_Mp4FileData*)context;
139 ERR_CHECK(context != M4OSA_NULL, M4ERR_PARAMETER);
140
141 /*freeContext is now called after closeWrite*/
142 ERR_CHECK( mMp4FileDataPtr->state == M4MP4W_closed, M4ERR_STATE);
143 mMp4FileDataPtr->state = M4MP4W_closed;
144
145 if (mMp4FileDataPtr->audioTrackPtr != M4OSA_NULL)
146 {
147 /*delete also other chunks if any*/
148 /*for (i=0; i<=mMp4FileDataPtr->audioTrackPtr->currentChunk; i++)*/
149
150 #ifdef _M4MP4W_MOOV_FIRST
151 for (i=0; i<=mMp4FileDataPtr->audioTrackPtr->LastAllocatedChunk; i++)
152 {
153 free(mMp4FileDataPtr->audioTrackPtr->Chunk[i]);
154 }
155 #else
156 if ((M4OSA_NULL != mMp4FileDataPtr->audioTrackPtr->Chunk) &&
157 (M4OSA_NULL != mMp4FileDataPtr->audioTrackPtr->Chunk[0]))
158 {
159 free(mMp4FileDataPtr->audioTrackPtr->Chunk[0]);
160 }
161 if (M4OSA_NULL != mMp4FileDataPtr->audioTrackPtr->chunkOffsetTable)
162 {
163 free(mMp4FileDataPtr->audioTrackPtr->chunkOffsetTable);
164 }
165 #endif /*_M4MP4W_MOOV_FIRST*/
166
167 /*now dynamic*/
168 if (M4OSA_NULL != mMp4FileDataPtr->audioTrackPtr->Chunk)
169 {
170 free(mMp4FileDataPtr->audioTrackPtr->Chunk);
171 }
172 if (M4OSA_NULL != mMp4FileDataPtr->audioTrackPtr->chunkSizeTable)
173 {
174 free(mMp4FileDataPtr->audioTrackPtr->chunkSizeTable);
175 }
176 if (M4OSA_NULL != mMp4FileDataPtr->audioTrackPtr->chunkSampleNbTable)
177 {
178 free(mMp4FileDataPtr->audioTrackPtr->chunkSampleNbTable);
179 }
180 if (M4OSA_NULL != mMp4FileDataPtr->audioTrackPtr->chunkTimeMsTable)
181 {
182 free(mMp4FileDataPtr->audioTrackPtr->chunkTimeMsTable);
183 }
184
185 if (mMp4FileDataPtr->audioTrackPtr->TABLE_STTS != M4OSA_NULL)
186 {
187 free(mMp4FileDataPtr->audioTrackPtr->TABLE_STTS);
188 }
189
190 if (mMp4FileDataPtr->audioTrackPtr->TABLE_STSZ != M4OSA_NULL)
191 {
192 free(mMp4FileDataPtr->audioTrackPtr->TABLE_STSZ);
193 }
194
195 if (mMp4FileDataPtr->audioTrackPtr->DSI != M4OSA_NULL)
196 {
197 free(mMp4FileDataPtr->audioTrackPtr->DSI);
198 mMp4FileDataPtr->audioTrackPtr->DSI = M4OSA_NULL;
199 }
200
201 free(mMp4FileDataPtr->audioTrackPtr);
202 mMp4FileDataPtr->audioTrackPtr = M4OSA_NULL;
203 }
204 if (mMp4FileDataPtr->videoTrackPtr != M4OSA_NULL)
205 {
206 /*delete also other chunks if any*/
207 /*for (i=0; i<=mMp4FileDataPtr->videoTrackPtr->currentChunk; i++)*/
208
209 #ifdef _M4MP4W_MOOV_FIRST
210 for (i=0; i<=mMp4FileDataPtr->videoTrackPtr->LastAllocatedChunk; i++)
211 {
212 free(mMp4FileDataPtr->videoTrackPtr->Chunk[i]);
213 }
214 #else
215 if ((M4OSA_NULL != mMp4FileDataPtr->videoTrackPtr->Chunk) &&
216 (M4OSA_NULL != mMp4FileDataPtr->videoTrackPtr->Chunk[0]))
217 {
218 free(mMp4FileDataPtr->videoTrackPtr->Chunk[0]);
219 }
220 if (M4OSA_NULL != mMp4FileDataPtr->videoTrackPtr->chunkOffsetTable)
221 {
222 free(mMp4FileDataPtr->videoTrackPtr->chunkOffsetTable);
223 }
224 #endif /*_M4MP4W_MOOV_FIRST*/
225
226 /*now dynamic*/
227 if (M4OSA_NULL != mMp4FileDataPtr->videoTrackPtr->Chunk)
228 {
229 free(mMp4FileDataPtr->videoTrackPtr->Chunk);
230 }
231 if (M4OSA_NULL != mMp4FileDataPtr->videoTrackPtr->chunkSizeTable)
232 {
233 free(mMp4FileDataPtr->videoTrackPtr->chunkSizeTable);
234 }
235 if (M4OSA_NULL != mMp4FileDataPtr->videoTrackPtr->chunkSampleNbTable)
236 {
237 free(mMp4FileDataPtr->videoTrackPtr->chunkSampleNbTable);
238 }
239 if (M4OSA_NULL != mMp4FileDataPtr->videoTrackPtr->chunkTimeMsTable)
240 {
241 free(mMp4FileDataPtr->videoTrackPtr->chunkTimeMsTable);
242 }
243
244 if (mMp4FileDataPtr->videoTrackPtr->DSI != M4OSA_NULL)
245 {
246 free(mMp4FileDataPtr->videoTrackPtr->DSI);
247 mMp4FileDataPtr->videoTrackPtr->DSI = M4OSA_NULL;
248 }
249
250 /*now dynamic*/
251 if (M4OSA_NULL != mMp4FileDataPtr->videoTrackPtr->TABLE_STTS)
252 {
253 free(mMp4FileDataPtr->videoTrackPtr->TABLE_STTS);
254 }
255 if (M4OSA_NULL != mMp4FileDataPtr->videoTrackPtr->TABLE_STSZ)
256 {
257 free(mMp4FileDataPtr->videoTrackPtr->TABLE_STSZ);
258 }
259 if (M4OSA_NULL != mMp4FileDataPtr->videoTrackPtr->TABLE_STSS)
260 {
261 free(mMp4FileDataPtr->videoTrackPtr->TABLE_STSS);
262 }
263
264 free(mMp4FileDataPtr->videoTrackPtr);
265 mMp4FileDataPtr->videoTrackPtr = M4OSA_NULL;
266 }
267
268 if (mMp4FileDataPtr->embeddedString != M4OSA_NULL)
269 {
270 free(mMp4FileDataPtr->embeddedString);
271 mMp4FileDataPtr->embeddedString = M4OSA_NULL;
272 }
273
274 free(mMp4FileDataPtr);
275
276 return M4NO_ERROR;
277 }
278
279 #ifdef _M4MP4W_OPTIMIZE_FOR_PHONE
280 /*******************************************************************************/
M4MP4W_put32_Hi(M4OSA_UInt32 * tab,M4OSA_UInt16 Hi)281 M4OSA_Void M4MP4W_put32_Hi(M4OSA_UInt32* tab, M4OSA_UInt16 Hi)
282 /*******************************************************************************/
283 {
284 *tab &= 0xFFFF;
285 *tab |= Hi<<16;
286 }
287
288 /*******************************************************************************/
M4MP4W_put32_Lo(M4OSA_UInt32 * tab,M4OSA_UInt16 Lo)289 M4OSA_Void M4MP4W_put32_Lo(M4OSA_UInt32* tab, M4OSA_UInt16 Lo)
290 /*******************************************************************************/
291 {
292 *tab &= 0xFFFF0000;
293 *tab |= Lo;
294 }
295
296 /*******************************************************************************/
M4MP4W_get32_Hi(M4OSA_UInt32 * tab)297 M4OSA_UInt16 M4MP4W_get32_Hi(M4OSA_UInt32* tab)
298 /*******************************************************************************/
299 {
300 return (*tab >> 16) & 0xFFFF;
301 }
302
303 /*******************************************************************************/
M4MP4W_get32_Lo(M4OSA_UInt32 * tab)304 M4OSA_UInt16 M4MP4W_get32_Lo(M4OSA_UInt32* tab)
305 /*******************************************************************************/
306 {
307 return *tab & 0xFFFF;
308 }
309 #endif
310
311 #endif /* _M4MP4W_USE_CST_MEMORY_WRITER */
312
313