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 //
gf_odf_create_descriptor(u8 tag)32 GF_Descriptor *gf_odf_create_descriptor(u8 tag)
33 {
34 GF_Descriptor *desc;
35
36 switch (tag) {
37 case GF_ODF_IOD_TAG:
38 return gf_odf_new_iod();
39 case GF_ODF_OD_TAG:
40 return gf_odf_new_od();
41 case GF_ODF_ESD_TAG:
42 return gf_odf_new_esd();
43 case GF_ODF_DCD_TAG:
44 return gf_odf_new_dcd();
45 case GF_ODF_SLC_TAG:
46 //default : we create it without any predefinition...
47 return gf_odf_new_slc(0);
48 case GF_ODF_MUXINFO_TAG:
49 return gf_odf_new_muxinfo();
50 case GF_ODF_BIFS_CFG_TAG:
51 return gf_odf_new_bifs_cfg();
52 case GF_ODF_UI_CFG_TAG:
53 return gf_odf_new_ui_cfg();
54 case GF_ODF_TEXT_CFG_TAG:
55 return gf_odf_new_text_cfg();
56 case GF_ODF_TX3G_TAG:
57 return gf_odf_new_tx3g();
58 case GF_ODF_ELEM_MASK_TAG:
59 return gf_odf_New_ElemMask();
60 case GF_ODF_LASER_CFG_TAG:
61 return gf_odf_new_laser_cfg();
62
63 case GF_ODF_DSI_TAG:
64 desc = gf_odf_new_default();
65 if (!desc) return desc;
66 desc->tag = GF_ODF_DSI_TAG;
67 return desc;
68
69 case GF_ODF_AUX_VIDEO_DATA:
70 return gf_odf_new_auxvid();
71
72 case GF_ODF_SEGMENT_TAG:
73 return gf_odf_new_segment();
74
75 //File Format Specific
76 case GF_ODF_ISOM_IOD_TAG:
77 return gf_odf_new_isom_iod();
78 case GF_ODF_ISOM_OD_TAG:
79 return gf_odf_new_isom_od();
80 case GF_ODF_ESD_INC_TAG:
81 return gf_odf_new_esd_inc();
82 case GF_ODF_ESD_REF_TAG:
83 return gf_odf_new_esd_ref();
84 case GF_ODF_LANG_TAG:
85 return gf_odf_new_lang();
86 case GF_ODF_GPAC_LANG:
87 desc = gf_odf_new_lang();
88 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 default:
150 //ISO Reserved
151 if ( (tag >= GF_ODF_ISO_RES_BEGIN_TAG) &&
152 (tag <= GF_ODF_ISO_RES_END_TAG) ) {
153 return NULL;
154 }
155 desc = gf_odf_new_default();
156 if (!desc) return desc;
157 desc->tag = tag;
158 return desc;
159 }
160 }
161
162 //
163 // DESTRUCTORS
164 //
gf_odf_delete_descriptor(GF_Descriptor * desc)165 GF_Err gf_odf_delete_descriptor(GF_Descriptor *desc)
166 {
167 switch (desc->tag) {
168 case GF_ODF_IOD_TAG :
169 return gf_odf_del_iod((GF_InitialObjectDescriptor *)desc);
170 case GF_ODF_OD_TAG:
171 return gf_odf_del_od((GF_ObjectDescriptor *)desc);
172 case GF_ODF_ESD_TAG :
173 return gf_odf_del_esd((GF_ESD *)desc);
174 case GF_ODF_DCD_TAG :
175 return gf_odf_del_dcd((GF_DecoderConfig *)desc);
176 case GF_ODF_SLC_TAG:
177 return gf_odf_del_slc((GF_SLConfig *)desc);
178
179 case GF_ODF_ISOM_IOD_TAG:
180 return gf_odf_del_isom_iod((GF_IsomInitialObjectDescriptor *)desc);
181 case GF_ODF_ISOM_OD_TAG:
182 return gf_odf_del_isom_od((GF_IsomObjectDescriptor *)desc);
183
184 case GF_ODF_SEGMENT_TAG:
185 return gf_odf_del_segment((GF_Segment *) desc);
186
187 case GF_ODF_MUXINFO_TAG:
188 return gf_odf_del_muxinfo((GF_MuxInfo *)desc);
189 case GF_ODF_BIFS_CFG_TAG:
190 return gf_odf_del_bifs_cfg((GF_BIFSConfig *)desc);
191 case GF_ODF_UI_CFG_TAG:
192 return gf_odf_del_ui_cfg((GF_UIConfig *)desc);
193 case GF_ODF_TEXT_CFG_TAG:
194 return gf_odf_del_text_cfg((GF_TextConfig *)desc);
195 case GF_ODF_TX3G_TAG:
196 return gf_odf_del_tx3g((GF_TextSampleDescriptor*)desc);
197 case GF_ODF_ELEM_MASK_TAG:
198 return gf_odf_del_ElemMask((GF_ElementaryMask*)desc);
199 case GF_ODF_LASER_CFG_TAG:
200 return gf_odf_del_laser_cfg((GF_LASERConfig *)desc);
201
202 case GF_ODF_AUX_VIDEO_DATA:
203 return gf_odf_del_auxvid((GF_AuxVideoDescriptor *)desc);
204
205 case GF_ODF_LANG_TAG:
206 case GF_ODF_GPAC_LANG:
207 return gf_odf_del_lang((GF_Language *)desc);
208
209 case GF_ODF_ESD_INC_TAG:
210 return gf_odf_del_esd_inc((GF_ES_ID_Inc *)desc);
211 case GF_ODF_ESD_REF_TAG:
212 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 default:
265 return gf_odf_del_default((GF_DefaultDescriptor *)desc);
266 }
267 return GF_OK;
268 }
269
270
271
272
273 //
274 // READERS
275 //
gf_odf_read_descriptor(GF_BitStream * bs,GF_Descriptor * desc,u32 DescSize)276 GF_Err gf_odf_read_descriptor(GF_BitStream *bs, GF_Descriptor *desc, u32 DescSize)
277 {
278 switch (desc->tag) {
279 case GF_ODF_IOD_TAG :
280 return gf_odf_read_iod(bs, (GF_InitialObjectDescriptor *)desc, DescSize);
281 case GF_ODF_ESD_TAG :
282 return gf_odf_read_esd(bs, (GF_ESD *)desc, DescSize);
283 case GF_ODF_DCD_TAG :
284 return gf_odf_read_dcd(bs, (GF_DecoderConfig *)desc, DescSize);
285 case GF_ODF_SLC_TAG :
286 return gf_odf_read_slc(bs, (GF_SLConfig *)desc, DescSize);
287 case GF_ODF_OD_TAG:
288 return gf_odf_read_od(bs, (GF_ObjectDescriptor *)desc, DescSize);
289
290 //MP4 File Format
291 case GF_ODF_ISOM_IOD_TAG:
292 return gf_odf_read_isom_iod(bs, (GF_IsomInitialObjectDescriptor *)desc, DescSize);
293 case GF_ODF_ISOM_OD_TAG:
294 return gf_odf_read_isom_od(bs, (GF_IsomObjectDescriptor *)desc, DescSize);
295 case GF_ODF_ESD_INC_TAG:
296 return gf_odf_read_esd_inc(bs, (GF_ES_ID_Inc *)desc, DescSize);
297 case GF_ODF_ESD_REF_TAG:
298 return gf_odf_read_esd_ref(bs, (GF_ES_ID_Ref *)desc, DescSize);
299
300 case GF_ODF_SEGMENT_TAG:
301 return gf_odf_read_segment(bs, (GF_Segment *) desc, DescSize);
302 case GF_ODF_MUXINFO_TAG:
303 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 case GF_ODF_AUX_VIDEO_DATA:
307 return gf_odf_read_auxvid(bs, (GF_AuxVideoDescriptor *)desc, DescSize);
308
309 case GF_ODF_LANG_TAG:
310 case GF_ODF_GPAC_LANG:
311 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 case GF_ODF_DSI_TAG:
365 default:
366 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 //
gf_odf_size_descriptor(GF_Descriptor * desc,u32 * outSize)378 GF_Err gf_odf_size_descriptor(GF_Descriptor *desc, u32 *outSize)
379 {
380 switch(desc->tag) {
381 case GF_ODF_IOD_TAG :
382 return gf_odf_size_iod((GF_InitialObjectDescriptor *)desc, outSize);
383 case GF_ODF_ESD_TAG :
384 return gf_odf_size_esd((GF_ESD *)desc, outSize);
385 case GF_ODF_DCD_TAG :
386 return gf_odf_size_dcd((GF_DecoderConfig *)desc, outSize);
387 case GF_ODF_SLC_TAG :
388 return gf_odf_size_slc((GF_SLConfig *)desc, outSize);
389
390 case GF_ODF_OD_TAG:
391 return gf_odf_size_od((GF_ObjectDescriptor *)desc, outSize);
392 case GF_ODF_ISOM_IOD_TAG:
393 return gf_odf_size_isom_iod((GF_IsomInitialObjectDescriptor *)desc, outSize);
394 case GF_ODF_ISOM_OD_TAG:
395 return gf_odf_size_isom_od((GF_IsomObjectDescriptor *)desc, outSize);
396 case GF_ODF_ESD_INC_TAG:
397 return gf_odf_size_esd_inc((GF_ES_ID_Inc *)desc, outSize);
398 case GF_ODF_ESD_REF_TAG:
399 return gf_odf_size_esd_ref((GF_ES_ID_Ref *)desc, outSize);
400
401 case GF_ODF_SEGMENT_TAG:
402 return gf_odf_size_segment((GF_Segment *) desc, outSize);
403 case GF_ODF_MUXINFO_TAG:
404 return gf_odf_size_muxinfo((GF_MuxInfo *) desc, outSize);
405
406 case GF_ODF_AUX_VIDEO_DATA:
407 return gf_odf_size_auxvid((GF_AuxVideoDescriptor *)desc, outSize);
408
409 case GF_ODF_LANG_TAG:
410 case GF_ODF_GPAC_LANG:
411 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 default:
464 /*don't write out l descriptors*/
465 if ((desc->tag>=GF_ODF_MUXINFO_TAG) && (desc->tag<=GF_ODF_LASER_CFG_TAG)) {
466 *outSize = 0;
467 return GF_OK;
468 }
469 return gf_odf_size_default((GF_DefaultDescriptor *)desc, outSize);
470 }
471 return GF_OK;
472 }
473
474
475 //
476 // WRITERS
477 //
478 GF_EXPORT
gf_odf_write_descriptor(GF_BitStream * bs,GF_Descriptor * desc)479 GF_Err gf_odf_write_descriptor(GF_BitStream *bs, GF_Descriptor *desc)
480 {
481 switch(desc->tag) {
482 case GF_ODF_IOD_TAG :
483 return gf_odf_write_iod(bs, (GF_InitialObjectDescriptor *)desc);
484 case GF_ODF_ESD_TAG :
485 return gf_odf_write_esd(bs, (GF_ESD *)desc);
486 case GF_ODF_DCD_TAG :
487 return gf_odf_write_dcd(bs, (GF_DecoderConfig *)desc);
488 case GF_ODF_SLC_TAG :
489 return gf_odf_write_slc(bs, (GF_SLConfig *)desc);
490 case GF_ODF_ESD_INC_TAG:
491 return gf_odf_write_esd_inc(bs, (GF_ES_ID_Inc *)desc);
492 case GF_ODF_ESD_REF_TAG:
493 return gf_odf_write_esd_ref(bs, (GF_ES_ID_Ref *)desc);
494
495
496 case GF_ODF_ISOM_IOD_TAG:
497 return gf_odf_write_isom_iod(bs, (GF_IsomInitialObjectDescriptor *)desc);
498 case GF_ODF_ISOM_OD_TAG:
499 return gf_odf_write_isom_od(bs, (GF_IsomObjectDescriptor *)desc);
500 case GF_ODF_OD_TAG:
501 return gf_odf_write_od(bs, (GF_ObjectDescriptor *)desc);
502 case GF_ODF_SEGMENT_TAG:
503 return gf_odf_write_segment(bs, (GF_Segment *) desc);
504 case GF_ODF_MUXINFO_TAG:
505 return gf_odf_write_muxinfo(bs, (GF_MuxInfo *) desc);
506
507 case GF_ODF_AUX_VIDEO_DATA:
508 return gf_odf_write_auxvid(bs, (GF_AuxVideoDescriptor *)desc);
509
510 case GF_ODF_LANG_TAG:
511 case GF_ODF_GPAC_LANG:
512 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 default:
564 /*don't write out internal descriptors*/
565 if ((desc->tag>=GF_ODF_MUXINFO_TAG) && (desc->tag<=GF_ODF_LASER_CFG_TAG))
566 return GF_OK;
567 return gf_odf_write_default(bs, (GF_DefaultDescriptor *)desc);
568 }
569 return GF_OK;
570 }
571
572 //
573 // CONSTRUCTORS
574 //
gf_odf_create_command(u8 tag)575 GF_ODCom *gf_odf_create_command(u8 tag)
576 {
577 GF_ODCom *com;
578 switch (tag) {
579 case GF_ODF_OD_UPDATE_TAG:
580 return gf_odf_new_od_update();
581 case GF_ODF_OD_REMOVE_TAG:
582 return gf_odf_new_od_remove();
583 case GF_ODF_ESD_UPDATE_TAG:
584 return gf_odf_new_esd_update();
585 case GF_ODF_ESD_REMOVE_TAG:
586 return gf_odf_new_esd_remove();
587 //special case for ESDRemove in the file format...
588 case GF_ODF_ESD_REMOVE_REF_TAG:
589 com = gf_odf_new_esd_remove();
590 if (!com) return com;
591 com->tag = GF_ODF_ESD_REMOVE_REF_TAG;
592 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 //
gf_odf_delete_command(GF_ODCom * com)620 GF_Err gf_odf_delete_command(GF_ODCom *com)
621 {
622 switch (com->tag) {
623 case GF_ODF_OD_UPDATE_TAG:
624 return gf_odf_del_od_update((GF_ODUpdate *)com);
625 case GF_ODF_OD_REMOVE_TAG:
626 return gf_odf_del_od_remove((GF_ODRemove *)com);
627
628 case GF_ODF_ESD_UPDATE_TAG:
629 return gf_odf_del_esd_update((GF_ESDUpdate *)com);
630 case GF_ODF_ESD_REMOVE_TAG:
631 case GF_ODF_ESD_REMOVE_REF_TAG:
632 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 //
gf_odf_read_command(GF_BitStream * bs,GF_ODCom * com,u32 gf_odf_size_command)653 GF_Err gf_odf_read_command(GF_BitStream *bs, GF_ODCom *com, u32 gf_odf_size_command)
654 {
655 switch (com->tag) {
656 case GF_ODF_OD_UPDATE_TAG:
657 return gf_odf_read_od_update(bs, (GF_ODUpdate *)com, gf_odf_size_command);
658 case GF_ODF_OD_REMOVE_TAG:
659 return gf_odf_read_od_remove(bs, (GF_ODRemove *)com, gf_odf_size_command);
660 case GF_ODF_ESD_UPDATE_TAG:
661 return gf_odf_read_esd_update(bs, (GF_ESDUpdate *)com, gf_odf_size_command);
662 case GF_ODF_ESD_REMOVE_TAG:
663 case GF_ODF_ESD_REMOVE_REF_TAG:
664 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 //
gf_odf_write_command(GF_BitStream * bs,GF_ODCom * com)685 GF_Err gf_odf_write_command(GF_BitStream *bs, GF_ODCom *com)
686 {
687 switch (com->tag) {
688 case GF_ODF_OD_UPDATE_TAG:
689 return gf_odf_write_od_update(bs, (GF_ODUpdate *)com);
690 case GF_ODF_OD_REMOVE_TAG:
691 return gf_odf_write_od_remove(bs, (GF_ODRemove *)com);
692
693 case GF_ODF_ESD_UPDATE_TAG:
694 return gf_odf_write_esd_update(bs, (GF_ESDUpdate *)com);
695 case GF_ODF_ESD_REMOVE_TAG:
696 case GF_ODF_ESD_REMOVE_REF_TAG:
697 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 }
712