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