Coverage Report

Created: 2026-01-25 07:15

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
}