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 / ISO Media File Format 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/isomedia_dev.h>
27 
28 #ifndef GPAC_DISABLE_ISOM
29 
30 //Add this funct to handle incomplete files...
31 //bytesExpected is 0 most of the time. If the file is incomplete, bytesExpected
32 //is the number of bytes missing to parse the box...
gf_isom_parse_root_box(GF_Box ** outBox,GF_BitStream * bs,u64 * bytesExpected,Bool progressive_mode)33 GF_Err gf_isom_parse_root_box(GF_Box **outBox, GF_BitStream *bs, u64 *bytesExpected, Bool progressive_mode)
34 {
35 	GF_Err ret;
36 	u64 start;
37 	//first make sure we can at least get the box size and type...
38 	//18 = size (int32) + type (int32)
39 	if (gf_bs_available(bs) < 8) {
40 		*bytesExpected = 8;
41 		return GF_ISOM_INCOMPLETE_FILE;
42 	}
43 	start = gf_bs_get_position(bs);
44 	ret = gf_isom_parse_box_ex(outBox, bs, 0, GF_TRUE);
45 	if (ret == GF_ISOM_INCOMPLETE_FILE) {
46 		*bytesExpected = (*outBox)->size;
47 		GF_LOG(progressive_mode ? GF_LOG_DEBUG : GF_LOG_ERROR, GF_LOG_CONTAINER, ("[iso file] Incomplete box %s\n", gf_4cc_to_str((*outBox)->type)));
48 		gf_bs_seek(bs, start);
49 		gf_isom_box_del(*outBox);
50 		*outBox = NULL;
51 	}
52 	return ret;
53 }
54 
gf_isom_parse_box_ex(GF_Box ** outBox,GF_BitStream * bs,u32 parent_type,Bool is_root_box)55 GF_Err gf_isom_parse_box_ex(GF_Box **outBox, GF_BitStream *bs, u32 parent_type, Bool is_root_box)
56 {
57 	u32 type, uuid_type, hdr_size;
58 	u64 size, start, end;
59 	char uuid[16];
60 	GF_Err e;
61 	GF_Box *newBox;
62 
63 	if ((bs == NULL) || (outBox == NULL)) return GF_BAD_PARAM;
64 	*outBox = NULL;
65 
66 	start = gf_bs_get_position(bs);
67 
68 	uuid_type = 0;
69 	size = (u64)gf_bs_read_u32(bs);
70 	hdr_size = 4;
71 	/*fix for some boxes found in some old hinted files*/
72 	if ((size >= 2) && (size <= 4)) {
73 		size = 4;
74 		type = GF_ISOM_BOX_TYPE_VOID;
75 	}
76 	else {
77 		type = gf_bs_read_u32(bs);
78 		hdr_size += 4;
79 		/*no size means till end of file - EXCEPT FOR some old QuickTime boxes...*/
80 		if (type == GF_ISOM_BOX_TYPE_TOTL)
81 			size = 12;
82 		if (!size) {
83 			if (is_root_box) {
84 				GF_LOG(GF_LOG_DEBUG, GF_LOG_CONTAINER, ("[iso file] Warning Read Box type %s (0x%08X) size 0 reading till the end of file\n", gf_4cc_to_str(type), type));
85 				size = gf_bs_available(bs) + 8;
86 			}
87 			else {
88 				GF_LOG(GF_LOG_DEBUG, GF_LOG_CONTAINER, ("[iso file] Warning Read Box type %s (0x%08X) size 0 - patching to size=8 ...\n", gf_4cc_to_str(type), type));
89 				size = 8;
90 			}
91 		}
92 	}
93 	/*handle uuid*/
94 	memset(uuid, 0, 16);
95 	if (type == GF_ISOM_BOX_TYPE_UUID) {
96 		gf_bs_read_data(bs, uuid, 16);
97 		hdr_size += 16;
98 	}
99 
100 	//handle large box
101 	if (size == 1) {
102 		size = gf_bs_read_u64(bs);
103 		hdr_size += 8;
104 	}
105 	GF_LOG(GF_LOG_DEBUG, GF_LOG_CONTAINER, ("[iso file] Read Box type %s size "LLD" start "LLD"\n", gf_4cc_to_str(type), LLD_CAST size, LLD_CAST start));
106 
107 	if (size < hdr_size) {
108 		GF_LOG(GF_LOG_DEBUG, GF_LOG_CONTAINER, ("[iso file] Box size "LLD" less than box header size %d\n", LLD_CAST size, hdr_size));
109 		return GF_ISOM_INVALID_FILE;
110 	}
111 
112 	if (parent_type && (parent_type == GF_ISOM_BOX_TYPE_TREF)) {
113 		newBox = gf_isom_box_new(GF_ISOM_BOX_TYPE_REFT);
114 		if (!newBox) return GF_OUT_OF_MEM;
115 		((GF_TrackReferenceTypeBox*)newBox)->reference_type = type;
116 	}
117 	else if (parent_type && (parent_type == GF_ISOM_BOX_TYPE_IREF)) {
118 		newBox = gf_isom_box_new(GF_ISOM_BOX_TYPE_REFI);
119 		if (!newBox) return GF_OUT_OF_MEM;
120 		((GF_ItemReferenceTypeBox*)newBox)->reference_type = type;
121 	}
122 	else {
123 		//OK, create the box based on the type
124 		newBox = gf_isom_box_new(uuid_type ? uuid_type : type);
125 		if (!newBox) return GF_OUT_OF_MEM;
126 	}
127 
128 	//OK, init and read this box
129 	if (type == GF_ISOM_BOX_TYPE_UUID) {
130 		memcpy(((GF_UUIDBox *)newBox)->uuid, uuid, 16);
131 		((GF_UnknownUUIDBox *)newBox)->internal_4cc = uuid_type;
132 	}
133 
134 	if (!newBox->type) newBox->type = type;
135 
136 	end = gf_bs_available(bs);
137 	if (size - hdr_size > end) {
138 		newBox->size = size - hdr_size - end;
139 		*outBox = newBox;
140 		return GF_ISOM_INCOMPLETE_FILE;
141 	}
142 	//we need a special reading for these boxes...
143 	if ((newBox->type == GF_ISOM_BOX_TYPE_STDP) || (newBox->type == GF_ISOM_BOX_TYPE_SDTP)) {
144 		newBox->size = size;
145 		*outBox = newBox;
146 		return GF_OK;
147 	}
148 
149 	newBox->size = size - hdr_size;
150 	e = gf_isom_box_read(newBox, bs);
151 	newBox->size = size;
152 	end = gf_bs_get_position(bs);
153 
154 	if (e && (e != GF_ISOM_INCOMPLETE_FILE)) {
155 		gf_isom_box_del(newBox);
156 		*outBox = NULL;
157 		GF_LOG(GF_LOG_ERROR, GF_LOG_CONTAINER, ("[iso file] Read Box \"%s\" failed (%s) - skiping\n", gf_4cc_to_str(type), gf_error_to_string(e)));
158 		/*let's still try to load the file since no error was notified*/
159 		gf_bs_seek(bs, start + hdr_size);
160 		newBox = free_New();
161 		((GF_FreeSpaceBox*)newBox)->original_4cc = type;
162 		newBox->size = size - hdr_size;
163 		e = gf_isom_box_read(newBox, bs);
164 		newBox->size = size;
165 		end = gf_bs_get_position(bs);
166 		if (e) return e;
167 	}
168 
169 	if (end - start > size) {
170 		GF_LOG(GF_LOG_WARNING, GF_LOG_CONTAINER, ("[iso file] Box \"%s\" size "LLU" invalid (read "LLU")\n", gf_4cc_to_str(type), LLU_CAST size, LLU_CAST(end - start)));
171 		/*let's still try to load the file since no error was notified*/
172 		gf_bs_seek(bs, start + size);
173 	}
174 	else if (end - start < size) {
175 		u32 to_skip = (u32)(size - (end - start));
176 		GF_LOG(GF_LOG_DEBUG, GF_LOG_CONTAINER, ("[iso file] Box \"%s\" has %d extra bytes\n", gf_4cc_to_str(type), to_skip));
177 		gf_bs_skip_bytes(bs, to_skip);
178 	}
179 	*outBox = newBox;
180 	return e;
181 }
182 
183 GF_EXPORT
gf_isom_parse_box(GF_Box ** outBox,GF_BitStream * bs)184 GF_Err gf_isom_parse_box(GF_Box **outBox, GF_BitStream *bs)
185 {
186 	return gf_isom_parse_box_ex(outBox, bs, 0, GF_FALSE);
187 }
188 
gf_isom_full_box_read(GF_Box * ptr,GF_BitStream * bs)189 GF_Err gf_isom_full_box_read(GF_Box *ptr, GF_BitStream *bs)
190 {
191 	GF_FullBox *self = (GF_FullBox *)ptr;
192 	if (ptr->size<4) return GF_ISOM_INVALID_FILE;
193 	self->version = gf_bs_read_u8(bs);
194 	self->flags = gf_bs_read_u24(bs);
195 	ptr->size -= 4;
196 	return GF_OK;
197 }
198 
199 
200 //void gf_isom_full_box_init(GF_Box *a)
201 //{
202 //	GF_FullBox *ptr = (GF_FullBox *)a;
203 //	if (! ptr) return;
204 //	ptr->flags = 0;
205 //	ptr->version = 0;
206 //}
207 
208 
gf_isom_box_array_del(GF_List * other_boxes)209 void gf_isom_box_array_del(GF_List *other_boxes)
210 {
211 	u32 count, i;
212 	GF_Box *a;
213 	if (!other_boxes) return;
214 	count = gf_list_count(other_boxes);
215 	for (i = 0; i < count; i++) {
216 		a = (GF_Box *)gf_list_get(other_boxes, i);
217 		if (a) gf_isom_box_del(a);
218 	}
219 	gf_list_del(other_boxes);
220 }
221 
gf_isom_read_box_list_ex(GF_Box * parent,GF_BitStream * bs,GF_Err (* add_box)(GF_Box * par,GF_Box * b),u32 parent_type)222 GF_Err gf_isom_read_box_list_ex(GF_Box *parent, GF_BitStream *bs, GF_Err(*add_box)(GF_Box *par, GF_Box *b), u32 parent_type)
223 {
224 	GF_Err e;
225 	GF_Box *a = NULL;
226 
227 	while (parent->size) {
228 		e = gf_isom_parse_box_ex(&a, bs, parent_type, GF_FALSE);
229 		if (e) {
230 			if (a) gf_isom_box_del(a);
231 			return e;
232 		}
233 		if (parent->size < a->size) {
234 			GF_LOG(GF_LOG_WARNING, GF_LOG_CONTAINER, ("[iso file] Box \"%s\" is larger than container box\n", gf_4cc_to_str(a->type)));
235 			parent->size = 0;
236 		}
237 		else {
238 			parent->size -= a->size;
239 		}
240 		e = add_box(parent, a);
241 		if (e) {
242 			gf_isom_box_del(a);
243 			return e;
244 		}
245 	}
246 	return GF_OK;
247 }
248 
gf_isom_read_box_list(GF_Box * parent,GF_BitStream * bs,GF_Err (* add_box)(GF_Box * par,GF_Box * b))249 GF_Err gf_isom_read_box_list(GF_Box *parent, GF_BitStream *bs, GF_Err(*add_box)(GF_Box *par, GF_Box *b))
250 {
251 	return gf_isom_read_box_list_ex(parent, bs, add_box, 0);
252 }
253 
254 #ifndef GPAC_DISABLE_ISOM_WRITE
255 
gf_isom_box_get_size(GF_Box * ptr)256 GF_Err gf_isom_box_get_size(GF_Box *ptr)
257 {
258 	ptr->size = 8;
259 
260 	if (ptr->type == GF_ISOM_BOX_TYPE_UUID) {
261 		ptr->size += 16;
262 	}
263 	//the large size is handled during write, cause at this stage we don't know the size
264 	return GF_OK;
265 }
266 
gf_isom_full_box_get_size(GF_Box * ptr)267 GF_Err gf_isom_full_box_get_size(GF_Box *ptr)
268 {
269 	GF_Err e;
270 	e = gf_isom_box_get_size(ptr);
271 	if (e) return e;
272 	ptr->size += 4;
273 	return GF_OK;
274 }
275 
276 
277 GF_EXPORT
gf_isom_box_write_header(GF_Box * ptr,GF_BitStream * bs)278 GF_Err gf_isom_box_write_header(GF_Box *ptr, GF_BitStream *bs)
279 {
280 	u64 start;
281 	if (!bs || !ptr) return GF_BAD_PARAM;
282 	if (!ptr->size) return GF_ISOM_INVALID_FILE;
283 
284 	start = gf_bs_get_position(bs);
285 	if (ptr->size > 0xFFFFFFFF) {
286 		gf_bs_write_u32(bs, 1);
287 	}
288 	else {
289 		gf_bs_write_u32(bs, (u32)ptr->size);
290 	}
291 	gf_bs_write_u32(bs, ptr->type);
292 	if (ptr->type == GF_ISOM_BOX_TYPE_UUID) {
293 		u32 i;
294 		char uuid[16];
295 		char strUUID[32];
296 
297 		switch (((GF_UUIDBox*)ptr)->internal_4cc) {
298 		case GF_ISOM_BOX_UUID_TENC:
299 			memcpy(strUUID, "8974dbce7be74c5184f97148f9882554", 32);
300 			break;
301 		case GF_ISOM_BOX_UUID_PSEC:
302 			memcpy(strUUID, "A2394F525A9B4F14A2446C427C648DF4", 32);
303 			break;
304 		case GF_ISOM_BOX_UUID_MSSM:
305 			memcpy(strUUID, "A5D40B30E81411DDBA2F0800200C9A66", 32);
306 			break;
307 		case GF_ISOM_BOX_UUID_PSSH:
308 			memcpy(strUUID, "D08A4F1810F34A82B6C832D8ABA183D3", 32);
309 			break;
310 		case GF_ISOM_BOX_UUID_TFXD:
311 			memcpy(strUUID, "6D1D9B0542D544E680E2141DAFF757B2", 32);
312 			break;
313 		default:
314 			memset(strUUID, 0, 32);
315 			break;
316 		}
317 
318 		for (i = 0; i < 16; i++) {
319 			char t[3];
320 			t[2] = 0;
321 			t[0] = strUUID[2 * i];
322 			t[1] = strUUID[2 * i + 1];
323 			uuid[i] = (u8)strtol(t, NULL, 16);
324 		}
325 
326 		gf_bs_write_data(bs, uuid, 16);
327 	}
328 	if (ptr->size > 0xFFFFFFFF)
329 		gf_bs_write_u64(bs, ptr->size);
330 
331 	GF_LOG(GF_LOG_DEBUG, GF_LOG_CONTAINER, ("[iso file] Written Box type %s size "LLD" start "LLD"\n", gf_4cc_to_str(ptr->type), LLD_CAST ptr->size, LLD_CAST start));
332 
333 	return GF_OK;
334 }
335 
gf_isom_full_box_write(GF_Box * s,GF_BitStream * bs)336 GF_Err gf_isom_full_box_write(GF_Box *s, GF_BitStream *bs)
337 {
338 	GF_Err e;
339 	GF_FullBox *ptr = (GF_FullBox *)s;
340 	e = gf_isom_box_write_header(s, bs);
341 	if (e) return e;
342 	gf_bs_write_u8(bs, ptr->version);
343 	gf_bs_write_u24(bs, ptr->flags);
344 	return GF_OK;
345 }
346 
347 
gf_isom_box_array_write(GF_Box * parent,GF_List * list,GF_BitStream * bs)348 GF_Err gf_isom_box_array_write(GF_Box *parent, GF_List *list, GF_BitStream *bs)
349 {
350 	u32 count, i;
351 	GF_Box *a;
352 	GF_Err e;
353 	if (!list) return GF_BAD_PARAM;
354 	count = gf_list_count(list);
355 	for (i = 0; i < count; i++) {
356 		a = (GF_Box *)gf_list_get(list, i);
357 		if (a) {
358 			e = gf_isom_box_write(a, bs);
359 			if (e) {
360 				GF_LOG(GF_LOG_ERROR, GF_LOG_CONTAINER, ("ISOBMF: Error %s writing box %s\n", gf_error_to_string(e), gf_4cc_to_str(a->type)));
361 				return e;
362 			}
363 		}
364 	}
365 	return GF_OK;
366 }
367 
gf_isom_box_array_size(GF_Box * parent,GF_List * list)368 GF_Err gf_isom_box_array_size(GF_Box *parent, GF_List *list)
369 {
370 	GF_Err e;
371 	u32 count, i;
372 	GF_Box *a;
373 	if (!list) return GF_BAD_PARAM;
374 
375 	count = gf_list_count(list);
376 	for (i = 0; i < count; i++) {
377 		a = (GF_Box *)gf_list_get(list, i);
378 		if (a) {
379 			e = gf_isom_box_size(a);
380 			if (e) {
381 				GF_LOG(GF_LOG_ERROR, GF_LOG_CONTAINER, ("ISOBMF: Error %s computing box %s size\n", gf_error_to_string(e), gf_4cc_to_str(a->type)));
382 				return e;
383 			}
384 			parent->size += a->size;
385 		}
386 	}
387 	return GF_OK;
388 }
389 
390 #endif /*GPAC_DISABLE_ISOM_WRITE*/
391 
392 GF_EXPORT
gf_isom_box_new(u32 boxType)393 GF_Box *gf_isom_box_new(u32 boxType)
394 {
395 	GF_Box *a;
396 	switch (boxType) {
397 	case GF_ISOM_BOX_TYPE_REFT:
398 		return reftype_New();
399 	case GF_ISOM_BOX_TYPE_REFI:
400 		return ireftype_New();
401 	case GF_ISOM_BOX_TYPE_FREE:
402 		return free_New();
403 	case GF_ISOM_BOX_TYPE_SKIP:
404 		a = free_New();
405 		if (a) a->type = GF_ISOM_BOX_TYPE_SKIP;
406 		return a;
407 	case GF_ISOM_BOX_TYPE_MDAT:
408 		return mdat_New();
409 	case GF_ISOM_BOX_TYPE_MOOV:
410 		return moov_New();
411 	case GF_ISOM_BOX_TYPE_MVHD:
412 		return mvhd_New();
413 	case GF_ISOM_BOX_TYPE_MDHD:
414 		return mdhd_New();
415 	case GF_ISOM_BOX_TYPE_VMHD:
416 		return vmhd_New();
417 	case GF_ISOM_BOX_TYPE_SMHD:
418 		return smhd_New();
419 	case GF_ISOM_BOX_TYPE_HMHD:
420 		return hmhd_New();
421 	case GF_ISOM_BOX_TYPE_ODHD:
422 	case GF_ISOM_BOX_TYPE_CRHD:
423 	case GF_ISOM_BOX_TYPE_SDHD:
424 	case GF_ISOM_BOX_TYPE_NMHD:
425 	case GF_ISOM_BOX_TYPE_STHD:
426 		a = nmhd_New();
427 		if (a) a->type = boxType;
428 		return a;
429 	case GF_ISOM_BOX_TYPE_STBL:
430 		return stbl_New();
431 	case GF_ISOM_BOX_TYPE_DINF:
432 		return dinf_New();
433 	case GF_ISOM_BOX_TYPE_URL:
434 		return url_New();
435 	case GF_ISOM_BOX_TYPE_URN:
436 		return urn_New();
437 	case GF_ISOM_BOX_TYPE_CPRT:
438 		return cprt_New();
439 	case GF_ISOM_BOX_TYPE_KIND:
440 		return kind_New();
441 	case GF_ISOM_BOX_TYPE_CHPL:
442 		return chpl_New();
443 	case GF_ISOM_BOX_TYPE_HDLR:
444 		return hdlr_New();
445 	case GF_ISOM_BOX_TYPE_IODS:
446 		return iods_New();
447 	case GF_ISOM_BOX_TYPE_TRAK:
448 		return trak_New();
449 	case GF_ISOM_BOX_TYPE_MP4S:
450 		return mp4s_New();
451 	case GF_ISOM_BOX_TYPE_MP4A:
452 		return mp4a_New();
453 	case GF_ISOM_BOX_TYPE_GNRM:
454 		return gnrm_New();
455 	case GF_ISOM_BOX_TYPE_GNRV:
456 		return gnrv_New();
457 	case GF_ISOM_BOX_TYPE_GNRA:
458 		return gnra_New();
459 	case GF_ISOM_BOX_TYPE_EDTS:
460 		return edts_New();
461 	case GF_ISOM_BOX_TYPE_UDTA:
462 		return udta_New();
463 	case GF_ISOM_BOX_TYPE_DREF:
464 		return dref_New();
465 	case GF_ISOM_BOX_TYPE_STSD:
466 		return stsd_New();
467 	case GF_ISOM_BOX_TYPE_STTS:
468 		return stts_New();
469 	case GF_ISOM_BOX_TYPE_CTTS:
470 		return ctts_New();
471 	case GF_ISOM_BOX_TYPE_CSLG:
472 		return cslg_New();
473 	case GF_ISOM_BOX_TYPE_STSH:
474 		return stsh_New();
475 	case GF_ISOM_BOX_TYPE_ELST:
476 		return elst_New();
477 	case GF_ISOM_BOX_TYPE_STSC:
478 		return stsc_New();
479 	case GF_ISOM_BOX_TYPE_STZ2:
480 	case GF_ISOM_BOX_TYPE_STSZ:
481 		a = stsz_New();
482 		if (a) a->type = boxType;
483 		return a;
484 	case GF_ISOM_BOX_TYPE_STCO:
485 		return stco_New();
486 	case GF_ISOM_BOX_TYPE_STSS:
487 		return stss_New();
488 	case GF_ISOM_BOX_TYPE_STDP:
489 		return stdp_New();
490 	case GF_ISOM_BOX_TYPE_SDTP:
491 		return sdtp_New();
492 	case GF_ISOM_BOX_TYPE_CO64:
493 		return co64_New();
494 	case GF_ISOM_BOX_TYPE_ESDS:
495 		return esds_New();
496 	case GF_ISOM_BOX_TYPE_MINF:
497 		return minf_New();
498 	case GF_ISOM_BOX_TYPE_TKHD:
499 		return tkhd_New();
500 	case GF_ISOM_BOX_TYPE_TREF:
501 		return tref_New();
502 	case GF_ISOM_BOX_TYPE_MDIA:
503 		return mdia_New();
504 	case GF_ISOM_BOX_TYPE_MFRA:
505 		return mfra_New();
506 	case GF_ISOM_BOX_TYPE_TFRA:
507 		return tfra_New();
508 	case GF_ISOM_BOX_TYPE_ELNG:
509 		return elng_New();
510 
511 	case GF_ISOM_BOX_TYPE_FTYP:
512 	case GF_ISOM_BOX_TYPE_STYP:
513 		a = ftyp_New();
514 		if (a) a->type = boxType;
515 		return a;
516 	case GF_ISOM_BOX_TYPE_PADB:
517 		return padb_New();
518 	case GF_ISOM_BOX_TYPE_VOID:
519 		return void_New();
520 	case GF_ISOM_BOX_TYPE_STSF:
521 		return stsf_New();
522 	case GF_ISOM_BOX_TYPE_PDIN:
523 		return pdin_New();
524 	case GF_ISOM_BOX_TYPE_SBGP:
525 		return sbgp_New();
526 	case GF_ISOM_BOX_TYPE_SGPD:
527 		return sgpd_New();
528 	case GF_ISOM_BOX_TYPE_SAIZ:
529 		return saiz_New();
530 	case GF_ISOM_BOX_TYPE_SAIO:
531 		return saio_New();
532 	case GF_ISOM_BOX_TYPE_PSSH:
533 		return pssh_New();
534 	case GF_ISOM_BOX_TYPE_TENC:
535 		return tenc_New();
536 
537 #ifndef GPAC_DISABLE_ISOM_HINTING
538 	case GF_ISOM_BOX_TYPE_RTP_STSD:
539 		a = ghnt_New();
540 		if (a) a->type = boxType;
541 		return a;
542 	case GF_ISOM_BOX_TYPE_RTPO:
543 		return rtpo_New();
544 	case GF_ISOM_BOX_TYPE_HNTI:
545 		return hnti_New();
546 	case GF_ISOM_BOX_TYPE_SDP:
547 		return sdp_New();
548 	case GF_ISOM_BOX_TYPE_HINF:
549 		return hinf_New();
550 	case GF_ISOM_BOX_TYPE_RELY:
551 		return rely_New();
552 	case GF_ISOM_BOX_TYPE_TIMS:
553 		return tims_New();
554 	case GF_ISOM_BOX_TYPE_TSRO:
555 		return tsro_New();
556 	case GF_ISOM_BOX_TYPE_SNRO:
557 		return snro_New();
558 	case GF_ISOM_BOX_TYPE_TRPY:
559 		return trpy_New();
560 	case GF_ISOM_BOX_TYPE_NUMP:
561 		return nump_New();
562 	case GF_ISOM_BOX_TYPE_TOTL:
563 		return totl_New();
564 	case GF_ISOM_BOX_TYPE_NPCK:
565 		return npck_New();
566 	case GF_ISOM_BOX_TYPE_TPYL:
567 		return tpyl_New();
568 	case GF_ISOM_BOX_TYPE_TPAY:
569 		return tpay_New();
570 	case GF_ISOM_BOX_TYPE_MAXR:
571 		return maxr_New();
572 	case GF_ISOM_BOX_TYPE_DMED:
573 		return dmed_New();
574 	case GF_ISOM_BOX_TYPE_DIMM:
575 		return dimm_New();
576 	case GF_ISOM_BOX_TYPE_DREP:
577 		return drep_New();
578 	case GF_ISOM_BOX_TYPE_TMIN:
579 		return tmin_New();
580 	case GF_ISOM_BOX_TYPE_TMAX:
581 		return tmax_New();
582 	case GF_ISOM_BOX_TYPE_PMAX:
583 		return pmax_New();
584 	case GF_ISOM_BOX_TYPE_DMAX:
585 		return dmax_New();
586 	case GF_ISOM_BOX_TYPE_PAYT:
587 		return payt_New();
588 	case GF_ISOM_BOX_TYPE_NAME:
589 		return name_New();
590 #endif /*GPAC_DISABLE_ISOM_HINTING*/
591 
592 #ifndef	GPAC_DISABLE_ISOM_FRAGMENTS
593 	case GF_ISOM_BOX_TYPE_MVEX:
594 		return mvex_New();
595 	case GF_ISOM_BOX_TYPE_MEHD:
596 		return mehd_New();
597 	case GF_ISOM_BOX_TYPE_TREX:
598 		return trex_New();
599 	case GF_ISOM_BOX_TYPE_TREP:
600 		return trep_New();
601 	case GF_ISOM_BOX_TYPE_MOOF:
602 		return moof_New();
603 	case GF_ISOM_BOX_TYPE_MFHD:
604 		return mfhd_New();
605 	case GF_ISOM_BOX_TYPE_TRAF:
606 		return traf_New();
607 	case GF_ISOM_BOX_TYPE_TFHD:
608 		return tfhd_New();
609 	case GF_ISOM_BOX_TYPE_TRUN:
610 		return trun_New();
611 #endif
612 
613 		/*3GPP boxes*/
614 	case GF_ISOM_SUBTYPE_3GP_AMR:
615 	case GF_ISOM_SUBTYPE_3GP_AMR_WB:
616 	case GF_ISOM_SUBTYPE_3GP_EVRC:
617 	case GF_ISOM_SUBTYPE_3GP_QCELP:
618 	case GF_ISOM_SUBTYPE_3GP_SMV:
619 		return gppa_New(boxType);
620 	case GF_ISOM_SUBTYPE_3GP_H263:
621 		return gppv_New(boxType);
622 	case GF_ISOM_BOX_TYPE_DAMR:
623 	case GF_ISOM_BOX_TYPE_DEVC:
624 	case GF_ISOM_BOX_TYPE_DQCP:
625 	case GF_ISOM_BOX_TYPE_DSMV:
626 	case GF_ISOM_BOX_TYPE_D263:
627 		return gppc_New(boxType);
628 
629 		/*AVC boxes*/
630 	case GF_ISOM_BOX_TYPE_AVCC:
631 	case GF_ISOM_BOX_TYPE_SVCC:
632 		a = avcc_New();
633 		if (a) a->type = boxType;
634 		return a;
635 	case GF_ISOM_BOX_TYPE_HVCC:
636 	case GF_ISOM_BOX_TYPE_LHVC:
637 		a = hvcc_New();
638 		if (a) a->type = boxType;
639 		return a;
640 
641 	case GF_ISOM_BOX_TYPE_BTRT:
642 		return btrt_New();
643 	case GF_ISOM_BOX_TYPE_M4DS:
644 		return m4ds_New();
645 
646 	case GF_ISOM_BOX_TYPE_MP4V:
647 	case GF_ISOM_BOX_TYPE_ENCV:
648 	case GF_ISOM_BOX_TYPE_AVC1:
649 	case GF_ISOM_BOX_TYPE_AVC2:
650 	case GF_ISOM_BOX_TYPE_AVC3:
651 	case GF_ISOM_BOX_TYPE_AVC4:
652 	case GF_ISOM_BOX_TYPE_SVC1:
653 	case GF_ISOM_BOX_TYPE_HVC1:
654 	case GF_ISOM_BOX_TYPE_HEV1:
655 	case GF_ISOM_BOX_TYPE_HVC2:
656 	case GF_ISOM_BOX_TYPE_HEV2:
657 	case GF_ISOM_BOX_TYPE_LHV1:
658 	case GF_ISOM_BOX_TYPE_LHE1:
659 	case GF_ISOM_BOX_TYPE_HVT1:
660 		return mp4v_encv_avc_hevc_new(boxType);
661 
662 		/*3GPP streaming text*/
663 	case GF_ISOM_BOX_TYPE_FTAB:
664 		return ftab_New();
665 	case GF_ISOM_BOX_TYPE_TX3G:
666 		return tx3g_New();
667 	case GF_ISOM_BOX_TYPE_TEXT:
668 		return text_New();
669 	case GF_ISOM_BOX_TYPE_STYL:
670 		return styl_New();
671 	case GF_ISOM_BOX_TYPE_HLIT:
672 		return hlit_New();
673 	case GF_ISOM_BOX_TYPE_HCLR:
674 		return hclr_New();
675 	case GF_ISOM_BOX_TYPE_KROK:
676 		return krok_New();
677 	case GF_ISOM_BOX_TYPE_DLAY:
678 		return dlay_New();
679 	case GF_ISOM_BOX_TYPE_HREF:
680 		return href_New();
681 	case GF_ISOM_BOX_TYPE_TBOX:
682 		return tbox_New();
683 	case GF_ISOM_BOX_TYPE_BLNK:
684 		return blnk_New();
685 	case GF_ISOM_BOX_TYPE_TWRP:
686 		return twrp_New();
687 
688 		/* ISMA 1.0 Encryption and Authentication V 1.0 */
689 	case GF_ISOM_BOX_TYPE_IKMS:
690 		return iKMS_New();
691 	case GF_ISOM_BOX_TYPE_ISFM:
692 		return iSFM_New();
693 
694 		/* ISO FF extensions for MPEG-21 */
695 	case GF_ISOM_BOX_TYPE_META:
696 		return meta_New();
697 	case GF_ISOM_BOX_TYPE_XML:
698 		return xml_New();
699 	case GF_ISOM_BOX_TYPE_BXML:
700 		return bxml_New();
701 	case GF_ISOM_BOX_TYPE_ILOC:
702 		return iloc_New();
703 	case GF_ISOM_BOX_TYPE_PITM:
704 		return pitm_New();
705 	case GF_ISOM_BOX_TYPE_IPRO:
706 		return ipro_New();
707 	case GF_ISOM_BOX_TYPE_INFE:
708 		return infe_New();
709 	case GF_ISOM_BOX_TYPE_IINF:
710 		return iinf_New();
711 	case GF_ISOM_BOX_TYPE_IREF:
712 		return iref_New();
713 	case GF_ISOM_BOX_TYPE_SINF:
714 		return sinf_New();
715 	case GF_ISOM_BOX_TYPE_FRMA:
716 		return frma_New();
717 	case GF_ISOM_BOX_TYPE_SCHM:
718 		return schm_New();
719 	case GF_ISOM_BOX_TYPE_SCHI:
720 		return schi_New();
721 	case GF_ISOM_BOX_TYPE_ENCA:
722 		return enca_New();
723 	case GF_ISOM_BOX_TYPE_ENCS:
724 		return encs_New();
725 
726 	case GF_ISOM_BOX_TYPE_SENC:
727 		return senc_New();
728 
729 	case GF_ISOM_BOX_UUID_TENC:
730 		return piff_tenc_New();
731 	case GF_ISOM_BOX_UUID_PSEC:
732 		return piff_psec_New();
733 	case GF_ISOM_BOX_UUID_PSSH:
734 		return piff_pssh_New();
735 	case GF_ISOM_BOX_UUID_TFXD:
736 		return tfxd_New();
737 	case GF_ISOM_BOX_UUID_MSSM:
738 	case GF_ISOM_BOX_UUID_TFRF:
739 	case GF_ISOM_BOX_TYPE_UUID:
740 		return uuid_New();
741 
742 #ifndef GPAC_DISABLE_ISOM_ADOBE
743 		/* Adobe extensions */
744 	case GF_ISOM_BOX_TYPE_ABST:
745 		return abst_New();
746 	case GF_ISOM_BOX_TYPE_AFRA:
747 		return afra_New();
748 	case GF_ISOM_BOX_TYPE_ASRT:
749 		return asrt_New();
750 	case GF_ISOM_BOX_TYPE_AFRT:
751 		return afrt_New();
752 #endif
753 
754 		/* Apple extensions */
755 	case GF_ISOM_BOX_TYPE_ILST:
756 		return ilst_New();
757 
758 	case GF_ISOM_BOX_TYPE_0xA9NAM:
759 	case GF_ISOM_BOX_TYPE_0xA9CMT:
760 	case GF_ISOM_BOX_TYPE_0xA9DAY:
761 	case GF_ISOM_BOX_TYPE_0xA9ART:
762 	case GF_ISOM_BOX_TYPE_0xA9TRK:
763 	case GF_ISOM_BOX_TYPE_0xA9ALB:
764 	case GF_ISOM_BOX_TYPE_0xA9COM:
765 	case GF_ISOM_BOX_TYPE_0xA9WRT:
766 	case GF_ISOM_BOX_TYPE_0xA9TOO:
767 	case GF_ISOM_BOX_TYPE_0xA9CPY:
768 	case GF_ISOM_BOX_TYPE_0xA9DES:
769 	case GF_ISOM_BOX_TYPE_0xA9GEN:
770 	case GF_ISOM_BOX_TYPE_0xA9GRP:
771 	case GF_ISOM_BOX_TYPE_0xA9ENC:
772 	case GF_ISOM_BOX_TYPE_aART:
773 	case GF_ISOM_BOX_TYPE_GNRE:
774 	case GF_ISOM_BOX_TYPE_DISK:
775 	case GF_ISOM_BOX_TYPE_TRKN:
776 	case GF_ISOM_BOX_TYPE_TMPO:
777 	case GF_ISOM_BOX_TYPE_CPIL:
778 	case GF_ISOM_BOX_TYPE_PGAP:
779 	case GF_ISOM_BOX_TYPE_COVR:
780 		return ListItem_New(boxType);
781 
782 	case GF_ISOM_BOX_TYPE_DATA:
783 		return data_New();
784 
785 	case GF_ISOM_BOX_TYPE_OHDR:
786 		return ohdr_New();
787 	case GF_ISOM_BOX_TYPE_GRPI:
788 		return grpi_New();
789 	case GF_ISOM_BOX_TYPE_MDRI:
790 		return mdri_New();
791 	case GF_ISOM_BOX_TYPE_ODTT:
792 		return odtt_New();
793 	case GF_ISOM_BOX_TYPE_ODRB:
794 		return odrb_New();
795 	case GF_ISOM_BOX_TYPE_ODKM:
796 		return odkm_New();
797 	case GF_ISOM_BOX_TYPE_ODAF:
798 		a = iSFM_New();
799 		a->type = GF_ISOM_BOX_TYPE_ODAF;
800 		return a;
801 
802 	case GF_ISOM_BOX_TYPE_PASP:
803 		return pasp_New();
804 	case GF_ISOM_BOX_TYPE_TSEL:
805 		return tsel_New();
806 
807 	case GF_ISOM_BOX_TYPE_DIMS:
808 		return dims_New();
809 	case GF_ISOM_BOX_TYPE_DIMC:
810 		return dimC_New();
811 	case GF_ISOM_BOX_TYPE_DIST:
812 		return diST_New();
813 
814 	case GF_ISOM_BOX_TYPE_METX:
815 	case GF_ISOM_BOX_TYPE_METT:
816 		return metx_New(boxType);
817 
818 	case GF_ISOM_BOX_TYPE_AC3:
819 	case GF_ISOM_BOX_TYPE_EC3:
820 		return ac3_New(boxType);
821 	case GF_ISOM_BOX_TYPE_DAC3:
822 	case GF_ISOM_BOX_TYPE_DEC3:
823 		return dac3_New(boxType);
824 
825 	case GF_ISOM_BOX_TYPE_LSRC:
826 		return lsrc_New();
827 	case GF_ISOM_BOX_TYPE_LSR1:
828 		return lsr1_New();
829 
830 #ifndef GPAC_DISABLE_ISOM_FRAGMENTS
831 	case GF_ISOM_BOX_TYPE_SIDX:
832 		return sidx_New();
833 	case GF_ISOM_BOX_TYPE_SUBS:
834 		return subs_New();
835 	case GF_ISOM_BOX_TYPE_TFDT:
836 		return tfdt_New();
837 	case GF_ISOM_BOX_TYPE_PCRB:
838 		return pcrb_New();
839 #endif
840 	case GF_ISOM_BOX_TYPE_RVCC:
841 		return rvcc_New();
842 
843 	case GF_ISOM_BOX_TYPE_PRFT:
844 		return prft_New();
845 	case GF_ISOM_BOX_TYPE_TRGR:
846 		return trgr_New();
847 	case GF_ISOM_BOX_TYPE_TRGT:
848 	case GF_ISOM_BOX_TYPE_MSRC:
849 	case GF_ISOM_BOX_TYPE_CSTG:
850 	case GF_ISOM_BOX_TYPE_STER:
851 		return trgt_New(boxType);
852 
853 #ifndef GPAC_DISABLE_TTXT
854 	case GF_ISOM_BOX_TYPE_STXT:
855 		return metx_New(GF_ISOM_BOX_TYPE_STXT);
856 	case GF_ISOM_BOX_TYPE_TXTC:
857 		return txtc_New();
858 
859 
860 
861 	case GF_ISOM_BOX_TYPE_STPP:
862 		return metx_New(GF_ISOM_BOX_TYPE_STPP);
863 	case GF_ISOM_BOX_TYPE_SBTT:
864 		return metx_New(GF_ISOM_BOX_TYPE_SBTT);
865 #endif //GPAC_DISABLE_TTXT
866 
867 	case GF_ISOM_BOX_TYPE_ADKM:
868 		return adkm_New();
869 	case GF_ISOM_BOX_TYPE_AHDR:
870 		return ahdr_New();
871 	case GF_ISOM_BOX_TYPE_APRM:
872 		return aprm_New();
873 	case GF_ISOM_BOX_TYPE_AEIB:
874 		return aeib_New();
875 	case GF_ISOM_BOX_TYPE_AKEY:
876 		return akey_New();
877 	case GF_ISOM_BOX_TYPE_FLXS:
878 		return flxs_New();
879 	case GF_ISOM_BOX_TYPE_ADAF:
880 		return adaf_New();
881 	default:
882 		a = defa_New();
883 		if (a) a->type = boxType;
884 		return a;
885 	}
886 }
887 
888 GF_EXPORT
gf_isom_box_add_default(GF_Box * a,GF_Box * subbox)889 GF_Err gf_isom_box_add_default(GF_Box *a, GF_Box *subbox)
890 {
891 	if (!a->other_boxes) {
892 		a->other_boxes = gf_list_new();
893 		if (!a->other_boxes) return GF_OUT_OF_MEM;
894 	}
895 	return gf_list_add(a->other_boxes, subbox);
896 }
897 
898 GF_EXPORT
gf_isom_box_del(GF_Box * a)899 void gf_isom_box_del(GF_Box *a)
900 {
901 	if (!a) return;
902 	if (a->other_boxes) {
903 		gf_isom_box_array_del(a->other_boxes);
904 		a->other_boxes = NULL;
905 	}
906 	switch (a->type) {
907 	case GF_ISOM_BOX_TYPE_REFT:
908 		reftype_del(a);
909 		return;
910 	case GF_ISOM_BOX_TYPE_REFI:
911 		ireftype_del(a);
912 		return;
913 	case GF_ISOM_BOX_TYPE_FREE:
914 	case GF_ISOM_BOX_TYPE_SKIP:
915 		free_del(a);
916 		return;
917 	case GF_ISOM_BOX_TYPE_MDAT:
918 		mdat_del(a);
919 		return;
920 	case GF_ISOM_BOX_TYPE_MOOV:
921 		moov_del(a);
922 		return;
923 	case GF_ISOM_BOX_TYPE_MVHD:
924 		mvhd_del(a);
925 		return;
926 	case GF_ISOM_BOX_TYPE_MDHD:
927 		mdhd_del(a);
928 		return;
929 	case GF_ISOM_BOX_TYPE_VMHD:
930 		vmhd_del(a);
931 		return;
932 	case GF_ISOM_BOX_TYPE_SMHD:
933 		smhd_del(a);
934 		return;
935 	case GF_ISOM_BOX_TYPE_HMHD:
936 		hmhd_del(a);
937 		return;
938 	case GF_ISOM_BOX_TYPE_ODHD:
939 	case GF_ISOM_BOX_TYPE_CRHD:
940 	case GF_ISOM_BOX_TYPE_SDHD:
941 	case GF_ISOM_BOX_TYPE_NMHD:
942 		nmhd_del(a);
943 		return;
944 	case GF_ISOM_BOX_TYPE_STBL:
945 		stbl_del(a);
946 		return;
947 	case GF_ISOM_BOX_TYPE_DINF:
948 		dinf_del(a);
949 		return;
950 	case GF_ISOM_BOX_TYPE_URL:
951 		url_del(a);
952 		return;
953 	case GF_ISOM_BOX_TYPE_URN:
954 		urn_del(a);
955 		return;
956 	case GF_ISOM_BOX_TYPE_CHPL:
957 		chpl_del(a);
958 		return;
959 	case GF_ISOM_BOX_TYPE_CPRT:
960 		cprt_del(a);
961 		return;
962 	case GF_ISOM_BOX_TYPE_KIND:
963 		kind_del(a);
964 		return;
965 	case GF_ISOM_BOX_TYPE_HDLR:
966 		hdlr_del(a);
967 		return;
968 	case GF_ISOM_BOX_TYPE_IODS:
969 		iods_del(a);
970 		return;
971 	case GF_ISOM_BOX_TYPE_TRAK:
972 		trak_del(a);
973 		return;
974 	case GF_ISOM_BOX_TYPE_MP4S:
975 		mp4s_del(a);
976 		return;
977 	case GF_4CC('2', '6', '4', 'b'):
978 	case GF_ISOM_BOX_TYPE_MP4V:
979 		mp4v_del(a);
980 		return;
981 	case GF_ISOM_BOX_TYPE_MP4A:
982 		mp4a_del(a);
983 		return;
984 	case GF_ISOM_BOX_TYPE_GNRM:
985 		gnrm_del(a);
986 		return;
987 	case GF_ISOM_BOX_TYPE_GNRV:
988 		gnrv_del(a);
989 		return;
990 	case GF_ISOM_BOX_TYPE_GNRA:
991 		gnra_del(a);
992 		return;
993 	case GF_ISOM_BOX_TYPE_EDTS:
994 		edts_del(a);
995 		return;
996 	case GF_ISOM_BOX_TYPE_UDTA:
997 		udta_del(a);
998 		return;
999 	case GF_ISOM_BOX_TYPE_DREF:
1000 		dref_del(a);
1001 		return;
1002 	case GF_ISOM_BOX_TYPE_STSD:
1003 		stsd_del(a);
1004 		return;
1005 	case GF_ISOM_BOX_TYPE_STTS:
1006 		stts_del(a);
1007 		return;
1008 	case GF_ISOM_BOX_TYPE_CTTS:
1009 		ctts_del(a);
1010 		return;
1011 	case GF_ISOM_BOX_TYPE_CSLG:
1012 		cslg_del(a);
1013 		return;
1014 	case GF_ISOM_BOX_TYPE_STSH:
1015 		stsh_del(a);
1016 		return;
1017 	case GF_ISOM_BOX_TYPE_ELST:
1018 		elst_del(a);
1019 		return;
1020 	case GF_ISOM_BOX_TYPE_STSC:
1021 		stsc_del(a);
1022 		return;
1023 	case GF_ISOM_BOX_TYPE_STZ2:
1024 	case GF_ISOM_BOX_TYPE_STSZ:
1025 		stsz_del(a);
1026 		return;
1027 	case GF_ISOM_BOX_TYPE_STCO:
1028 		stco_del(a);
1029 		return;
1030 	case GF_ISOM_BOX_TYPE_STSS:
1031 		stss_del(a);
1032 		return;
1033 	case GF_ISOM_BOX_TYPE_STDP:
1034 		stdp_del(a);
1035 		return;
1036 	case GF_ISOM_BOX_TYPE_SDTP:
1037 		sdtp_del(a);
1038 		return;
1039 	case GF_ISOM_BOX_TYPE_CO64:
1040 		co64_del(a);
1041 		return;
1042 	case GF_ISOM_BOX_TYPE_ESDS:
1043 		esds_del(a);
1044 		return;
1045 	case GF_ISOM_BOX_TYPE_MINF:
1046 		minf_del(a);
1047 		return;
1048 	case GF_ISOM_BOX_TYPE_TKHD:
1049 		tkhd_del(a);
1050 		return;
1051 	case GF_ISOM_BOX_TYPE_TREF:
1052 		tref_del(a);
1053 		return;
1054 	case GF_ISOM_BOX_TYPE_MDIA:
1055 		mdia_del(a);
1056 		return;
1057 	case GF_ISOM_BOX_TYPE_MFRA:
1058 		mfra_del(a);
1059 		return;
1060 	case GF_ISOM_BOX_TYPE_TFRA:
1061 		tfra_del(a);
1062 		return;
1063 
1064 	case GF_ISOM_BOX_TYPE_ELNG:
1065 		elng_del(a);
1066 		return;
1067 	case GF_ISOM_BOX_TYPE_FTYP:
1068 	case GF_ISOM_BOX_TYPE_STYP:
1069 		ftyp_del(a);
1070 		return;
1071 	case GF_ISOM_BOX_TYPE_PADB:
1072 		padb_del(a);
1073 		return;
1074 	case GF_ISOM_BOX_TYPE_VOID:
1075 		void_del(a);
1076 		return;
1077 	case GF_ISOM_BOX_TYPE_STSF:
1078 		stsf_del(a);
1079 		return;
1080 	case GF_ISOM_BOX_TYPE_PDIN:
1081 		pdin_del(a);
1082 		return;
1083 	case GF_ISOM_BOX_TYPE_SBGP:
1084 		sbgp_del(a);
1085 		return;
1086 	case GF_ISOM_BOX_TYPE_SGPD:
1087 		sgpd_del(a);
1088 		return;
1089 	case GF_ISOM_BOX_TYPE_SAIZ:
1090 		saiz_del(a);
1091 		return;
1092 	case GF_ISOM_BOX_TYPE_SAIO:
1093 		saio_del(a);
1094 		return;
1095 	case GF_ISOM_BOX_TYPE_PSSH:
1096 		pssh_del(a);
1097 		return;
1098 	case GF_ISOM_BOX_TYPE_TENC:
1099 		tenc_del(a);
1100 		return;
1101 
1102 
1103 #ifndef GPAC_DISABLE_ISOM_HINTING
1104 	case GF_ISOM_BOX_TYPE_RTP_STSD:
1105 		ghnt_del(a);
1106 		return;
1107 	case GF_ISOM_BOX_TYPE_RTPO:
1108 		rtpo_del(a);
1109 		return;
1110 	case GF_ISOM_BOX_TYPE_HNTI:
1111 		hnti_del(a);
1112 		return;
1113 	case GF_ISOM_BOX_TYPE_SDP:
1114 		sdp_del(a);
1115 		return;
1116 	case GF_ISOM_BOX_TYPE_HINF:
1117 		hinf_del(a);
1118 		return;
1119 	case GF_ISOM_BOX_TYPE_RELY:
1120 		rely_del(a);
1121 		return;
1122 	case GF_ISOM_BOX_TYPE_TIMS:
1123 		tims_del(a);
1124 		return;
1125 	case GF_ISOM_BOX_TYPE_TSRO:
1126 		tsro_del(a);
1127 		return;
1128 	case GF_ISOM_BOX_TYPE_SNRO:
1129 		snro_del(a);
1130 		return;
1131 	case GF_ISOM_BOX_TYPE_TRPY:
1132 		trpy_del(a);
1133 		return;
1134 	case GF_ISOM_BOX_TYPE_NUMP:
1135 		nump_del(a);
1136 		return;
1137 	case GF_ISOM_BOX_TYPE_TOTL:
1138 		totl_del(a);
1139 		return;
1140 	case GF_ISOM_BOX_TYPE_NPCK:
1141 		npck_del(a);
1142 		return;
1143 	case GF_ISOM_BOX_TYPE_TPYL:
1144 		tpyl_del(a);
1145 		return;
1146 	case GF_ISOM_BOX_TYPE_TPAY:
1147 		tpay_del(a);
1148 		return;
1149 	case GF_ISOM_BOX_TYPE_MAXR:
1150 		maxr_del(a);
1151 		return;
1152 	case GF_ISOM_BOX_TYPE_DMED:
1153 		dmed_del(a);
1154 		return;
1155 	case GF_ISOM_BOX_TYPE_DIMM:
1156 		dimm_del(a);
1157 		return;
1158 	case GF_ISOM_BOX_TYPE_DREP:
1159 		drep_del(a);
1160 		return;
1161 	case GF_ISOM_BOX_TYPE_TMIN:
1162 		tmin_del(a);
1163 		return;
1164 	case GF_ISOM_BOX_TYPE_TMAX:
1165 		tmax_del(a);
1166 		return;
1167 	case GF_ISOM_BOX_TYPE_PMAX:
1168 		pmax_del(a);
1169 		return;
1170 	case GF_ISOM_BOX_TYPE_DMAX:
1171 		dmax_del(a);
1172 		return;
1173 	case GF_ISOM_BOX_TYPE_PAYT:
1174 		payt_del(a);
1175 		return;
1176 	case GF_ISOM_BOX_TYPE_NAME:
1177 		name_del(a);
1178 		return;
1179 #endif /*GPAC_DISABLE_ISOM_HINTING*/
1180 
1181 #ifndef	GPAC_DISABLE_ISOM_FRAGMENTS
1182 	case GF_ISOM_BOX_TYPE_MVEX:
1183 		mvex_del(a);
1184 		return;
1185 	case GF_ISOM_BOX_TYPE_MEHD:
1186 		mehd_del(a);
1187 		return;
1188 	case GF_ISOM_BOX_TYPE_TREX:
1189 		trex_del(a);
1190 		return;
1191 	case GF_ISOM_BOX_TYPE_TREP:
1192 		trep_del(a);
1193 		return;
1194 	case GF_ISOM_BOX_TYPE_MOOF:
1195 		moof_del(a);
1196 		return;
1197 	case GF_ISOM_BOX_TYPE_MFHD:
1198 		mfhd_del(a);
1199 		return;
1200 	case GF_ISOM_BOX_TYPE_TRAF:
1201 		traf_del(a);
1202 		return;
1203 	case GF_ISOM_BOX_TYPE_TFHD:
1204 		tfhd_del(a);
1205 		return;
1206 	case GF_ISOM_BOX_TYPE_TFDT:
1207 		tfdt_del(a);
1208 		return;
1209 	case GF_ISOM_BOX_TYPE_TRUN:
1210 		trun_del(a);
1211 		return;
1212 #endif
1213 
1214 	case GF_ISOM_SUBTYPE_3GP_AMR:
1215 	case GF_ISOM_SUBTYPE_3GP_AMR_WB:
1216 	case GF_ISOM_SUBTYPE_3GP_EVRC:
1217 	case GF_ISOM_SUBTYPE_3GP_QCELP:
1218 	case GF_ISOM_SUBTYPE_3GP_SMV:
1219 		gppa_del(a);
1220 		return;
1221 	case GF_ISOM_SUBTYPE_3GP_H263:
1222 		gppv_del(a);
1223 		return;
1224 	case GF_ISOM_BOX_TYPE_DAMR:
1225 	case GF_ISOM_BOX_TYPE_DEVC:
1226 	case GF_ISOM_BOX_TYPE_DQCP:
1227 	case GF_ISOM_BOX_TYPE_DSMV:
1228 	case GF_ISOM_BOX_TYPE_D263:
1229 		gppc_del(a);
1230 		return;
1231 
1232 		/*AVC boxes*/
1233 	case GF_ISOM_BOX_TYPE_AVCC:
1234 	case GF_ISOM_BOX_TYPE_SVCC:
1235 		avcc_del(a);
1236 		return;
1237 	case GF_ISOM_BOX_TYPE_BTRT:
1238 		btrt_del(a);
1239 		return;
1240 	case GF_ISOM_BOX_TYPE_M4DS:
1241 		m4ds_del(a);
1242 		return;
1243 	case GF_ISOM_BOX_TYPE_AVC1:
1244 	case GF_ISOM_BOX_TYPE_AVC2:
1245 	case GF_ISOM_BOX_TYPE_AVC3:
1246 	case GF_ISOM_BOX_TYPE_AVC4:
1247 	case GF_ISOM_BOX_TYPE_SVC1:
1248 	case GF_ISOM_BOX_TYPE_HVC1:
1249 	case GF_ISOM_BOX_TYPE_HEV1:
1250 	case GF_ISOM_BOX_TYPE_HVC2:
1251 	case GF_ISOM_BOX_TYPE_HEV2:
1252 	case GF_ISOM_BOX_TYPE_LHV1:
1253 	case GF_ISOM_BOX_TYPE_LHE1:
1254 	case GF_ISOM_BOX_TYPE_HVT1:
1255 		mp4v_del(a);
1256 		return;
1257 	case GF_ISOM_BOX_TYPE_HVCC:
1258 	case GF_ISOM_BOX_TYPE_LHVC:
1259 		hvcc_del(a);
1260 		return;
1261 
1262 		/*3GPP streaming text*/
1263 	case GF_ISOM_BOX_TYPE_FTAB:
1264 		ftab_del(a);
1265 		return;
1266 	case GF_ISOM_BOX_TYPE_TX3G:
1267 		tx3g_del(a);
1268 		return;
1269 	case GF_ISOM_BOX_TYPE_TEXT:
1270 		text_del(a);
1271 		return;
1272 	case GF_ISOM_BOX_TYPE_STYL:
1273 		styl_del(a);
1274 		return;
1275 	case GF_ISOM_BOX_TYPE_HLIT:
1276 		hlit_del(a);
1277 		return;
1278 	case GF_ISOM_BOX_TYPE_HCLR:
1279 		hclr_del(a);
1280 		return;
1281 	case GF_ISOM_BOX_TYPE_KROK:
1282 		krok_del(a);
1283 		return;
1284 	case GF_ISOM_BOX_TYPE_DLAY:
1285 		dlay_del(a);
1286 		return;
1287 	case GF_ISOM_BOX_TYPE_HREF:
1288 		href_del(a);
1289 		return;
1290 	case GF_ISOM_BOX_TYPE_TBOX:
1291 		tbox_del(a);
1292 		return;
1293 	case GF_ISOM_BOX_TYPE_BLNK:
1294 		blnk_del(a);
1295 		return;
1296 	case GF_ISOM_BOX_TYPE_TWRP:
1297 		twrp_del(a);
1298 		return;
1299 
1300 		/* ISMA 1.0 Encryption and Authentication V 1.0 */
1301 	case GF_ISOM_BOX_TYPE_IKMS:
1302 		iKMS_del(a);
1303 		return;
1304 	case GF_ISOM_BOX_TYPE_ISFM:
1305 		iSFM_del(a);
1306 		return;
1307 
1308 		/* ISO FF extensions for MPEG-21 */
1309 	case GF_ISOM_BOX_TYPE_META:
1310 		meta_del(a);
1311 		return;
1312 	case GF_ISOM_BOX_TYPE_XML:
1313 		xml_del(a);
1314 		return;
1315 	case GF_ISOM_BOX_TYPE_BXML:
1316 		bxml_del(a);
1317 		return;
1318 	case GF_ISOM_BOX_TYPE_ILOC:
1319 		iloc_del(a);
1320 		return;
1321 	case GF_ISOM_BOX_TYPE_PITM:
1322 		pitm_del(a);
1323 		return;
1324 	case GF_ISOM_BOX_TYPE_IPRO:
1325 		ipro_del(a);
1326 		return;
1327 	case GF_ISOM_BOX_TYPE_INFE:
1328 		infe_del(a);
1329 		return;
1330 	case GF_ISOM_BOX_TYPE_IINF:
1331 		iinf_del(a);
1332 		return;
1333 	case GF_ISOM_BOX_TYPE_IREF:
1334 		iref_del(a);
1335 		return;
1336 	case GF_ISOM_BOX_TYPE_SINF:
1337 		sinf_del(a);
1338 		return;
1339 	case GF_ISOM_BOX_TYPE_FRMA:
1340 		frma_del(a);
1341 		return;
1342 	case GF_ISOM_BOX_TYPE_SCHM:
1343 		schm_del(a);
1344 		return;
1345 	case GF_ISOM_BOX_TYPE_SCHI:
1346 		schi_del(a);
1347 		return;
1348 
1349 	case GF_ISOM_BOX_TYPE_ENCA:
1350 	case GF_ISOM_BOX_TYPE_ENCV:
1351 	case GF_ISOM_BOX_TYPE_ENCS:
1352 	{
1353 		GF_ProtectionInfoBox *sinf = gf_list_get(((GF_SampleEntryBox *)a)->protections, 0);
1354 		a->type = sinf->original_format->data_format;
1355 		gf_isom_box_del(a);
1356 	}
1357 	return;
1358 	case GF_ISOM_BOX_TYPE_SENC:
1359 		senc_del(a);
1360 		return;
1361 	case GF_ISOM_BOX_TYPE_UUID:
1362 		switch (((GF_UnknownUUIDBox *)a)->internal_4cc) {
1363 		case GF_ISOM_BOX_UUID_TENC:
1364 			piff_tenc_del(a);
1365 			return;
1366 		case GF_ISOM_BOX_UUID_PSEC:
1367 			piff_psec_del(a);
1368 			return;
1369 		case GF_ISOM_BOX_UUID_PSSH:
1370 			piff_pssh_del(a);
1371 			return;
1372 		case GF_ISOM_BOX_UUID_TFXD:
1373 			tfxd_del(a);
1374 			return;
1375 		case GF_ISOM_BOX_UUID_MSSM:
1376 		case GF_ISOM_BOX_UUID_TFRF:
1377 		default:
1378 			uuid_del(a);
1379 			return;
1380 		}
1381 		return;
1382 
1383 #ifndef GPAC_DISABLE_ISOM_ADOBE
1384 		/* Adobe extensions */
1385 	case GF_ISOM_BOX_TYPE_ABST:
1386 		abst_del(a);
1387 		return;
1388 	case GF_ISOM_BOX_TYPE_AFRA:
1389 		afra_del(a);
1390 		return;
1391 	case GF_ISOM_BOX_TYPE_ASRT:
1392 		asrt_del(a);
1393 		return;
1394 	case GF_ISOM_BOX_TYPE_AFRT:
1395 		afrt_del(a);
1396 		return;
1397 #endif
1398 
1399 		/* Apple extensions */
1400 	case GF_ISOM_BOX_TYPE_ILST:
1401 		ilst_del(a);
1402 		return;
1403 
1404 	case GF_ISOM_BOX_TYPE_0xA9NAM:
1405 	case GF_ISOM_BOX_TYPE_0xA9CMT:
1406 	case GF_ISOM_BOX_TYPE_0xA9DAY:
1407 	case GF_ISOM_BOX_TYPE_0xA9ART:
1408 	case GF_ISOM_BOX_TYPE_0xA9TRK:
1409 	case GF_ISOM_BOX_TYPE_0xA9ALB:
1410 	case GF_ISOM_BOX_TYPE_0xA9COM:
1411 	case GF_ISOM_BOX_TYPE_0xA9WRT:
1412 	case GF_ISOM_BOX_TYPE_0xA9TOO:
1413 	case GF_ISOM_BOX_TYPE_0xA9CPY:
1414 	case GF_ISOM_BOX_TYPE_0xA9DES:
1415 	case GF_ISOM_BOX_TYPE_0xA9GEN:
1416 	case GF_ISOM_BOX_TYPE_0xA9GRP:
1417 	case GF_ISOM_BOX_TYPE_0xA9ENC:
1418 	case GF_ISOM_BOX_TYPE_aART:
1419 	case GF_ISOM_BOX_TYPE_GNRE:
1420 	case GF_ISOM_BOX_TYPE_DISK:
1421 	case GF_ISOM_BOX_TYPE_TRKN:
1422 	case GF_ISOM_BOX_TYPE_TMPO:
1423 	case GF_ISOM_BOX_TYPE_CPIL:
1424 	case GF_ISOM_BOX_TYPE_PGAP:
1425 	case GF_ISOM_BOX_TYPE_COVR:
1426 		ListItem_del(a);
1427 		return;
1428 
1429 	case GF_ISOM_BOX_TYPE_DATA:
1430 		data_del(a);
1431 		return;
1432 
1433 	case GF_ISOM_BOX_TYPE_OHDR:
1434 		ohdr_del(a);
1435 		return;
1436 	case GF_ISOM_BOX_TYPE_GRPI:
1437 		grpi_del(a);
1438 		return;
1439 	case GF_ISOM_BOX_TYPE_MDRI:
1440 		mdri_del(a);
1441 		return;
1442 	case GF_ISOM_BOX_TYPE_ODTT:
1443 		odtt_del(a);
1444 		return;
1445 	case GF_ISOM_BOX_TYPE_ODRB:
1446 		odrb_del(a);
1447 		return;
1448 	case GF_ISOM_BOX_TYPE_ODKM:
1449 		odkm_del(a);
1450 		return;
1451 	case GF_ISOM_BOX_TYPE_ODAF:
1452 		iSFM_del(a);
1453 		return;
1454 
1455 	case GF_ISOM_BOX_TYPE_PASP:
1456 		pasp_del(a);
1457 		return;
1458 	case GF_ISOM_BOX_TYPE_TSEL:
1459 		tsel_del(a);
1460 		return;
1461 
1462 	case GF_ISOM_BOX_TYPE_METX:
1463 	case GF_ISOM_BOX_TYPE_METT:
1464 		metx_del(a);
1465 		return;
1466 
1467 	case GF_ISOM_BOX_TYPE_DIMS:
1468 		dims_del(a);
1469 		return;
1470 	case GF_ISOM_BOX_TYPE_DIMC:
1471 		dimC_del(a);
1472 		return;
1473 	case GF_ISOM_BOX_TYPE_DIST:
1474 		diST_del(a);
1475 		return;
1476 
1477 	case GF_ISOM_BOX_TYPE_AC3:
1478 		ac3_del(a);
1479 		return;
1480 	case GF_ISOM_BOX_TYPE_DAC3:
1481 		dac3_del(a);
1482 		return;
1483 
1484 	case GF_ISOM_BOX_TYPE_LSRC:
1485 		lsrc_del(a);
1486 		return;
1487 	case GF_ISOM_BOX_TYPE_LSR1:
1488 		lsr1_del(a);
1489 		return;
1490 
1491 	case GF_ISOM_BOX_TYPE_SIDX:
1492 		sidx_del(a);
1493 		return;
1494 	case GF_ISOM_BOX_TYPE_PCRB:
1495 		pcrb_del(a);
1496 		return;
1497 	case GF_ISOM_BOX_TYPE_SUBS:
1498 		subs_del(a);
1499 		return;
1500 	case GF_ISOM_BOX_TYPE_RVCC:
1501 		rvcc_del(a);
1502 		return;
1503 
1504 	case GF_ISOM_BOX_TYPE_PRFT:
1505 		prft_del(a);
1506 		return;
1507 
1508 	case GF_ISOM_BOX_TYPE_TRGR:
1509 		trgr_del(a);
1510 		return;
1511 	case GF_ISOM_BOX_TYPE_TRGT:
1512 		trgt_del(a);
1513 		return;
1514 
1515 #ifndef GPAC_DISABLE_TTXT
1516 	case GF_ISOM_BOX_TYPE_STXT:
1517 		metx_del(a);
1518 		return;
1519 	case GF_ISOM_BOX_TYPE_TXTC:
1520 		txtc_del(a);
1521 		return;
1522 
1523 
1524 	case GF_ISOM_BOX_TYPE_STPP:
1525 		metx_del(a);
1526 		return;
1527 	case GF_ISOM_BOX_TYPE_SBTT:
1528 		metx_del(a);
1529 		return;
1530 
1531 #endif // GPAC_DISABLE_TTXT
1532 
1533 	case GF_ISOM_BOX_TYPE_ADKM:
1534 		adkm_del(a);
1535 		return;
1536 	case GF_ISOM_BOX_TYPE_AHDR:
1537 		ahdr_del(a);
1538 		return;
1539 	case GF_ISOM_BOX_TYPE_APRM:
1540 		aprm_del(a);
1541 		return;
1542 	case GF_ISOM_BOX_TYPE_AEIB:
1543 		aeib_del(a);
1544 		return;
1545 	case GF_ISOM_BOX_TYPE_AKEY:
1546 		akey_del(a);
1547 		return;
1548 	case GF_ISOM_BOX_TYPE_FLXS:
1549 		flxs_del(a);
1550 		return;
1551 	case GF_ISOM_BOX_TYPE_ADAF:
1552 		adaf_del(a);
1553 		return;
1554 
1555 
1556 	default:
1557 		defa_del(a);
1558 		return;
1559 	}
1560 }
1561 
1562 
gf_isom_box_read(GF_Box * a,GF_BitStream * bs)1563 GF_Err gf_isom_box_read(GF_Box *a, GF_BitStream *bs)
1564 {
1565 	switch (a->type) {
1566 	case GF_ISOM_BOX_TYPE_REFT:
1567 		return reftype_Read(a, bs);
1568 	case GF_ISOM_BOX_TYPE_REFI:
1569 		return ireftype_Read(a, bs);
1570 	case GF_ISOM_BOX_TYPE_FREE:
1571 	case GF_ISOM_BOX_TYPE_SKIP:
1572 		return free_Read(a, bs);
1573 	case GF_ISOM_BOX_TYPE_MDAT:
1574 		return mdat_Read(a, bs);
1575 	case GF_ISOM_BOX_TYPE_MOOV:
1576 		return moov_Read(a, bs);
1577 	case GF_ISOM_BOX_TYPE_MVHD:
1578 		return mvhd_Read(a, bs);
1579 	case GF_ISOM_BOX_TYPE_MDHD:
1580 		return mdhd_Read(a, bs);
1581 	case GF_ISOM_BOX_TYPE_VMHD:
1582 		return vmhd_Read(a, bs);
1583 	case GF_ISOM_BOX_TYPE_SMHD:
1584 		return smhd_Read(a, bs);
1585 	case GF_ISOM_BOX_TYPE_HMHD:
1586 		return hmhd_Read(a, bs);
1587 	case GF_ISOM_BOX_TYPE_ODHD:
1588 	case GF_ISOM_BOX_TYPE_CRHD:
1589 	case GF_ISOM_BOX_TYPE_SDHD:
1590 	case GF_ISOM_BOX_TYPE_NMHD:
1591 	case GF_ISOM_BOX_TYPE_STHD:
1592 		return nmhd_Read(a, bs);
1593 	case GF_ISOM_BOX_TYPE_STBL:
1594 		return stbl_Read(a, bs);
1595 	case GF_ISOM_BOX_TYPE_DINF:
1596 		return dinf_Read(a, bs);
1597 	case GF_ISOM_BOX_TYPE_URL:
1598 		return url_Read(a, bs);
1599 	case GF_ISOM_BOX_TYPE_URN:
1600 		return urn_Read(a, bs);
1601 	case GF_ISOM_BOX_TYPE_CPRT:
1602 		return cprt_Read(a, bs);
1603 	case GF_ISOM_BOX_TYPE_KIND:
1604 		return kind_Read(a, bs);
1605 	case GF_ISOM_BOX_TYPE_HDLR:
1606 		return hdlr_Read(a, bs);
1607 	case GF_ISOM_BOX_TYPE_IODS:
1608 		return iods_Read(a, bs);
1609 	case GF_ISOM_BOX_TYPE_TRAK:
1610 		return trak_Read(a, bs);
1611 	case GF_ISOM_BOX_TYPE_MP4S:
1612 		return mp4s_Read(a, bs);
1613 	case GF_ISOM_BOX_TYPE_MP4V:
1614 		return mp4v_Read(a, bs);
1615 	case GF_ISOM_BOX_TYPE_MP4A:
1616 		return mp4a_Read(a, bs);
1617 	case GF_ISOM_BOX_TYPE_EDTS:
1618 		return edts_Read(a, bs);
1619 	case GF_ISOM_BOX_TYPE_UDTA:
1620 		return udta_Read(a, bs);
1621 	case GF_ISOM_BOX_TYPE_DREF:
1622 		return dref_Read(a, bs);
1623 	case GF_ISOM_BOX_TYPE_STSD:
1624 		return stsd_Read(a, bs);
1625 	case GF_ISOM_BOX_TYPE_STTS:
1626 		return stts_Read(a, bs);
1627 	case GF_ISOM_BOX_TYPE_CTTS:
1628 		return ctts_Read(a, bs);
1629 	case GF_ISOM_BOX_TYPE_CSLG:
1630 		return cslg_Read(a, bs);
1631 	case GF_ISOM_BOX_TYPE_STSH:
1632 		return stsh_Read(a, bs);
1633 	case GF_ISOM_BOX_TYPE_ELST:
1634 		return elst_Read(a, bs);
1635 	case GF_ISOM_BOX_TYPE_STSC:
1636 		return stsc_Read(a, bs);
1637 	case GF_ISOM_BOX_TYPE_STZ2:
1638 	case GF_ISOM_BOX_TYPE_STSZ:
1639 		return stsz_Read(a, bs);
1640 	case GF_ISOM_BOX_TYPE_STCO:
1641 		return stco_Read(a, bs);
1642 	case GF_ISOM_BOX_TYPE_STSS:
1643 		return stss_Read(a, bs);
1644 	case GF_ISOM_BOX_TYPE_STDP:
1645 		return stdp_Read(a, bs);
1646 	case GF_ISOM_BOX_TYPE_SDTP:
1647 		return sdtp_Read(a, bs);
1648 	case GF_ISOM_BOX_TYPE_CO64:
1649 		return co64_Read(a, bs);
1650 	case GF_ISOM_BOX_TYPE_ESDS:
1651 		return esds_Read(a, bs);
1652 	case GF_ISOM_BOX_TYPE_MINF:
1653 		return minf_Read(a, bs);
1654 	case GF_ISOM_BOX_TYPE_TKHD:
1655 		return tkhd_Read(a, bs);
1656 	case GF_ISOM_BOX_TYPE_TREF:
1657 		return tref_Read(a, bs);
1658 	case GF_ISOM_BOX_TYPE_MDIA:
1659 		return mdia_Read(a, bs);
1660 	case GF_ISOM_BOX_TYPE_MFRA:
1661 		return mfra_Read(a, bs);
1662 	case GF_ISOM_BOX_TYPE_TFRA:
1663 		return tfra_Read(a, bs);
1664 	case GF_ISOM_BOX_TYPE_ELNG:
1665 		return elng_Read(a, bs);
1666 	case GF_ISOM_BOX_TYPE_CHPL:
1667 		return chpl_Read(a, bs);
1668 	case GF_ISOM_BOX_TYPE_FTYP:
1669 	case GF_ISOM_BOX_TYPE_STYP:
1670 		return ftyp_Read(a, bs);
1671 	case GF_ISOM_BOX_TYPE_PADB:
1672 		return padb_Read(a, bs);
1673 	case GF_ISOM_BOX_TYPE_VOID:
1674 		return void_Read(a, bs);
1675 	case GF_ISOM_BOX_TYPE_STSF:
1676 		return stsf_Read(a, bs);
1677 	case GF_ISOM_BOX_TYPE_PDIN:
1678 		return pdin_Read(a, bs);
1679 	case GF_ISOM_BOX_TYPE_SBGP:
1680 		return sbgp_Read(a, bs);
1681 	case GF_ISOM_BOX_TYPE_SGPD:
1682 		return sgpd_Read(a, bs);
1683 	case GF_ISOM_BOX_TYPE_SAIZ:
1684 		return saiz_Read(a, bs);
1685 	case GF_ISOM_BOX_TYPE_SAIO:
1686 		return saio_Read(a, bs);
1687 	case GF_ISOM_BOX_TYPE_PSSH:
1688 		return pssh_Read(a, bs);
1689 	case GF_ISOM_BOX_TYPE_TENC:
1690 		return tenc_Read(a, bs);
1691 
1692 #ifndef GPAC_DISABLE_ISOM_HINTING
1693 	case GF_ISOM_BOX_TYPE_RTP_STSD:
1694 		return ghnt_Read(a, bs);
1695 	case GF_ISOM_BOX_TYPE_RTPO:
1696 		return rtpo_Read(a, bs);
1697 	case GF_ISOM_BOX_TYPE_HNTI:
1698 		return hnti_Read(a, bs);
1699 	case GF_ISOM_BOX_TYPE_SDP:
1700 		return sdp_Read(a, bs);
1701 	case GF_ISOM_BOX_TYPE_HINF:
1702 		return hinf_Read(a, bs);
1703 	case GF_ISOM_BOX_TYPE_RELY:
1704 		return rely_Read(a, bs);
1705 	case GF_ISOM_BOX_TYPE_TIMS:
1706 		return tims_Read(a, bs);
1707 	case GF_ISOM_BOX_TYPE_TSRO:
1708 		return tsro_Read(a, bs);
1709 	case GF_ISOM_BOX_TYPE_SNRO:
1710 		return snro_Read(a, bs);
1711 	case GF_ISOM_BOX_TYPE_TRPY:
1712 		return trpy_Read(a, bs);
1713 	case GF_ISOM_BOX_TYPE_NUMP:
1714 		return nump_Read(a, bs);
1715 	case GF_ISOM_BOX_TYPE_TOTL:
1716 		return totl_Read(a, bs);
1717 	case GF_ISOM_BOX_TYPE_NPCK:
1718 		return npck_Read(a, bs);
1719 	case GF_ISOM_BOX_TYPE_TPYL:
1720 		return tpyl_Read(a, bs);
1721 	case GF_ISOM_BOX_TYPE_TPAY:
1722 		return tpay_Read(a, bs);
1723 	case GF_ISOM_BOX_TYPE_MAXR:
1724 		return maxr_Read(a, bs);
1725 	case GF_ISOM_BOX_TYPE_DMED:
1726 		return dmed_Read(a, bs);
1727 	case GF_ISOM_BOX_TYPE_DIMM:
1728 		return dimm_Read(a, bs);
1729 	case GF_ISOM_BOX_TYPE_DREP:
1730 		return drep_Read(a, bs);
1731 	case GF_ISOM_BOX_TYPE_TMIN:
1732 		return tmin_Read(a, bs);
1733 	case GF_ISOM_BOX_TYPE_TMAX:
1734 		return tmax_Read(a, bs);
1735 	case GF_ISOM_BOX_TYPE_PMAX:
1736 		return pmax_Read(a, bs);
1737 	case GF_ISOM_BOX_TYPE_DMAX:
1738 		return dmax_Read(a, bs);
1739 	case GF_ISOM_BOX_TYPE_PAYT:
1740 		return payt_Read(a, bs);
1741 	case GF_ISOM_BOX_TYPE_NAME:
1742 		return name_Read(a, bs);
1743 #endif /*GPAC_DISABLE_ISOM_HINTING*/
1744 
1745 #ifndef	GPAC_DISABLE_ISOM_FRAGMENTS
1746 	case GF_ISOM_BOX_TYPE_MVEX:
1747 		return mvex_Read(a, bs);
1748 	case GF_ISOM_BOX_TYPE_MEHD:
1749 		return mehd_Read(a, bs);
1750 	case GF_ISOM_BOX_TYPE_TREX:
1751 		return trex_Read(a, bs);
1752 	case GF_ISOM_BOX_TYPE_TREP:
1753 		return trep_Read(a, bs);
1754 	case GF_ISOM_BOX_TYPE_MOOF:
1755 		return moof_Read(a, bs);
1756 	case GF_ISOM_BOX_TYPE_MFHD:
1757 		return mfhd_Read(a, bs);
1758 	case GF_ISOM_BOX_TYPE_TRAF:
1759 		return traf_Read(a, bs);
1760 	case GF_ISOM_BOX_TYPE_TFHD:
1761 		return tfhd_Read(a, bs);
1762 	case GF_ISOM_BOX_TYPE_TFDT:
1763 		return tfdt_Read(a, bs);
1764 	case GF_ISOM_BOX_TYPE_TRUN:
1765 		return trun_Read(a, bs);
1766 #endif
1767 
1768 
1769 		/*3GPP boxes*/
1770 	case GF_ISOM_SUBTYPE_3GP_AMR:
1771 	case GF_ISOM_SUBTYPE_3GP_AMR_WB:
1772 	case GF_ISOM_SUBTYPE_3GP_EVRC:
1773 	case GF_ISOM_SUBTYPE_3GP_QCELP:
1774 	case GF_ISOM_SUBTYPE_3GP_SMV:
1775 		return gppa_Read(a, bs);
1776 	case GF_ISOM_SUBTYPE_3GP_H263:
1777 		return gppv_Read(a, bs);
1778 	case GF_ISOM_BOX_TYPE_DAMR:
1779 	case GF_ISOM_BOX_TYPE_DEVC:
1780 	case GF_ISOM_BOX_TYPE_DQCP:
1781 	case GF_ISOM_BOX_TYPE_DSMV:
1782 	case GF_ISOM_BOX_TYPE_D263:
1783 		return gppc_Read(a, bs);
1784 
1785 	case GF_ISOM_BOX_TYPE_AVCC:
1786 	case GF_ISOM_BOX_TYPE_SVCC:
1787 		return avcc_Read(a, bs);
1788 	case GF_ISOM_BOX_TYPE_BTRT:
1789 		return btrt_Read(a, bs);
1790 	case GF_ISOM_BOX_TYPE_M4DS:
1791 		return m4ds_Read(a, bs);
1792 	case GF_ISOM_BOX_TYPE_AVC1:
1793 	case GF_ISOM_BOX_TYPE_AVC2:
1794 	case GF_ISOM_BOX_TYPE_AVC3:
1795 	case GF_ISOM_BOX_TYPE_AVC4:
1796 	case GF_ISOM_BOX_TYPE_SVC1:
1797 	case GF_ISOM_BOX_TYPE_HVC1:
1798 	case GF_ISOM_BOX_TYPE_HEV1:
1799 	case GF_ISOM_BOX_TYPE_HVC2:
1800 	case GF_ISOM_BOX_TYPE_HEV2:
1801 	case GF_ISOM_BOX_TYPE_LHV1:
1802 	case GF_ISOM_BOX_TYPE_LHE1:
1803 	case GF_ISOM_BOX_TYPE_HVT1:
1804 		return mp4v_Read(a, bs);
1805 	case GF_ISOM_BOX_TYPE_HVCC:
1806 	case GF_ISOM_BOX_TYPE_LHVC:
1807 		return hvcc_Read(a, bs);
1808 
1809 		/*3GPP streaming text*/
1810 	case GF_ISOM_BOX_TYPE_FTAB:
1811 		return ftab_Read(a, bs);
1812 	case GF_ISOM_BOX_TYPE_TEXT:
1813 		return text_Read(a, bs);
1814 	case GF_ISOM_BOX_TYPE_TX3G:
1815 		return tx3g_Read(a, bs);
1816 	case GF_ISOM_BOX_TYPE_STYL:
1817 		return styl_Read(a, bs);
1818 	case GF_ISOM_BOX_TYPE_HLIT:
1819 		return hlit_Read(a, bs);
1820 	case GF_ISOM_BOX_TYPE_HCLR:
1821 		return hclr_Read(a, bs);
1822 	case GF_ISOM_BOX_TYPE_KROK:
1823 		return krok_Read(a, bs);
1824 	case GF_ISOM_BOX_TYPE_DLAY:
1825 		return dlay_Read(a, bs);
1826 	case GF_ISOM_BOX_TYPE_HREF:
1827 		return href_Read(a, bs);
1828 	case GF_ISOM_BOX_TYPE_TBOX:
1829 		return tbox_Read(a, bs);
1830 	case GF_ISOM_BOX_TYPE_BLNK:
1831 		return blnk_Read(a, bs);
1832 	case GF_ISOM_BOX_TYPE_TWRP:
1833 		return twrp_Read(a, bs);
1834 
1835 		/* ISMA 1.0 Encryption and Authentication V 1.0 */
1836 	case GF_ISOM_BOX_TYPE_IKMS:
1837 		return iKMS_Read(a, bs);
1838 	case GF_ISOM_BOX_TYPE_ISFM:
1839 		return iSFM_Read(a, bs);
1840 
1841 		/* ISO FF extensions for MPEG-21 */
1842 	case GF_ISOM_BOX_TYPE_META:
1843 		return meta_Read(a, bs);
1844 	case GF_ISOM_BOX_TYPE_XML:
1845 		return xml_Read(a, bs);
1846 	case GF_ISOM_BOX_TYPE_BXML:
1847 		return bxml_Read(a, bs);
1848 	case GF_ISOM_BOX_TYPE_ILOC:
1849 		return iloc_Read(a, bs);
1850 	case GF_ISOM_BOX_TYPE_PITM:
1851 		return pitm_Read(a, bs);
1852 	case GF_ISOM_BOX_TYPE_IPRO:
1853 		return ipro_Read(a, bs);
1854 	case GF_ISOM_BOX_TYPE_INFE:
1855 		return infe_Read(a, bs);
1856 	case GF_ISOM_BOX_TYPE_IINF:
1857 		return iinf_Read(a, bs);
1858 	case GF_ISOM_BOX_TYPE_IREF:
1859 		return iref_Read(a, bs);
1860 	case GF_ISOM_BOX_TYPE_SINF:
1861 		return sinf_Read(a, bs);
1862 	case GF_ISOM_BOX_TYPE_FRMA:
1863 		return frma_Read(a, bs);
1864 	case GF_ISOM_BOX_TYPE_SCHM:
1865 		return schm_Read(a, bs);
1866 	case GF_ISOM_BOX_TYPE_SCHI:
1867 		return schi_Read(a, bs);
1868 	case GF_ISOM_BOX_TYPE_ENCA:
1869 		return mp4a_Read(a, bs);
1870 	case GF_ISOM_BOX_TYPE_ENCV:
1871 		return mp4v_Read(a, bs);
1872 	case GF_ISOM_BOX_TYPE_ENCS:
1873 		return mp4s_Read(a, bs);
1874 	case GF_ISOM_BOX_TYPE_SENC:
1875 		return senc_Read(a, bs);
1876 	case GF_ISOM_BOX_TYPE_UUID:
1877 		switch (((GF_UnknownUUIDBox *)a)->internal_4cc) {
1878 		case GF_ISOM_BOX_UUID_TENC:
1879 			return piff_tenc_Read(a, bs);
1880 		case GF_ISOM_BOX_UUID_PSEC:
1881 			return piff_psec_Read(a, bs);
1882 		case GF_ISOM_BOX_UUID_PSSH:
1883 			return piff_pssh_Read(a, bs);
1884 		case GF_ISOM_BOX_UUID_TFXD:
1885 			return tfxd_Read(a, bs);
1886 		case GF_ISOM_BOX_UUID_MSSM:
1887 		case GF_ISOM_BOX_UUID_TFRF:
1888 		default:
1889 			return uuid_Read(a, bs);
1890 		}
1891 
1892 #ifndef GPAC_DISABLE_ISOM_ADOBE
1893 		/* Adobe extensions */
1894 	case GF_ISOM_BOX_TYPE_ABST:
1895 		return abst_Read(a, bs);
1896 	case GF_ISOM_BOX_TYPE_AFRA:
1897 		return afra_Read(a, bs);
1898 	case GF_ISOM_BOX_TYPE_ASRT:
1899 		return asrt_Read(a, bs);
1900 	case GF_ISOM_BOX_TYPE_AFRT:
1901 		return afrt_Read(a, bs);
1902 #endif
1903 
1904 		/* Apple extensions */
1905 	case GF_ISOM_BOX_TYPE_ILST:
1906 		return ilst_Read(a, bs);
1907 
1908 	case GF_ISOM_BOX_TYPE_0xA9NAM:
1909 	case GF_ISOM_BOX_TYPE_0xA9CMT:
1910 	case GF_ISOM_BOX_TYPE_0xA9DAY:
1911 	case GF_ISOM_BOX_TYPE_0xA9ART:
1912 	case GF_ISOM_BOX_TYPE_0xA9TRK:
1913 	case GF_ISOM_BOX_TYPE_0xA9ALB:
1914 	case GF_ISOM_BOX_TYPE_0xA9COM:
1915 	case GF_ISOM_BOX_TYPE_0xA9WRT:
1916 	case GF_ISOM_BOX_TYPE_0xA9TOO:
1917 	case GF_ISOM_BOX_TYPE_0xA9CPY:
1918 	case GF_ISOM_BOX_TYPE_0xA9DES:
1919 	case GF_ISOM_BOX_TYPE_0xA9GEN:
1920 	case GF_ISOM_BOX_TYPE_0xA9GRP:
1921 	case GF_ISOM_BOX_TYPE_0xA9ENC:
1922 	case GF_ISOM_BOX_TYPE_aART:
1923 	case GF_ISOM_BOX_TYPE_GNRE:
1924 	case GF_ISOM_BOX_TYPE_DISK:
1925 	case GF_ISOM_BOX_TYPE_TRKN:
1926 	case GF_ISOM_BOX_TYPE_TMPO:
1927 	case GF_ISOM_BOX_TYPE_CPIL:
1928 	case GF_ISOM_BOX_TYPE_PGAP:
1929 	case GF_ISOM_BOX_TYPE_COVR:
1930 		return ListItem_Read(a, bs);
1931 
1932 	case GF_ISOM_BOX_TYPE_DATA:
1933 		return data_Read(a, bs);
1934 
1935 	case GF_ISOM_BOX_TYPE_OHDR:
1936 		return ohdr_Read(a, bs);
1937 	case GF_ISOM_BOX_TYPE_GRPI:
1938 		return grpi_Read(a, bs);
1939 	case GF_ISOM_BOX_TYPE_MDRI:
1940 		return mdri_Read(a, bs);
1941 	case GF_ISOM_BOX_TYPE_ODTT:
1942 		return odtt_Read(a, bs);
1943 	case GF_ISOM_BOX_TYPE_ODRB:
1944 		return odrb_Read(a, bs);
1945 	case GF_ISOM_BOX_TYPE_ODKM:
1946 		return odkm_Read(a, bs);
1947 	case GF_ISOM_BOX_TYPE_ODAF:
1948 		return iSFM_Read(a, bs);
1949 
1950 	case GF_ISOM_BOX_TYPE_PASP:
1951 		return pasp_Read(a, bs);
1952 	case GF_ISOM_BOX_TYPE_TSEL:
1953 		return tsel_Read(a, bs);
1954 
1955 	case GF_ISOM_BOX_TYPE_METX:
1956 	case GF_ISOM_BOX_TYPE_METT:
1957 		return metx_Read(a, bs);
1958 
1959 	case GF_ISOM_BOX_TYPE_DIMS:
1960 		return dims_Read(a, bs);
1961 	case GF_ISOM_BOX_TYPE_DIMC:
1962 		return dimC_Read(a, bs);
1963 	case GF_ISOM_BOX_TYPE_DIST:
1964 		return diST_Read(a, bs);
1965 
1966 	case GF_ISOM_BOX_TYPE_AC3:
1967 		return ac3_Read(a, bs);
1968 	case GF_ISOM_BOX_TYPE_DAC3:
1969 		return dac3_Read(a, bs);
1970 
1971 	case GF_ISOM_BOX_TYPE_LSRC:
1972 		return lsrc_Read(a, bs);
1973 	case GF_ISOM_BOX_TYPE_LSR1:
1974 		return lsr1_Read(a, bs);
1975 
1976 	case GF_ISOM_BOX_TYPE_SIDX:
1977 		return sidx_Read(a, bs);
1978 	case GF_ISOM_BOX_TYPE_SUBS:
1979 		return subs_Read(a, bs);
1980 	case GF_ISOM_BOX_TYPE_RVCC:
1981 		return rvcc_Read(a, bs);
1982 	case GF_ISOM_BOX_TYPE_PCRB:
1983 		return pcrb_Read(a, bs);
1984 	case GF_ISOM_BOX_TYPE_PRFT:
1985 		return prft_Read(a, bs);
1986 
1987 	case GF_ISOM_BOX_TYPE_TRGR:
1988 		return trgr_Read(a, bs);
1989 	case GF_ISOM_BOX_TYPE_TRGT:
1990 		return trgt_Read(a, bs);
1991 
1992 #ifndef GPAC_DISABLE_TTXT
1993 	case GF_ISOM_BOX_TYPE_STXT:
1994 		return metx_Read(a, bs);
1995 	case GF_ISOM_BOX_TYPE_TXTC:
1996 		return txtc_Read(a, bs);
1997 
1998 
1999 
2000 	case GF_ISOM_BOX_TYPE_STPP:
2001 		return metx_Read(a, bs);
2002 	case GF_ISOM_BOX_TYPE_SBTT:
2003 		return metx_Read(a, bs);
2004 
2005 #endif // GPAC_DISABLE_TTXT
2006 
2007 	case GF_ISOM_BOX_TYPE_ADKM:
2008 		return adkm_Read(a, bs);
2009 	case GF_ISOM_BOX_TYPE_AHDR:
2010 		return ahdr_Read(a, bs);
2011 	case GF_ISOM_BOX_TYPE_APRM:
2012 		return aprm_Read(a, bs);
2013 	case GF_ISOM_BOX_TYPE_AEIB:
2014 		return aeib_Read(a, bs);
2015 	case GF_ISOM_BOX_TYPE_AKEY:
2016 		return akey_Read(a, bs);
2017 	case GF_ISOM_BOX_TYPE_FLXS:
2018 		return flxs_Read(a, bs);
2019 	case GF_ISOM_BOX_TYPE_ADAF:
2020 		return adaf_Read(a, bs);
2021 
2022 
2023 	default:
2024 		return defa_Read(a, bs);
2025 	}
2026 }
2027 
2028 #ifndef GPAC_DISABLE_ISOM_WRITE
2029 
gf_isom_box_write_listing(GF_Box * a,GF_BitStream * bs)2030 GF_Err gf_isom_box_write_listing(GF_Box *a, GF_BitStream *bs)
2031 {
2032 	switch (a->type) {
2033 	case GF_ISOM_BOX_TYPE_REFT:
2034 		return reftype_Write(a, bs);
2035 	case GF_ISOM_BOX_TYPE_REFI:
2036 		return ireftype_Write(a, bs);
2037 	case GF_ISOM_BOX_TYPE_FREE:
2038 	case GF_ISOM_BOX_TYPE_SKIP:
2039 		return free_Write(a, bs);
2040 	case GF_ISOM_BOX_TYPE_MDAT:
2041 		return mdat_Write(a, bs);
2042 	case GF_ISOM_BOX_TYPE_MOOV:
2043 		return moov_Write(a, bs);
2044 	case GF_ISOM_BOX_TYPE_MVHD:
2045 		return mvhd_Write(a, bs);
2046 	case GF_ISOM_BOX_TYPE_MDHD:
2047 		return mdhd_Write(a, bs);
2048 	case GF_ISOM_BOX_TYPE_VMHD:
2049 		return vmhd_Write(a, bs);
2050 	case GF_ISOM_BOX_TYPE_SMHD:
2051 		return smhd_Write(a, bs);
2052 	case GF_ISOM_BOX_TYPE_HMHD:
2053 		return hmhd_Write(a, bs);
2054 	case GF_ISOM_BOX_TYPE_ODHD:
2055 	case GF_ISOM_BOX_TYPE_CRHD:
2056 	case GF_ISOM_BOX_TYPE_SDHD:
2057 	case GF_ISOM_BOX_TYPE_NMHD:
2058 	case GF_ISOM_BOX_TYPE_STHD:
2059 		return nmhd_Write(a, bs);
2060 	case GF_ISOM_BOX_TYPE_STBL:
2061 		return stbl_Write(a, bs);
2062 	case GF_ISOM_BOX_TYPE_DINF:
2063 		return dinf_Write(a, bs);
2064 	case GF_ISOM_BOX_TYPE_URL:
2065 		return url_Write(a, bs);
2066 	case GF_ISOM_BOX_TYPE_URN:
2067 		return urn_Write(a, bs);
2068 	case GF_ISOM_BOX_TYPE_CHPL:
2069 		return chpl_Write(a, bs);
2070 	case GF_ISOM_BOX_TYPE_CPRT:
2071 		return cprt_Write(a, bs);
2072 	case GF_ISOM_BOX_TYPE_KIND:
2073 		return kind_Write(a, bs);
2074 	case GF_ISOM_BOX_TYPE_HDLR:
2075 		return hdlr_Write(a, bs);
2076 	case GF_ISOM_BOX_TYPE_IODS:
2077 		return iods_Write(a, bs);
2078 	case GF_ISOM_BOX_TYPE_TRAK:
2079 		return trak_Write(a, bs);
2080 	case GF_ISOM_BOX_TYPE_MP4S:
2081 		return mp4s_Write(a, bs);
2082 	case GF_ISOM_BOX_TYPE_MP4V:
2083 		return mp4v_Write(a, bs);
2084 	case GF_ISOM_BOX_TYPE_MP4A:
2085 		return mp4a_Write(a, bs);
2086 	case GF_ISOM_BOX_TYPE_GNRM:
2087 		return gnrm_Write(a, bs);
2088 	case GF_ISOM_BOX_TYPE_GNRV:
2089 		return gnrv_Write(a, bs);
2090 	case GF_ISOM_BOX_TYPE_GNRA:
2091 		return gnra_Write(a, bs);
2092 	case GF_ISOM_BOX_TYPE_EDTS:
2093 		return edts_Write(a, bs);
2094 	case GF_ISOM_BOX_TYPE_UDTA:
2095 		return udta_Write(a, bs);
2096 	case GF_ISOM_BOX_TYPE_DREF:
2097 		return dref_Write(a, bs);
2098 	case GF_ISOM_BOX_TYPE_STSD:
2099 		return stsd_Write(a, bs);
2100 	case GF_ISOM_BOX_TYPE_STTS:
2101 		return stts_Write(a, bs);
2102 	case GF_ISOM_BOX_TYPE_CTTS:
2103 		return ctts_Write(a, bs);
2104 	case GF_ISOM_BOX_TYPE_CSLG:
2105 		return cslg_Write(a, bs);
2106 	case GF_ISOM_BOX_TYPE_STSH:
2107 		return stsh_Write(a, bs);
2108 	case GF_ISOM_BOX_TYPE_ELST:
2109 		return elst_Write(a, bs);
2110 	case GF_ISOM_BOX_TYPE_STSC:
2111 		return stsc_Write(a, bs);
2112 	case GF_ISOM_BOX_TYPE_STZ2:
2113 	case GF_ISOM_BOX_TYPE_STSZ:
2114 		return stsz_Write(a, bs);
2115 	case GF_ISOM_BOX_TYPE_STCO:
2116 		return stco_Write(a, bs);
2117 	case GF_ISOM_BOX_TYPE_STSS:
2118 		return stss_Write(a, bs);
2119 	case GF_ISOM_BOX_TYPE_STDP:
2120 		return stdp_Write(a, bs);
2121 	case GF_ISOM_BOX_TYPE_SDTP:
2122 		return sdtp_Write(a, bs);
2123 	case GF_ISOM_BOX_TYPE_CO64:
2124 		return co64_Write(a, bs);
2125 	case GF_ISOM_BOX_TYPE_ESDS:
2126 		return esds_Write(a, bs);
2127 	case GF_ISOM_BOX_TYPE_MINF:
2128 		return minf_Write(a, bs);
2129 	case GF_ISOM_BOX_TYPE_TKHD:
2130 		return tkhd_Write(a, bs);
2131 	case GF_ISOM_BOX_TYPE_TREF:
2132 		return tref_Write(a, bs);
2133 	case GF_ISOM_BOX_TYPE_MDIA:
2134 		return mdia_Write(a, bs);
2135 	case GF_ISOM_BOX_TYPE_ELNG:
2136 		return elng_Write(a, bs);
2137 	case GF_ISOM_BOX_TYPE_FTYP:
2138 	case GF_ISOM_BOX_TYPE_STYP:
2139 		return ftyp_Write(a, bs);
2140 	case GF_ISOM_BOX_TYPE_PADB:
2141 		return padb_Write(a, bs);
2142 	case GF_ISOM_BOX_TYPE_VOID:
2143 		return void_Write(a, bs);
2144 	case GF_ISOM_BOX_TYPE_STSF:
2145 		return stsf_Write(a, bs);
2146 	case GF_ISOM_BOX_TYPE_PDIN:
2147 		return pdin_Write(a, bs);
2148 	case GF_ISOM_BOX_TYPE_SBGP:
2149 		return sbgp_Write(a, bs);
2150 	case GF_ISOM_BOX_TYPE_SGPD:
2151 		return sgpd_Write(a, bs);
2152 	case GF_ISOM_BOX_TYPE_SAIZ:
2153 		return saiz_Write(a, bs);
2154 	case GF_ISOM_BOX_TYPE_SAIO:
2155 		return saio_Write(a, bs);
2156 	case GF_ISOM_BOX_TYPE_PSSH:
2157 		return pssh_Write(a, bs);
2158 	case GF_ISOM_BOX_TYPE_TENC:
2159 		return tenc_Write(a, bs);
2160 
2161 #ifndef GPAC_DISABLE_ISOM_HINTING
2162 	case GF_ISOM_BOX_TYPE_RTP_STSD:
2163 		return ghnt_Write(a, bs);
2164 	case GF_ISOM_BOX_TYPE_RTPO:
2165 		return rtpo_Write(a, bs);
2166 	case GF_ISOM_BOX_TYPE_HNTI:
2167 		return hnti_Write(a, bs);
2168 	case GF_ISOM_BOX_TYPE_SDP:
2169 		return sdp_Write(a, bs);
2170 	case GF_ISOM_BOX_TYPE_HINF:
2171 		return hinf_Write(a, bs);
2172 	case GF_ISOM_BOX_TYPE_RELY:
2173 		return rely_Write(a, bs);
2174 	case GF_ISOM_BOX_TYPE_TIMS:
2175 		return tims_Write(a, bs);
2176 	case GF_ISOM_BOX_TYPE_TSRO:
2177 		return tsro_Write(a, bs);
2178 	case GF_ISOM_BOX_TYPE_SNRO:
2179 		return snro_Write(a, bs);
2180 	case GF_ISOM_BOX_TYPE_TRPY:
2181 		return trpy_Write(a, bs);
2182 	case GF_ISOM_BOX_TYPE_NUMP:
2183 		return nump_Write(a, bs);
2184 	case GF_ISOM_BOX_TYPE_TOTL:
2185 		return totl_Write(a, bs);
2186 	case GF_ISOM_BOX_TYPE_NPCK:
2187 		return npck_Write(a, bs);
2188 	case GF_ISOM_BOX_TYPE_TPYL:
2189 		return tpyl_Write(a, bs);
2190 	case GF_ISOM_BOX_TYPE_TPAY:
2191 		return tpay_Write(a, bs);
2192 	case GF_ISOM_BOX_TYPE_MAXR:
2193 		return maxr_Write(a, bs);
2194 	case GF_ISOM_BOX_TYPE_DMED:
2195 		return dmed_Write(a, bs);
2196 	case GF_ISOM_BOX_TYPE_DIMM:
2197 		return dimm_Write(a, bs);
2198 	case GF_ISOM_BOX_TYPE_DREP:
2199 		return drep_Write(a, bs);
2200 	case GF_ISOM_BOX_TYPE_TMIN:
2201 		return tmin_Write(a, bs);
2202 	case GF_ISOM_BOX_TYPE_TMAX:
2203 		return tmax_Write(a, bs);
2204 	case GF_ISOM_BOX_TYPE_PMAX:
2205 		return pmax_Write(a, bs);
2206 	case GF_ISOM_BOX_TYPE_DMAX:
2207 		return dmax_Write(a, bs);
2208 	case GF_ISOM_BOX_TYPE_PAYT:
2209 		return payt_Write(a, bs);
2210 	case GF_ISOM_BOX_TYPE_NAME:
2211 		return name_Write(a, bs);
2212 #endif /*GPAC_DISABLE_ISOM_HINTING*/
2213 
2214 #ifndef	GPAC_DISABLE_ISOM_FRAGMENTS
2215 	case GF_ISOM_BOX_TYPE_MVEX:
2216 		return mvex_Write(a, bs);
2217 	case GF_ISOM_BOX_TYPE_MEHD:
2218 		return mehd_Write(a, bs);
2219 	case GF_ISOM_BOX_TYPE_TREX:
2220 		return trex_Write(a, bs);
2221 	case GF_ISOM_BOX_TYPE_TREP:
2222 		return trep_Write(a, bs);
2223 	case GF_ISOM_BOX_TYPE_MOOF:
2224 		return moof_Write(a, bs);
2225 	case GF_ISOM_BOX_TYPE_MFHD:
2226 		return mfhd_Write(a, bs);
2227 	case GF_ISOM_BOX_TYPE_TRAF:
2228 		return traf_Write(a, bs);
2229 	case GF_ISOM_BOX_TYPE_TFHD:
2230 		return tfhd_Write(a, bs);
2231 	case GF_ISOM_BOX_TYPE_TFDT:
2232 		return tfdt_Write(a, bs);
2233 	case GF_ISOM_BOX_TYPE_TRUN:
2234 		return trun_Write(a, bs);
2235 #endif
2236 
2237 		/*3GPP boxes*/
2238 	case GF_ISOM_SUBTYPE_3GP_AMR:
2239 	case GF_ISOM_SUBTYPE_3GP_AMR_WB:
2240 	case GF_ISOM_SUBTYPE_3GP_EVRC:
2241 	case GF_ISOM_SUBTYPE_3GP_QCELP:
2242 	case GF_ISOM_SUBTYPE_3GP_SMV:
2243 		return gppa_Write(a, bs);
2244 	case GF_ISOM_SUBTYPE_3GP_H263:
2245 		return gppv_Write(a, bs);
2246 	case GF_ISOM_BOX_TYPE_DAMR:
2247 	case GF_ISOM_BOX_TYPE_DEVC:
2248 	case GF_ISOM_BOX_TYPE_DQCP:
2249 	case GF_ISOM_BOX_TYPE_DSMV:
2250 	case GF_ISOM_BOX_TYPE_D263:
2251 		return gppc_Write(a, bs);
2252 
2253 	case GF_ISOM_BOX_TYPE_AVCC:
2254 	case GF_ISOM_BOX_TYPE_SVCC:
2255 		return avcc_Write(a, bs);
2256 	case GF_ISOM_BOX_TYPE_HVCC:
2257 	case GF_ISOM_BOX_TYPE_LHVC:
2258 		return hvcc_Write(a, bs);
2259 	case GF_ISOM_BOX_TYPE_BTRT:
2260 		return btrt_Write(a, bs);
2261 	case GF_ISOM_BOX_TYPE_M4DS:
2262 		return m4ds_Write(a, bs);
2263 	case GF_ISOM_BOX_TYPE_AVC1:
2264 	case GF_ISOM_BOX_TYPE_AVC2:
2265 	case GF_ISOM_BOX_TYPE_AVC3:
2266 	case GF_ISOM_BOX_TYPE_AVC4:
2267 	case GF_ISOM_BOX_TYPE_SVC1:
2268 	case GF_ISOM_BOX_TYPE_HVC1:
2269 	case GF_ISOM_BOX_TYPE_HEV1:
2270 	case GF_ISOM_BOX_TYPE_HVC2:
2271 	case GF_ISOM_BOX_TYPE_HEV2:
2272 	case GF_ISOM_BOX_TYPE_LHV1:
2273 	case GF_ISOM_BOX_TYPE_LHE1:
2274 	case GF_ISOM_BOX_TYPE_HVT1:
2275 		return mp4v_Write(a, bs);
2276 
2277 		/*3GPP streaming text*/
2278 	case GF_ISOM_BOX_TYPE_FTAB:
2279 		return ftab_Write(a, bs);
2280 	case GF_ISOM_BOX_TYPE_TX3G:
2281 		return tx3g_Write(a, bs);
2282 	case GF_ISOM_BOX_TYPE_TEXT:
2283 		return text_Write(a, bs);
2284 	case GF_ISOM_BOX_TYPE_STYL:
2285 		return styl_Write(a, bs);
2286 	case GF_ISOM_BOX_TYPE_HLIT:
2287 		return hlit_Write(a, bs);
2288 	case GF_ISOM_BOX_TYPE_HCLR:
2289 		return hclr_Write(a, bs);
2290 	case GF_ISOM_BOX_TYPE_KROK:
2291 		return krok_Write(a, bs);
2292 	case GF_ISOM_BOX_TYPE_DLAY:
2293 		return dlay_Write(a, bs);
2294 	case GF_ISOM_BOX_TYPE_HREF:
2295 		return href_Write(a, bs);
2296 	case GF_ISOM_BOX_TYPE_TBOX:
2297 		return tbox_Write(a, bs);
2298 	case GF_ISOM_BOX_TYPE_BLNK:
2299 		return blnk_Write(a, bs);
2300 	case GF_ISOM_BOX_TYPE_TWRP:
2301 		return twrp_Write(a, bs);
2302 
2303 		/* ISMA 1.0 Encryption and Authentication V 1.0 */
2304 	case GF_ISOM_BOX_TYPE_IKMS:
2305 		return iKMS_Write(a, bs);
2306 	case GF_ISOM_BOX_TYPE_ISFM:
2307 		return iSFM_Write(a, bs);
2308 
2309 		/* ISO FF extensions for MPEG-21 */
2310 	case GF_ISOM_BOX_TYPE_META:
2311 		return meta_Write(a, bs);
2312 	case GF_ISOM_BOX_TYPE_XML:
2313 		return xml_Write(a, bs);
2314 	case GF_ISOM_BOX_TYPE_BXML:
2315 		return bxml_Write(a, bs);
2316 	case GF_ISOM_BOX_TYPE_ILOC:
2317 		return iloc_Write(a, bs);
2318 	case GF_ISOM_BOX_TYPE_PITM:
2319 		return pitm_Write(a, bs);
2320 	case GF_ISOM_BOX_TYPE_IPRO:
2321 		return ipro_Write(a, bs);
2322 	case GF_ISOM_BOX_TYPE_INFE:
2323 		return infe_Write(a, bs);
2324 	case GF_ISOM_BOX_TYPE_IINF:
2325 		return iinf_Write(a, bs);
2326 	case GF_ISOM_BOX_TYPE_IREF:
2327 		return iref_Write(a, bs);
2328 	case GF_ISOM_BOX_TYPE_SINF:
2329 		return sinf_Write(a, bs);
2330 	case GF_ISOM_BOX_TYPE_FRMA:
2331 		return frma_Write(a, bs);
2332 	case GF_ISOM_BOX_TYPE_SCHM:
2333 		return schm_Write(a, bs);
2334 	case GF_ISOM_BOX_TYPE_SCHI:
2335 		return schi_Write(a, bs);
2336 	case GF_ISOM_BOX_TYPE_ENCA:
2337 		return mp4a_Write(a, bs);
2338 	case GF_ISOM_BOX_TYPE_ENCV:
2339 		return mp4v_Write(a, bs);
2340 	case GF_ISOM_BOX_TYPE_ENCS:
2341 		return mp4s_Write(a, bs);
2342 
2343 	case GF_ISOM_BOX_TYPE_SENC:
2344 		return senc_Write(a, bs);
2345 
2346 	case GF_ISOM_BOX_TYPE_UUID:
2347 		switch (((GF_UnknownUUIDBox *)a)->internal_4cc) {
2348 		case GF_ISOM_BOX_UUID_TENC:
2349 			return piff_tenc_Write(a, bs);
2350 		case GF_ISOM_BOX_UUID_PSEC:
2351 			return piff_psec_Write(a, bs);
2352 		case GF_ISOM_BOX_UUID_PSSH:
2353 			return piff_pssh_Write(a, bs);
2354 		case GF_ISOM_BOX_UUID_TFXD:
2355 			return tfxd_Write(a, bs);
2356 		case GF_ISOM_BOX_UUID_MSSM:
2357 		case GF_ISOM_BOX_UUID_TFRF:
2358 		default:
2359 			return uuid_Write(a, bs);
2360 		}
2361 
2362 #ifndef GPAC_DISABLE_ISOM_ADOBE
2363 		/* Adobe extensions */
2364 	case GF_ISOM_BOX_TYPE_ABST:
2365 		return abst_Write(a, bs);
2366 	case GF_ISOM_BOX_TYPE_AFRA:
2367 		return afra_Write(a, bs);
2368 	case GF_ISOM_BOX_TYPE_ASRT:
2369 		return asrt_Write(a, bs);
2370 	case GF_ISOM_BOX_TYPE_AFRT:
2371 		return afrt_Write(a, bs);
2372 #endif
2373 
2374 		/* Apple extensions */
2375 	case GF_ISOM_BOX_TYPE_ILST:
2376 		return ilst_Write(a, bs);
2377 
2378 	case GF_ISOM_BOX_TYPE_0xA9NAM:
2379 	case GF_ISOM_BOX_TYPE_0xA9CMT:
2380 	case GF_ISOM_BOX_TYPE_0xA9DAY:
2381 	case GF_ISOM_BOX_TYPE_0xA9ART:
2382 	case GF_ISOM_BOX_TYPE_0xA9TRK:
2383 	case GF_ISOM_BOX_TYPE_0xA9ALB:
2384 	case GF_ISOM_BOX_TYPE_0xA9COM:
2385 	case GF_ISOM_BOX_TYPE_0xA9WRT:
2386 	case GF_ISOM_BOX_TYPE_0xA9TOO:
2387 	case GF_ISOM_BOX_TYPE_0xA9CPY:
2388 	case GF_ISOM_BOX_TYPE_0xA9DES:
2389 	case GF_ISOM_BOX_TYPE_0xA9GEN:
2390 	case GF_ISOM_BOX_TYPE_0xA9GRP:
2391 	case GF_ISOM_BOX_TYPE_0xA9ENC:
2392 	case GF_ISOM_BOX_TYPE_aART:
2393 	case GF_ISOM_BOX_TYPE_GNRE:
2394 	case GF_ISOM_BOX_TYPE_DISK:
2395 	case GF_ISOM_BOX_TYPE_TRKN:
2396 	case GF_ISOM_BOX_TYPE_TMPO:
2397 	case GF_ISOM_BOX_TYPE_CPIL:
2398 	case GF_ISOM_BOX_TYPE_PGAP:
2399 	case GF_ISOM_BOX_TYPE_COVR:
2400 		return ListItem_Write(a, bs);
2401 
2402 	case GF_ISOM_BOX_TYPE_DATA:
2403 		return data_Write(a, bs);
2404 
2405 	case GF_ISOM_BOX_TYPE_OHDR:
2406 		return ohdr_Write(a, bs);
2407 	case GF_ISOM_BOX_TYPE_GRPI:
2408 		return grpi_Write(a, bs);
2409 	case GF_ISOM_BOX_TYPE_MDRI:
2410 		return mdri_Write(a, bs);
2411 	case GF_ISOM_BOX_TYPE_ODTT:
2412 		return odtt_Write(a, bs);
2413 	case GF_ISOM_BOX_TYPE_ODRB:
2414 		return odrb_Write(a, bs);
2415 	case GF_ISOM_BOX_TYPE_ODKM:
2416 		return odkm_Write(a, bs);
2417 	case GF_ISOM_BOX_TYPE_ODAF:
2418 		return iSFM_Write(a, bs);
2419 
2420 	case GF_ISOM_BOX_TYPE_PASP:
2421 		return pasp_Write(a, bs);
2422 	case GF_ISOM_BOX_TYPE_TSEL:
2423 		return tsel_Write(a, bs);
2424 
2425 	case GF_ISOM_BOX_TYPE_METX:
2426 	case GF_ISOM_BOX_TYPE_METT:
2427 		return metx_Write(a, bs);
2428 
2429 	case GF_ISOM_BOX_TYPE_DIMS:
2430 		return dims_Write(a, bs);
2431 	case GF_ISOM_BOX_TYPE_DIMC:
2432 		return dimC_Write(a, bs);
2433 	case GF_ISOM_BOX_TYPE_DIST:
2434 		return diST_Write(a, bs);
2435 
2436 	case GF_ISOM_BOX_TYPE_AC3:
2437 		return ac3_Write(a, bs);
2438 	case GF_ISOM_BOX_TYPE_DAC3:
2439 		return dac3_Write(a, bs);
2440 
2441 	case GF_ISOM_BOX_TYPE_LSRC:
2442 		return lsrc_Write(a, bs);
2443 	case GF_ISOM_BOX_TYPE_LSR1:
2444 		return lsr1_Write(a, bs);
2445 
2446 	case GF_ISOM_BOX_TYPE_SIDX:
2447 		return sidx_Write(a, bs);
2448 	case GF_ISOM_BOX_TYPE_PCRB:
2449 		return pcrb_Write(a, bs);
2450 	case GF_ISOM_BOX_TYPE_SUBS:
2451 		return subs_Write(a, bs);
2452 	case GF_ISOM_BOX_TYPE_RVCC:
2453 		return rvcc_Write(a, bs);
2454 
2455 	case GF_ISOM_BOX_TYPE_TRGR:
2456 		return trgr_Write(a, bs);
2457 	case GF_ISOM_BOX_TYPE_TRGT:
2458 		return trgt_Write(a, bs);
2459 
2460 #ifndef GPAC_DISABLE_TTXT
2461 	case GF_ISOM_BOX_TYPE_STXT:
2462 		return metx_Write(a, bs);
2463 	case GF_ISOM_BOX_TYPE_TXTC:
2464 		return txtc_Write(a, bs);
2465 
2466 	case GF_ISOM_BOX_TYPE_STPP:
2467 		return metx_Write(a, bs);
2468 	case GF_ISOM_BOX_TYPE_SBTT:
2469 		return metx_Write(a, bs);
2470 #endif//GPAC_DISABLE_TTXT
2471 
2472 	case GF_ISOM_BOX_TYPE_ADKM:
2473 		return adkm_Write(a, bs);
2474 	case GF_ISOM_BOX_TYPE_AHDR:
2475 		return ahdr_Write(a, bs);
2476 	case GF_ISOM_BOX_TYPE_APRM:
2477 		return aprm_Write(a, bs);
2478 	case GF_ISOM_BOX_TYPE_AEIB:
2479 		return aeib_Write(a, bs);
2480 	case GF_ISOM_BOX_TYPE_AKEY:
2481 		return akey_Write(a, bs);
2482 	case GF_ISOM_BOX_TYPE_FLXS:
2483 		return flxs_Write(a, bs);
2484 	case GF_ISOM_BOX_TYPE_ADAF:
2485 		return adaf_Write(a, bs);
2486 
2487 
2488 	default:
2489 		return defa_Write(a, bs);
2490 	}
2491 }
2492 
2493 GF_EXPORT
gf_isom_box_write(GF_Box * a,GF_BitStream * bs)2494 GF_Err gf_isom_box_write(GF_Box *a, GF_BitStream *bs)
2495 {
2496 	GF_Err e = gf_isom_box_write_listing(a, bs);
2497 	if (e) return e;
2498 	if (a->other_boxes) {
2499 		return gf_isom_box_array_write(a, a->other_boxes, bs);
2500 	}
2501 	return GF_OK;
2502 }
2503 
gf_isom_box_size_listing(GF_Box * a)2504 static GF_Err gf_isom_box_size_listing(GF_Box *a)
2505 {
2506 	switch (a->type) {
2507 	case GF_ISOM_BOX_TYPE_REFT:
2508 		return reftype_Size(a);
2509 	case GF_ISOM_BOX_TYPE_REFI:
2510 		return ireftype_Size(a);
2511 	case GF_ISOM_BOX_TYPE_FREE:
2512 	case GF_ISOM_BOX_TYPE_SKIP:
2513 		return free_Size(a);
2514 	case GF_ISOM_BOX_TYPE_MDAT:
2515 		return mdat_Size(a);
2516 	case GF_ISOM_BOX_TYPE_MOOV:
2517 		return moov_Size(a);
2518 	case GF_ISOM_BOX_TYPE_MVHD:
2519 		return mvhd_Size(a);
2520 	case GF_ISOM_BOX_TYPE_MDHD:
2521 		return mdhd_Size(a);
2522 	case GF_ISOM_BOX_TYPE_VMHD:
2523 		return vmhd_Size(a);
2524 	case GF_ISOM_BOX_TYPE_SMHD:
2525 		return smhd_Size(a);
2526 	case GF_ISOM_BOX_TYPE_HMHD:
2527 		return hmhd_Size(a);
2528 	case GF_ISOM_BOX_TYPE_ODHD:
2529 	case GF_ISOM_BOX_TYPE_CRHD:
2530 	case GF_ISOM_BOX_TYPE_SDHD:
2531 	case GF_ISOM_BOX_TYPE_NMHD:
2532 	case GF_ISOM_BOX_TYPE_STHD:
2533 		return nmhd_Size(a);
2534 	case GF_ISOM_BOX_TYPE_STBL:
2535 		return stbl_Size(a);
2536 	case GF_ISOM_BOX_TYPE_DINF:
2537 		return dinf_Size(a);
2538 	case GF_ISOM_BOX_TYPE_URL:
2539 		return url_Size(a);
2540 	case GF_ISOM_BOX_TYPE_URN:
2541 		return urn_Size(a);
2542 	case GF_ISOM_BOX_TYPE_CHPL:
2543 		return chpl_Size(a);
2544 	case GF_ISOM_BOX_TYPE_CPRT:
2545 		return cprt_Size(a);
2546 	case GF_ISOM_BOX_TYPE_KIND:
2547 		return kind_Size(a);
2548 	case GF_ISOM_BOX_TYPE_HDLR:
2549 		return hdlr_Size(a);
2550 	case GF_ISOM_BOX_TYPE_IODS:
2551 		return iods_Size(a);
2552 	case GF_ISOM_BOX_TYPE_TRAK:
2553 		return trak_Size(a);
2554 	case GF_ISOM_BOX_TYPE_MP4S:
2555 		return mp4s_Size(a);
2556 	case GF_ISOM_BOX_TYPE_MP4V:
2557 		return mp4v_Size(a);
2558 	case GF_ISOM_BOX_TYPE_MP4A:
2559 		return mp4a_Size(a);
2560 	case GF_ISOM_BOX_TYPE_GNRM:
2561 		return gnrm_Size(a);
2562 	case GF_ISOM_BOX_TYPE_GNRV:
2563 		return gnrv_Size(a);
2564 	case GF_ISOM_BOX_TYPE_GNRA:
2565 		return gnra_Size(a);
2566 	case GF_ISOM_BOX_TYPE_EDTS:
2567 		return edts_Size(a);
2568 	case GF_ISOM_BOX_TYPE_UDTA:
2569 		return udta_Size(a);
2570 	case GF_ISOM_BOX_TYPE_DREF:
2571 		return dref_Size(a);
2572 	case GF_ISOM_BOX_TYPE_STSD:
2573 		return stsd_Size(a);
2574 	case GF_ISOM_BOX_TYPE_STTS:
2575 		return stts_Size(a);
2576 	case GF_ISOM_BOX_TYPE_CTTS:
2577 		return ctts_Size(a);
2578 	case GF_ISOM_BOX_TYPE_CSLG:
2579 		return cslg_Size(a);
2580 	case GF_ISOM_BOX_TYPE_STSH:
2581 		return stsh_Size(a);
2582 	case GF_ISOM_BOX_TYPE_ELST:
2583 		return elst_Size(a);
2584 	case GF_ISOM_BOX_TYPE_STSC:
2585 		return stsc_Size(a);
2586 	case GF_ISOM_BOX_TYPE_STZ2:
2587 	case GF_ISOM_BOX_TYPE_STSZ:
2588 		return stsz_Size(a);
2589 	case GF_ISOM_BOX_TYPE_STCO:
2590 		return stco_Size(a);
2591 	case GF_ISOM_BOX_TYPE_STSS:
2592 		return stss_Size(a);
2593 	case GF_ISOM_BOX_TYPE_SDTP:
2594 		return sdtp_Size(a);
2595 	case GF_ISOM_BOX_TYPE_CO64:
2596 		return co64_Size(a);
2597 	case GF_ISOM_BOX_TYPE_ESDS:
2598 		return esds_Size(a);
2599 	case GF_ISOM_BOX_TYPE_MINF:
2600 		return minf_Size(a);
2601 	case GF_ISOM_BOX_TYPE_TKHD:
2602 		return tkhd_Size(a);
2603 	case GF_ISOM_BOX_TYPE_TREF:
2604 		return tref_Size(a);
2605 	case GF_ISOM_BOX_TYPE_MDIA:
2606 		return mdia_Size(a);
2607 	case GF_ISOM_BOX_TYPE_ELNG:
2608 		return elng_Size(a);
2609 	case GF_ISOM_BOX_TYPE_FTYP:
2610 	case GF_ISOM_BOX_TYPE_STYP:
2611 		return ftyp_Size(a);
2612 	case GF_ISOM_BOX_TYPE_PADB:
2613 		return padb_Size(a);
2614 	case GF_ISOM_BOX_TYPE_VOID:
2615 		return void_Size(a);
2616 	case GF_ISOM_BOX_TYPE_STSF:
2617 		return stsf_Size(a);
2618 	case GF_ISOM_BOX_TYPE_PDIN:
2619 		return pdin_Size(a);
2620 	case GF_ISOM_BOX_TYPE_SBGP:
2621 		return sbgp_Size(a);
2622 	case GF_ISOM_BOX_TYPE_SGPD:
2623 		return sgpd_Size(a);
2624 	case GF_ISOM_BOX_TYPE_SAIZ:
2625 		return saiz_Size(a);
2626 	case GF_ISOM_BOX_TYPE_SAIO:
2627 		return saio_Size(a);
2628 	case GF_ISOM_BOX_TYPE_PSSH:
2629 		return pssh_Size(a);
2630 	case GF_ISOM_BOX_TYPE_TENC:
2631 		return tenc_Size(a);
2632 
2633 #ifndef GPAC_DISABLE_ISOM_HINTING
2634 	case GF_ISOM_BOX_TYPE_RTP_STSD:
2635 		return ghnt_Size(a);
2636 	case GF_ISOM_BOX_TYPE_RTPO:
2637 		return rtpo_Size(a);
2638 	case GF_ISOM_BOX_TYPE_HNTI:
2639 		return hnti_Size(a);
2640 	case GF_ISOM_BOX_TYPE_SDP:
2641 		return sdp_Size(a);
2642 	case GF_ISOM_BOX_TYPE_HINF:
2643 		return hinf_Size(a);
2644 	case GF_ISOM_BOX_TYPE_RELY:
2645 		return rely_Size(a);
2646 	case GF_ISOM_BOX_TYPE_TIMS:
2647 		return tims_Size(a);
2648 	case GF_ISOM_BOX_TYPE_TSRO:
2649 		return tsro_Size(a);
2650 	case GF_ISOM_BOX_TYPE_SNRO:
2651 		return snro_Size(a);
2652 	case GF_ISOM_BOX_TYPE_TRPY:
2653 		return trpy_Size(a);
2654 	case GF_ISOM_BOX_TYPE_NUMP:
2655 		return nump_Size(a);
2656 	case GF_ISOM_BOX_TYPE_TOTL:
2657 		return totl_Size(a);
2658 	case GF_ISOM_BOX_TYPE_NPCK:
2659 		return npck_Size(a);
2660 	case GF_ISOM_BOX_TYPE_TPYL:
2661 		return tpyl_Size(a);
2662 	case GF_ISOM_BOX_TYPE_TPAY:
2663 		return tpay_Size(a);
2664 	case GF_ISOM_BOX_TYPE_MAXR:
2665 		return maxr_Size(a);
2666 	case GF_ISOM_BOX_TYPE_DMED:
2667 		return dmed_Size(a);
2668 	case GF_ISOM_BOX_TYPE_DIMM:
2669 		return dimm_Size(a);
2670 	case GF_ISOM_BOX_TYPE_DREP:
2671 		return drep_Size(a);
2672 	case GF_ISOM_BOX_TYPE_TMIN:
2673 		return tmin_Size(a);
2674 	case GF_ISOM_BOX_TYPE_TMAX:
2675 		return tmax_Size(a);
2676 	case GF_ISOM_BOX_TYPE_PMAX:
2677 		return pmax_Size(a);
2678 	case GF_ISOM_BOX_TYPE_DMAX:
2679 		return dmax_Size(a);
2680 	case GF_ISOM_BOX_TYPE_PAYT:
2681 		return payt_Size(a);
2682 	case GF_ISOM_BOX_TYPE_NAME:
2683 		return name_Size(a);
2684 #endif /*GPAC_DISABLE_ISOM_HINTING*/
2685 
2686 
2687 #ifndef	GPAC_DISABLE_ISOM_FRAGMENTS
2688 	case GF_ISOM_BOX_TYPE_MVEX:
2689 		return mvex_Size(a);
2690 	case GF_ISOM_BOX_TYPE_MEHD:
2691 		return mehd_Size(a);
2692 	case GF_ISOM_BOX_TYPE_TREX:
2693 		return trex_Size(a);
2694 	case GF_ISOM_BOX_TYPE_TREP:
2695 		return trep_Size(a);
2696 	case GF_ISOM_BOX_TYPE_MOOF:
2697 		return moof_Size(a);
2698 	case GF_ISOM_BOX_TYPE_MFHD:
2699 		return mfhd_Size(a);
2700 	case GF_ISOM_BOX_TYPE_TRAF:
2701 		return traf_Size(a);
2702 	case GF_ISOM_BOX_TYPE_TFHD:
2703 		return tfhd_Size(a);
2704 	case GF_ISOM_BOX_TYPE_TFDT:
2705 		return tfdt_Size(a);
2706 	case GF_ISOM_BOX_TYPE_TRUN:
2707 		return trun_Size(a);
2708 #endif
2709 
2710 		/*3GPP boxes*/
2711 	case GF_ISOM_SUBTYPE_3GP_AMR:
2712 	case GF_ISOM_SUBTYPE_3GP_AMR_WB:
2713 	case GF_ISOM_SUBTYPE_3GP_EVRC:
2714 	case GF_ISOM_SUBTYPE_3GP_QCELP:
2715 	case GF_ISOM_SUBTYPE_3GP_SMV:
2716 		return gppa_Size(a);
2717 	case GF_ISOM_SUBTYPE_3GP_H263:
2718 		return gppv_Size(a);
2719 	case GF_ISOM_BOX_TYPE_DAMR:
2720 	case GF_ISOM_BOX_TYPE_DEVC:
2721 	case GF_ISOM_BOX_TYPE_DQCP:
2722 	case GF_ISOM_BOX_TYPE_DSMV:
2723 	case GF_ISOM_BOX_TYPE_D263:
2724 		return gppc_Size(a);
2725 
2726 	case GF_ISOM_BOX_TYPE_AVCC:
2727 	case GF_ISOM_BOX_TYPE_SVCC:
2728 		return avcc_Size(a);
2729 	case GF_ISOM_BOX_TYPE_HVCC:
2730 	case GF_ISOM_BOX_TYPE_LHVC:
2731 		return hvcc_Size(a);
2732 	case GF_ISOM_BOX_TYPE_BTRT:
2733 		return btrt_Size(a);
2734 	case GF_ISOM_BOX_TYPE_M4DS:
2735 		return m4ds_Size(a);
2736 	case GF_ISOM_BOX_TYPE_AVC1:
2737 	case GF_ISOM_BOX_TYPE_AVC2:
2738 	case GF_ISOM_BOX_TYPE_AVC3:
2739 	case GF_ISOM_BOX_TYPE_AVC4:
2740 	case GF_ISOM_BOX_TYPE_SVC1:
2741 	case GF_ISOM_BOX_TYPE_HVC1:
2742 	case GF_ISOM_BOX_TYPE_HEV1:
2743 	case GF_ISOM_BOX_TYPE_HVC2:
2744 	case GF_ISOM_BOX_TYPE_HEV2:
2745 	case GF_ISOM_BOX_TYPE_LHV1:
2746 	case GF_ISOM_BOX_TYPE_LHE1:
2747 	case GF_ISOM_BOX_TYPE_HVT1:
2748 		return mp4v_Size(a);
2749 
2750 		/*3GPP streaming text*/
2751 	case GF_ISOM_BOX_TYPE_FTAB:
2752 		return ftab_Size(a);
2753 	case GF_ISOM_BOX_TYPE_TX3G:
2754 		return tx3g_Size(a);
2755 	case GF_ISOM_BOX_TYPE_TEXT:
2756 		return text_Size(a);
2757 	case GF_ISOM_BOX_TYPE_STYL:
2758 		return styl_Size(a);
2759 	case GF_ISOM_BOX_TYPE_HLIT:
2760 		return hlit_Size(a);
2761 	case GF_ISOM_BOX_TYPE_HCLR:
2762 		return hclr_Size(a);
2763 	case GF_ISOM_BOX_TYPE_KROK:
2764 		return krok_Size(a);
2765 	case GF_ISOM_BOX_TYPE_DLAY:
2766 		return dlay_Size(a);
2767 	case GF_ISOM_BOX_TYPE_HREF:
2768 		return href_Size(a);
2769 	case GF_ISOM_BOX_TYPE_TBOX:
2770 		return tbox_Size(a);
2771 	case GF_ISOM_BOX_TYPE_BLNK:
2772 		return blnk_Size(a);
2773 	case GF_ISOM_BOX_TYPE_TWRP:
2774 		return twrp_Size(a);
2775 
2776 		/* ISMA 1.0 Encryption and Authentication V 1.0 */
2777 	case GF_ISOM_BOX_TYPE_IKMS:
2778 		return iKMS_Size(a);
2779 	case GF_ISOM_BOX_TYPE_ISFM:
2780 		return iSFM_Size(a);
2781 
2782 		/* ISO FF extensions for MPEG-21 */
2783 	case GF_ISOM_BOX_TYPE_META:
2784 		return meta_Size(a);
2785 	case GF_ISOM_BOX_TYPE_XML:
2786 		return xml_Size(a);
2787 	case GF_ISOM_BOX_TYPE_BXML:
2788 		return bxml_Size(a);
2789 	case GF_ISOM_BOX_TYPE_ILOC:
2790 		return iloc_Size(a);
2791 	case GF_ISOM_BOX_TYPE_PITM:
2792 		return pitm_Size(a);
2793 	case GF_ISOM_BOX_TYPE_IPRO:
2794 		return ipro_Size(a);
2795 	case GF_ISOM_BOX_TYPE_INFE:
2796 		return infe_Size(a);
2797 	case GF_ISOM_BOX_TYPE_IINF:
2798 		return iinf_Size(a);
2799 	case GF_ISOM_BOX_TYPE_IREF:
2800 		return iref_Size(a);
2801 	case GF_ISOM_BOX_TYPE_SINF:
2802 		return sinf_Size(a);
2803 	case GF_ISOM_BOX_TYPE_FRMA:
2804 		return frma_Size(a);
2805 	case GF_ISOM_BOX_TYPE_SCHM:
2806 		return schm_Size(a);
2807 	case GF_ISOM_BOX_TYPE_SCHI:
2808 		return schi_Size(a);
2809 	case GF_ISOM_BOX_TYPE_ENCA:
2810 		return mp4a_Size(a);
2811 	case GF_ISOM_BOX_TYPE_ENCV:
2812 		return mp4v_Size(a);
2813 	case GF_ISOM_BOX_TYPE_ENCS:
2814 		return mp4s_Size(a);
2815 	case GF_ISOM_BOX_TYPE_SENC:
2816 		return senc_Size(a);
2817 	case GF_ISOM_BOX_TYPE_UUID:
2818 		switch (((GF_UnknownUUIDBox *)a)->internal_4cc) {
2819 		case GF_ISOM_BOX_UUID_TENC:
2820 			return piff_tenc_Size(a);
2821 		case GF_ISOM_BOX_UUID_PSEC:
2822 			return piff_psec_Size(a);
2823 		case GF_ISOM_BOX_UUID_PSSH:
2824 			return piff_pssh_Size(a);
2825 		case GF_ISOM_BOX_UUID_TFXD:
2826 			return tfxd_Size(a);
2827 		case GF_ISOM_BOX_UUID_MSSM:
2828 		case GF_ISOM_BOX_UUID_TFRF:
2829 		default:
2830 			return uuid_Size(a);
2831 		}
2832 
2833 #ifndef GPAC_DISABLE_ISOM_ADOBE
2834 		/* Adobe extensions */
2835 	case GF_ISOM_BOX_TYPE_ABST:
2836 		return abst_Size(a);
2837 	case GF_ISOM_BOX_TYPE_AFRA:
2838 		return afra_Size(a);
2839 	case GF_ISOM_BOX_TYPE_ASRT:
2840 		return asrt_Size(a);
2841 	case GF_ISOM_BOX_TYPE_AFRT:
2842 		return afrt_Size(a);
2843 #endif
2844 
2845 		/* Apple extensions */
2846 	case GF_ISOM_BOX_TYPE_ILST:
2847 		return ilst_Size(a);
2848 
2849 	case GF_ISOM_BOX_TYPE_0xA9NAM:
2850 	case GF_ISOM_BOX_TYPE_0xA9CMT:
2851 	case GF_ISOM_BOX_TYPE_0xA9DAY:
2852 	case GF_ISOM_BOX_TYPE_0xA9ART:
2853 	case GF_ISOM_BOX_TYPE_0xA9TRK:
2854 	case GF_ISOM_BOX_TYPE_0xA9ALB:
2855 	case GF_ISOM_BOX_TYPE_0xA9COM:
2856 	case GF_ISOM_BOX_TYPE_0xA9WRT:
2857 	case GF_ISOM_BOX_TYPE_0xA9TOO:
2858 	case GF_ISOM_BOX_TYPE_0xA9CPY:
2859 	case GF_ISOM_BOX_TYPE_0xA9DES:
2860 	case GF_ISOM_BOX_TYPE_0xA9GEN:
2861 	case GF_ISOM_BOX_TYPE_0xA9GRP:
2862 	case GF_ISOM_BOX_TYPE_0xA9ENC:
2863 	case GF_ISOM_BOX_TYPE_aART:
2864 	case GF_ISOM_BOX_TYPE_GNRE:
2865 	case GF_ISOM_BOX_TYPE_DISK:
2866 	case GF_ISOM_BOX_TYPE_TRKN:
2867 	case GF_ISOM_BOX_TYPE_TMPO:
2868 	case GF_ISOM_BOX_TYPE_CPIL:
2869 	case GF_ISOM_BOX_TYPE_PGAP:
2870 	case GF_ISOM_BOX_TYPE_COVR:
2871 		return ListItem_Size(a);
2872 
2873 	case GF_ISOM_BOX_TYPE_DATA:
2874 		return data_Size(a);
2875 
2876 	case GF_ISOM_BOX_TYPE_OHDR:
2877 		return ohdr_Size(a);
2878 	case GF_ISOM_BOX_TYPE_GRPI:
2879 		return grpi_Size(a);
2880 	case GF_ISOM_BOX_TYPE_MDRI:
2881 		return mdri_Size(a);
2882 	case GF_ISOM_BOX_TYPE_ODTT:
2883 		return odtt_Size(a);
2884 	case GF_ISOM_BOX_TYPE_ODRB:
2885 		return odrb_Size(a);
2886 	case GF_ISOM_BOX_TYPE_ODKM:
2887 		return odkm_Size(a);
2888 	case GF_ISOM_BOX_TYPE_ODAF:
2889 		return iSFM_Size(a);
2890 
2891 	case GF_ISOM_BOX_TYPE_PASP:
2892 		return pasp_Size(a);
2893 	case GF_ISOM_BOX_TYPE_TSEL:
2894 		return tsel_Size(a);
2895 
2896 	case GF_ISOM_BOX_TYPE_METX:
2897 	case GF_ISOM_BOX_TYPE_METT:
2898 		return metx_Size(a);
2899 
2900 	case GF_ISOM_BOX_TYPE_DIMS:
2901 		return dims_Size(a);
2902 	case GF_ISOM_BOX_TYPE_DIMC:
2903 		return dimC_Size(a);
2904 	case GF_ISOM_BOX_TYPE_DIST:
2905 		return diST_Size(a);
2906 
2907 	case GF_ISOM_BOX_TYPE_AC3:
2908 		return ac3_Size(a);
2909 	case GF_ISOM_BOX_TYPE_DAC3:
2910 		return dac3_Size(a);
2911 
2912 	case GF_ISOM_BOX_TYPE_LSRC:
2913 		return lsrc_Size(a);
2914 	case GF_ISOM_BOX_TYPE_LSR1:
2915 		return lsr1_Size(a);
2916 
2917 	case GF_ISOM_BOX_TYPE_SIDX:
2918 		return sidx_Size(a);
2919 	case GF_ISOM_BOX_TYPE_PCRB:
2920 		return pcrb_Size(a);
2921 	case GF_ISOM_BOX_TYPE_SUBS:
2922 		return subs_Size(a);
2923 	case GF_ISOM_BOX_TYPE_RVCC:
2924 		return rvcc_Size(a);
2925 
2926 	case GF_ISOM_BOX_TYPE_TRGR:
2927 		return trgr_Size(a);
2928 	case GF_ISOM_BOX_TYPE_TRGT:
2929 		return trgt_Size(a);
2930 
2931 #ifndef GPAC_DISABLE_TTXT
2932 	case GF_ISOM_BOX_TYPE_STXT:
2933 		return metx_Size(a);
2934 	case GF_ISOM_BOX_TYPE_TXTC:
2935 		return txtc_Size(a);
2936 
2937 	case GF_ISOM_BOX_TYPE_STPP:
2938 		return metx_Size(a);
2939 	case GF_ISOM_BOX_TYPE_SBTT:
2940 		return metx_Size(a);
2941 #endif // GPAC_DISABLE_TTXT
2942 
2943 	case GF_ISOM_BOX_TYPE_ADKM:
2944 		return adkm_Size(a);
2945 	case GF_ISOM_BOX_TYPE_AHDR:
2946 		return ahdr_Size(a);
2947 	case GF_ISOM_BOX_TYPE_APRM:
2948 		return aprm_Size(a);
2949 	case GF_ISOM_BOX_TYPE_AEIB:
2950 		return aeib_Size(a);
2951 	case GF_ISOM_BOX_TYPE_AKEY:
2952 		return akey_Size(a);
2953 	case GF_ISOM_BOX_TYPE_FLXS:
2954 		return flxs_Size(a);
2955 	case GF_ISOM_BOX_TYPE_ADAF:
2956 		return adaf_Size(a);
2957 
2958 	default:
2959 		return defa_Size(a);
2960 	}
2961 }
2962 
2963 GF_EXPORT
gf_isom_box_size(GF_Box * a)2964 GF_Err gf_isom_box_size(GF_Box *a)
2965 {
2966 	GF_Err e = gf_isom_box_size_listing(a);
2967 	if (e) return e;
2968 	if (a->other_boxes) {
2969 		e = gf_isom_box_array_size(a, a->other_boxes);
2970 		if (e) return e;
2971 	}
2972 	return GF_OK;
2973 }
2974 
2975 #endif /*GPAC_DISABLE_ISOM_WRITE*/
2976 
2977 #endif /*GPAC_DISABLE_ISOM*/
2978