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