/src/gpac/src/odf/desc_private.c
Line | Count | Source |
1 | | /* |
2 | | * GPAC - Multimedia Framework C SDK |
3 | | * |
4 | | * Authors: Jean Le Feuvre |
5 | | * Copyright (c) Telecom ParisTech 2000-2012 |
6 | | * All rights reserved |
7 | | * |
8 | | * This file is part of GPAC / MPEG-4 ObjectDescriptor sub-project |
9 | | * |
10 | | * GPAC is free software; you can redistribute it and/or modify |
11 | | * it under the terms of the GNU Lesser General Public License as published by |
12 | | * the Free Software Foundation; either version 2, or (at your option) |
13 | | * any later version. |
14 | | * |
15 | | * GPAC is distributed in the hope that it will be useful, |
16 | | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
17 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
18 | | * GNU Lesser General Public License for more details. |
19 | | * |
20 | | * You should have received a copy of the GNU Lesser General Public |
21 | | * License along with this library; see the file COPYING. If not, write to |
22 | | * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. |
23 | | * |
24 | | */ |
25 | | |
26 | | #include <gpac/internal/odf_dev.h> |
27 | | |
28 | | |
29 | | // |
30 | | // CONSTRUCTORS |
31 | | // |
32 | | GF_Descriptor *gf_odf_create_descriptor(u8 tag) |
33 | 459k | { |
34 | 459k | GF_Descriptor *desc; |
35 | | |
36 | 459k | switch (tag) { |
37 | 6.34k | case GF_ODF_IOD_TAG: |
38 | 6.34k | return gf_odf_new_iod(); |
39 | 5.02k | case GF_ODF_OD_TAG: |
40 | 5.02k | return gf_odf_new_od(); |
41 | 37.6k | case GF_ODF_ESD_TAG: |
42 | 37.6k | return gf_odf_new_esd(); |
43 | 24.2k | case GF_ODF_DCD_TAG: |
44 | 24.2k | return gf_odf_new_dcd(); |
45 | 12.2k | case GF_ODF_SLC_TAG: |
46 | | //default : we create it without any predefinition... |
47 | 12.2k | return gf_odf_new_slc(0); |
48 | 270 | case GF_ODF_MUXINFO_TAG: |
49 | 270 | return gf_odf_new_muxinfo(); |
50 | 431 | case GF_ODF_BIFS_CFG_TAG: |
51 | 431 | return gf_odf_new_bifs_cfg(); |
52 | 270 | case GF_ODF_UI_CFG_TAG: |
53 | 270 | return gf_odf_new_ui_cfg(); |
54 | 2.05k | case GF_ODF_TEXT_CFG_TAG: |
55 | 2.05k | return gf_odf_new_text_cfg(); |
56 | 2.85k | case GF_ODF_TX3G_TAG: |
57 | 2.85k | return gf_odf_new_tx3g(); |
58 | 239 | case GF_ODF_ELEM_MASK_TAG: |
59 | 239 | return gf_odf_New_ElemMask(); |
60 | 1.60k | case GF_ODF_LASER_CFG_TAG: |
61 | 1.60k | return gf_odf_new_laser_cfg(); |
62 | | |
63 | 20.9k | case GF_ODF_DSI_TAG: |
64 | 20.9k | desc = gf_odf_new_default(); |
65 | 20.9k | if (!desc) return desc; |
66 | 20.9k | desc->tag = GF_ODF_DSI_TAG; |
67 | 20.9k | return desc; |
68 | | |
69 | 1.56k | case GF_ODF_AUX_VIDEO_DATA: |
70 | 1.56k | return gf_odf_new_auxvid(); |
71 | | |
72 | 1.25k | case GF_ODF_SEGMENT_TAG: |
73 | 1.25k | return gf_odf_new_segment(); |
74 | | |
75 | | //File Format Specific |
76 | 4.78k | case GF_ODF_ISOM_IOD_TAG: |
77 | 4.78k | return gf_odf_new_isom_iod(); |
78 | 6.36k | case GF_ODF_ISOM_OD_TAG: |
79 | 6.36k | return gf_odf_new_isom_od(); |
80 | 2.39k | case GF_ODF_ESD_INC_TAG: |
81 | 2.39k | return gf_odf_new_esd_inc(); |
82 | 6.06k | case GF_ODF_ESD_REF_TAG: |
83 | 6.06k | return gf_odf_new_esd_ref(); |
84 | 4.69k | case GF_ODF_LANG_TAG: |
85 | 4.69k | return gf_odf_new_lang(); |
86 | 305 | case GF_ODF_GPAC_LANG: |
87 | 305 | desc = gf_odf_new_lang(); |
88 | 305 | if (desc) desc->tag = GF_ODF_GPAC_LANG; |
89 | 305 | 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 | 318k | default: |
150 | | //ISO Reserved |
151 | 318k | if ( (tag >= GF_ODF_ISO_RES_BEGIN_TAG) && |
152 | 25.3k | (tag <= GF_ODF_ISO_RES_END_TAG) ) { |
153 | 645 | return NULL; |
154 | 645 | } |
155 | 317k | desc = gf_odf_new_default(); |
156 | 317k | if (!desc) return desc; |
157 | 317k | desc->tag = tag; |
158 | 317k | return desc; |
159 | 459k | } |
160 | 459k | } |
161 | | |
162 | | // |
163 | | // DESTRUCTORS |
164 | | // |
165 | | GF_Err gf_odf_delete_descriptor(GF_Descriptor *desc) |
166 | 472k | { |
167 | 472k | switch (desc->tag) { |
168 | 6.42k | case GF_ODF_IOD_TAG : |
169 | 6.42k | return gf_odf_del_iod((GF_InitialObjectDescriptor *)desc); |
170 | 5.02k | case GF_ODF_OD_TAG: |
171 | 5.02k | return gf_odf_del_od((GF_ObjectDescriptor *)desc); |
172 | 37.6k | case GF_ODF_ESD_TAG : |
173 | 37.6k | return gf_odf_del_esd((GF_ESD *)desc); |
174 | 24.2k | case GF_ODF_DCD_TAG : |
175 | 24.2k | return gf_odf_del_dcd((GF_DecoderConfig *)desc); |
176 | 25.7k | case GF_ODF_SLC_TAG: |
177 | 25.7k | return gf_odf_del_slc((GF_SLConfig *)desc); |
178 | | |
179 | 4.78k | case GF_ODF_ISOM_IOD_TAG: |
180 | 4.78k | return gf_odf_del_isom_iod((GF_IsomInitialObjectDescriptor *)desc); |
181 | 6.36k | case GF_ODF_ISOM_OD_TAG: |
182 | 6.36k | return gf_odf_del_isom_od((GF_IsomObjectDescriptor *)desc); |
183 | | |
184 | 1.25k | case GF_ODF_SEGMENT_TAG: |
185 | 1.25k | return gf_odf_del_segment((GF_Segment *) desc); |
186 | | |
187 | 270 | case GF_ODF_MUXINFO_TAG: |
188 | 270 | return gf_odf_del_muxinfo((GF_MuxInfo *)desc); |
189 | 431 | case GF_ODF_BIFS_CFG_TAG: |
190 | 431 | return gf_odf_del_bifs_cfg((GF_BIFSConfig *)desc); |
191 | 270 | case GF_ODF_UI_CFG_TAG: |
192 | 270 | return gf_odf_del_ui_cfg((GF_UIConfig *)desc); |
193 | 2.05k | case GF_ODF_TEXT_CFG_TAG: |
194 | 2.05k | return gf_odf_del_text_cfg((GF_TextConfig *)desc); |
195 | 2.93k | case GF_ODF_TX3G_TAG: |
196 | 2.93k | return gf_odf_del_tx3g((GF_TextSampleDescriptor*)desc); |
197 | 239 | case GF_ODF_ELEM_MASK_TAG: |
198 | 239 | return gf_odf_del_ElemMask((GF_ElementaryMask*)desc); |
199 | 1.60k | case GF_ODF_LASER_CFG_TAG: |
200 | 1.60k | return gf_odf_del_laser_cfg((GF_LASERConfig *)desc); |
201 | | |
202 | 1.56k | case GF_ODF_AUX_VIDEO_DATA: |
203 | 1.56k | return gf_odf_del_auxvid((GF_AuxVideoDescriptor *)desc); |
204 | | |
205 | 4.69k | case GF_ODF_LANG_TAG: |
206 | 5.00k | case GF_ODF_GPAC_LANG: |
207 | 5.00k | return gf_odf_del_lang((GF_Language *)desc); |
208 | | |
209 | 2.39k | case GF_ODF_ESD_INC_TAG: |
210 | 2.39k | return gf_odf_del_esd_inc((GF_ES_ID_Inc *)desc); |
211 | 6.06k | case GF_ODF_ESD_REF_TAG: |
212 | 6.06k | 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 | 338k | default: |
265 | 338k | return gf_odf_del_default((GF_DefaultDescriptor *)desc); |
266 | 472k | } |
267 | 0 | return GF_OK; |
268 | 472k | } |
269 | | |
270 | | |
271 | | |
272 | | |
273 | | // |
274 | | // READERS |
275 | | // |
276 | | static GF_Err gf_odf_read_descriptor_internal(GF_BitStream *bs, GF_Descriptor *desc, u32 DescSize) |
277 | 415k | { |
278 | 415k | switch (desc->tag) { |
279 | 6.34k | case GF_ODF_IOD_TAG : |
280 | 6.34k | return gf_odf_read_iod(bs, (GF_InitialObjectDescriptor *)desc, DescSize); |
281 | 24.1k | case GF_ODF_ESD_TAG : |
282 | 24.1k | return gf_odf_read_esd(bs, (GF_ESD *)desc, DescSize); |
283 | 10.6k | case GF_ODF_DCD_TAG : |
284 | 10.6k | return gf_odf_read_dcd(bs, (GF_DecoderConfig *)desc, DescSize); |
285 | 9.99k | case GF_ODF_SLC_TAG : |
286 | 9.99k | return gf_odf_read_slc(bs, (GF_SLConfig *)desc, DescSize); |
287 | 5.02k | case GF_ODF_OD_TAG: |
288 | 5.02k | return gf_odf_read_od(bs, (GF_ObjectDescriptor *)desc, DescSize); |
289 | | |
290 | | //MP4 File Format |
291 | 4.78k | case GF_ODF_ISOM_IOD_TAG: |
292 | 4.78k | return gf_odf_read_isom_iod(bs, (GF_IsomInitialObjectDescriptor *)desc, DescSize); |
293 | 6.35k | case GF_ODF_ISOM_OD_TAG: |
294 | 6.35k | return gf_odf_read_isom_od(bs, (GF_IsomObjectDescriptor *)desc, DescSize); |
295 | 2.39k | case GF_ODF_ESD_INC_TAG: |
296 | 2.39k | return gf_odf_read_esd_inc(bs, (GF_ES_ID_Inc *)desc, DescSize); |
297 | 6.06k | case GF_ODF_ESD_REF_TAG: |
298 | 6.06k | return gf_odf_read_esd_ref(bs, (GF_ES_ID_Ref *)desc, DescSize); |
299 | | |
300 | 1.25k | case GF_ODF_SEGMENT_TAG: |
301 | 1.25k | return gf_odf_read_segment(bs, (GF_Segment *) desc, DescSize); |
302 | 270 | case GF_ODF_MUXINFO_TAG: |
303 | 270 | 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 | 270 | return GF_NON_COMPLIANT_BITSTREAM; |
305 | | |
306 | 1.56k | case GF_ODF_AUX_VIDEO_DATA: |
307 | 1.56k | return gf_odf_read_auxvid(bs, (GF_AuxVideoDescriptor *)desc, DescSize); |
308 | | |
309 | 4.32k | case GF_ODF_LANG_TAG: |
310 | 4.62k | case GF_ODF_GPAC_LANG: |
311 | 4.62k | 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 | 7.41k | case GF_ODF_DSI_TAG: |
365 | 332k | default: |
366 | 332k | return gf_odf_read_default(bs, (GF_DefaultDescriptor *)desc, DescSize); |
367 | 415k | } |
368 | 0 | return GF_OK; |
369 | 415k | } |
370 | | |
371 | | GF_Err gf_odf_read_descriptor(GF_BitStream *bs, GF_Descriptor *desc, u32 DescSize) |
372 | 415k | { |
373 | 415k | u64 cookie = gf_bs_get_cookie(bs); |
374 | | //we allow 100 max desc in a hierarchy - see issue 2216 |
375 | 415k | if (cookie>100) |
376 | 9 | return GF_NON_COMPLIANT_BITSTREAM; |
377 | 415k | gf_bs_set_cookie(bs, cookie+1); |
378 | 415k | GF_Err e = gf_odf_read_descriptor_internal(bs, desc, DescSize); |
379 | 415k | gf_bs_set_cookie(bs, cookie); |
380 | 415k | return e; |
381 | 415k | } |
382 | | |
383 | | |
384 | | |
385 | | // |
386 | | // SIZE FUNCTION |
387 | | // |
388 | | GF_Err gf_odf_size_descriptor(GF_Descriptor *desc, u32 *outSize) |
389 | 79.3k | { |
390 | 79.3k | switch(desc->tag) { |
391 | 1.10k | case GF_ODF_IOD_TAG : |
392 | 1.10k | return gf_odf_size_iod((GF_InitialObjectDescriptor *)desc, outSize); |
393 | 5.06k | case GF_ODF_ESD_TAG : |
394 | 5.06k | return gf_odf_size_esd((GF_ESD *)desc, outSize); |
395 | 1.23k | case GF_ODF_DCD_TAG : |
396 | 1.23k | return gf_odf_size_dcd((GF_DecoderConfig *)desc, outSize); |
397 | 4.45k | case GF_ODF_SLC_TAG : |
398 | 4.45k | return gf_odf_size_slc((GF_SLConfig *)desc, outSize); |
399 | | |
400 | 1.19k | case GF_ODF_OD_TAG: |
401 | 1.19k | return gf_odf_size_od((GF_ObjectDescriptor *)desc, outSize); |
402 | 631 | case GF_ODF_ISOM_IOD_TAG: |
403 | 631 | return gf_odf_size_isom_iod((GF_IsomInitialObjectDescriptor *)desc, outSize); |
404 | 677 | case GF_ODF_ISOM_OD_TAG: |
405 | 677 | return gf_odf_size_isom_od((GF_IsomObjectDescriptor *)desc, outSize); |
406 | 358 | case GF_ODF_ESD_INC_TAG: |
407 | 358 | return gf_odf_size_esd_inc((GF_ES_ID_Inc *)desc, outSize); |
408 | 2.30k | case GF_ODF_ESD_REF_TAG: |
409 | 2.30k | return gf_odf_size_esd_ref((GF_ES_ID_Ref *)desc, outSize); |
410 | | |
411 | 40 | case GF_ODF_SEGMENT_TAG: |
412 | 40 | return gf_odf_size_segment((GF_Segment *) desc, outSize); |
413 | 0 | case GF_ODF_MUXINFO_TAG: |
414 | 0 | return gf_odf_size_muxinfo((GF_MuxInfo *) desc, outSize); |
415 | | |
416 | 890 | case GF_ODF_AUX_VIDEO_DATA: |
417 | 890 | return gf_odf_size_auxvid((GF_AuxVideoDescriptor *)desc, outSize); |
418 | | |
419 | 2.25k | case GF_ODF_LANG_TAG: |
420 | 2.34k | case GF_ODF_GPAC_LANG: |
421 | 2.34k | return gf_odf_size_lang((GF_Language *)desc, outSize); |
422 | | |
423 | | #ifndef GPAC_MINIMAL_ODF |
424 | | case GF_ODF_MEDIATIME_TAG: |
425 | | return gf_odf_size_mediatime((GF_MediaTime *) desc, outSize); |
426 | | case GF_ODF_CC_TAG: |
427 | | return gf_odf_size_cc((GF_CCDescriptor *)desc, outSize); |
428 | | case GF_ODF_CC_DATE_TAG: |
429 | | return gf_odf_size_cc_date((GF_CC_Date *)desc, outSize); |
430 | | case GF_ODF_CC_NAME_TAG: |
431 | | return gf_odf_size_cc_name((GF_CC_Name *)desc, outSize); |
432 | | case GF_ODF_CI_TAG: |
433 | | return gf_odf_size_ci((GF_CIDesc *)desc, outSize); |
434 | | case GF_ODF_TEXT_TAG: |
435 | | return gf_odf_size_exp_text((GF_ExpandedTextual *)desc, outSize); |
436 | | case GF_ODF_EXT_PL_TAG: |
437 | | return gf_odf_size_pl_ext((GF_PLExt *)desc, outSize); |
438 | | case GF_ODF_IPI_PTR_TAG: |
439 | | case GF_ODF_ISOM_IPI_PTR_TAG: |
440 | | return gf_odf_size_ipi_ptr((GF_IPIPtr *)desc, outSize); |
441 | | case GF_ODF_IPMP_TAG: |
442 | | return gf_odf_size_ipmp((GF_IPMP_Descriptor *)desc, outSize); |
443 | | case GF_ODF_IPMP_PTR_TAG: |
444 | | return gf_odf_size_ipmp_ptr((GF_IPMPPtr *)desc, outSize); |
445 | | case GF_ODF_KW_TAG: |
446 | | return gf_odf_size_kw((GF_KeyWord *)desc, outSize); |
447 | | case GF_ODF_OCI_DATE_TAG: |
448 | | return gf_odf_size_oci_date((GF_OCI_Data *)desc, outSize); |
449 | | case GF_ODF_OCI_NAME_TAG: |
450 | | return gf_odf_size_oci_name((GF_OCICreators *)desc, outSize); |
451 | | case GF_ODF_PL_IDX_TAG: |
452 | | return gf_odf_size_pl_idx((GF_PL_IDX *)desc, outSize); |
453 | | case GF_ODF_QOS_TAG: |
454 | | return gf_odf_size_qos((GF_QoS_Descriptor *)desc, outSize); |
455 | | case GF_ODF_RATING_TAG: |
456 | | return gf_odf_size_rating((GF_Rating *)desc, outSize); |
457 | | case GF_ODF_REG_TAG: |
458 | | return gf_odf_size_reg((GF_Registration *)desc, outSize); |
459 | | case GF_ODF_SHORT_TEXT_TAG: |
460 | | return gf_odf_size_short_text((GF_ShortTextual *)desc, outSize); |
461 | | case GF_ODF_SMPTE_TAG: |
462 | | return gf_odf_size_smpte_camera((GF_SMPTECamera *)desc, outSize); |
463 | | case GF_ODF_SCI_TAG: |
464 | | return gf_odf_size_sup_cid((GF_SCIDesc *)desc, outSize); |
465 | | |
466 | | |
467 | | case GF_ODF_IPMP_TL_TAG: |
468 | | return gf_odf_size_ipmp_tool_list((GF_IPMP_ToolList *)desc, outSize); |
469 | | case GF_ODF_IPMP_TOOL_TAG: |
470 | | return gf_odf_size_ipmp_tool((GF_IPMP_Tool *)desc, outSize); |
471 | | |
472 | | #endif /*GPAC_MINIMAL_ODF*/ |
473 | 59.0k | default: |
474 | | /*don't write out l descriptors*/ |
475 | 59.0k | if ((desc->tag>=GF_ODF_MUXINFO_TAG) && (desc->tag<=GF_ODF_LASER_CFG_TAG)) { |
476 | 1.13k | *outSize = 0; |
477 | 1.13k | return GF_OK; |
478 | 1.13k | } |
479 | 57.9k | return gf_odf_size_default((GF_DefaultDescriptor *)desc, outSize); |
480 | 79.3k | } |
481 | 0 | return GF_OK; |
482 | 79.3k | } |
483 | | |
484 | | |
485 | | // |
486 | | // WRITERS |
487 | | // |
488 | | GF_EXPORT |
489 | | GF_Err gf_odf_write_descriptor(GF_BitStream *bs, GF_Descriptor *desc) |
490 | 66.5k | { |
491 | 66.5k | switch(desc->tag) { |
492 | 1.10k | case GF_ODF_IOD_TAG : |
493 | 1.10k | return gf_odf_write_iod(bs, (GF_InitialObjectDescriptor *)desc); |
494 | 4.94k | case GF_ODF_ESD_TAG : |
495 | 4.94k | return gf_odf_write_esd(bs, (GF_ESD *)desc); |
496 | 682 | case GF_ODF_DCD_TAG : |
497 | 682 | return gf_odf_write_dcd(bs, (GF_DecoderConfig *)desc); |
498 | 2.73k | case GF_ODF_SLC_TAG : |
499 | 2.73k | return gf_odf_write_slc(bs, (GF_SLConfig *)desc); |
500 | 220 | case GF_ODF_ESD_INC_TAG: |
501 | 220 | return gf_odf_write_esd_inc(bs, (GF_ES_ID_Inc *)desc); |
502 | 2.10k | case GF_ODF_ESD_REF_TAG: |
503 | 2.10k | return gf_odf_write_esd_ref(bs, (GF_ES_ID_Ref *)desc); |
504 | | |
505 | | |
506 | 631 | case GF_ODF_ISOM_IOD_TAG: |
507 | 631 | return gf_odf_write_isom_iod(bs, (GF_IsomInitialObjectDescriptor *)desc); |
508 | 677 | case GF_ODF_ISOM_OD_TAG: |
509 | 677 | return gf_odf_write_isom_od(bs, (GF_IsomObjectDescriptor *)desc); |
510 | 1.19k | case GF_ODF_OD_TAG: |
511 | 1.19k | return gf_odf_write_od(bs, (GF_ObjectDescriptor *)desc); |
512 | 40 | case GF_ODF_SEGMENT_TAG: |
513 | 40 | return gf_odf_write_segment(bs, (GF_Segment *) desc); |
514 | 0 | case GF_ODF_MUXINFO_TAG: |
515 | 0 | return gf_odf_write_muxinfo(bs, (GF_MuxInfo *) desc); |
516 | | |
517 | 463 | case GF_ODF_AUX_VIDEO_DATA: |
518 | 463 | return gf_odf_write_auxvid(bs, (GF_AuxVideoDescriptor *)desc); |
519 | | |
520 | 1.79k | case GF_ODF_LANG_TAG: |
521 | 1.87k | case GF_ODF_GPAC_LANG: |
522 | 1.87k | return gf_odf_write_lang(bs, (GF_Language *)desc); |
523 | | |
524 | | #ifndef GPAC_MINIMAL_ODF |
525 | | case GF_ODF_MEDIATIME_TAG: |
526 | | return gf_odf_write_mediatime(bs, (GF_MediaTime *) desc); |
527 | | case GF_ODF_CC_TAG: |
528 | | return gf_odf_write_cc(bs, (GF_CCDescriptor *)desc); |
529 | | case GF_ODF_CC_DATE_TAG: |
530 | | return gf_odf_write_cc_date(bs, (GF_CC_Date *)desc); |
531 | | case GF_ODF_CC_NAME_TAG: |
532 | | return gf_odf_write_cc_name(bs, (GF_CC_Name *)desc); |
533 | | case GF_ODF_CI_TAG: |
534 | | return gf_odf_write_ci(bs, (GF_CIDesc *)desc); |
535 | | |
536 | | case GF_ODF_TEXT_TAG: |
537 | | return gf_odf_write_exp_text(bs, (GF_ExpandedTextual *)desc); |
538 | | case GF_ODF_EXT_PL_TAG: |
539 | | return gf_odf_write_pl_ext(bs, (GF_PLExt *)desc); |
540 | | case GF_ODF_IPI_PTR_TAG: |
541 | | case GF_ODF_ISOM_IPI_PTR_TAG: |
542 | | return gf_odf_write_ipi_ptr(bs, (GF_IPIPtr *)desc); |
543 | | case GF_ODF_IPMP_TAG: |
544 | | return gf_odf_write_ipmp(bs, (GF_IPMP_Descriptor *)desc); |
545 | | case GF_ODF_IPMP_PTR_TAG: |
546 | | return gf_odf_write_ipmp_ptr(bs, (GF_IPMPPtr *)desc); |
547 | | case GF_ODF_KW_TAG: |
548 | | return gf_odf_write_kw(bs, (GF_KeyWord *)desc); |
549 | | case GF_ODF_OCI_DATE_TAG: |
550 | | return gf_odf_write_oci_date(bs, (GF_OCI_Data *)desc); |
551 | | case GF_ODF_OCI_NAME_TAG: |
552 | | return gf_odf_write_oci_name(bs, (GF_OCICreators *)desc); |
553 | | case GF_ODF_PL_IDX_TAG: |
554 | | return gf_odf_write_pl_idx(bs, (GF_PL_IDX *)desc); |
555 | | case GF_ODF_QOS_TAG: |
556 | | return gf_odf_write_qos(bs, (GF_QoS_Descriptor *)desc); |
557 | | case GF_ODF_RATING_TAG: |
558 | | return gf_odf_write_rating(bs, (GF_Rating *)desc); |
559 | | case GF_ODF_REG_TAG: |
560 | | return gf_odf_write_reg(bs, (GF_Registration *)desc); |
561 | | case GF_ODF_SHORT_TEXT_TAG: |
562 | | return gf_odf_write_short_text(bs, (GF_ShortTextual *)desc); |
563 | | case GF_ODF_SMPTE_TAG: |
564 | | return gf_odf_write_smpte_camera(bs, (GF_SMPTECamera *)desc); |
565 | | case GF_ODF_SCI_TAG: |
566 | | return gf_odf_write_sup_cid(bs, (GF_SCIDesc *)desc); |
567 | | |
568 | | case GF_ODF_IPMP_TL_TAG: |
569 | | return gf_odf_write_ipmp_tool_list(bs, (GF_IPMP_ToolList *)desc); |
570 | | case GF_ODF_IPMP_TOOL_TAG: |
571 | | return gf_odf_write_ipmp_tool(bs, (GF_IPMP_Tool *)desc); |
572 | | #endif /*GPAC_MINIMAL_ODF*/ |
573 | 49.8k | default: |
574 | | /*don't write out internal descriptors*/ |
575 | 49.8k | if ((desc->tag>=GF_ODF_MUXINFO_TAG) && (desc->tag<=GF_ODF_LASER_CFG_TAG)) |
576 | 1.61k | return GF_OK; |
577 | 48.2k | return gf_odf_write_default(bs, (GF_DefaultDescriptor *)desc); |
578 | 66.5k | } |
579 | 0 | return GF_OK; |
580 | 66.5k | } |
581 | | |
582 | | // |
583 | | // CONSTRUCTORS |
584 | | // |
585 | | GF_ODCom *gf_odf_create_command(u8 tag) |
586 | 0 | { |
587 | 0 | GF_ODCom *com; |
588 | 0 | switch (tag) { |
589 | 0 | case GF_ODF_OD_UPDATE_TAG: |
590 | 0 | return gf_odf_new_od_update(); |
591 | 0 | case GF_ODF_OD_REMOVE_TAG: |
592 | 0 | return gf_odf_new_od_remove(); |
593 | 0 | case GF_ODF_ESD_UPDATE_TAG: |
594 | 0 | return gf_odf_new_esd_update(); |
595 | 0 | case GF_ODF_ESD_REMOVE_TAG: |
596 | 0 | return gf_odf_new_esd_remove(); |
597 | | //special case for ESDRemove in the file format... |
598 | 0 | case GF_ODF_ESD_REMOVE_REF_TAG: |
599 | 0 | com = gf_odf_new_esd_remove(); |
600 | 0 | if (!com) return com; |
601 | 0 | com->tag = GF_ODF_ESD_REMOVE_REF_TAG; |
602 | 0 | return com; |
603 | | |
604 | | #ifndef GPAC_MINIMAL_ODF |
605 | | case GF_ODF_IPMP_UPDATE_TAG: |
606 | | return gf_odf_new_ipmp_update(); |
607 | | case GF_ODF_IPMP_REMOVE_TAG: |
608 | | return gf_odf_new_ipmp_remove(); |
609 | | |
610 | | default: |
611 | | if ( (tag >= GF_ODF_COM_ISO_BEGIN_TAG) && |
612 | | ( tag <= GF_ODF_COM_ISO_END_TAG) ) { |
613 | | return NULL; |
614 | | } |
615 | | com = gf_odf_new_base_command(); |
616 | | if (!com) return com; |
617 | | com->tag = tag; |
618 | | return com; |
619 | | #else |
620 | 0 | default: |
621 | 0 | return NULL; |
622 | 0 | #endif |
623 | 0 | } |
624 | 0 | } |
625 | | |
626 | | |
627 | | // |
628 | | // DESTRUCTORS |
629 | | // |
630 | | GF_Err gf_odf_delete_command(GF_ODCom *com) |
631 | 0 | { |
632 | 0 | switch (com->tag) { |
633 | 0 | case GF_ODF_OD_UPDATE_TAG: |
634 | 0 | return gf_odf_del_od_update((GF_ODUpdate *)com); |
635 | 0 | case GF_ODF_OD_REMOVE_TAG: |
636 | 0 | return gf_odf_del_od_remove((GF_ODRemove *)com); |
637 | | |
638 | 0 | case GF_ODF_ESD_UPDATE_TAG: |
639 | 0 | return gf_odf_del_esd_update((GF_ESDUpdate *)com); |
640 | 0 | case GF_ODF_ESD_REMOVE_TAG: |
641 | 0 | case GF_ODF_ESD_REMOVE_REF_TAG: |
642 | 0 | return gf_odf_del_esd_remove((GF_ESDRemove *)com); |
643 | | #ifndef GPAC_MINIMAL_ODF |
644 | | case GF_ODF_IPMP_UPDATE_TAG: |
645 | | return gf_odf_del_ipmp_update((GF_IPMPUpdate *)com); |
646 | | case GF_ODF_IPMP_REMOVE_TAG: |
647 | | return gf_odf_del_ipmp_remove((GF_IPMPRemove *)com); |
648 | | |
649 | | default: |
650 | | return gf_odf_del_base_command((GF_BaseODCom *)com); |
651 | | #else |
652 | 0 | default: |
653 | 0 | return GF_NOT_SUPPORTED; |
654 | 0 | #endif |
655 | |
|
656 | 0 | } |
657 | 0 | } |
658 | | |
659 | | |
660 | | // |
661 | | // READERS |
662 | | // |
663 | | GF_Err gf_odf_read_command(GF_BitStream *bs, GF_ODCom *com, u32 gf_odf_size_command) |
664 | 0 | { |
665 | 0 | switch (com->tag) { |
666 | 0 | case GF_ODF_OD_UPDATE_TAG: |
667 | 0 | return gf_odf_read_od_update(bs, (GF_ODUpdate *)com, gf_odf_size_command); |
668 | 0 | case GF_ODF_OD_REMOVE_TAG: |
669 | 0 | return gf_odf_read_od_remove(bs, (GF_ODRemove *)com, gf_odf_size_command); |
670 | 0 | case GF_ODF_ESD_UPDATE_TAG: |
671 | 0 | return gf_odf_read_esd_update(bs, (GF_ESDUpdate *)com, gf_odf_size_command); |
672 | 0 | case GF_ODF_ESD_REMOVE_TAG: |
673 | 0 | case GF_ODF_ESD_REMOVE_REF_TAG: |
674 | 0 | return gf_odf_read_esd_remove(bs, (GF_ESDRemove *)com, gf_odf_size_command); |
675 | | #ifndef GPAC_MINIMAL_ODF |
676 | | case GF_ODF_IPMP_UPDATE_TAG: |
677 | | return gf_odf_read_ipmp_update(bs, (GF_IPMPUpdate *)com, gf_odf_size_command); |
678 | | case GF_ODF_IPMP_REMOVE_TAG: |
679 | | return gf_odf_read_ipmp_remove(bs, (GF_IPMPRemove *)com, gf_odf_size_command); |
680 | | default: |
681 | | return gf_odf_read_base_command(bs, (GF_BaseODCom *)com, gf_odf_size_command); |
682 | | #else |
683 | 0 | default: |
684 | 0 | return GF_NOT_SUPPORTED; |
685 | 0 | #endif |
686 | |
|
687 | 0 | } |
688 | 0 | } |
689 | | |
690 | | |
691 | | |
692 | | // |
693 | | // WRITERS |
694 | | // |
695 | | GF_Err gf_odf_write_command(GF_BitStream *bs, GF_ODCom *com) |
696 | 0 | { |
697 | 0 | switch (com->tag) { |
698 | 0 | case GF_ODF_OD_UPDATE_TAG: |
699 | 0 | return gf_odf_write_od_update(bs, (GF_ODUpdate *)com); |
700 | 0 | case GF_ODF_OD_REMOVE_TAG: |
701 | 0 | return gf_odf_write_od_remove(bs, (GF_ODRemove *)com); |
702 | | |
703 | 0 | case GF_ODF_ESD_UPDATE_TAG: |
704 | 0 | return gf_odf_write_esd_update(bs, (GF_ESDUpdate *)com); |
705 | 0 | case GF_ODF_ESD_REMOVE_TAG: |
706 | 0 | case GF_ODF_ESD_REMOVE_REF_TAG: |
707 | 0 | return gf_odf_write_esd_remove(bs, (GF_ESDRemove *)com); |
708 | | #ifndef GPAC_MINIMAL_ODF |
709 | | case GF_ODF_IPMP_UPDATE_TAG: |
710 | | return gf_odf_write_ipmp_update(bs, (GF_IPMPUpdate *)com); |
711 | | case GF_ODF_IPMP_REMOVE_TAG: |
712 | | return gf_odf_write_ipmp_remove(bs, (GF_IPMPRemove *)com); |
713 | | |
714 | | default: |
715 | | return gf_odf_write_base_command(bs, (GF_BaseODCom *)com); |
716 | | #else |
717 | 0 | default: |
718 | 0 | return GF_NOT_SUPPORTED; |
719 | 0 | #endif |
720 | 0 | } |
721 | 0 | } |