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 case GF_ODF_MEDIATIME_TAG:
75 return gf_odf_new_mediatime();
76
77 //File Format Specific
78 case GF_ODF_ISOM_IOD_TAG:
79 return gf_odf_new_isom_iod();
80 case GF_ODF_ISOM_OD_TAG:
81 return gf_odf_new_isom_od();
82 case GF_ODF_ESD_INC_TAG:
83 return gf_odf_new_esd_inc();
84 case GF_ODF_ESD_REF_TAG:
85 return gf_odf_new_esd_ref();
86 case GF_ODF_LANG_TAG:
87 return gf_odf_new_lang();
88
89 #ifndef GPAC_MINIMAL_ODF
90
91 case GF_ODF_CI_TAG:
92 return gf_odf_new_ci();
93 case GF_ODF_SCI_TAG:
94 return gf_odf_new_sup_cid();
95 case GF_ODF_IPI_PTR_TAG:
96 return gf_odf_new_ipi_ptr();
97 //special case for the file format
98 case GF_ODF_ISOM_IPI_PTR_TAG:
99 desc = gf_odf_new_ipi_ptr();
100 if (!desc) return desc;
101 desc->tag = GF_ODF_ISOM_IPI_PTR_TAG;
102 return desc;
103
104 case GF_ODF_IPMP_PTR_TAG:
105 return gf_odf_new_ipmp_ptr();
106 case GF_ODF_IPMP_TAG:
107 return gf_odf_new_ipmp();
108 case GF_ODF_QOS_TAG:
109 return gf_odf_new_qos();
110 case GF_ODF_REG_TAG:
111 return gf_odf_new_reg();
112 case GF_ODF_CC_TAG:
113 return gf_odf_new_cc();
114 case GF_ODF_KW_TAG:
115 return gf_odf_new_kw();
116 case GF_ODF_RATING_TAG:
117 return gf_odf_new_rating();
118 case GF_ODF_SHORT_TEXT_TAG:
119 return gf_odf_new_short_text();
120 case GF_ODF_TEXT_TAG:
121 return gf_odf_new_exp_text();
122 case GF_ODF_CC_NAME_TAG:
123 return gf_odf_new_cc_name();
124 case GF_ODF_CC_DATE_TAG:
125 return gf_odf_new_cc_date();
126 case GF_ODF_OCI_NAME_TAG:
127 return gf_odf_new_oci_name();
128 case GF_ODF_OCI_DATE_TAG:
129 return gf_odf_new_oci_date();
130 case GF_ODF_SMPTE_TAG:
131 return gf_odf_new_smpte_camera();
132 case GF_ODF_EXT_PL_TAG:
133 return gf_odf_new_pl_ext();
134 case GF_ODF_PL_IDX_TAG:
135 return gf_odf_new_pl_idx();
136
137 case GF_ODF_IPMP_TL_TAG:
138 return gf_odf_new_ipmp_tool_list();
139 case GF_ODF_IPMP_TOOL_TAG:
140 return gf_odf_new_ipmp_tool();
141
142 case 0:
143 case 0xFF:
144 return NULL;
145 #endif /*GPAC_MINIMAL_ODF*/
146 default:
147 //ISO Reserved
148 if ((tag >= GF_ODF_ISO_RES_BEGIN_TAG) &&
149 (tag <= GF_ODF_ISO_RES_END_TAG)) {
150 return NULL;
151 }
152 desc = gf_odf_new_default();
153 if (!desc) return desc;
154 desc->tag = tag;
155 return desc;
156 }
157 }
158
159 //
160 // DESTRUCTORS
161 //
gf_odf_delete_descriptor(GF_Descriptor * desc)162 GF_Err gf_odf_delete_descriptor(GF_Descriptor *desc)
163 {
164 switch (desc->tag) {
165 case GF_ODF_IOD_TAG:
166 return gf_odf_del_iod((GF_InitialObjectDescriptor *)desc);
167 case GF_ODF_OD_TAG:
168 return gf_odf_del_od((GF_ObjectDescriptor *)desc);
169 case GF_ODF_ESD_TAG:
170 return gf_odf_del_esd((GF_ESD *)desc);
171 case GF_ODF_DCD_TAG:
172 return gf_odf_del_dcd((GF_DecoderConfig *)desc);
173 case GF_ODF_SLC_TAG:
174 return gf_odf_del_slc((GF_SLConfig *)desc);
175
176 case GF_ODF_ISOM_IOD_TAG:
177 return gf_odf_del_isom_iod((GF_IsomInitialObjectDescriptor *)desc);
178 case GF_ODF_ISOM_OD_TAG:
179 return gf_odf_del_isom_od((GF_IsomObjectDescriptor *)desc);
180
181 case GF_ODF_SEGMENT_TAG:
182 return gf_odf_del_segment((GF_Segment *)desc);
183 case GF_ODF_MEDIATIME_TAG:
184 return gf_odf_del_mediatime((GF_MediaTime *)desc);
185
186 case GF_ODF_MUXINFO_TAG:
187 return gf_odf_del_muxinfo((GF_MuxInfo *)desc);
188 case GF_ODF_BIFS_CFG_TAG:
189 return gf_odf_del_bifs_cfg((GF_BIFSConfig *)desc);
190 case GF_ODF_UI_CFG_TAG:
191 return gf_odf_del_ui_cfg((GF_UIConfig *)desc);
192 case GF_ODF_TEXT_CFG_TAG:
193 return gf_odf_del_text_cfg((GF_TextConfig *)desc);
194 case GF_ODF_TX3G_TAG:
195 return gf_odf_del_tx3g((GF_TextSampleDescriptor*)desc);
196 case GF_ODF_LASER_CFG_TAG:
197 return gf_odf_del_laser_cfg((GF_LASERConfig *)desc);
198
199 case GF_ODF_AUX_VIDEO_DATA:
200 return gf_odf_del_auxvid((GF_AuxVideoDescriptor *)desc);
201
202 case GF_ODF_LANG_TAG:
203 return gf_odf_del_lang((GF_Language *)desc);
204
205 case GF_ODF_ESD_INC_TAG:
206 return gf_odf_del_esd_inc((GF_ES_ID_Inc *)desc);
207 case GF_ODF_ESD_REF_TAG:
208 return gf_odf_del_esd_ref((GF_ES_ID_Ref *)desc);
209
210 #ifndef GPAC_MINIMAL_ODF
211
212 case GF_ODF_CC_TAG:
213 return gf_odf_del_cc((GF_CCDescriptor *)desc);
214 case GF_ODF_CC_DATE_TAG:
215 return gf_odf_del_cc_date((GF_CC_Date *)desc);
216 case GF_ODF_CC_NAME_TAG:
217 return gf_odf_del_cc_name((GF_CC_Name *)desc);
218 case GF_ODF_CI_TAG:
219 return gf_odf_del_ci((GF_CIDesc *)desc);
220 case GF_ODF_TEXT_TAG:
221 return gf_odf_del_exp_text((GF_ExpandedTextual *)desc);
222 case GF_ODF_EXT_PL_TAG:
223 return gf_odf_del_pl_ext((GF_PLExt *)desc);
224 case GF_ODF_IPI_PTR_TAG:
225 case GF_ODF_ISOM_IPI_PTR_TAG:
226 return gf_odf_del_ipi_ptr((GF_IPIPtr *)desc);
227 case GF_ODF_IPMP_TAG:
228 return gf_odf_del_ipmp((GF_IPMP_Descriptor *)desc);
229 case GF_ODF_IPMP_PTR_TAG:
230 return gf_odf_del_ipmp_ptr((GF_IPMPPtr *)desc);
231 case GF_ODF_KW_TAG:
232 return gf_odf_del_kw((GF_KeyWord *)desc);
233 case GF_ODF_OCI_DATE_TAG:
234 return gf_odf_del_oci_date((GF_OCI_Data *)desc);
235 case GF_ODF_OCI_NAME_TAG:
236 return gf_odf_del_oci_name((GF_OCICreators *)desc);
237 case GF_ODF_PL_IDX_TAG:
238 return gf_odf_del_pl_idx((GF_PL_IDX *)desc);
239 case GF_ODF_QOS_TAG:
240 return gf_odf_del_qos((GF_QoS_Descriptor *)desc);
241 case GF_ODF_RATING_TAG:
242 return gf_odf_del_rating((GF_Rating *)desc);
243 case GF_ODF_REG_TAG:
244 return gf_odf_del_reg((GF_Registration *)desc);
245 case GF_ODF_SHORT_TEXT_TAG:
246 return gf_odf_del_short_text((GF_ShortTextual *)desc);
247 case GF_ODF_SMPTE_TAG:
248 return gf_odf_del_smpte_camera((GF_SMPTECamera *)desc);
249 case GF_ODF_SCI_TAG:
250 return gf_odf_del_sup_cid((GF_SCIDesc *)desc);
251
252 case GF_ODF_IPMP_TL_TAG:
253 return gf_odf_del_ipmp_tool_list((GF_IPMP_ToolList *)desc);
254 case GF_ODF_IPMP_TOOL_TAG:
255 return gf_odf_del_ipmp_tool((GF_IPMP_Tool *)desc);
256
257 #endif /*GPAC_MINIMAL_ODF*/
258
259 default:
260 return gf_odf_del_default((GF_DefaultDescriptor *)desc);
261 }
262 return GF_OK;
263 }
264
265
266
267
268 //
269 // READERS
270 //
gf_odf_read_descriptor(GF_BitStream * bs,GF_Descriptor * desc,u32 DescSize)271 GF_Err gf_odf_read_descriptor(GF_BitStream *bs, GF_Descriptor *desc, u32 DescSize)
272 {
273 switch (desc->tag) {
274 case GF_ODF_IOD_TAG:
275 return gf_odf_read_iod(bs, (GF_InitialObjectDescriptor *)desc, DescSize);
276 case GF_ODF_ESD_TAG:
277 return gf_odf_read_esd(bs, (GF_ESD *)desc, DescSize);
278 case GF_ODF_DCD_TAG:
279 return gf_odf_read_dcd(bs, (GF_DecoderConfig *)desc, DescSize);
280 case GF_ODF_SLC_TAG:
281 return gf_odf_read_slc(bs, (GF_SLConfig *)desc, DescSize);
282 case GF_ODF_OD_TAG:
283 return gf_odf_read_od(bs, (GF_ObjectDescriptor *)desc, DescSize);
284
285 //MP4 File Format
286 case GF_ODF_ISOM_IOD_TAG:
287 return gf_odf_read_isom_iod(bs, (GF_IsomInitialObjectDescriptor *)desc, DescSize);
288 case GF_ODF_ISOM_OD_TAG:
289 return gf_odf_read_isom_od(bs, (GF_IsomObjectDescriptor *)desc, DescSize);
290 case GF_ODF_ESD_INC_TAG:
291 return gf_odf_read_esd_inc(bs, (GF_ES_ID_Inc *)desc, DescSize);
292 case GF_ODF_ESD_REF_TAG:
293 return gf_odf_read_esd_ref(bs, (GF_ES_ID_Ref *)desc, DescSize);
294
295 case GF_ODF_SEGMENT_TAG:
296 return gf_odf_read_segment(bs, (GF_Segment *)desc, DescSize);
297 case GF_ODF_MEDIATIME_TAG:
298 return gf_odf_read_mediatime(bs, (GF_MediaTime *)desc, DescSize);
299 case GF_ODF_MUXINFO_TAG:
300 return gf_odf_read_muxinfo(bs, (GF_MuxInfo *)desc, DescSize);
301
302 case GF_ODF_AUX_VIDEO_DATA:
303 return gf_odf_read_auxvid(bs, (GF_AuxVideoDescriptor *)desc, DescSize);
304
305 case GF_ODF_LANG_TAG:
306 return gf_odf_read_lang(bs, (GF_Language *)desc, DescSize);
307
308 #ifndef GPAC_MINIMAL_ODF
309 case GF_ODF_IPMP_TAG:
310 return gf_odf_read_ipmp(bs, (GF_IPMP_Descriptor *)desc, DescSize);
311 case GF_ODF_IPMP_PTR_TAG:
312 return gf_odf_read_ipmp_ptr(bs, (GF_IPMPPtr *)desc, DescSize);
313
314 case GF_ODF_CC_TAG:
315 return gf_odf_read_cc(bs, (GF_CCDescriptor *)desc, DescSize);
316 case GF_ODF_CC_DATE_TAG:
317 return gf_odf_read_cc_date(bs, (GF_CC_Date *)desc, DescSize);
318 case GF_ODF_CC_NAME_TAG:
319 return gf_odf_read_cc_name(bs, (GF_CC_Name *)desc, DescSize);
320 case GF_ODF_CI_TAG:
321 return gf_odf_read_ci(bs, (GF_CIDesc *)desc, DescSize);
322 case GF_ODF_TEXT_TAG:
323 return gf_odf_read_exp_text(bs, (GF_ExpandedTextual *)desc, DescSize);
324 case GF_ODF_EXT_PL_TAG:
325 return gf_odf_read_pl_ext(bs, (GF_PLExt *)desc, DescSize);
326 case GF_ODF_IPI_PTR_TAG:
327 case GF_ODF_ISOM_IPI_PTR_TAG:
328 return gf_odf_read_ipi_ptr(bs, (GF_IPIPtr *)desc, DescSize);
329 case GF_ODF_KW_TAG:
330 return gf_odf_read_kw(bs, (GF_KeyWord *)desc, DescSize);
331 case GF_ODF_OCI_DATE_TAG:
332 return gf_odf_read_oci_date(bs, (GF_OCI_Data *)desc, DescSize);
333 case GF_ODF_OCI_NAME_TAG:
334 return gf_odf_read_oci_name(bs, (GF_OCICreators *)desc, DescSize);
335 case GF_ODF_PL_IDX_TAG:
336 return gf_odf_read_pl_idx(bs, (GF_PL_IDX *)desc, DescSize);
337 case GF_ODF_QOS_TAG:
338 return gf_odf_read_qos(bs, (GF_QoS_Descriptor *)desc, DescSize);
339 case GF_ODF_RATING_TAG:
340 return gf_odf_read_rating(bs, (GF_Rating *)desc, DescSize);
341 case GF_ODF_REG_TAG:
342 return gf_odf_read_reg(bs, (GF_Registration *)desc, DescSize);
343 case GF_ODF_SHORT_TEXT_TAG:
344 return gf_odf_read_short_text(bs, (GF_ShortTextual *)desc, DescSize);
345 case GF_ODF_SMPTE_TAG:
346 return gf_odf_read_smpte_camera(bs, (GF_SMPTECamera *)desc, DescSize);
347 case GF_ODF_SCI_TAG:
348 return gf_odf_read_sup_cid(bs, (GF_SCIDesc *)desc, DescSize);
349
350 case GF_ODF_IPMP_TL_TAG:
351 return gf_odf_read_ipmp_tool_list(bs, (GF_IPMP_ToolList *)desc, DescSize);
352 case GF_ODF_IPMP_TOOL_TAG:
353 return gf_odf_read_ipmp_tool(bs, (GF_IPMP_Tool *)desc, DescSize);
354
355 #endif /*GPAC_MINIMAL_ODF*/
356 //default:
357 case GF_ODF_DSI_TAG:
358 default:
359 return gf_odf_read_default(bs, (GF_DefaultDescriptor *)desc, DescSize);
360 }
361 return GF_OK;
362 }
363
364
365
366
367
368 //
369 // SIZE FUNCTION
370 //
gf_odf_size_descriptor(GF_Descriptor * desc,u32 * outSize)371 GF_Err gf_odf_size_descriptor(GF_Descriptor *desc, u32 *outSize)
372 {
373 switch (desc->tag) {
374 case GF_ODF_IOD_TAG:
375 return gf_odf_size_iod((GF_InitialObjectDescriptor *)desc, outSize);
376 case GF_ODF_ESD_TAG:
377 return gf_odf_size_esd((GF_ESD *)desc, outSize);
378 case GF_ODF_DCD_TAG:
379 return gf_odf_size_dcd((GF_DecoderConfig *)desc, outSize);
380 case GF_ODF_SLC_TAG:
381 return gf_odf_size_slc((GF_SLConfig *)desc, outSize);
382
383 case GF_ODF_OD_TAG:
384 return gf_odf_size_od((GF_ObjectDescriptor *)desc, outSize);
385 case GF_ODF_ISOM_IOD_TAG:
386 return gf_odf_size_isom_iod((GF_IsomInitialObjectDescriptor *)desc, outSize);
387 case GF_ODF_ISOM_OD_TAG:
388 return gf_odf_size_isom_od((GF_IsomObjectDescriptor *)desc, outSize);
389 case GF_ODF_ESD_INC_TAG:
390 return gf_odf_size_esd_inc((GF_ES_ID_Inc *)desc, outSize);
391 case GF_ODF_ESD_REF_TAG:
392 return gf_odf_size_esd_ref((GF_ES_ID_Ref *)desc, outSize);
393
394 case GF_ODF_SEGMENT_TAG:
395 return gf_odf_size_segment((GF_Segment *)desc, outSize);
396 case GF_ODF_MEDIATIME_TAG:
397 return gf_odf_size_mediatime((GF_MediaTime *)desc, outSize);
398 case GF_ODF_MUXINFO_TAG:
399 return gf_odf_size_muxinfo((GF_MuxInfo *)desc, outSize);
400
401 case GF_ODF_AUX_VIDEO_DATA:
402 return gf_odf_size_auxvid((GF_AuxVideoDescriptor *)desc, outSize);
403
404 case GF_ODF_LANG_TAG:
405 return gf_odf_size_lang((GF_Language *)desc, outSize);
406
407 #ifndef GPAC_MINIMAL_ODF
408 case GF_ODF_CC_TAG:
409 return gf_odf_size_cc((GF_CCDescriptor *)desc, outSize);
410 case GF_ODF_CC_DATE_TAG:
411 return gf_odf_size_cc_date((GF_CC_Date *)desc, outSize);
412 case GF_ODF_CC_NAME_TAG:
413 return gf_odf_size_cc_name((GF_CC_Name *)desc, outSize);
414 case GF_ODF_CI_TAG:
415 return gf_odf_size_ci((GF_CIDesc *)desc, outSize);
416 case GF_ODF_TEXT_TAG:
417 return gf_odf_size_exp_text((GF_ExpandedTextual *)desc, outSize);
418 case GF_ODF_EXT_PL_TAG:
419 return gf_odf_size_pl_ext((GF_PLExt *)desc, outSize);
420 case GF_ODF_IPI_PTR_TAG:
421 case GF_ODF_ISOM_IPI_PTR_TAG:
422 return gf_odf_size_ipi_ptr((GF_IPIPtr *)desc, outSize);
423 case GF_ODF_IPMP_TAG:
424 return gf_odf_size_ipmp((GF_IPMP_Descriptor *)desc, outSize);
425 case GF_ODF_IPMP_PTR_TAG:
426 return gf_odf_size_ipmp_ptr((GF_IPMPPtr *)desc, outSize);
427 case GF_ODF_KW_TAG:
428 return gf_odf_size_kw((GF_KeyWord *)desc, outSize);
429 case GF_ODF_OCI_DATE_TAG:
430 return gf_odf_size_oci_date((GF_OCI_Data *)desc, outSize);
431 case GF_ODF_OCI_NAME_TAG:
432 return gf_odf_size_oci_name((GF_OCICreators *)desc, outSize);
433 case GF_ODF_PL_IDX_TAG:
434 return gf_odf_size_pl_idx((GF_PL_IDX *)desc, outSize);
435 case GF_ODF_QOS_TAG:
436 return gf_odf_size_qos((GF_QoS_Descriptor *)desc, outSize);
437 case GF_ODF_RATING_TAG:
438 return gf_odf_size_rating((GF_Rating *)desc, outSize);
439 case GF_ODF_REG_TAG:
440 return gf_odf_size_reg((GF_Registration *)desc, outSize);
441 case GF_ODF_SHORT_TEXT_TAG:
442 return gf_odf_size_short_text((GF_ShortTextual *)desc, outSize);
443 case GF_ODF_SMPTE_TAG:
444 return gf_odf_size_smpte_camera((GF_SMPTECamera *)desc, outSize);
445 case GF_ODF_SCI_TAG:
446 return gf_odf_size_sup_cid((GF_SCIDesc *)desc, outSize);
447
448
449 case GF_ODF_IPMP_TL_TAG:
450 return gf_odf_size_ipmp_tool_list((GF_IPMP_ToolList *)desc, outSize);
451 case GF_ODF_IPMP_TOOL_TAG:
452 return gf_odf_size_ipmp_tool((GF_IPMP_Tool *)desc, outSize);
453
454 #endif /*GPAC_MINIMAL_ODF*/
455 default:
456 /*don't write out l descriptors*/
457 if ((desc->tag >= GF_ODF_MUXINFO_TAG) && (desc->tag <= GF_ODF_LASER_CFG_TAG)) {
458 *outSize = 0;
459 return GF_OK;
460 }
461 return gf_odf_size_default((GF_DefaultDescriptor *)desc, outSize);
462 }
463 return GF_OK;
464 }
465
466
467 //
468 // WRITERS
469 //
gf_odf_write_descriptor(GF_BitStream * bs,GF_Descriptor * desc)470 GF_Err gf_odf_write_descriptor(GF_BitStream *bs, GF_Descriptor *desc)
471 {
472 switch (desc->tag) {
473 case GF_ODF_IOD_TAG:
474 return gf_odf_write_iod(bs, (GF_InitialObjectDescriptor *)desc);
475 case GF_ODF_ESD_TAG:
476 return gf_odf_write_esd(bs, (GF_ESD *)desc);
477 case GF_ODF_DCD_TAG:
478 return gf_odf_write_dcd(bs, (GF_DecoderConfig *)desc);
479 case GF_ODF_SLC_TAG:
480 return gf_odf_write_slc(bs, (GF_SLConfig *)desc);
481 case GF_ODF_ESD_INC_TAG:
482 return gf_odf_write_esd_inc(bs, (GF_ES_ID_Inc *)desc);
483 case GF_ODF_ESD_REF_TAG:
484 return gf_odf_write_esd_ref(bs, (GF_ES_ID_Ref *)desc);
485
486
487 case GF_ODF_ISOM_IOD_TAG:
488 return gf_odf_write_isom_iod(bs, (GF_IsomInitialObjectDescriptor *)desc);
489 case GF_ODF_ISOM_OD_TAG:
490 return gf_odf_write_isom_od(bs, (GF_IsomObjectDescriptor *)desc);
491 case GF_ODF_OD_TAG:
492 return gf_odf_write_od(bs, (GF_ObjectDescriptor *)desc);
493 case GF_ODF_SEGMENT_TAG:
494 return gf_odf_write_segment(bs, (GF_Segment *)desc);
495 case GF_ODF_MEDIATIME_TAG:
496 return gf_odf_write_mediatime(bs, (GF_MediaTime *)desc);
497 case GF_ODF_MUXINFO_TAG:
498 return gf_odf_write_muxinfo(bs, (GF_MuxInfo *)desc);
499
500 case GF_ODF_AUX_VIDEO_DATA:
501 return gf_odf_write_auxvid(bs, (GF_AuxVideoDescriptor *)desc);
502
503 case GF_ODF_LANG_TAG:
504 return gf_odf_write_lang(bs, (GF_Language *)desc);
505
506 #ifndef GPAC_MINIMAL_ODF
507 case GF_ODF_CC_TAG:
508 return gf_odf_write_cc(bs, (GF_CCDescriptor *)desc);
509 case GF_ODF_CC_DATE_TAG:
510 return gf_odf_write_cc_date(bs, (GF_CC_Date *)desc);
511 case GF_ODF_CC_NAME_TAG:
512 return gf_odf_write_cc_name(bs, (GF_CC_Name *)desc);
513 case GF_ODF_CI_TAG:
514 return gf_odf_write_ci(bs, (GF_CIDesc *)desc);
515
516 case GF_ODF_TEXT_TAG:
517 return gf_odf_write_exp_text(bs, (GF_ExpandedTextual *)desc);
518 case GF_ODF_EXT_PL_TAG:
519 return gf_odf_write_pl_ext(bs, (GF_PLExt *)desc);
520 case GF_ODF_IPI_PTR_TAG:
521 case GF_ODF_ISOM_IPI_PTR_TAG:
522 return gf_odf_write_ipi_ptr(bs, (GF_IPIPtr *)desc);
523 case GF_ODF_IPMP_TAG:
524 return gf_odf_write_ipmp(bs, (GF_IPMP_Descriptor *)desc);
525 case GF_ODF_IPMP_PTR_TAG:
526 return gf_odf_write_ipmp_ptr(bs, (GF_IPMPPtr *)desc);
527 case GF_ODF_KW_TAG:
528 return gf_odf_write_kw(bs, (GF_KeyWord *)desc);
529 case GF_ODF_OCI_DATE_TAG:
530 return gf_odf_write_oci_date(bs, (GF_OCI_Data *)desc);
531 case GF_ODF_OCI_NAME_TAG:
532 return gf_odf_write_oci_name(bs, (GF_OCICreators *)desc);
533 case GF_ODF_PL_IDX_TAG:
534 return gf_odf_write_pl_idx(bs, (GF_PL_IDX *)desc);
535 case GF_ODF_QOS_TAG:
536 return gf_odf_write_qos(bs, (GF_QoS_Descriptor *)desc);
537 case GF_ODF_RATING_TAG:
538 return gf_odf_write_rating(bs, (GF_Rating *)desc);
539 case GF_ODF_REG_TAG:
540 return gf_odf_write_reg(bs, (GF_Registration *)desc);
541 case GF_ODF_SHORT_TEXT_TAG:
542 return gf_odf_write_short_text(bs, (GF_ShortTextual *)desc);
543 case GF_ODF_SMPTE_TAG:
544 return gf_odf_write_smpte_camera(bs, (GF_SMPTECamera *)desc);
545 case GF_ODF_SCI_TAG:
546 return gf_odf_write_sup_cid(bs, (GF_SCIDesc *)desc);
547
548 case GF_ODF_IPMP_TL_TAG:
549 return gf_odf_write_ipmp_tool_list(bs, (GF_IPMP_ToolList *)desc);
550 case GF_ODF_IPMP_TOOL_TAG:
551 return gf_odf_write_ipmp_tool(bs, (GF_IPMP_Tool *)desc);
552 #endif /*GPAC_MINIMAL_ODF*/
553 default:
554 /*don't write out internal descriptors*/
555 if ((desc->tag >= GF_ODF_MUXINFO_TAG) && (desc->tag <= GF_ODF_LASER_CFG_TAG))
556 return GF_OK;
557 return gf_odf_write_default(bs, (GF_DefaultDescriptor *)desc);
558 }
559 return GF_OK;
560 }
561
562 //
563 // CONSTRUCTORS
564 //
gf_odf_create_command(u8 tag)565 GF_ODCom *gf_odf_create_command(u8 tag)
566 {
567 GF_ODCom *com;
568 switch (tag) {
569 case GF_ODF_OD_UPDATE_TAG:
570 return gf_odf_new_od_update();
571 case GF_ODF_OD_REMOVE_TAG:
572 return gf_odf_new_od_remove();
573 case GF_ODF_ESD_UPDATE_TAG:
574 return gf_odf_new_esd_update();
575 case GF_ODF_ESD_REMOVE_TAG:
576 return gf_odf_new_esd_remove();
577 //special case for ESDRemove in the file format...
578 case GF_ODF_ESD_REMOVE_REF_TAG:
579 com = gf_odf_new_esd_remove();
580 if (!com) return com;
581 com->tag = GF_ODF_ESD_REMOVE_REF_TAG;
582 return com;
583
584 case GF_ODF_IPMP_UPDATE_TAG:
585 return gf_odf_new_ipmp_update();
586 case GF_ODF_IPMP_REMOVE_TAG:
587 return gf_odf_new_ipmp_remove();
588
589 default:
590 if ((tag >= GF_ODF_COM_ISO_BEGIN_TAG) &&
591 (tag <= GF_ODF_COM_ISO_END_TAG)) {
592 return NULL;
593 }
594 com = gf_odf_new_base_command();
595 if (!com) return com;
596 com->tag = tag;
597 return com;
598 }
599 }
600
601
602 //
603 // DESTRUCTORS
604 //
gf_odf_delete_command(GF_ODCom * com)605 GF_Err gf_odf_delete_command(GF_ODCom *com)
606 {
607 switch (com->tag) {
608 case GF_ODF_OD_UPDATE_TAG:
609 return gf_odf_del_od_update((GF_ODUpdate *)com);
610 case GF_ODF_OD_REMOVE_TAG:
611 return gf_odf_del_od_remove((GF_ODRemove *)com);
612
613 case GF_ODF_ESD_UPDATE_TAG:
614 return gf_odf_del_esd_update((GF_ESDUpdate *)com);
615 case GF_ODF_ESD_REMOVE_TAG:
616 case GF_ODF_ESD_REMOVE_REF_TAG:
617 return gf_odf_del_esd_remove((GF_ESDRemove *)com);
618 case GF_ODF_IPMP_UPDATE_TAG:
619 return gf_odf_del_ipmp_update((GF_IPMPUpdate *)com);
620 case GF_ODF_IPMP_REMOVE_TAG:
621 return gf_odf_del_ipmp_remove((GF_IPMPRemove *)com);
622
623 default:
624 return gf_odf_del_base_command((GF_BaseODCom *)com);
625 }
626 }
627
628
629 //
630 // READERS
631 //
gf_odf_read_command(GF_BitStream * bs,GF_ODCom * com,u32 gf_odf_size_command)632 GF_Err gf_odf_read_command(GF_BitStream *bs, GF_ODCom *com, u32 gf_odf_size_command)
633 {
634 switch (com->tag) {
635 case GF_ODF_OD_UPDATE_TAG:
636 return gf_odf_read_od_update(bs, (GF_ODUpdate *)com, gf_odf_size_command);
637 case GF_ODF_OD_REMOVE_TAG:
638 return gf_odf_read_od_remove(bs, (GF_ODRemove *)com, gf_odf_size_command);
639 case GF_ODF_ESD_UPDATE_TAG:
640 return gf_odf_read_esd_update(bs, (GF_ESDUpdate *)com, gf_odf_size_command);
641 case GF_ODF_ESD_REMOVE_TAG:
642 case GF_ODF_ESD_REMOVE_REF_TAG:
643 return gf_odf_read_esd_remove(bs, (GF_ESDRemove *)com, gf_odf_size_command);
644 case GF_ODF_IPMP_UPDATE_TAG:
645 return gf_odf_read_ipmp_update(bs, (GF_IPMPUpdate *)com, gf_odf_size_command);
646 case GF_ODF_IPMP_REMOVE_TAG:
647 return gf_odf_read_ipmp_remove(bs, (GF_IPMPRemove *)com, gf_odf_size_command);
648 default:
649 return gf_odf_read_base_command(bs, (GF_BaseODCom *)com, gf_odf_size_command);
650 }
651 }
652
653
654
655 //
656 // SIZE FUNCTION
657 //
gf_odf_size_command(GF_ODCom * com,u32 * outSize)658 GF_Err gf_odf_size_command(GF_ODCom *com, u32 *outSize)
659 {
660 switch (com->tag) {
661 case GF_ODF_OD_UPDATE_TAG:
662 return gf_odf_size_od_update((GF_ODUpdate *)com, outSize);
663 case GF_ODF_OD_REMOVE_TAG:
664 return gf_odf_size_od_remove((GF_ODRemove *)com, outSize);
665
666 case GF_ODF_ESD_UPDATE_TAG:
667 return gf_odf_size_esd_update((GF_ESDUpdate *)com, outSize);
668 case GF_ODF_ESD_REMOVE_TAG:
669 case GF_ODF_ESD_REMOVE_REF_TAG:
670 return gf_odf_size_esd_remove((GF_ESDRemove *)com, outSize);
671 case GF_ODF_IPMP_UPDATE_TAG:
672 return gf_odf_size_ipmp_update((GF_IPMPUpdate *)com, outSize);
673 case GF_ODF_IPMP_REMOVE_TAG:
674 return gf_odf_size_ipmp_remove((GF_IPMPRemove *)com, outSize);
675
676 default:
677 return gf_odf_size_base_command((GF_BaseODCom *)com, outSize);
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 case GF_ODF_IPMP_UPDATE_TAG:
699 return gf_odf_write_ipmp_update(bs, (GF_IPMPUpdate *)com);
700 case GF_ODF_IPMP_REMOVE_TAG:
701 return gf_odf_write_ipmp_remove(bs, (GF_IPMPRemove *)com);
702
703 default:
704 return gf_odf_write_base_command(bs, (GF_BaseODCom *)com);
705 }
706 }
707