Line data Source code
1 : /*
2 : * GPAC - Multimedia Framework C SDK
3 : *
4 : * Authors: Jean Le Feuvre
5 : * Copyright (c) Telecom ParisTech 2000-2012
6 : * All rights reserved
7 : *
8 : * This file is part of GPAC / MPEG-4 ObjectDescriptor sub-project
9 : *
10 : * GPAC is free software; you can redistribute it and/or modify
11 : * it under the terms of the GNU Lesser General Public License as published by
12 : * the Free Software Foundation; either version 2, or (at your option)
13 : * any later version.
14 : *
15 : * GPAC is distributed in the hope that it will be useful,
16 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 : * GNU Lesser General Public License for more details.
19 : *
20 : * You should have received a copy of the GNU Lesser General Public
21 : * License along with this library; see the file COPYING. If not, write to
22 : * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
23 : *
24 : */
25 :
26 : #include <gpac/internal/odf_dev.h>
27 :
28 :
29 : //
30 : // CONSTRUCTORS
31 : //
32 32218 : GF_Descriptor *gf_odf_create_descriptor(u8 tag)
33 : {
34 : GF_Descriptor *desc;
35 :
36 32218 : switch (tag) {
37 390 : case GF_ODF_IOD_TAG:
38 390 : return gf_odf_new_iod();
39 701 : case GF_ODF_OD_TAG:
40 701 : return gf_odf_new_od();
41 8059 : case GF_ODF_ESD_TAG:
42 8059 : return gf_odf_new_esd();
43 7893 : case GF_ODF_DCD_TAG:
44 7893 : return gf_odf_new_dcd();
45 3971 : case GF_ODF_SLC_TAG:
46 : //default : we create it without any predefinition...
47 3971 : return gf_odf_new_slc(0);
48 245 : case GF_ODF_MUXINFO_TAG:
49 245 : return gf_odf_new_muxinfo();
50 421 : case GF_ODF_BIFS_CFG_TAG:
51 421 : return gf_odf_new_bifs_cfg();
52 33 : case GF_ODF_UI_CFG_TAG:
53 33 : return gf_odf_new_ui_cfg();
54 10 : case GF_ODF_TEXT_CFG_TAG:
55 10 : return gf_odf_new_text_cfg();
56 62 : case GF_ODF_TX3G_TAG:
57 62 : return gf_odf_new_tx3g();
58 1 : case GF_ODF_ELEM_MASK_TAG:
59 1 : return gf_odf_New_ElemMask();
60 2 : case GF_ODF_LASER_CFG_TAG:
61 2 : return gf_odf_new_laser_cfg();
62 :
63 7264 : case GF_ODF_DSI_TAG:
64 7264 : desc = gf_odf_new_default();
65 7264 : if (!desc) return desc;
66 7264 : desc->tag = GF_ODF_DSI_TAG;
67 7264 : return desc;
68 :
69 10 : case GF_ODF_AUX_VIDEO_DATA:
70 10 : return gf_odf_new_auxvid();
71 :
72 33 : case GF_ODF_SEGMENT_TAG:
73 33 : return gf_odf_new_segment();
74 :
75 : //File Format Specific
76 1857 : case GF_ODF_ISOM_IOD_TAG:
77 1857 : return gf_odf_new_isom_iod();
78 232 : case GF_ODF_ISOM_OD_TAG:
79 232 : return gf_odf_new_isom_od();
80 391 : case GF_ODF_ESD_INC_TAG:
81 391 : return gf_odf_new_esd_inc();
82 314 : case GF_ODF_ESD_REF_TAG:
83 314 : return gf_odf_new_esd_ref();
84 311 : case GF_ODF_LANG_TAG:
85 311 : return gf_odf_new_lang();
86 18 : case GF_ODF_GPAC_LANG:
87 18 : desc = gf_odf_new_lang();
88 18 : if (desc) desc->tag = GF_ODF_GPAC_LANG;
89 : return desc;
90 :
91 : #ifndef GPAC_MINIMAL_ODF
92 : case GF_ODF_MEDIATIME_TAG:
93 : return gf_odf_new_mediatime();
94 : case GF_ODF_CI_TAG:
95 : return gf_odf_new_ci();
96 : case GF_ODF_SCI_TAG:
97 : return gf_odf_new_sup_cid();
98 : case GF_ODF_IPI_PTR_TAG:
99 : return gf_odf_new_ipi_ptr();
100 : //special case for the file format
101 : case GF_ODF_ISOM_IPI_PTR_TAG:
102 : desc = gf_odf_new_ipi_ptr();
103 : if (!desc) return desc;
104 : desc->tag = GF_ODF_ISOM_IPI_PTR_TAG;
105 : return desc;
106 :
107 : case GF_ODF_IPMP_PTR_TAG:
108 : return gf_odf_new_ipmp_ptr();
109 : case GF_ODF_IPMP_TAG:
110 : return gf_odf_new_ipmp();
111 : case GF_ODF_QOS_TAG:
112 : return gf_odf_new_qos();
113 : case GF_ODF_REG_TAG:
114 : return gf_odf_new_reg();
115 : case GF_ODF_CC_TAG:
116 : return gf_odf_new_cc();
117 : case GF_ODF_KW_TAG:
118 : return gf_odf_new_kw();
119 : case GF_ODF_RATING_TAG:
120 : return gf_odf_new_rating();
121 : case GF_ODF_SHORT_TEXT_TAG:
122 : return gf_odf_new_short_text();
123 : case GF_ODF_TEXT_TAG:
124 : return gf_odf_new_exp_text();
125 : case GF_ODF_CC_NAME_TAG:
126 : return gf_odf_new_cc_name();
127 : case GF_ODF_CC_DATE_TAG:
128 : return gf_odf_new_cc_date();
129 : case GF_ODF_OCI_NAME_TAG:
130 : return gf_odf_new_oci_name();
131 : case GF_ODF_OCI_DATE_TAG:
132 : return gf_odf_new_oci_date();
133 : case GF_ODF_SMPTE_TAG:
134 : return gf_odf_new_smpte_camera();
135 : case GF_ODF_EXT_PL_TAG:
136 : return gf_odf_new_pl_ext();
137 : case GF_ODF_PL_IDX_TAG:
138 : return gf_odf_new_pl_idx();
139 :
140 : case GF_ODF_IPMP_TL_TAG:
141 : return gf_odf_new_ipmp_tool_list();
142 : case GF_ODF_IPMP_TOOL_TAG:
143 : return gf_odf_new_ipmp_tool();
144 :
145 : case 0:
146 : case 0xFF:
147 : return NULL;
148 : #endif /*GPAC_MINIMAL_ODF*/
149 0 : default:
150 : //ISO Reserved
151 0 : if ( (tag >= GF_ODF_ISO_RES_BEGIN_TAG) &&
152 : (tag <= GF_ODF_ISO_RES_END_TAG) ) {
153 : return NULL;
154 : }
155 0 : desc = gf_odf_new_default();
156 0 : if (!desc) return desc;
157 0 : desc->tag = tag;
158 0 : return desc;
159 : }
160 : }
161 :
162 : //
163 : // DESTRUCTORS
164 : //
165 36661 : GF_Err gf_odf_delete_descriptor(GF_Descriptor *desc)
166 : {
167 36661 : switch (desc->tag) {
168 963 : case GF_ODF_IOD_TAG :
169 963 : return gf_odf_del_iod((GF_InitialObjectDescriptor *)desc);
170 797 : case GF_ODF_OD_TAG:
171 797 : return gf_odf_del_od((GF_ObjectDescriptor *)desc);
172 8059 : case GF_ODF_ESD_TAG :
173 8059 : return gf_odf_del_esd((GF_ESD *)desc);
174 7893 : case GF_ODF_DCD_TAG :
175 7893 : return gf_odf_del_dcd((GF_DecoderConfig *)desc);
176 7547 : case GF_ODF_SLC_TAG:
177 7547 : return gf_odf_del_slc((GF_SLConfig *)desc);
178 :
179 1893 : case GF_ODF_ISOM_IOD_TAG:
180 1893 : return gf_odf_del_isom_iod((GF_IsomInitialObjectDescriptor *)desc);
181 349 : case GF_ODF_ISOM_OD_TAG:
182 349 : return gf_odf_del_isom_od((GF_IsomObjectDescriptor *)desc);
183 :
184 33 : case GF_ODF_SEGMENT_TAG:
185 33 : return gf_odf_del_segment((GF_Segment *) desc);
186 :
187 245 : case GF_ODF_MUXINFO_TAG:
188 245 : return gf_odf_del_muxinfo((GF_MuxInfo *)desc);
189 421 : case GF_ODF_BIFS_CFG_TAG:
190 421 : return gf_odf_del_bifs_cfg((GF_BIFSConfig *)desc);
191 33 : case GF_ODF_UI_CFG_TAG:
192 33 : return gf_odf_del_ui_cfg((GF_UIConfig *)desc);
193 10 : case GF_ODF_TEXT_CFG_TAG:
194 10 : return gf_odf_del_text_cfg((GF_TextConfig *)desc);
195 107 : case GF_ODF_TX3G_TAG:
196 107 : return gf_odf_del_tx3g((GF_TextSampleDescriptor*)desc);
197 1 : case GF_ODF_ELEM_MASK_TAG:
198 1 : return gf_odf_del_ElemMask((GF_ElementaryMask*)desc);
199 2 : case GF_ODF_LASER_CFG_TAG:
200 2 : return gf_odf_del_laser_cfg((GF_LASERConfig *)desc);
201 :
202 10 : case GF_ODF_AUX_VIDEO_DATA:
203 10 : return gf_odf_del_auxvid((GF_AuxVideoDescriptor *)desc);
204 :
205 329 : case GF_ODF_LANG_TAG:
206 : case GF_ODF_GPAC_LANG:
207 329 : return gf_odf_del_lang((GF_Language *)desc);
208 :
209 391 : case GF_ODF_ESD_INC_TAG:
210 391 : return gf_odf_del_esd_inc((GF_ES_ID_Inc *)desc);
211 314 : case GF_ODF_ESD_REF_TAG:
212 314 : return gf_odf_del_esd_ref((GF_ES_ID_Ref *)desc);
213 :
214 : #ifndef GPAC_MINIMAL_ODF
215 : case GF_ODF_MEDIATIME_TAG:
216 : return gf_odf_del_mediatime((GF_MediaTime *) desc);
217 : case GF_ODF_CC_TAG:
218 : return gf_odf_del_cc((GF_CCDescriptor *)desc);
219 : case GF_ODF_CC_DATE_TAG:
220 : return gf_odf_del_cc_date((GF_CC_Date *)desc);
221 : case GF_ODF_CC_NAME_TAG:
222 : return gf_odf_del_cc_name((GF_CC_Name *)desc);
223 : case GF_ODF_CI_TAG:
224 : return gf_odf_del_ci((GF_CIDesc *)desc);
225 : case GF_ODF_TEXT_TAG:
226 : return gf_odf_del_exp_text((GF_ExpandedTextual *)desc);
227 : case GF_ODF_EXT_PL_TAG:
228 : return gf_odf_del_pl_ext((GF_PLExt *)desc);
229 : case GF_ODF_IPI_PTR_TAG:
230 : case GF_ODF_ISOM_IPI_PTR_TAG:
231 : return gf_odf_del_ipi_ptr((GF_IPIPtr *)desc);
232 : case GF_ODF_IPMP_TAG:
233 : return gf_odf_del_ipmp((GF_IPMP_Descriptor *)desc);
234 : case GF_ODF_IPMP_PTR_TAG:
235 : return gf_odf_del_ipmp_ptr((GF_IPMPPtr *)desc);
236 : case GF_ODF_KW_TAG:
237 : return gf_odf_del_kw((GF_KeyWord *)desc);
238 : case GF_ODF_OCI_DATE_TAG:
239 : return gf_odf_del_oci_date((GF_OCI_Data *)desc);
240 : case GF_ODF_OCI_NAME_TAG:
241 : return gf_odf_del_oci_name((GF_OCICreators *)desc);
242 : case GF_ODF_PL_IDX_TAG:
243 : return gf_odf_del_pl_idx((GF_PL_IDX *)desc);
244 : case GF_ODF_QOS_TAG:
245 : return gf_odf_del_qos((GF_QoS_Descriptor *)desc);
246 : case GF_ODF_RATING_TAG:
247 : return gf_odf_del_rating((GF_Rating *)desc);
248 : case GF_ODF_REG_TAG:
249 : return gf_odf_del_reg((GF_Registration *)desc);
250 : case GF_ODF_SHORT_TEXT_TAG:
251 : return gf_odf_del_short_text((GF_ShortTextual *)desc);
252 : case GF_ODF_SMPTE_TAG:
253 : return gf_odf_del_smpte_camera((GF_SMPTECamera *)desc);
254 : case GF_ODF_SCI_TAG:
255 : return gf_odf_del_sup_cid((GF_SCIDesc *)desc);
256 :
257 : case GF_ODF_IPMP_TL_TAG:
258 : return gf_odf_del_ipmp_tool_list((GF_IPMP_ToolList *)desc);
259 : case GF_ODF_IPMP_TOOL_TAG:
260 : return gf_odf_del_ipmp_tool((GF_IPMP_Tool *)desc);
261 :
262 : #endif /*GPAC_MINIMAL_ODF*/
263 :
264 7264 : default:
265 7264 : return gf_odf_del_default((GF_DefaultDescriptor *)desc);
266 : }
267 : return GF_OK;
268 : }
269 :
270 :
271 :
272 :
273 : //
274 : // READERS
275 : //
276 17444 : GF_Err gf_odf_read_descriptor(GF_BitStream *bs, GF_Descriptor *desc, u32 DescSize)
277 : {
278 17444 : switch (desc->tag) {
279 4 : case GF_ODF_IOD_TAG :
280 4 : return gf_odf_read_iod(bs, (GF_InitialObjectDescriptor *)desc, DescSize);
281 3754 : case GF_ODF_ESD_TAG :
282 3754 : return gf_odf_read_esd(bs, (GF_ESD *)desc, DescSize);
283 3752 : case GF_ODF_DCD_TAG :
284 3752 : return gf_odf_read_dcd(bs, (GF_DecoderConfig *)desc, DescSize);
285 3893 : case GF_ODF_SLC_TAG :
286 3893 : return gf_odf_read_slc(bs, (GF_SLConfig *)desc, DescSize);
287 323 : case GF_ODF_OD_TAG:
288 323 : return gf_odf_read_od(bs, (GF_ObjectDescriptor *)desc, DescSize);
289 :
290 : //MP4 File Format
291 1383 : case GF_ODF_ISOM_IOD_TAG:
292 1383 : return gf_odf_read_isom_iod(bs, (GF_IsomInitialObjectDescriptor *)desc, DescSize);
293 196 : case GF_ODF_ISOM_OD_TAG:
294 196 : return gf_odf_read_isom_od(bs, (GF_IsomObjectDescriptor *)desc, DescSize);
295 297 : case GF_ODF_ESD_INC_TAG:
296 297 : return gf_odf_read_esd_inc(bs, (GF_ES_ID_Inc *)desc, DescSize);
297 199 : case GF_ODF_ESD_REF_TAG:
298 199 : return gf_odf_read_esd_ref(bs, (GF_ES_ID_Ref *)desc, DescSize);
299 :
300 18 : case GF_ODF_SEGMENT_TAG:
301 18 : return gf_odf_read_segment(bs, (GF_Segment *) desc, DescSize);
302 0 : case GF_ODF_MUXINFO_TAG:
303 0 : GF_LOG(GF_LOG_ERROR, GF_LOG_CODING, ("[ODF] MuxInfo descriptor cannot be read, wrong serialization or conflict with other user-space OD tags\n"));
304 : return GF_NON_COMPLIANT_BITSTREAM;
305 :
306 2 : case GF_ODF_AUX_VIDEO_DATA:
307 2 : return gf_odf_read_auxvid(bs, (GF_AuxVideoDescriptor *)desc, DescSize);
308 :
309 19 : case GF_ODF_LANG_TAG:
310 : case GF_ODF_GPAC_LANG:
311 19 : return gf_odf_read_lang(bs, (GF_Language *)desc, DescSize);
312 :
313 : #ifndef GPAC_MINIMAL_ODF
314 : case GF_ODF_MEDIATIME_TAG:
315 : return gf_odf_read_mediatime(bs, (GF_MediaTime *) desc, DescSize);
316 : case GF_ODF_IPMP_TAG:
317 : return gf_odf_read_ipmp(bs, (GF_IPMP_Descriptor *)desc, DescSize);
318 : case GF_ODF_IPMP_PTR_TAG:
319 : return gf_odf_read_ipmp_ptr(bs, (GF_IPMPPtr *)desc, DescSize);
320 :
321 : case GF_ODF_CC_TAG:
322 : return gf_odf_read_cc(bs, (GF_CCDescriptor *)desc, DescSize);
323 : case GF_ODF_CC_DATE_TAG:
324 : return gf_odf_read_cc_date(bs, (GF_CC_Date *)desc, DescSize);
325 : case GF_ODF_CC_NAME_TAG:
326 : return gf_odf_read_cc_name(bs, (GF_CC_Name *)desc, DescSize);
327 : case GF_ODF_CI_TAG:
328 : return gf_odf_read_ci(bs, (GF_CIDesc *)desc, DescSize);
329 : case GF_ODF_TEXT_TAG:
330 : return gf_odf_read_exp_text(bs, (GF_ExpandedTextual *)desc, DescSize);
331 : case GF_ODF_EXT_PL_TAG:
332 : return gf_odf_read_pl_ext(bs, (GF_PLExt *)desc, DescSize);
333 : case GF_ODF_IPI_PTR_TAG:
334 : case GF_ODF_ISOM_IPI_PTR_TAG:
335 : return gf_odf_read_ipi_ptr(bs, (GF_IPIPtr *)desc, DescSize);
336 : case GF_ODF_KW_TAG:
337 : return gf_odf_read_kw(bs, (GF_KeyWord *)desc, DescSize);
338 : case GF_ODF_OCI_DATE_TAG:
339 : return gf_odf_read_oci_date(bs, (GF_OCI_Data *)desc, DescSize);
340 : case GF_ODF_OCI_NAME_TAG:
341 : return gf_odf_read_oci_name(bs, (GF_OCICreators *)desc, DescSize);
342 : case GF_ODF_PL_IDX_TAG:
343 : return gf_odf_read_pl_idx(bs, (GF_PL_IDX *)desc, DescSize);
344 : case GF_ODF_QOS_TAG:
345 : return gf_odf_read_qos(bs, (GF_QoS_Descriptor *)desc, DescSize);
346 : case GF_ODF_RATING_TAG:
347 : return gf_odf_read_rating(bs, (GF_Rating *)desc, DescSize);
348 : case GF_ODF_REG_TAG:
349 : return gf_odf_read_reg(bs, (GF_Registration *)desc, DescSize);
350 : case GF_ODF_SHORT_TEXT_TAG:
351 : return gf_odf_read_short_text(bs, (GF_ShortTextual *)desc, DescSize);
352 : case GF_ODF_SMPTE_TAG:
353 : return gf_odf_read_smpte_camera(bs, (GF_SMPTECamera *)desc, DescSize);
354 : case GF_ODF_SCI_TAG:
355 : return gf_odf_read_sup_cid(bs, (GF_SCIDesc *)desc, DescSize);
356 :
357 : case GF_ODF_IPMP_TL_TAG:
358 : return gf_odf_read_ipmp_tool_list(bs, (GF_IPMP_ToolList *)desc, DescSize);
359 : case GF_ODF_IPMP_TOOL_TAG:
360 : return gf_odf_read_ipmp_tool(bs, (GF_IPMP_Tool *)desc, DescSize);
361 :
362 : #endif /*GPAC_MINIMAL_ODF*/
363 : //default:
364 3604 : case GF_ODF_DSI_TAG:
365 : default:
366 3604 : return gf_odf_read_default(bs, (GF_DefaultDescriptor *)desc, DescSize);
367 : }
368 : return GF_OK;
369 : }
370 :
371 :
372 :
373 :
374 :
375 : //
376 : // SIZE FUNCTION
377 : //
378 44169 : GF_Err gf_odf_size_descriptor(GF_Descriptor *desc, u32 *outSize)
379 : {
380 44169 : switch(desc->tag) {
381 83 : case GF_ODF_IOD_TAG :
382 83 : return gf_odf_size_iod((GF_InitialObjectDescriptor *)desc, outSize);
383 6121 : case GF_ODF_ESD_TAG :
384 6121 : return gf_odf_size_esd((GF_ESD *)desc, outSize);
385 9753 : case GF_ODF_DCD_TAG :
386 9753 : return gf_odf_size_dcd((GF_DecoderConfig *)desc, outSize);
387 9894 : case GF_ODF_SLC_TAG :
388 9894 : return gf_odf_size_slc((GF_SLConfig *)desc, outSize);
389 :
390 535 : case GF_ODF_OD_TAG:
391 535 : return gf_odf_size_od((GF_ObjectDescriptor *)desc, outSize);
392 2999 : case GF_ODF_ISOM_IOD_TAG:
393 2999 : return gf_odf_size_isom_iod((GF_IsomInitialObjectDescriptor *)desc, outSize);
394 330 : case GF_ODF_ISOM_OD_TAG:
395 330 : return gf_odf_size_isom_od((GF_IsomObjectDescriptor *)desc, outSize);
396 775 : case GF_ODF_ESD_INC_TAG:
397 775 : return gf_odf_size_esd_inc((GF_ES_ID_Inc *)desc, outSize);
398 534 : case GF_ODF_ESD_REF_TAG:
399 534 : return gf_odf_size_esd_ref((GF_ES_ID_Ref *)desc, outSize);
400 :
401 48 : case GF_ODF_SEGMENT_TAG:
402 48 : return gf_odf_size_segment((GF_Segment *) desc, outSize);
403 156 : case GF_ODF_MUXINFO_TAG:
404 156 : return gf_odf_size_muxinfo((GF_MuxInfo *) desc, outSize);
405 :
406 8 : case GF_ODF_AUX_VIDEO_DATA:
407 8 : return gf_odf_size_auxvid((GF_AuxVideoDescriptor *)desc, outSize);
408 :
409 33 : case GF_ODF_LANG_TAG:
410 : case GF_ODF_GPAC_LANG:
411 33 : return gf_odf_size_lang((GF_Language *)desc, outSize);
412 :
413 : #ifndef GPAC_MINIMAL_ODF
414 : case GF_ODF_MEDIATIME_TAG:
415 : return gf_odf_size_mediatime((GF_MediaTime *) desc, outSize);
416 : case GF_ODF_CC_TAG:
417 : return gf_odf_size_cc((GF_CCDescriptor *)desc, outSize);
418 : case GF_ODF_CC_DATE_TAG:
419 : return gf_odf_size_cc_date((GF_CC_Date *)desc, outSize);
420 : case GF_ODF_CC_NAME_TAG:
421 : return gf_odf_size_cc_name((GF_CC_Name *)desc, outSize);
422 : case GF_ODF_CI_TAG:
423 : return gf_odf_size_ci((GF_CIDesc *)desc, outSize);
424 : case GF_ODF_TEXT_TAG:
425 : return gf_odf_size_exp_text((GF_ExpandedTextual *)desc, outSize);
426 : case GF_ODF_EXT_PL_TAG:
427 : return gf_odf_size_pl_ext((GF_PLExt *)desc, outSize);
428 : case GF_ODF_IPI_PTR_TAG:
429 : case GF_ODF_ISOM_IPI_PTR_TAG:
430 : return gf_odf_size_ipi_ptr((GF_IPIPtr *)desc, outSize);
431 : case GF_ODF_IPMP_TAG:
432 : return gf_odf_size_ipmp((GF_IPMP_Descriptor *)desc, outSize);
433 : case GF_ODF_IPMP_PTR_TAG:
434 : return gf_odf_size_ipmp_ptr((GF_IPMPPtr *)desc, outSize);
435 : case GF_ODF_KW_TAG:
436 : return gf_odf_size_kw((GF_KeyWord *)desc, outSize);
437 : case GF_ODF_OCI_DATE_TAG:
438 : return gf_odf_size_oci_date((GF_OCI_Data *)desc, outSize);
439 : case GF_ODF_OCI_NAME_TAG:
440 : return gf_odf_size_oci_name((GF_OCICreators *)desc, outSize);
441 : case GF_ODF_PL_IDX_TAG:
442 : return gf_odf_size_pl_idx((GF_PL_IDX *)desc, outSize);
443 : case GF_ODF_QOS_TAG:
444 : return gf_odf_size_qos((GF_QoS_Descriptor *)desc, outSize);
445 : case GF_ODF_RATING_TAG:
446 : return gf_odf_size_rating((GF_Rating *)desc, outSize);
447 : case GF_ODF_REG_TAG:
448 : return gf_odf_size_reg((GF_Registration *)desc, outSize);
449 : case GF_ODF_SHORT_TEXT_TAG:
450 : return gf_odf_size_short_text((GF_ShortTextual *)desc, outSize);
451 : case GF_ODF_SMPTE_TAG:
452 : return gf_odf_size_smpte_camera((GF_SMPTECamera *)desc, outSize);
453 : case GF_ODF_SCI_TAG:
454 : return gf_odf_size_sup_cid((GF_SCIDesc *)desc, outSize);
455 :
456 :
457 : case GF_ODF_IPMP_TL_TAG:
458 : return gf_odf_size_ipmp_tool_list((GF_IPMP_ToolList *)desc, outSize);
459 : case GF_ODF_IPMP_TOOL_TAG:
460 : return gf_odf_size_ipmp_tool((GF_IPMP_Tool *)desc, outSize);
461 :
462 : #endif /*GPAC_MINIMAL_ODF*/
463 12900 : default:
464 : /*don't write out l descriptors*/
465 12900 : if ((desc->tag>=GF_ODF_MUXINFO_TAG) && (desc->tag<=GF_ODF_LASER_CFG_TAG)) {
466 0 : *outSize = 0;
467 0 : return GF_OK;
468 : }
469 12900 : return gf_odf_size_default((GF_DefaultDescriptor *)desc, outSize);
470 : }
471 : return GF_OK;
472 : }
473 :
474 :
475 : //
476 : // WRITERS
477 : //
478 : GF_EXPORT
479 16899 : GF_Err gf_odf_write_descriptor(GF_BitStream *bs, GF_Descriptor *desc)
480 : {
481 16899 : switch(desc->tag) {
482 9 : case GF_ODF_IOD_TAG :
483 9 : return gf_odf_write_iod(bs, (GF_InitialObjectDescriptor *)desc);
484 3639 : case GF_ODF_ESD_TAG :
485 3639 : return gf_odf_write_esd(bs, (GF_ESD *)desc);
486 3637 : case GF_ODF_DCD_TAG :
487 3637 : return gf_odf_write_dcd(bs, (GF_DecoderConfig *)desc);
488 3778 : case GF_ODF_SLC_TAG :
489 3778 : return gf_odf_write_slc(bs, (GF_SLConfig *)desc);
490 284 : case GF_ODF_ESD_INC_TAG:
491 284 : return gf_odf_write_esd_inc(bs, (GF_ES_ID_Inc *)desc);
492 211 : case GF_ODF_ESD_REF_TAG:
493 211 : return gf_odf_write_esd_ref(bs, (GF_ES_ID_Ref *)desc);
494 :
495 :
496 1204 : case GF_ODF_ISOM_IOD_TAG:
497 1204 : return gf_odf_write_isom_iod(bs, (GF_IsomInitialObjectDescriptor *)desc);
498 213 : case GF_ODF_ISOM_OD_TAG:
499 213 : return gf_odf_write_isom_od(bs, (GF_IsomObjectDescriptor *)desc);
500 335 : case GF_ODF_OD_TAG:
501 335 : return gf_odf_write_od(bs, (GF_ObjectDescriptor *)desc);
502 18 : case GF_ODF_SEGMENT_TAG:
503 18 : return gf_odf_write_segment(bs, (GF_Segment *) desc);
504 55 : case GF_ODF_MUXINFO_TAG:
505 55 : return gf_odf_write_muxinfo(bs, (GF_MuxInfo *) desc);
506 :
507 2 : case GF_ODF_AUX_VIDEO_DATA:
508 2 : return gf_odf_write_auxvid(bs, (GF_AuxVideoDescriptor *)desc);
509 :
510 15 : case GF_ODF_LANG_TAG:
511 : case GF_ODF_GPAC_LANG:
512 15 : return gf_odf_write_lang(bs, (GF_Language *)desc);
513 :
514 : #ifndef GPAC_MINIMAL_ODF
515 : case GF_ODF_MEDIATIME_TAG:
516 : return gf_odf_write_mediatime(bs, (GF_MediaTime *) desc);
517 : case GF_ODF_CC_TAG:
518 : return gf_odf_write_cc(bs, (GF_CCDescriptor *)desc);
519 : case GF_ODF_CC_DATE_TAG:
520 : return gf_odf_write_cc_date(bs, (GF_CC_Date *)desc);
521 : case GF_ODF_CC_NAME_TAG:
522 : return gf_odf_write_cc_name(bs, (GF_CC_Name *)desc);
523 : case GF_ODF_CI_TAG:
524 : return gf_odf_write_ci(bs, (GF_CIDesc *)desc);
525 :
526 : case GF_ODF_TEXT_TAG:
527 : return gf_odf_write_exp_text(bs, (GF_ExpandedTextual *)desc);
528 : case GF_ODF_EXT_PL_TAG:
529 : return gf_odf_write_pl_ext(bs, (GF_PLExt *)desc);
530 : case GF_ODF_IPI_PTR_TAG:
531 : case GF_ODF_ISOM_IPI_PTR_TAG:
532 : return gf_odf_write_ipi_ptr(bs, (GF_IPIPtr *)desc);
533 : case GF_ODF_IPMP_TAG:
534 : return gf_odf_write_ipmp(bs, (GF_IPMP_Descriptor *)desc);
535 : case GF_ODF_IPMP_PTR_TAG:
536 : return gf_odf_write_ipmp_ptr(bs, (GF_IPMPPtr *)desc);
537 : case GF_ODF_KW_TAG:
538 : return gf_odf_write_kw(bs, (GF_KeyWord *)desc);
539 : case GF_ODF_OCI_DATE_TAG:
540 : return gf_odf_write_oci_date(bs, (GF_OCI_Data *)desc);
541 : case GF_ODF_OCI_NAME_TAG:
542 : return gf_odf_write_oci_name(bs, (GF_OCICreators *)desc);
543 : case GF_ODF_PL_IDX_TAG:
544 : return gf_odf_write_pl_idx(bs, (GF_PL_IDX *)desc);
545 : case GF_ODF_QOS_TAG:
546 : return gf_odf_write_qos(bs, (GF_QoS_Descriptor *)desc);
547 : case GF_ODF_RATING_TAG:
548 : return gf_odf_write_rating(bs, (GF_Rating *)desc);
549 : case GF_ODF_REG_TAG:
550 : return gf_odf_write_reg(bs, (GF_Registration *)desc);
551 : case GF_ODF_SHORT_TEXT_TAG:
552 : return gf_odf_write_short_text(bs, (GF_ShortTextual *)desc);
553 : case GF_ODF_SMPTE_TAG:
554 : return gf_odf_write_smpte_camera(bs, (GF_SMPTECamera *)desc);
555 : case GF_ODF_SCI_TAG:
556 : return gf_odf_write_sup_cid(bs, (GF_SCIDesc *)desc);
557 :
558 : case GF_ODF_IPMP_TL_TAG:
559 : return gf_odf_write_ipmp_tool_list(bs, (GF_IPMP_ToolList *)desc);
560 : case GF_ODF_IPMP_TOOL_TAG:
561 : return gf_odf_write_ipmp_tool(bs, (GF_IPMP_Tool *)desc);
562 : #endif /*GPAC_MINIMAL_ODF*/
563 3499 : default:
564 : /*don't write out internal descriptors*/
565 3499 : if ((desc->tag>=GF_ODF_MUXINFO_TAG) && (desc->tag<=GF_ODF_LASER_CFG_TAG))
566 : return GF_OK;
567 3499 : return gf_odf_write_default(bs, (GF_DefaultDescriptor *)desc);
568 : }
569 : return GF_OK;
570 : }
571 :
572 : //
573 : // CONSTRUCTORS
574 : //
575 603 : GF_ODCom *gf_odf_create_command(u8 tag)
576 : {
577 : GF_ODCom *com;
578 603 : switch (tag) {
579 432 : case GF_ODF_OD_UPDATE_TAG:
580 432 : return gf_odf_new_od_update();
581 58 : case GF_ODF_OD_REMOVE_TAG:
582 58 : return gf_odf_new_od_remove();
583 28 : case GF_ODF_ESD_UPDATE_TAG:
584 28 : return gf_odf_new_esd_update();
585 67 : case GF_ODF_ESD_REMOVE_TAG:
586 67 : return gf_odf_new_esd_remove();
587 : //special case for ESDRemove in the file format...
588 18 : case GF_ODF_ESD_REMOVE_REF_TAG:
589 18 : com = gf_odf_new_esd_remove();
590 18 : if (!com) return com;
591 18 : com->tag = GF_ODF_ESD_REMOVE_REF_TAG;
592 18 : return com;
593 :
594 : #ifndef GPAC_MINIMAL_ODF
595 : case GF_ODF_IPMP_UPDATE_TAG:
596 : return gf_odf_new_ipmp_update();
597 : case GF_ODF_IPMP_REMOVE_TAG:
598 : return gf_odf_new_ipmp_remove();
599 :
600 : default:
601 : if ( (tag >= GF_ODF_COM_ISO_BEGIN_TAG) &&
602 : ( tag <= GF_ODF_COM_ISO_END_TAG) ) {
603 : return NULL;
604 : }
605 : com = gf_odf_new_base_command();
606 : if (!com) return com;
607 : com->tag = tag;
608 : return com;
609 : #else
610 : default:
611 : return NULL;
612 : #endif
613 : }
614 : }
615 :
616 :
617 : //
618 : // DESTRUCTORS
619 : //
620 603 : GF_Err gf_odf_delete_command(GF_ODCom *com)
621 : {
622 603 : switch (com->tag) {
623 432 : case GF_ODF_OD_UPDATE_TAG:
624 432 : return gf_odf_del_od_update((GF_ODUpdate *)com);
625 58 : case GF_ODF_OD_REMOVE_TAG:
626 58 : return gf_odf_del_od_remove((GF_ODRemove *)com);
627 :
628 28 : case GF_ODF_ESD_UPDATE_TAG:
629 28 : return gf_odf_del_esd_update((GF_ESDUpdate *)com);
630 85 : case GF_ODF_ESD_REMOVE_TAG:
631 : case GF_ODF_ESD_REMOVE_REF_TAG:
632 85 : return gf_odf_del_esd_remove((GF_ESDRemove *)com);
633 : #ifndef GPAC_MINIMAL_ODF
634 : case GF_ODF_IPMP_UPDATE_TAG:
635 : return gf_odf_del_ipmp_update((GF_IPMPUpdate *)com);
636 : case GF_ODF_IPMP_REMOVE_TAG:
637 : return gf_odf_del_ipmp_remove((GF_IPMPRemove *)com);
638 :
639 : default:
640 : return gf_odf_del_base_command((GF_BaseODCom *)com);
641 : #else
642 : default:
643 : return GF_NOT_SUPPORTED;
644 : #endif
645 :
646 : }
647 : }
648 :
649 :
650 : //
651 : // READERS
652 : //
653 249 : GF_Err gf_odf_read_command(GF_BitStream *bs, GF_ODCom *com, u32 gf_odf_size_command)
654 : {
655 249 : switch (com->tag) {
656 151 : case GF_ODF_OD_UPDATE_TAG:
657 151 : return gf_odf_read_od_update(bs, (GF_ODUpdate *)com, gf_odf_size_command);
658 42 : case GF_ODF_OD_REMOVE_TAG:
659 42 : return gf_odf_read_od_remove(bs, (GF_ODRemove *)com, gf_odf_size_command);
660 14 : case GF_ODF_ESD_UPDATE_TAG:
661 14 : return gf_odf_read_esd_update(bs, (GF_ESDUpdate *)com, gf_odf_size_command);
662 42 : case GF_ODF_ESD_REMOVE_TAG:
663 : case GF_ODF_ESD_REMOVE_REF_TAG:
664 42 : return gf_odf_read_esd_remove(bs, (GF_ESDRemove *)com, gf_odf_size_command);
665 : #ifndef GPAC_MINIMAL_ODF
666 : case GF_ODF_IPMP_UPDATE_TAG:
667 : return gf_odf_read_ipmp_update(bs, (GF_IPMPUpdate *)com, gf_odf_size_command);
668 : case GF_ODF_IPMP_REMOVE_TAG:
669 : return gf_odf_read_ipmp_remove(bs, (GF_IPMPRemove *)com, gf_odf_size_command);
670 : default:
671 : return gf_odf_read_base_command(bs, (GF_BaseODCom *)com, gf_odf_size_command);
672 : #else
673 : default:
674 : return GF_NOT_SUPPORTED;
675 : #endif
676 :
677 : }
678 : }
679 :
680 :
681 :
682 : //
683 : // WRITERS
684 : //
685 238 : GF_Err gf_odf_write_command(GF_BitStream *bs, GF_ODCom *com)
686 : {
687 238 : switch (com->tag) {
688 154 : case GF_ODF_OD_UPDATE_TAG:
689 154 : return gf_odf_write_od_update(bs, (GF_ODUpdate *)com);
690 36 : case GF_ODF_OD_REMOVE_TAG:
691 36 : return gf_odf_write_od_remove(bs, (GF_ODRemove *)com);
692 :
693 12 : case GF_ODF_ESD_UPDATE_TAG:
694 12 : return gf_odf_write_esd_update(bs, (GF_ESDUpdate *)com);
695 36 : case GF_ODF_ESD_REMOVE_TAG:
696 : case GF_ODF_ESD_REMOVE_REF_TAG:
697 36 : return gf_odf_write_esd_remove(bs, (GF_ESDRemove *)com);
698 : #ifndef GPAC_MINIMAL_ODF
699 : case GF_ODF_IPMP_UPDATE_TAG:
700 : return gf_odf_write_ipmp_update(bs, (GF_IPMPUpdate *)com);
701 : case GF_ODF_IPMP_REMOVE_TAG:
702 : return gf_odf_write_ipmp_remove(bs, (GF_IPMPRemove *)com);
703 :
704 : default:
705 : return gf_odf_write_base_command(bs, (GF_BaseODCom *)com);
706 : #else
707 : default:
708 : return GF_NOT_SUPPORTED;
709 : #endif
710 : }
711 : }
|