LCOV - code coverage report
Current view: top level - isomedia - box_funcs.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 463 518 89.4 %
Date: 2021-04-29 23:48:07 Functions: 41 41 100.0 %

          Line data    Source code
       1             : /*
       2             :  *                      GPAC - Multimedia Framework C SDK
       3             :  *
       4             :  *                      Authors: Jean Le Feuvre
       5             :  *                      Copyright (c) Telecom ParisTech 2000-2021
       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...
      33       24139 : GF_Err gf_isom_parse_root_box(GF_Box **outBox, GF_BitStream *bs, u32 *box_type, u64 *bytesExpected, Bool progressive_mode)
      34             : {
      35             :         GF_Err ret;
      36             :         u64 start;
      37       24139 :         start = gf_bs_get_position(bs);
      38       24139 :         ret = gf_isom_box_parse_ex(outBox, bs, 0, GF_TRUE);
      39       24139 :         if (ret == GF_ISOM_INCOMPLETE_FILE) {
      40        4492 :                 if (!*outBox) {
      41             :                         // We could not even read the box size, we at least need 8 bytes
      42           7 :                         *bytesExpected = 8;
      43           7 :                         if (box_type) *box_type = 0;
      44           7 :                         GF_LOG(progressive_mode ? GF_LOG_DEBUG : GF_LOG_ERROR, GF_LOG_CONTAINER, ("[iso file] Incomplete box - start "LLU"\n", start));
      45             :                 }
      46             :                 else {
      47        4485 :                         u32 type = (*outBox)->type;
      48        4485 :                         if (type==GF_ISOM_BOX_TYPE_UNKNOWN)
      49           0 :                                 type = ((GF_UnknownBox *) (*outBox))->original_4cc;
      50             : 
      51        4485 :                         *bytesExpected = (*outBox)->size;
      52        4485 :                         if (box_type) *box_type = (*outBox)->type;
      53             : 
      54        4485 :                         GF_LOG(progressive_mode ? GF_LOG_DEBUG : GF_LOG_ERROR, GF_LOG_CONTAINER, ("[iso file] Incomplete box %s - start "LLU" size "LLU"\n", gf_4cc_to_str(type), start, (*outBox)->size));
      55        4485 :                         gf_isom_box_del(*outBox);
      56        4485 :                         *outBox = NULL;
      57             :                 }
      58        4492 :                 gf_bs_seek(bs, start);
      59             :         }
      60       24139 :         return ret;
      61             : }
      62             : 
      63          53 : u32 gf_isom_solve_uuid_box(u8 *UUID)
      64             : {
      65             :         u32 i;
      66             :         char strUUID[33], strChar[3];
      67          53 :         strUUID[0] = 0;
      68          53 :         strUUID[32] = 0;
      69         901 :         for (i=0; i<16; i++) {
      70         848 :                 snprintf(strChar, 3, "%02X", (unsigned char) UUID[i]);
      71             :                 strcat(strUUID, strChar);
      72             :         }
      73          53 :         if (!strnicmp(strUUID, "8974dbce7be74c5184f97148f9882554", 32))
      74             :                 return GF_ISOM_BOX_UUID_TENC;
      75          49 :         if (!strnicmp(strUUID, "A5D40B30E81411DDBA2F0800200C9A66", 32))
      76             :                 return GF_ISOM_BOX_UUID_MSSM;
      77          49 :         if (!strnicmp(strUUID, "D4807EF2CA3946958E5426CB9E46A79F", 32))
      78             :                 return GF_ISOM_BOX_UUID_TFRF;
      79          49 :         if (!strnicmp(strUUID, "6D1D9B0542D544E680E2141DAFF757B2", 32))
      80             :                 return GF_ISOM_BOX_UUID_TFXD;
      81          39 :         if (!strnicmp(strUUID, "A2394F525A9B4F14A2446C427C648DF4", 32))
      82             :                 return GF_ISOM_BOX_UUID_PSEC;
      83          18 :         if (!strnicmp(strUUID, "D08A4F1810F34A82B6C832D8ABA183D3", 32))
      84             :                 return GF_ISOM_BOX_UUID_PSSH;
      85             : 
      86          17 :         return 0;
      87             : }
      88             : 
      89             : static GF_Err gf_isom_full_box_read(GF_Box *ptr, GF_BitStream *bs);
      90             : 
      91      120022 : GF_Err gf_isom_box_parse_ex(GF_Box **outBox, GF_BitStream *bs, u32 parent_type, Bool is_root_box)
      92             : {
      93             :         u32 type, uuid_type, hdr_size, restore_type;
      94             :         u64 size, start, comp_start, payload_start, end;
      95             :         char uuid[16];
      96             :         GF_Err e;
      97             :         GF_BitStream *uncomp_bs = NULL;
      98      120022 :         u8 *uncomp_data = NULL;
      99             :         u32 compressed_size=0;
     100             :         GF_Box *newBox;
     101      120022 :         Bool skip_logs = (gf_bs_get_cookie(bs) & GF_ISOM_BS_COOKIE_NO_LOGS ) ? GF_TRUE : GF_FALSE;
     102             :         Bool is_special = GF_TRUE;
     103             :         
     104      120022 :         if ((bs == NULL) || (outBox == NULL) ) return GF_BAD_PARAM;
     105      120022 :         *outBox = NULL;
     106      120022 :         if (gf_bs_available(bs) < 8) {
     107             :                 return GF_ISOM_INCOMPLETE_FILE;
     108             :         }
     109             : 
     110      120003 :         comp_start = start = gf_bs_get_position(bs);
     111             : 
     112             :         uuid_type = 0;
     113      120003 :         size = (u64) gf_bs_read_u32(bs);
     114             :         hdr_size = 4;
     115             :         /*fix for some boxes found in some old hinted files*/
     116      120003 :         if ((size >= 2) && (size <= 4)) {
     117             :                 size = 4;
     118             :                 type = GF_ISOM_BOX_TYPE_VOID;
     119             :         } else {
     120      120003 :                 type = gf_bs_read_u32(bs);
     121             :                 hdr_size += 4;
     122             :                 /*no size means till end of file - EXCEPT FOR some old QuickTime boxes...*/
     123      120003 :                 if (type == GF_ISOM_BOX_TYPE_TOTL)
     124             :                         size = 12;
     125      120002 :                 if (!size) {
     126           4 :                         if (is_root_box) {
     127           1 :                                 if (!skip_logs) {
     128           1 :                                         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));
     129             :                                 }
     130           1 :                                 size = gf_bs_available(bs) + 8;
     131             :                         } else {
     132           3 :                                 if (!skip_logs) {
     133           0 :                                         GF_LOG(GF_LOG_ERROR, GF_LOG_CONTAINER, ("[iso file] Read Box type %s (0x%08X) at position "LLU" has size 0 but is not at root/file level, skipping\n", gf_4cc_to_str(type), type, start));
     134             :                                 }
     135             :                                 return GF_OK;
     136             :                         }
     137             :                 }
     138      120000 :                 if (is_root_box && (size>=8)) {
     139             :                         Bool do_uncompress = GF_FALSE;
     140             :                         u8 *compb = NULL;
     141       24132 :                         u32 osize = 0;
     142             :                         u32 otype = type;
     143       24132 :                         if (type==GF_4CC('!', 'm', 'o', 'f')) {
     144             :                                 do_uncompress = GF_TRUE;
     145             :                                 type = GF_ISOM_BOX_TYPE_MOOF;
     146             :                         }
     147       24122 :                         else if (type==GF_4CC('!', 'm', 'o', 'v')) {
     148             :                                 do_uncompress = GF_TRUE;
     149             :                                 type = GF_ISOM_BOX_TYPE_MOOV;
     150             :                         }
     151       24120 :                         else if (type==GF_4CC('!', 's', 'i', 'x')) {
     152             :                                 do_uncompress = GF_TRUE;
     153             :                                 type = GF_ISOM_BOX_TYPE_SIDX;
     154             :                         }
     155       24119 :                         else if (type==GF_4CC('!', 's', 's', 'x')) {
     156             :                                 do_uncompress = GF_TRUE;
     157             :                                 type = GF_ISOM_BOX_TYPE_SSIX;
     158             :                         }
     159             : 
     160             :                         if (do_uncompress) {
     161          13 :                                 compb = gf_malloc((u32) (size-8));
     162             : 
     163             :                                 compressed_size = (u32) (size - 8);
     164          13 :                                 gf_bs_read_data(bs, compb, compressed_size);
     165          13 :                                 e = gf_gz_decompress_payload(compb, compressed_size, &uncomp_data, &osize);
     166          13 :                                 if (e) {
     167           0 :                                         GF_LOG(GF_LOG_ERROR, GF_LOG_CONTAINER, ("[iso file] Failed to uncompress payload for box type %s (0x%08X)\n", gf_4cc_to_str(otype), otype));
     168           0 :                                         return e;
     169             :                                 }
     170             : 
     171             :                                 //keep size as complete box size for tests below
     172          13 :                                 size = osize + 8;
     173          13 :                                 uncomp_bs = gf_bs_new(uncomp_data, osize, GF_BITSTREAM_READ);
     174             :                                 bs = uncomp_bs;
     175             :                                 start = 0;
     176          13 :                                 gf_free(compb);
     177             :                         }
     178             :                 }
     179             :         }
     180             :         /*handle uuid*/
     181             :         memset(uuid, 0, 16);
     182      120000 :         if (type == GF_ISOM_BOX_TYPE_UUID ) {
     183          49 :                 if (gf_bs_available(bs) < 16) {
     184             :                         return GF_ISOM_INCOMPLETE_FILE;
     185             :                 }
     186          49 :                 gf_bs_read_data(bs, uuid, 16);
     187          49 :                 hdr_size += 16;
     188          49 :                 uuid_type = gf_isom_solve_uuid_box(uuid);
     189             :         }
     190             : 
     191             :         //handle large box
     192      120000 :         if (size == 1) {
     193           0 :                 if (gf_bs_available(bs) < 8) {
     194             :                         return GF_ISOM_INCOMPLETE_FILE;
     195             :                 }
     196           0 :                 size = gf_bs_read_u64(bs);
     197           0 :                 hdr_size += 8;
     198             :         }
     199      120000 :         if (!skip_logs)
     200      112383 :                 GF_LOG(GF_LOG_DEBUG, GF_LOG_CONTAINER, ("[iso file] Read Box type %s size "LLD" start "LLD"\n", gf_4cc_to_str(type), size,  start));
     201             : 
     202      120000 :         if ( size < hdr_size ) {
     203           0 :                 GF_LOG(GF_LOG_DEBUG, GF_LOG_CONTAINER, ("[iso file] Box size "LLD" less than box header size %d\n", size, hdr_size));
     204             :                 return GF_ISOM_INVALID_FILE;
     205             :         }
     206             :         restore_type = 0;
     207      120000 :         if ((parent_type==GF_ISOM_BOX_TYPE_STSD) && (type==GF_QT_SUBTYPE_RAW) ) {
     208           0 :                 u64 cookie = gf_bs_get_cookie(bs);
     209             :                 restore_type = type;
     210           0 :                 if (cookie & GF_ISOM_BS_COOKIE_VISUAL_TRACK)
     211             :                         type = GF_QT_SUBTYPE_RAW_VID;
     212             :                 else
     213             :                         type = GF_QT_SUBTYPE_RAW_AUD;
     214             : 
     215             :         }
     216             : 
     217             :         //some special boxes (references and track groups) are handled by a single generic box with an associated ref/group type
     218      120000 :         if (parent_type && (parent_type == GF_ISOM_BOX_TYPE_TREF)) {
     219         354 :                 newBox = gf_isom_box_new(GF_ISOM_BOX_TYPE_REFT);
     220         354 :                 if (!newBox) return GF_OUT_OF_MEM;
     221         354 :                 ((GF_TrackReferenceTypeBox*)newBox)->reference_type = type;
     222      119646 :         } else if (parent_type && (parent_type == GF_ISOM_BOX_TYPE_IREF)) {
     223          34 :                 newBox = gf_isom_box_new(GF_ISOM_BOX_TYPE_REFI);
     224          34 :                 if (!newBox) return GF_OUT_OF_MEM;
     225          34 :                 ((GF_ItemReferenceTypeBox*)newBox)->reference_type = type;
     226      119612 :         } else if (parent_type && (parent_type == GF_ISOM_BOX_TYPE_TRGR)) {
     227          19 :                 newBox = gf_isom_box_new(GF_ISOM_BOX_TYPE_TRGT);
     228          19 :                 if (!newBox) return GF_OUT_OF_MEM;
     229          19 :                 ((GF_TrackGroupTypeBox*)newBox)->group_type = type;
     230      119593 :         } else if (parent_type && (parent_type == GF_ISOM_BOX_TYPE_GRPL)) {
     231           0 :                 newBox = gf_isom_box_new(GF_ISOM_BOX_TYPE_GRPT);
     232           0 :                 if (!newBox) return GF_OUT_OF_MEM;
     233           0 :                 ((GF_EntityToGroupTypeBox*)newBox)->grouping_type = type;
     234             :         } else {
     235             :                 //OK, create the box based on the type
     236             :                 is_special = GF_FALSE;
     237      119593 :                 newBox = gf_isom_box_new_ex(uuid_type ? uuid_type : type, parent_type, skip_logs, is_root_box);
     238      119593 :                 if (!newBox) return GF_OUT_OF_MEM;
     239             :         }
     240             : 
     241             :         //OK, init and read this box
     242      120000 :         if (type==GF_ISOM_BOX_TYPE_UUID && !is_special) {
     243          49 :                 memcpy(((GF_UUIDBox *)newBox)->uuid, uuid, 16);
     244          49 :                 ((GF_UUIDBox *)newBox)->internal_4cc = uuid_type;
     245             :         }
     246             : 
     247      120000 :         if (!newBox->type) newBox->type = type;
     248      120000 :         if (restore_type)
     249           0 :                 newBox->type = restore_type;
     250             : 
     251      120000 :         payload_start = gf_bs_get_position(bs);
     252             : 
     253      120000 : retry_unknown_box:
     254             : 
     255      120000 :         end = gf_bs_available(bs);
     256      120000 :         if (size - hdr_size > end ) {
     257        4488 :                 newBox->size = size - hdr_size - end;
     258        4488 :                 *outBox = newBox;
     259        4488 :                 return GF_ISOM_INCOMPLETE_FILE;
     260             :         }
     261             : 
     262      115512 :         newBox->size = size - hdr_size;
     263             : 
     264      115512 :         e = gf_isom_full_box_read(newBox, bs);
     265      115512 :         if (!e) e = gf_isom_box_read(newBox, bs);
     266      115512 :         if (e) {
     267           7 :                 if (gf_opts_get_bool("core", "no-check"))
     268             :                         e = GF_OK;
     269             :         }
     270      115512 :         newBox->size = size;
     271      115512 :         end = gf_bs_get_position(bs);
     272             : 
     273      115512 :         if (uncomp_bs) {
     274          13 :                 gf_free(uncomp_data);
     275          13 :                 gf_bs_del(uncomp_bs);
     276          13 :                 if (e) {
     277           0 :                         gf_isom_box_del(newBox);
     278           0 :                         *outBox = NULL;
     279           0 :                         return e;
     280             :                 }
     281             :                 //move size to real bitstream offsets for tests below
     282          13 :                 size -= 8;
     283             :                 //remember compressed vs real size info for moof in order to properly recompute data_offset/base_data_offset
     284          13 :                 if (type==GF_ISOM_BOX_TYPE_MOOF) {
     285          10 :                         ((GF_MovieFragmentBox *)newBox)->compressed_diff = (s32)size - (s32)compressed_size;
     286             :                 }
     287             :                 //remember compressed vs real size info for moov in order to properly recompute chunk offset
     288           3 :                 else if (type==GF_ISOM_BOX_TYPE_MOOV) {
     289           2 :                         ((GF_MovieBox *)newBox)->compressed_diff = (s32)size - (s32)compressed_size;
     290           2 :                         ((GF_MovieBox *)newBox)->file_offset = comp_start;
     291             :                 }
     292             :                 //remember compressed vs real size info for dump
     293           1 :                 else if (type==GF_ISOM_BOX_TYPE_SIDX) {
     294           1 :                         ((GF_SegmentIndexBox *)newBox)->compressed_diff = (s32)size - (s32)compressed_size;
     295             :                 }
     296             :                 //remember compressed vs real size info for dump
     297           0 :                 else if (type==GF_ISOM_BOX_TYPE_SSIX) {
     298           0 :                         ((GF_SubsegmentIndexBox *)newBox)->compressed_diff = (s32)size - (s32)compressed_size;
     299             :                 }
     300          13 :                 newBox->internal_flags = GF_ISOM_BOX_COMPRESSED;
     301             :         }
     302             : 
     303             : 
     304      115512 :         if (e && (e != GF_ISOM_INCOMPLETE_FILE)) {
     305           6 :                 gf_isom_box_del(newBox);
     306           6 :                 *outBox = NULL;
     307             : 
     308           6 :                 if (parent_type==GF_ISOM_BOX_TYPE_STSD) {
     309           0 :                         newBox = gf_isom_box_new(GF_ISOM_BOX_TYPE_UNKNOWN);
     310           0 :                         if (!newBox) return GF_OUT_OF_MEM;
     311           0 :                         ((GF_UnknownBox *)newBox)->original_4cc = type;
     312           0 :                         newBox->size = size;
     313           0 :                         gf_bs_seek(bs, payload_start);
     314           0 :                         goto retry_unknown_box;
     315             :                 }
     316           6 :                 if (!skip_logs) {
     317           6 :                         GF_LOG(GF_LOG_ERROR, GF_LOG_CONTAINER, ("[iso file] Read Box \"%s\" (start "LLU") failed (%s) - skipping\n", gf_4cc_to_str(type), start, gf_error_to_string(e)));
     318             :                 }
     319             :                 //we don't try to reparse known boxes that have been failing (too dangerous)
     320             :                 return e;
     321             :         }
     322             : 
     323      115506 :         if (end-start > size) {
     324           0 :                 if (!skip_logs) {
     325           0 :                         GF_LOG(GF_LOG_WARNING, GF_LOG_CONTAINER, ("[iso file] Box \"%s\" size "LLU" (start "LLU") invalid (read "LLU")\n", gf_4cc_to_str(type), size, start, (end-start) ));
     326             :                 }
     327             :                 /*let's still try to load the file since no error was notified*/
     328           0 :                 gf_bs_seek(bs, start+size);
     329      115506 :         } else if (end-start < size) {
     330           0 :                 u32 to_skip = (u32) (size-(end-start));
     331           0 :                 if (!skip_logs) {
     332           0 :                         if ((to_skip!=4) || gf_bs_peek_bits(bs, 32, 0)) {
     333           0 :                                 GF_LOG(GF_LOG_WARNING, GF_LOG_CONTAINER, ("[iso file] Box \"%s\" (start "LLU") has %u extra bytes\n", gf_4cc_to_str(type), start, to_skip));
     334             :                         }
     335             :                 }
     336           0 :                 gf_bs_skip_bytes(bs, to_skip);
     337             :         }
     338      115506 :         *outBox = newBox;
     339             : 
     340      115506 :         return e;
     341             : }
     342             : 
     343             : GF_EXPORT
     344        1182 : GF_Err gf_isom_box_parse(GF_Box **outBox, GF_BitStream *bs)
     345             : {
     346        1182 :         return gf_isom_box_parse_ex(outBox, bs, 0, GF_FALSE);
     347             : }
     348             : 
     349      153021 : void gf_isom_box_array_reset(GF_List *boxlist)
     350             : {
     351             :         u32 count, i;
     352      153021 :         if (!boxlist) return;
     353      150285 :         count = gf_list_count(boxlist);
     354      344787 :         for (i = 0; i < count; i++) {
     355      194502 :                 GF_Box *a = (GF_Box *)gf_list_get(boxlist, i);
     356      194502 :                 if (a) gf_isom_box_del(a);
     357             :         }
     358             : }
     359             : 
     360      153021 : void gf_isom_box_array_del(GF_List *boxlist)
     361             : {
     362      153021 :         gf_isom_box_array_reset(boxlist);
     363      153021 :         gf_list_del(boxlist);
     364      153021 : }
     365             : 
     366         688 : void gf_isom_box_array_reset_parent(GF_List **child_boxes, GF_List *boxlist)
     367             : {
     368             :         u32 count, i;
     369         688 :         if (!boxlist) return;
     370         255 :         count = gf_list_count(boxlist);
     371         510 :         for (i = 0; i < count; i++) {
     372         255 :                 GF_Box *a = (GF_Box *)gf_list_get(boxlist, i);
     373         255 :                 if (a) gf_isom_box_del_parent(child_boxes, a);
     374             :         }
     375         255 :         gf_list_reset(boxlist);
     376             : }
     377       55324 : void gf_isom_box_array_del_parent(GF_List **child_boxes, GF_List *boxlist)
     378             : {
     379       55324 :         if (!boxlist) return;
     380         166 :         gf_isom_box_array_reset_parent(child_boxes, boxlist);
     381         166 :         gf_list_del(boxlist);
     382             : }
     383             : 
     384             : 
     385       36647 : GF_Err gf_isom_box_array_read(GF_Box *parent, GF_BitStream *bs)
     386             : {
     387       36647 :         return gf_isom_box_array_read_ex(parent, bs, parent->type);
     388             : }
     389             : 
     390             : #ifndef GPAC_DISABLE_ISOM_WRITE
     391             : 
     392             : GF_EXPORT
     393      154719 : GF_Err gf_isom_box_write_header(GF_Box *ptr, GF_BitStream *bs)
     394             : {
     395             :         u64 start;
     396      154719 :         if (! bs || !ptr) return GF_BAD_PARAM;
     397      154719 :         if (!ptr->size) return GF_ISOM_INVALID_FILE;
     398             : 
     399      154719 :         start = gf_bs_get_position(bs);
     400      154719 :         if (ptr->size > 0xFFFFFFFF) {
     401           2 :                 gf_bs_write_u32(bs, 1);
     402             :         } else {
     403      154717 :                 gf_bs_write_u32(bs, (u32) ptr->size);
     404             :         }
     405      154719 :         gf_bs_write_u32(bs, ptr->type);
     406      154719 :         if (ptr->type == GF_ISOM_BOX_TYPE_UUID) {
     407             :                 u32 i;
     408             :                 Bool conv_uuid = GF_TRUE;
     409             :                 GF_UUIDBox *uuidb = (GF_UUIDBox *)ptr;
     410             :                 char strUUID[32];
     411             : 
     412          35 :                 switch (uuidb->internal_4cc) {
     413             :                 case GF_ISOM_BOX_UUID_TENC:
     414             :                         memcpy(strUUID, "8974dbce7be74c5184f97148f9882554", 32);
     415             :                         break;
     416             :                 case GF_ISOM_BOX_UUID_PSEC:
     417             :                         memcpy(strUUID, "A2394F525A9B4F14A2446C427C648DF4", 32);
     418             :                         break;
     419             :                 case GF_ISOM_BOX_UUID_MSSM:
     420             :                         memcpy(strUUID, "A5D40B30E81411DDBA2F0800200C9A66", 32);
     421             :                         break;
     422             :                 case GF_ISOM_BOX_UUID_PSSH:
     423             :                         memcpy(strUUID, "D08A4F1810F34A82B6C832D8ABA183D3", 32);
     424             :                         break;
     425             :                 case GF_ISOM_BOX_UUID_TFXD:
     426             :                         memcpy(strUUID, "6D1D9B0542D544E680E2141DAFF757B2", 32);
     427             :                         break;
     428             :                 default:
     429             :                         conv_uuid = GF_FALSE;
     430             :                         break;
     431             :                 }
     432             : 
     433             :                 if (conv_uuid) {
     434             :                         char uuid[16];
     435         368 :                         for (i = 0; i < 16; i++) {
     436             :                                 char t[3];
     437         368 :                                 t[2] = 0;
     438         368 :                                 t[0] = strUUID[2*i];
     439         368 :                                 t[1] = strUUID[2*i+1];
     440         368 :                                 uuid[i] = (u8) strtol(t, NULL, 16);
     441             :                         }
     442          23 :                         gf_bs_write_data(bs, uuid, 16);
     443             :                 } else {
     444          12 :                         gf_bs_write_data(bs, uuidb->uuid, 16);
     445             :                 }
     446             :         }
     447      154719 :         if (ptr->size > 0xFFFFFFFF)
     448           2 :                 gf_bs_write_u64(bs, ptr->size);
     449             : 
     450      154719 :         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), ptr->size, start));
     451             : 
     452             :         return GF_OK;
     453             : }
     454             : 
     455       58767 : GF_Err gf_isom_full_box_write(GF_Box *s, GF_BitStream *bs)
     456             : {
     457             :         GF_Err e;
     458             :         GF_FullBox *ptr = (GF_FullBox *)s;
     459       58767 :         e = gf_isom_box_write_header(s, bs);
     460       58767 :         if (e) return e;
     461       58767 :         gf_bs_write_u8(bs, ptr->version);
     462       58767 :         gf_bs_write_u24(bs, ptr->flags);
     463       58767 :         return GF_OK;
     464             : }
     465             : 
     466             : 
     467       62286 : GF_Err gf_isom_box_array_write(GF_Box *parent, GF_List *list, GF_BitStream *bs)
     468             : {
     469             :         u32 count, i;
     470             :         GF_Err e;
     471       62286 :         if (!list) return GF_OK;
     472       62265 :         count = gf_list_count(list);
     473      182589 :         for (i = 0; i < count; i++) {
     474      120324 :                 GF_Box *a = (GF_Box *)gf_list_get(list, i);
     475      120324 :                 if (a) {
     476      120324 :                         e = gf_isom_box_write(a, bs);
     477      120324 :                         if (e) {
     478           0 :                                 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) ));
     479             :                                 return e;
     480             :                         }
     481             :                 }
     482             :         }
     483             :         return GF_OK;
     484             : }
     485             : 
     486             : 
     487      117202 : GF_Err gf_isom_box_array_size(GF_Box *parent, GF_List *list)
     488             : {
     489             :         GF_Err e;
     490             :         u32 count, i;
     491      117202 :         if (! list) return GF_OK;
     492             : 
     493      117181 :         count = gf_list_count(list);
     494      358329 :         for (i = 0; i < count; i++) {
     495      241148 :                 GF_Box *a = (GF_Box *)gf_list_get(list, i);
     496      241148 :                 if (a) {
     497      241148 :                         e = gf_isom_box_size(a);
     498      241148 :                         if (e) {
     499           0 :                                 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) ));
     500             :                                 return e;
     501             :                         }
     502      241148 :                         parent->size += a->size;
     503             :                 }
     504             :         }
     505             :         return GF_OK;
     506             : }
     507             : 
     508             : #endif /*GPAC_DISABLE_ISOM_WRITE*/
     509             : 
     510             : 
     511             : 
     512             : GF_Box * unkn_box_new();
     513             : void unkn_box_del(GF_Box *);
     514             : GF_Err unkn_box_read(GF_Box *s, GF_BitStream *bs);
     515             : GF_Err unkn_box_write(GF_Box *s, GF_BitStream *bs);
     516             : GF_Err unkn_box_size(GF_Box *s);
     517             : GF_Err unkn_box_dump(GF_Box *a, FILE * trace);
     518             : 
     519             : //definition of boxes new/del/read/write/size. For now still exported since some files other than box_funcs.c call them
     520             : //this should be fixed by only using gf_isom_box_new
     521             : 
     522             : #define ISOM_BOX_IMPL_DECL(a_name) \
     523             :                 GF_Box * a_name##_box_new(); \
     524             :                 void a_name##_box_del(GF_Box *); \
     525             :                 GF_Err a_name##_box_read(GF_Box *s, GF_BitStream *bs); \
     526             :                 GF_Err a_name##_box_write(GF_Box *s, GF_BitStream *bs); \
     527             :                 GF_Err a_name##_box_size(GF_Box *s);\
     528             :                 GF_Err a_name##_box_dump(GF_Box *a, FILE * trace);
     529             : 
     530             : #define ISOM_BOX_IMPL_DECL_CHILD(a_name) \
     531             :                 GF_Box * a_name##_box_new(); \
     532             :                 void a_name##_box_del(GF_Box *); \
     533             :                 GF_Err a_name##_box_read(GF_Box *s, GF_BitStream *bs); \
     534             :                 GF_Err a_name##_box_write(GF_Box *s, GF_BitStream *bs); \
     535             :                 GF_Err a_name##_box_size(GF_Box *s);\
     536             :                 GF_Err a_name##_box_dump(GF_Box *a, FILE * trace);\
     537             :                 GF_Err a_name##_on_child_box(GF_Box *s, GF_Box *a, Bool is_rem);\
     538             : 
     539             : 
     540             : ISOM_BOX_IMPL_DECL(reftype)
     541             : ISOM_BOX_IMPL_DECL(ireftype)
     542             : ISOM_BOX_IMPL_DECL(free)
     543             : ISOM_BOX_IMPL_DECL(wide)
     544             : ISOM_BOX_IMPL_DECL(mdat)
     545             : ISOM_BOX_IMPL_DECL_CHILD(moov)
     546             : ISOM_BOX_IMPL_DECL(mvhd)
     547             : ISOM_BOX_IMPL_DECL(mdhd)
     548             : ISOM_BOX_IMPL_DECL(vmhd)
     549             : ISOM_BOX_IMPL_DECL(smhd)
     550             : ISOM_BOX_IMPL_DECL(hmhd)
     551             : ISOM_BOX_IMPL_DECL(nmhd)
     552             : ISOM_BOX_IMPL_DECL_CHILD(stbl)
     553             : ISOM_BOX_IMPL_DECL_CHILD(dinf)
     554             : ISOM_BOX_IMPL_DECL(url)
     555             : ISOM_BOX_IMPL_DECL(urn)
     556             : ISOM_BOX_IMPL_DECL(cprt)
     557             : ISOM_BOX_IMPL_DECL(kind)
     558             : ISOM_BOX_IMPL_DECL(chpl)
     559             : ISOM_BOX_IMPL_DECL(hdlr)
     560             : ISOM_BOX_IMPL_DECL(iods)
     561             : ISOM_BOX_IMPL_DECL_CHILD(trak)
     562             : ISOM_BOX_IMPL_DECL_CHILD(mp4s)
     563             : ISOM_BOX_IMPL_DECL_CHILD(audio_sample_entry)
     564             : ISOM_BOX_IMPL_DECL(gen_sample_entry)
     565             : ISOM_BOX_IMPL_DECL_CHILD(edts)
     566             : ISOM_BOX_IMPL_DECL_CHILD(udta)
     567             : ISOM_BOX_IMPL_DECL(dref)
     568             : ISOM_BOX_IMPL_DECL_CHILD(stsd)
     569             : ISOM_BOX_IMPL_DECL(stts)
     570             : ISOM_BOX_IMPL_DECL(ctts)
     571             : ISOM_BOX_IMPL_DECL(stsh)
     572             : ISOM_BOX_IMPL_DECL(elst)
     573             : ISOM_BOX_IMPL_DECL(stsc)
     574             : ISOM_BOX_IMPL_DECL(stsz)
     575             : ISOM_BOX_IMPL_DECL(stco)
     576             : ISOM_BOX_IMPL_DECL(stss)
     577             : ISOM_BOX_IMPL_DECL(stdp)
     578             : ISOM_BOX_IMPL_DECL(sdtp)
     579             : ISOM_BOX_IMPL_DECL(co64)
     580             : ISOM_BOX_IMPL_DECL(esds)
     581             : ISOM_BOX_IMPL_DECL_CHILD(minf)
     582             : ISOM_BOX_IMPL_DECL(tkhd)
     583             : ISOM_BOX_IMPL_DECL(tref)
     584             : ISOM_BOX_IMPL_DECL_CHILD(mdia)
     585             : ISOM_BOX_IMPL_DECL_CHILD(mfra)
     586             : ISOM_BOX_IMPL_DECL(tfra)
     587             : ISOM_BOX_IMPL_DECL(mfro)
     588             : ISOM_BOX_IMPL_DECL(uuid)
     589             : ISOM_BOX_IMPL_DECL(void)
     590             : ISOM_BOX_IMPL_DECL(gnrm)
     591             : ISOM_BOX_IMPL_DECL(gnrv)
     592             : ISOM_BOX_IMPL_DECL(gnra)
     593             : ISOM_BOX_IMPL_DECL(pdin)
     594             : ISOM_BOX_IMPL_DECL(def_parent)
     595             : ISOM_BOX_IMPL_DECL(def_parent_full)
     596             : ISOM_BOX_IMPL_DECL(csgp)
     597             : 
     598             : 
     599             : #ifndef GPAC_DISABLE_ISOM_HINTING
     600             : 
     601             : ISOM_BOX_IMPL_DECL_CHILD(hinf)
     602             : ISOM_BOX_IMPL_DECL(trpy)
     603             : ISOM_BOX_IMPL_DECL(totl)
     604             : ISOM_BOX_IMPL_DECL(nump)
     605             : ISOM_BOX_IMPL_DECL(npck)
     606             : ISOM_BOX_IMPL_DECL(tpyl)
     607             : ISOM_BOX_IMPL_DECL(tpay)
     608             : ISOM_BOX_IMPL_DECL(maxr)
     609             : ISOM_BOX_IMPL_DECL(dmed)
     610             : ISOM_BOX_IMPL_DECL(dimm)
     611             : ISOM_BOX_IMPL_DECL(drep)
     612             : ISOM_BOX_IMPL_DECL(tmin)
     613             : ISOM_BOX_IMPL_DECL(tmax)
     614             : ISOM_BOX_IMPL_DECL(pmax)
     615             : ISOM_BOX_IMPL_DECL(dmax)
     616             : ISOM_BOX_IMPL_DECL(payt)
     617             : ISOM_BOX_IMPL_DECL(name)
     618             : ISOM_BOX_IMPL_DECL(rely)
     619             : ISOM_BOX_IMPL_DECL(snro)
     620             : ISOM_BOX_IMPL_DECL(tims)
     621             : ISOM_BOX_IMPL_DECL(tsro)
     622             : ISOM_BOX_IMPL_DECL(ghnt)
     623             : ISOM_BOX_IMPL_DECL_CHILD(hnti)
     624             : ISOM_BOX_IMPL_DECL(sdp)
     625             : ISOM_BOX_IMPL_DECL(rtpo)
     626             : ISOM_BOX_IMPL_DECL(tssy)
     627             : ISOM_BOX_IMPL_DECL(rssr)
     628             : ISOM_BOX_IMPL_DECL_CHILD(srpp)
     629             : ISOM_BOX_IMPL_DECL(rtp_hnti)
     630             : 
     631             : #endif
     632             : 
     633             : ISOM_BOX_IMPL_DECL(ftyp)
     634             : ISOM_BOX_IMPL_DECL(padb)
     635             : ISOM_BOX_IMPL_DECL(gppc)
     636             : 
     637             : 
     638             : #ifndef GPAC_DISABLE_ISOM_FRAGMENTS
     639             : ISOM_BOX_IMPL_DECL_CHILD(mvex)
     640             : ISOM_BOX_IMPL_DECL(trex)
     641             : ISOM_BOX_IMPL_DECL_CHILD(moof)
     642             : ISOM_BOX_IMPL_DECL(mfhd)
     643             : ISOM_BOX_IMPL_DECL_CHILD(traf)
     644             : ISOM_BOX_IMPL_DECL(tfhd)
     645             : ISOM_BOX_IMPL_DECL(trun)
     646             : ISOM_BOX_IMPL_DECL(styp)
     647             : ISOM_BOX_IMPL_DECL(mehd)
     648             : /*smooth streaming timing*/
     649             : ISOM_BOX_IMPL_DECL(tfxd)
     650             : ISOM_BOX_IMPL_DECL(tfrf)
     651             : 
     652             : #endif
     653             : 
     654             : /*avc ext*/
     655             : ISOM_BOX_IMPL_DECL(avcc)
     656             : ISOM_BOX_IMPL_DECL_CHILD(video_sample_entry)
     657             : ISOM_BOX_IMPL_DECL(m4ds)
     658             : ISOM_BOX_IMPL_DECL(btrt)
     659             : ISOM_BOX_IMPL_DECL(mehd)
     660             : 
     661             : /*3GPP streaming text*/
     662             : ISOM_BOX_IMPL_DECL(ftab)
     663             : ISOM_BOX_IMPL_DECL_CHILD(tx3g)
     664             : ISOM_BOX_IMPL_DECL(text)
     665             : ISOM_BOX_IMPL_DECL(styl)
     666             : ISOM_BOX_IMPL_DECL(hlit)
     667             : ISOM_BOX_IMPL_DECL(hclr)
     668             : ISOM_BOX_IMPL_DECL(krok)
     669             : ISOM_BOX_IMPL_DECL(dlay)
     670             : ISOM_BOX_IMPL_DECL(href)
     671             : ISOM_BOX_IMPL_DECL(tbox)
     672             : ISOM_BOX_IMPL_DECL(blnk)
     673             : ISOM_BOX_IMPL_DECL(twrp)
     674             : 
     675             : 
     676             : #ifndef GPAC_DISABLE_VTT
     677             : 
     678             : /*WebVTT boxes*/
     679             : ISOM_BOX_IMPL_DECL(boxstring);
     680             : ISOM_BOX_IMPL_DECL_CHILD(vtcu)
     681             : ISOM_BOX_IMPL_DECL(vtte)
     682             : ISOM_BOX_IMPL_DECL_CHILD(wvtt)
     683             : 
     684             : #endif //GPAC_DISABLE_VTT
     685             : 
     686             : /* Items functions */
     687             : ISOM_BOX_IMPL_DECL_CHILD(meta)
     688             : ISOM_BOX_IMPL_DECL(xml)
     689             : ISOM_BOX_IMPL_DECL(bxml)
     690             : ISOM_BOX_IMPL_DECL(iloc)
     691             : ISOM_BOX_IMPL_DECL(pitm)
     692             : ISOM_BOX_IMPL_DECL_CHILD(ipro)
     693             : ISOM_BOX_IMPL_DECL(infe)
     694             : ISOM_BOX_IMPL_DECL_CHILD(iinf)
     695             : ISOM_BOX_IMPL_DECL_CHILD(iref)
     696             : ISOM_BOX_IMPL_DECL_CHILD(sinf)
     697             : ISOM_BOX_IMPL_DECL(frma)
     698             : ISOM_BOX_IMPL_DECL(schm)
     699             : ISOM_BOX_IMPL_DECL_CHILD(schi)
     700             : ISOM_BOX_IMPL_DECL(enca)
     701             : ISOM_BOX_IMPL_DECL(encs)
     702             : ISOM_BOX_IMPL_DECL(encv)
     703             : ISOM_BOX_IMPL_DECL(resv)
     704             : 
     705             : 
     706             : /** ISMACryp functions **/
     707             : ISOM_BOX_IMPL_DECL(iKMS)
     708             : ISOM_BOX_IMPL_DECL(iSFM)
     709             : ISOM_BOX_IMPL_DECL(iSLT)
     710             : 
     711             : #ifndef GPAC_DISABLE_ISOM_ADOBE
     712             : /* Adobe extensions */
     713             : ISOM_BOX_IMPL_DECL(abst)
     714             : ISOM_BOX_IMPL_DECL(afra)
     715             : ISOM_BOX_IMPL_DECL(asrt)
     716             : ISOM_BOX_IMPL_DECL(afrt)
     717             : #endif /*GPAC_DISABLE_ISOM_ADOBE*/
     718             : 
     719             : /* Apple extensions */
     720             : ISOM_BOX_IMPL_DECL(ilst)
     721             : ISOM_BOX_IMPL_DECL(ilst_item)
     722             : ISOM_BOX_IMPL_DECL(databox)
     723             : ISOM_BOX_IMPL_DECL(gmin)
     724             : ISOM_BOX_IMPL_DECL(alis)
     725             : ISOM_BOX_IMPL_DECL(clef)
     726             : 
     727             : /*OMA extensions*/
     728             : ISOM_BOX_IMPL_DECL(ohdr)
     729             : ISOM_BOX_IMPL_DECL(grpi)
     730             : ISOM_BOX_IMPL_DECL(mdri)
     731             : ISOM_BOX_IMPL_DECL(odtt)
     732             : ISOM_BOX_IMPL_DECL(odrb)
     733             : ISOM_BOX_IMPL_DECL(odkm)
     734             : 
     735             : 
     736             : ISOM_BOX_IMPL_DECL(pasp)
     737             : ISOM_BOX_IMPL_DECL(clap)
     738             : ISOM_BOX_IMPL_DECL_CHILD(metx)
     739             : ISOM_BOX_IMPL_DECL(txtc)
     740             : ISOM_BOX_IMPL_DECL(tsel)
     741             : ISOM_BOX_IMPL_DECL(dimC)
     742             : ISOM_BOX_IMPL_DECL_CHILD(dims)
     743             : ISOM_BOX_IMPL_DECL(diST)
     744             : ISOM_BOX_IMPL_DECL(ac3)
     745             : ISOM_BOX_IMPL_DECL(ec3)
     746             : ISOM_BOX_IMPL_DECL(dac3)
     747             : ISOM_BOX_IMPL_DECL(dec3)
     748             : ISOM_BOX_IMPL_DECL(dmlp)
     749             : ISOM_BOX_IMPL_DECL(lsrc)
     750             : ISOM_BOX_IMPL_DECL_CHILD(lsr1)
     751             : ISOM_BOX_IMPL_DECL(mvcg)
     752             : ISOM_BOX_IMPL_DECL(vwid)
     753             : 
     754             : ISOM_BOX_IMPL_DECL(subs)
     755             : 
     756             : ISOM_BOX_IMPL_DECL(tmcd)
     757             : ISOM_BOX_IMPL_DECL(tcmi)
     758             : ISOM_BOX_IMPL_DECL(fiel)
     759             : ISOM_BOX_IMPL_DECL(gama)
     760             : ISOM_BOX_IMPL_DECL(chrm)
     761             : ISOM_BOX_IMPL_DECL(chan)
     762             : 
     763             : 
     764             : #ifndef GPAC_DISABLE_ISOM_FRAGMENTS
     765             : ISOM_BOX_IMPL_DECL(sidx)
     766             : ISOM_BOX_IMPL_DECL(ssix)
     767             : ISOM_BOX_IMPL_DECL(leva)
     768             : ISOM_BOX_IMPL_DECL(pcrb)
     769             : ISOM_BOX_IMPL_DECL(tfdt)
     770             : ISOM_BOX_IMPL_DECL(emsg)
     771             : 
     772             : #endif
     773             : 
     774             : ISOM_BOX_IMPL_DECL(rvcc)
     775             : ISOM_BOX_IMPL_DECL(sbgp)
     776             : ISOM_BOX_IMPL_DECL(sgpd)
     777             : ISOM_BOX_IMPL_DECL(saiz)
     778             : ISOM_BOX_IMPL_DECL(saio)
     779             : 
     780             : ISOM_BOX_IMPL_DECL(pssh)
     781             : 
     782             : ISOM_BOX_IMPL_DECL(tenc)
     783             : ISOM_BOX_IMPL_DECL(piff_tenc)
     784             : ISOM_BOX_IMPL_DECL(piff_psec)
     785             : ISOM_BOX_IMPL_DECL(piff_pssh)
     786             : ISOM_BOX_IMPL_DECL(senc)
     787             : ISOM_BOX_IMPL_DECL(cslg)
     788             : ISOM_BOX_IMPL_DECL(ccst)
     789             : ISOM_BOX_IMPL_DECL(auxi)
     790             : ISOM_BOX_IMPL_DECL(hvcc)
     791             : ISOM_BOX_IMPL_DECL(av1c)
     792             : ISOM_BOX_IMPL_DECL(dOps)
     793             : ISOM_BOX_IMPL_DECL(prft)
     794             : ISOM_BOX_IMPL_DECL(vvcc)
     795             : 
     796             : //VPx
     797             : ISOM_BOX_IMPL_DECL(vpcc)
     798             : ISOM_BOX_IMPL_DECL(SmDm)
     799             : ISOM_BOX_IMPL_DECL(CoLL)
     800             : 
     801             : ISOM_BOX_IMPL_DECL(trep)
     802             : 
     803             : //FEC
     804             : ISOM_BOX_IMPL_DECL_CHILD(fiin)
     805             : ISOM_BOX_IMPL_DECL_CHILD(paen)
     806             : ISOM_BOX_IMPL_DECL(fpar)
     807             : ISOM_BOX_IMPL_DECL(fecr)
     808             : ISOM_BOX_IMPL_DECL(segr)
     809             : ISOM_BOX_IMPL_DECL(gitn)
     810             : ISOM_BOX_IMPL_DECL_CHILD(fdsa)
     811             : ISOM_BOX_IMPL_DECL(fdpa)
     812             : ISOM_BOX_IMPL_DECL(extr)
     813             : 
     814             : 
     815             : /*
     816             :         Adobe's protection boxes
     817             : */
     818             : ISOM_BOX_IMPL_DECL_CHILD(adkm)
     819             : ISOM_BOX_IMPL_DECL_CHILD(ahdr)
     820             : ISOM_BOX_IMPL_DECL_CHILD(aprm)
     821             : ISOM_BOX_IMPL_DECL(aeib)
     822             : ISOM_BOX_IMPL_DECL_CHILD(akey)
     823             : ISOM_BOX_IMPL_DECL(flxs)
     824             : ISOM_BOX_IMPL_DECL(adaf)
     825             : 
     826             : /* Image File Format declarations */
     827             : ISOM_BOX_IMPL_DECL(ispe)
     828             : ISOM_BOX_IMPL_DECL(colr)
     829             : ISOM_BOX_IMPL_DECL(pixi)
     830             : ISOM_BOX_IMPL_DECL(rloc)
     831             : ISOM_BOX_IMPL_DECL(irot)
     832             : ISOM_BOX_IMPL_DECL(imir)
     833             : ISOM_BOX_IMPL_DECL(ipco)
     834             : ISOM_BOX_IMPL_DECL_CHILD(iprp)
     835             : ISOM_BOX_IMPL_DECL(ipma)
     836             : ISOM_BOX_IMPL_DECL_CHILD(trgr)
     837             : ISOM_BOX_IMPL_DECL(trgt)
     838             : ISOM_BOX_IMPL_DECL(ienc)
     839             : ISOM_BOX_IMPL_DECL(iaux)
     840             : 
     841             : /* MIAF declarations */
     842             : ISOM_BOX_IMPL_DECL(clli)
     843             : ISOM_BOX_IMPL_DECL(mdcv)
     844             : 
     845             : ISOM_BOX_IMPL_DECL(grpl)
     846             : 
     847             : ISOM_BOX_IMPL_DECL_CHILD(strk)
     848             : ISOM_BOX_IMPL_DECL(stri)
     849             : ISOM_BOX_IMPL_DECL(stsg)
     850             : ISOM_BOX_IMPL_DECL(elng)
     851             : ISOM_BOX_IMPL_DECL(stvi)
     852             : ISOM_BOX_IMPL_DECL(auxc)
     853             : ISOM_BOX_IMPL_DECL(oinf)
     854             : ISOM_BOX_IMPL_DECL(tols)
     855             : 
     856             : ISOM_BOX_IMPL_DECL(trik)
     857             : ISOM_BOX_IMPL_DECL(bloc)
     858             : ISOM_BOX_IMPL_DECL(ainf)
     859             : ISOM_BOX_IMPL_DECL(mhac)
     860             : ISOM_BOX_IMPL_DECL(mhap)
     861             : 
     862             : ISOM_BOX_IMPL_DECL(grptype)
     863             : 
     864             : ISOM_BOX_IMPL_DECL_CHILD(jp2h)
     865             : ISOM_BOX_IMPL_DECL(ihdr)
     866             : ISOM_BOX_IMPL_DECL(load)
     867             : 
     868             : /* Dolby Vision */
     869             : ISOM_BOX_IMPL_DECL(dvcC)
     870             : ISOM_BOX_IMPL_DECL(dvhe)
     871             : ISOM_BOX_IMPL_DECL(dfla)
     872             : 
     873             : ISOM_BOX_IMPL_DECL(pcmC)
     874             : ISOM_BOX_IMPL_DECL(chnl)
     875             : 
     876             : ISOM_BOX_IMPL_DECL(xtra)
     877             : 
     878             : ISOM_BOX_IMPL_DECL(st3d)
     879             : ISOM_BOX_IMPL_DECL(svhd)
     880             : ISOM_BOX_IMPL_DECL(prhd)
     881             : ISOM_BOX_IMPL_DECL(proj_type)
     882             : //ISOM_BOX_IMPL_DECL(mesh)
     883             : 
     884             : 
     885             : #define BOX_DEFINE(__type, b_rad, __par) { __type, b_rad##_box_new, b_rad##_box_del, b_rad##_box_read, b_rad##_box_write, b_rad##_box_size, b_rad##_box_dump, 0, 0, 0, __par, "p12", GF_FALSE}
     886             : 
     887             : #define BOX_DEFINE_CHILD(__type, b_rad, __par) { __type, b_rad##_box_new, b_rad##_box_del, b_rad##_box_read, b_rad##_box_write, b_rad##_box_size, b_rad##_box_dump, 0, 0, 0, __par, "p12", GF_FALSE, b_rad##_on_child_box}
     888             : 
     889             : #define BOX_DEFINE_S(__type, b_rad, __par, __spec) { __type, b_rad##_box_new, b_rad##_box_del, b_rad##_box_read, b_rad##_box_write, b_rad##_box_size, b_rad##_box_dump, 0, 0, 0, __par, __spec, GF_FALSE }
     890             : 
     891             : #define BOX_DEFINE_S_CHILD(__type, b_rad, __par, __spec) { __type, b_rad##_box_new, b_rad##_box_del, b_rad##_box_read, b_rad##_box_write, b_rad##_box_size, b_rad##_box_dump, 0, 0, 0, __par, __spec, GF_FALSE, b_rad##_on_child_box}
     892             : 
     893             : #define FBOX_DEFINE(__type, b_rad, __par, __max_v) { __type, b_rad##_box_new, b_rad##_box_del, b_rad##_box_read, b_rad##_box_write, b_rad##_box_size, b_rad##_box_dump, 0, 1+__max_v, 0, __par, "p12", GF_FALSE }
     894             : 
     895             : #define FBOX_DEFINE_CHILD(__type, b_rad, __par, __max_v) { __type, b_rad##_box_new, b_rad##_box_del, b_rad##_box_read, b_rad##_box_write, b_rad##_box_size, b_rad##_box_dump, 0, 1+__max_v, 0, __par, "p12", GF_FALSE, b_rad##_on_child_box}
     896             : 
     897             : #define FBOX_DEFINE_FLAGS(__type, b_rad, __par, __max_v, flags) { __type, b_rad##_box_new, b_rad##_box_del, b_rad##_box_read, b_rad##_box_write, b_rad##_box_size, b_rad##_box_dump, 0, 1+__max_v, flags, __par, "p12", GF_FALSE }
     898             : 
     899             : #define FBOX_DEFINE_FLAGS_S(__type, b_rad, __par, __max_v, flags, __spec) { __type, b_rad##_box_new, b_rad##_box_del, b_rad##_box_read, b_rad##_box_write, b_rad##_box_size, b_rad##_box_dump, 0, 1+__max_v, flags, __par, __spec, GF_FALSE }
     900             : 
     901             : #define FBOX_DEFINE_S(__type, b_rad, __par, __max_v, __spec) { __type, b_rad##_box_new, b_rad##_box_del, b_rad##_box_read, b_rad##_box_write, b_rad##_box_size, b_rad##_box_dump, 0, 1+__max_v, 0, __par, __spec, GF_FALSE }
     902             : 
     903             : #define FBOX_DEFINE_S_CHILD(__type, b_rad, __par, __max_v, __spec) { __type, b_rad##_box_new, b_rad##_box_del, b_rad##_box_read, b_rad##_box_write, b_rad##_box_size, b_rad##_box_dump, 0, 1+__max_v, 0, __par, __spec, GF_FALSE, b_rad##_on_child_box}
     904             : 
     905             : #define TREF_DEFINE(__type, b_rad, __par, __4cc, __spec) { __type, b_rad##_box_new, b_rad##_box_del, b_rad##_box_read, b_rad##_box_write, b_rad##_box_size, b_rad##_box_dump, __4cc, 0, 0, __par, __spec, GF_FALSE }
     906             : 
     907             : #define TRGT_DEFINE(__type, b_rad, __par, __4cc, max_version, __spec) { __type, b_rad##_box_new, b_rad##_box_del, b_rad##_box_read, b_rad##_box_write, b_rad##_box_size, b_rad##_box_dump, __4cc, 1+max_version, 0, __par, __spec, GF_FALSE }
     908             : 
     909             : #define SGPD_DEFINE(__type, b_rad, __par, __4cc, __spec) { __type, b_rad##_box_new, b_rad##_box_del, b_rad##_box_read, b_rad##_box_write, b_rad##_box_size, b_rad##_box_dump, __4cc, 1, 0, __par, __spec, GF_FALSE }
     910             : 
     911             : #define ITUNES_TAG(_val) \
     912             :         BOX_DEFINE_S( _val, ilst_item, "ilst data", "apple")
     913             : 
     914             : static struct box_registry_entry {
     915             :         u32 box_4cc;
     916             :         GF_Box * (*new_fn)();
     917             :         void (*del_fn)(GF_Box *a);
     918             :         GF_Err (*read_fn)(GF_Box *s, GF_BitStream *bs);
     919             :         GF_Err (*write_fn)(GF_Box *s, GF_BitStream *bs);
     920             :         GF_Err (*size_fn)(GF_Box *a);
     921             :         GF_Err (*dump_fn)(GF_Box *a, FILE *trace);
     922             :         u32 alt_4cc;//used for sample grouping type and track / item reference types
     923             :         u8 max_version_plus_one;
     924             :         u32 flags;
     925             :         const char *parents_4cc;
     926             :         const char *spec;
     927             :         Bool disabled;
     928             :         GF_Err (*add_rem_fn)(GF_Box *par, GF_Box *b, Bool is_remove);
     929             : } box_registry [] =
     930             : {
     931             :         //DO NOT MOVE THE FIRST ENTRY
     932             :         BOX_DEFINE_S(GF_ISOM_BOX_TYPE_UNKNOWN, unkn, "unknown", "unknown"),
     933             :         BOX_DEFINE_S(GF_ISOM_BOX_TYPE_UUID, uuid, "unknown", "unknown"),
     934             : 
     935             :         //all track reference types
     936             :         TREF_DEFINE(GF_ISOM_BOX_TYPE_REFT, reftype, "tref", GF_ISOM_REF_META, "p12"),
     937             :         TREF_DEFINE(GF_ISOM_BOX_TYPE_REFT, reftype, "tref", GF_ISOM_REF_HINT, "p12"),
     938             :         TREF_DEFINE(GF_ISOM_BOX_TYPE_REFT, reftype, "tref", GF_ISOM_REF_FONT, "p12"),
     939             :         TREF_DEFINE(GF_ISOM_BOX_TYPE_REFT, reftype, "tref", GF_ISOM_REF_HIND, "p12"),
     940             :         TREF_DEFINE(GF_ISOM_BOX_TYPE_REFT, reftype, "tref", GF_ISOM_REF_VDEP, "p12"),
     941             :         TREF_DEFINE(GF_ISOM_BOX_TYPE_REFT, reftype, "tref", GF_ISOM_REF_VPLX, "p12"),
     942             :         TREF_DEFINE(GF_ISOM_BOX_TYPE_REFT, reftype, "tref", GF_ISOM_REF_SUBT, "p12"),
     943             :         TREF_DEFINE(GF_ISOM_BOX_TYPE_REFT, reftype, "tref", GF_ISOM_REF_THUMB, "p12"),
     944             : 
     945             :         TREF_DEFINE(GF_ISOM_BOX_TYPE_REFT, reftype, "tref", GF_ISOM_REF_OD, "p14"),
     946             :         TREF_DEFINE(GF_ISOM_BOX_TYPE_REFT, reftype, "tref", GF_ISOM_REF_DECODE, "p14"),
     947             :         TREF_DEFINE(GF_ISOM_BOX_TYPE_REFT, reftype, "tref", GF_ISOM_REF_OCR, "p14"),
     948             :         TREF_DEFINE(GF_ISOM_BOX_TYPE_REFT, reftype, "tref", GF_ISOM_REF_IPI, "p14"),
     949             : 
     950             :         TREF_DEFINE(GF_ISOM_BOX_TYPE_REFT, reftype, "tref", GF_ISOM_REF_BASE, "p15"),
     951             :         TREF_DEFINE(GF_ISOM_BOX_TYPE_REFT, reftype, "tref", GF_ISOM_REF_SCAL, "p15"),
     952             :         TREF_DEFINE(GF_ISOM_BOX_TYPE_REFT, reftype, "tref", GF_ISOM_REF_TBAS, "p15"),
     953             :         TREF_DEFINE(GF_ISOM_BOX_TYPE_REFT, reftype, "tref", GF_ISOM_REF_SABT, "p15"),
     954             :         TREF_DEFINE(GF_ISOM_BOX_TYPE_REFT, reftype, "tref", GF_ISOM_REF_OREF, "p15"),
     955             : 
     956             :         TREF_DEFINE(GF_ISOM_BOX_TYPE_REFT, reftype, "tref", GF_ISOM_REF_ADDA, "p12"),
     957             :         TREF_DEFINE(GF_ISOM_BOX_TYPE_REFT, reftype, "tref", GF_ISOM_REF_ADRC, "p12"),
     958             :         TREF_DEFINE(GF_ISOM_BOX_TYPE_REFT, reftype, "tref", GF_ISOM_REF_ILOC, "p12"),
     959             :         TREF_DEFINE(GF_ISOM_BOX_TYPE_REFT, reftype, "tref", GF_ISOM_REF_AVCP, "p15"),
     960             :         TREF_DEFINE(GF_ISOM_BOX_TYPE_REFT, reftype, "tref", GF_ISOM_REF_SWTO, "p15"),
     961             :         TREF_DEFINE(GF_ISOM_BOX_TYPE_REFT, reftype, "tref", GF_ISOM_REF_SWFR, "p15"),
     962             : 
     963             :         TREF_DEFINE(GF_ISOM_BOX_TYPE_REFT, reftype, "tref", GF_ISOM_REF_CHAP, "apple"),
     964             :         TREF_DEFINE(GF_ISOM_BOX_TYPE_REFT, reftype, "tref", GF_ISOM_REF_TMCD, "apple"),
     965             :         TREF_DEFINE(GF_ISOM_BOX_TYPE_REFT, reftype, "tref", GF_ISOM_REF_CDEP, "apple"),
     966             :         TREF_DEFINE(GF_ISOM_BOX_TYPE_REFT, reftype, "tref", GF_ISOM_REF_SCPT, "apple"),
     967             :         TREF_DEFINE(GF_ISOM_BOX_TYPE_REFT, reftype, "tref", GF_ISOM_REF_SSRC, "apple"),
     968             :         TREF_DEFINE(GF_ISOM_BOX_TYPE_REFT, reftype, "tref", GF_ISOM_REF_LYRA, "apple"),
     969             : 
     970             :         //all item reference types
     971             :         TREF_DEFINE( GF_ISOM_BOX_TYPE_REFI, ireftype, "iref", GF_ISOM_REF_TBAS, "p12"),
     972             :         TREF_DEFINE( GF_ISOM_BOX_TYPE_REFI, ireftype, "iref", GF_ISOM_REF_ILOC, "p12"),
     973             :         TREF_DEFINE( GF_ISOM_BOX_TYPE_REFI, ireftype, "iref", GF_ISOM_REF_FDEL, "p12"),
     974             : 
     975             :         //all sample group descriptions
     976             :         SGPD_DEFINE( GF_ISOM_BOX_TYPE_SGPD, sgpd, "stbl traf", GF_ISOM_SAMPLE_GROUP_ROLL, "p12"),
     977             :         SGPD_DEFINE( GF_ISOM_BOX_TYPE_SGPD, sgpd, "stbl traf", GF_ISOM_SAMPLE_GROUP_PROL, "p12"),
     978             :         SGPD_DEFINE( GF_ISOM_BOX_TYPE_SGPD, sgpd, "stbl traf", GF_ISOM_SAMPLE_GROUP_RAP, "p12"),
     979             :         SGPD_DEFINE( GF_ISOM_BOX_TYPE_SGPD, sgpd, "stbl traf", GF_ISOM_SAMPLE_GROUP_SEIG, "p15"),
     980             :         SGPD_DEFINE( GF_ISOM_BOX_TYPE_SGPD, sgpd, "stbl traf", GF_ISOM_SAMPLE_GROUP_OINF, "p15"),
     981             :         SGPD_DEFINE( GF_ISOM_BOX_TYPE_SGPD, sgpd, "stbl traf", GF_ISOM_SAMPLE_GROUP_LINF, "p15"),
     982             :         SGPD_DEFINE( GF_ISOM_BOX_TYPE_SGPD, sgpd, "stbl traf", GF_ISOM_SAMPLE_GROUP_TRIF, "p15"),
     983             :         SGPD_DEFINE( GF_ISOM_BOX_TYPE_SGPD, sgpd, "stbl traf", GF_ISOM_SAMPLE_GROUP_NALM, "p15"),
     984             :         SGPD_DEFINE( GF_ISOM_BOX_TYPE_SGPD, sgpd, "stbl traf", GF_ISOM_SAMPLE_GROUP_TELE, "p12"),
     985             :         SGPD_DEFINE( GF_ISOM_BOX_TYPE_SGPD, sgpd, "stbl traf", GF_ISOM_SAMPLE_GROUP_RASH, "p12"),
     986             :         SGPD_DEFINE( GF_ISOM_BOX_TYPE_SGPD, sgpd, "stbl traf", GF_ISOM_SAMPLE_GROUP_ALST, "p12"),
     987             :         SGPD_DEFINE( GF_ISOM_BOX_TYPE_SGPD, sgpd, "stbl traf", GF_ISOM_SAMPLE_GROUP_SAP, "p12"),
     988             : 
     989             :         SGPD_DEFINE( GF_ISOM_BOX_TYPE_SGPD, sgpd, "stbl traf", GF_ISOM_SAMPLE_GROUP_AVLL, "p15"),
     990             :         SGPD_DEFINE( GF_ISOM_BOX_TYPE_SGPD, sgpd, "stbl traf", GF_ISOM_SAMPLE_GROUP_AVSS, "p15"),
     991             :         SGPD_DEFINE( GF_ISOM_BOX_TYPE_SGPD, sgpd, "stbl traf", GF_ISOM_SAMPLE_GROUP_DTRT, "p15"),
     992             :         SGPD_DEFINE( GF_ISOM_BOX_TYPE_SGPD, sgpd, "stbl traf", GF_ISOM_SAMPLE_GROUP_MVIF, "p15"),
     993             :         SGPD_DEFINE( GF_ISOM_BOX_TYPE_SGPD, sgpd, "stbl traf", GF_ISOM_SAMPLE_GROUP_SCIF, "p15"),
     994             :         SGPD_DEFINE( GF_ISOM_BOX_TYPE_SGPD, sgpd, "stbl traf", GF_ISOM_SAMPLE_GROUP_SCNM, "p15"),
     995             :         SGPD_DEFINE( GF_ISOM_BOX_TYPE_SGPD, sgpd, "stbl traf", GF_ISOM_SAMPLE_GROUP_STSA, "p15"),
     996             :         SGPD_DEFINE( GF_ISOM_BOX_TYPE_SGPD, sgpd, "stbl traf", GF_ISOM_SAMPLE_GROUP_TSAS, "p15"),
     997             :         SGPD_DEFINE( GF_ISOM_BOX_TYPE_SGPD, sgpd, "stbl traf", GF_ISOM_SAMPLE_GROUP_SYNC, "p15"),
     998             :         SGPD_DEFINE( GF_ISOM_BOX_TYPE_SGPD, sgpd, "stbl traf", GF_ISOM_SAMPLE_GROUP_TSCL, "p15"),
     999             :         SGPD_DEFINE( GF_ISOM_BOX_TYPE_SGPD, sgpd, "stbl traf", GF_ISOM_SAMPLE_GROUP_VIPR, "p15"),
    1000             :         SGPD_DEFINE( GF_ISOM_BOX_TYPE_SGPD, sgpd, "stbl traf", GF_ISOM_SAMPLE_GROUP_LBLI, "p15"),
    1001             : 
    1002             :         SGPD_DEFINE( GF_ISOM_BOX_TYPE_SGPD, sgpd, "stbl traf", GF_ISOM_SAMPLE_GROUP_3GAG, "3gpp"),
    1003             :         SGPD_DEFINE( GF_ISOM_BOX_TYPE_SGPD, sgpd, "stbl traf", GF_ISOM_SAMPLE_GROUP_AVCB, "3gpp"),
    1004             : 
    1005             :         //internal boxes
    1006             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_GNRM, gnrm, "stsd", "unknown"),
    1007             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_GNRV, gnrv, "stsd", "unknown"),
    1008             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_GNRA, gnra, "stsd", "unknown"),
    1009             : 
    1010             :         //all track group types
    1011             :         TRGT_DEFINE( GF_ISOM_BOX_TYPE_TRGT, trgt, "trgr", GF_ISOM_BOX_TYPE_MSRC, 0, "p12" ),
    1012             :         TRGT_DEFINE( GF_ISOM_BOX_TYPE_TRGT, trgt, "trgr", GF_ISOM_BOX_TYPE_STER, 0, "p12" ),
    1013             :         TRGT_DEFINE( GF_ISOM_BOX_TYPE_TRGT, trgt, "trgr", GF_ISOM_BOX_TYPE_CSTG, 0, "p15" ),
    1014             : 
    1015             :         //part12 boxes
    1016             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_FREE, free, "*"),
    1017             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_SKIP, free, "*"),
    1018             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_MDAT, mdat, "file"),
    1019             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_IDAT, mdat, "meta"),
    1020             :         BOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_MOOV, moov, "file"),
    1021             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_MVHD, mvhd, "moov", 1),
    1022             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_MDHD, mdhd, "mdia", 1),
    1023             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_VMHD, vmhd, "minf", 0),
    1024             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_SMHD, smhd, "minf", 0),
    1025             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_HMHD, hmhd, "minf", 0),
    1026             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_NMHD, nmhd, "minf", 0),
    1027             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_STHD, nmhd, "minf", 0),
    1028             :         BOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_STBL, stbl, "minf"),
    1029             :         BOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_DINF, dinf, "minf meta"),
    1030             :         FBOX_DEFINE_FLAGS( GF_ISOM_BOX_TYPE_URL, url, "dref", 0, 1),
    1031             :         FBOX_DEFINE_FLAGS( GF_ISOM_BOX_TYPE_URN, urn, "dref", 0, 1),
    1032             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_CPRT, cprt, "udta", 0),
    1033             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_KIND, kind, "udta", 0),
    1034             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_HDLR, hdlr, "mdia meta minf", 0),       //minf container is OK in QT ...
    1035             :         BOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_TRAK, trak, "moov"),
    1036             :         BOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_EDTS, edts, "trak"),
    1037             :         BOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_UDTA, udta, "moov trak moof traf"),
    1038             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_DREF, dref, "dinf", 0),
    1039             :         FBOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_STSD, stsd, "stbl", 0),
    1040             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_STTS, stts, "stbl", 0),
    1041             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_CTTS, ctts, "stbl", 1),
    1042             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_CSLG, cslg, "stbl trep", 1),
    1043             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_STSH, stsh, "stbl", 0),
    1044             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_ELST, elst, "edts", 1),
    1045             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_STSC, stsc, "stbl", 0),
    1046             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_STSZ, stsz, "stbl", 0),
    1047             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_STZ2, stsz, "stbl", 0),
    1048             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_STCO, stco, "stbl", 0),
    1049             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_STSS, stss, "stbl", 0),
    1050             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_STDP, stdp, "stbl", 0),
    1051             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_SDTP, sdtp, "stbl traf", 0),
    1052             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_CO64, co64, "stbl", 0),
    1053             :         BOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_MINF, minf, "mdia"),
    1054             :         FBOX_DEFINE_FLAGS(GF_ISOM_BOX_TYPE_TKHD, tkhd, "trak", 1, 0x000001 | 0x000002 | 0x000004 | 0x000008),
    1055             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_TREF, tref, "trak"),
    1056             :         BOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_MDIA, mdia, "trak"),
    1057             :         BOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_MFRA, mfra, "file"),
    1058             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_MFRO, mfro, "mfra", 0),
    1059             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_TFRA, tfra, "mfra", 1),
    1060             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_ELNG, elng, "mdia", 0),
    1061             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_PDIN, pdin, "file", 0),
    1062             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_SBGP, sbgp, "stbl traf", 1),
    1063             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_SGPD, sgpd, "stbl traf", 2),
    1064             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_CSGP, csgp, "stbl traf"),
    1065             :         FBOX_DEFINE_FLAGS(GF_ISOM_BOX_TYPE_SAIZ, saiz, "stbl traf", 0, 0),
    1066             :         FBOX_DEFINE_FLAGS(GF_ISOM_BOX_TYPE_SAIZ, saiz, "stbl traf", 0, 1),
    1067             :         FBOX_DEFINE_FLAGS(GF_ISOM_BOX_TYPE_SAIO, saio, "stbl traf", 1, 0),
    1068             :         FBOX_DEFINE_FLAGS(GF_ISOM_BOX_TYPE_SAIO, saio, "stbl traf", 1, 1),
    1069             :         FBOX_DEFINE_FLAGS( GF_ISOM_BOX_TYPE_SUBS, subs, "stbl traf", 0, 7), //warning flags are not used as a bit mask but as an enum!!
    1070             :         BOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_TRGR, trgr, "trak"),
    1071             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_FTYP, ftyp, "file otyp"),
    1072             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_OTYP, def_parent, "file"),
    1073             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_PADB, padb, "stbl", 0),
    1074             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_BTRT, btrt, "sample_entry"),
    1075             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_PASP, pasp, "video_sample_entry ipco"),
    1076             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_CLAP, clap, "video_sample_entry ipco"),
    1077             :         FBOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_META, meta, "file moov trak moof traf udta", 0),  //apple uses meta in moov->udta
    1078             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_XML, xml, "meta", 0),
    1079             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_BXML, bxml, "meta", 0),
    1080             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_ILOC, iloc, "meta", 2),
    1081             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_PITM, pitm, "meta", 1),
    1082             :         FBOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_IPRO, ipro, "meta", 0),
    1083             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_INFE, infe, "iinf", 3),
    1084             :         FBOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_IINF, iinf, "meta", 1),
    1085             :         FBOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_IREF, iref, "meta", 1),
    1086             :         BOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_SINF, sinf, "ipro sample_entry"),
    1087             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_RINF, sinf, "sample_entry"),
    1088             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_FRMA, frma, "sinf rinf"),
    1089             :         FBOX_DEFINE_FLAGS(GF_ISOM_BOX_TYPE_SCHM, schm, "sinf rinf", 0, 1),
    1090             :         BOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_SCHI, schi, "sinf rinf"),
    1091             :         BOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_ENCA, audio_sample_entry, "stsd"),
    1092             :         BOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_ENCV, video_sample_entry, "stsd"),
    1093             :         BOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_RESV, video_sample_entry, "stsd"),
    1094             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_TSEL, tsel, "udta", 0),
    1095             :         BOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_STRK, strk, "udta"),
    1096             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_STRI, stri, "strk", 0),
    1097             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_STRD, def_parent, "strk"),
    1098             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_STSG, stsg, "strd", 0),
    1099             : 
    1100             :         BOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_ENCS, mp4s, "stsd"),
    1101             :         //THIS HAS TO BE FIXED, not extensible
    1102             :         BOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_ENCT, mp4s, "stsd"),
    1103             :         BOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_ENCM, mp4s, "stsd"),
    1104             :         BOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_ENCF, mp4s, "stsd"),
    1105             : 
    1106             :         BOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_METX, metx, "stsd"),
    1107             :         BOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_METT, metx, "stsd"),
    1108             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_STVI, stvi, "schi", 0),
    1109             : 
    1110             : 
    1111             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_CHNL, chnl, "audio_sample_entry", 0),
    1112             : 
    1113             :         //FEC
    1114             :         FBOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_FIIN, fiin, "meta", 0),
    1115             :         BOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_PAEN, paen, "fiin"),
    1116             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_FPAR, fpar, "paen", 1),
    1117             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_FECR, fecr, "paen", 1),
    1118             :         //fire uses the same box syntax as fecr
    1119             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_FIRE, fecr, "paen", 1),
    1120             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_SEGR, segr, "fiin"),
    1121             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_GITN, gitn, "fiin", 0),
    1122             : 
    1123             : #ifndef GPAC_DISABLE_ISOM_HINTING
    1124             :         BOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_FDSA, fdsa, "fdp_sample"),
    1125             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_FDPA, fdpa, "fdsa"),
    1126             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_EXTR, extr, "fdsa"),
    1127             : #endif
    1128             : 
    1129             :         //full boxes todo
    1130             :         //FBOX_DEFINE( GF_ISOM_BOX_TYPE_ASSP, assp, 1),
    1131             :         //FBOX_DEFINE( GF_ISOM_BOX_TYPE_MERE, assp, 0),
    1132             :         //FBOX_DEFINE( GF_ISOM_BOX_TYPE_SRAT, srat, 0),
    1133             :         //FBOX_DEFINE( GF_ISOM_BOX_TYPE_CHNL, chnl, 0),
    1134             :         //FBOX_DEFINE( GF_ISOM_BOX_TYPE_DMIX, dmix, 0),
    1135             :         //FBOX_DEFINE( GF_ISOM_BOX_TYPE_TLOU, alou, 0),
    1136             :         //FBOX_DEFINE( GF_ISOM_BOX_TYPE_ALOU, alou, 0),
    1137             :         //FBOX_DEFINE( GF_ISOM_BOX_TYPE_URI, uri, 0),
    1138             :         //FBOX_DEFINE( GF_ISOM_BOX_TYPE_URII, urii, 0),
    1139             : 
    1140             : #ifndef GPAC_DISABLE_ISOM_HINTING
    1141             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_RTP_STSD, ghnt, "stsd"),
    1142             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_SRTP_STSD, ghnt, "stsd"),
    1143             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_FDP_STSD, ghnt, "stsd"),
    1144             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_RRTP_STSD, ghnt, "stsd"),
    1145             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_RTCP_STSD, ghnt, "stsd"),
    1146             :         BOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_HNTI, hnti, "udta"),
    1147             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_SDP, sdp, "hnti"),
    1148             :         BOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_HINF, hinf, "udta"),
    1149             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_TRPY, trpy, "hinf"),
    1150             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_NUMP, nump, "hinf"),
    1151             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_TPYL, tpyl, "hinf"),
    1152             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_TOTL, totl, "hinf"),
    1153             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_NPCK, npck, "hinf"),
    1154             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_TPAY, tpay, "hinf"),
    1155             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_MAXR, maxr, "hinf"),
    1156             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_DMED, dmed, "hinf"),
    1157             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_DIMM, dimm, "hinf"),
    1158             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_DREP, drep, "hinf"),
    1159             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_TMIN, tmin, "hinf"),
    1160             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_TMAX, tmax, "hinf"),
    1161             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_PMAX, pmax, "hinf"),
    1162             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_DMAX, dmax, "hinf"),
    1163             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_PAYT, payt, "hinf"),
    1164             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_RTP, rtp_hnti, "hnti"),
    1165             : 
    1166             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_RTPO, rtpo, "rtp_packet"),
    1167             : 
    1168             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_RELY, rely, "rtp srtp"),
    1169             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_TIMS, tims, "rtp srtp rrtp"),
    1170             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_TSRO, tsro, "rtp srtp rrtp"),
    1171             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_SNRO, snro, "rtp srtp"),
    1172             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_NAME, name, "udta"),
    1173             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_TSSY, tssy, "rrtp"),
    1174             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_RSSR, rssr, "rrtp"),
    1175             :         FBOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_SRPP, srpp, "srtp", 0),
    1176             : 
    1177             : #endif
    1178             : 
    1179             : #ifndef GPAC_DISABLE_ISOM_FRAGMENTS
    1180             :         BOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_MVEX, mvex, "moov"),
    1181             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_MEHD, mehd, "mvex", 1),
    1182             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_TREX, trex, "mvex", 0),
    1183             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_LEVA, leva, "mvex", 0),
    1184             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_TREP, trep, "mvex", 0),
    1185             :         BOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_MOOF, moof, "file"),
    1186             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_MFHD, mfhd, "moof", 0),
    1187             :         BOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_TRAF, traf, "moof"),
    1188             :         FBOX_DEFINE_FLAGS(GF_ISOM_BOX_TYPE_TFHD, tfhd, "traf", 0, 0x000001|0x000002|0x000008|0x000010|0x000020|0x010000|0x020000),
    1189             :         FBOX_DEFINE_FLAGS(GF_ISOM_BOX_TYPE_TRUN, trun, "traf", 0, 0x000001|0x000004|0x000100|0x000200|0x000400|0x000800),
    1190             : #ifdef GF_ENABLE_CTRN
    1191             :         FBOX_DEFINE_FLAGS(GF_ISOM_BOX_TYPE_CTRN, trun, "traf", 0, 0),
    1192             : #endif
    1193             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_TFDT, tfdt, "traf", 1),
    1194             :         BOX_DEFINE( GF_ISOM_BOX_TYPE_STYP, ftyp, "file"),
    1195             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_PRFT, prft, "file", 1),
    1196             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_SIDX, sidx, "file", 1),
    1197             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_SSIX, ssix, "file", 0),
    1198             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_PCRB, pcrb, "file", "dash"),
    1199             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_EMSG, emsg, "file", 1, "dash"),
    1200             : #endif
    1201             : 
    1202             : 
    1203             :         //part14 boxes
    1204             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_IODS, iods, "moov", 0, "p14"),
    1205             :         BOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_MP4S, mp4s, "stsd", "p14"),
    1206             :         BOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_MP4V, video_sample_entry, "stsd", "p14"),
    1207             :         BOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_MP4A, audio_sample_entry, "stsd", "p14"),
    1208             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_M4DS, m4ds, "sample_entry", "p14"),
    1209             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_ESDS, esds, "mp4a mp4s mp4v encv enca encs resv wave", 0, "p14"),
    1210             : 
    1211             :         //part 15 boxes
    1212             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_AVCC, avcc, "avc1 avc2 avc3 avc4 encv resv ipco", "p15"),
    1213             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_SVCC, avcc, "avc1 avc2 avc3 avc4 svc1 svc2 encv resv", "p15"),
    1214             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_MVCC, avcc, "avc1 avc2 avc3 avc4 mvc1 mvc2 encv resv", "p15"),
    1215             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_HVCC, hvcc, "hvc1 hev1 hvc2 hev2 encv resv ipco dvhe", "p15"),
    1216             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_LHVC, hvcc, "hvc1 hev1 hvc2 hev2 lhv1 lhe1 encv resv ipco", "p15"),
    1217             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_VVCC, vvcc, "vvc1 vvi1 encv resv ipco dvhe", "p15"),
    1218             :         BOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_AVC1, video_sample_entry, "stsd", "p15"),
    1219             :         BOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_AVC2, video_sample_entry, "stsd", "p15"),
    1220             :         BOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_AVC3, video_sample_entry, "stsd", "p15"),
    1221             :         BOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_AVC4, video_sample_entry, "stsd", "p15"),
    1222             :         BOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_SVC1, video_sample_entry, "stsd", "p15"),
    1223             :         BOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_MVC1, video_sample_entry, "stsd", "p15"),
    1224             :         BOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_HVC1, video_sample_entry, "stsd", "p15"),
    1225             :         BOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_HEV1, video_sample_entry, "stsd", "p15"),
    1226             :         BOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_HVC2, video_sample_entry, "stsd", "p15"),
    1227             :         BOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_HEV2, video_sample_entry, "stsd", "p15"),
    1228             :         BOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_LHV1, video_sample_entry, "stsd", "p15"),
    1229             :         BOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_LHE1, video_sample_entry, "stsd", "p15"),
    1230             :         BOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_HVT1, video_sample_entry, "stsd", "p15"),
    1231             :         BOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_VVC1, video_sample_entry, "stsd", "p15"),
    1232             :         BOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_VVI1, video_sample_entry, "stsd", "p15"),
    1233             :         FBOX_DEFINE_S(GF_ISOM_BOX_TYPE_MVCI, def_parent_full, "minf", 0, "p15"),
    1234             :         FBOX_DEFINE_S(GF_ISOM_BOX_TYPE_MVCG, mvcg, "mvci", 0, "p15"),
    1235             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_VWID, vwid, "video_sample_entry", 0, "p15"),
    1236             : 
    1237             :         //mpegh 3D audio boxes
    1238             :         BOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_MHA1, audio_sample_entry, "stsd", "mpegh3Daudio"),
    1239             :         BOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_MHA2, audio_sample_entry, "stsd", "mpegh3Daudio"),
    1240             :         BOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_MHM1, audio_sample_entry, "stsd", "mpegh3Daudio"),
    1241             :         BOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_MHM2, audio_sample_entry, "stsd", "mpegh3Daudio"),
    1242             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_MHAC, mhac, "mha1 mha2 mhm1 mhm2 wave", "mpegh3Daudio"),
    1243             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_MHAP, mhap, "mha1 mha2 mhm1 mhm2 wave", "mpegh3Daudio"),
    1244             : 
    1245             :         BOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_IPCM, audio_sample_entry, "stsd", "23003_5"),
    1246             :         BOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_FPCM, audio_sample_entry, "stsd", "23003_5"),
    1247             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_PCMC, pcmC, "ipcm fpcm", 0, "23003_5"),
    1248             : 
    1249             :         //AV1 in ISOBMFF boxes
    1250             :         BOX_DEFINE_S_CHILD(GF_ISOM_BOX_TYPE_AV01, video_sample_entry, "stsd", "av1"),
    1251             :         BOX_DEFINE_S(GF_ISOM_BOX_TYPE_AV1C, av1c, "av01 encv resv ipco", "av1"),
    1252             : 
    1253             :         // VP8-9 boxes
    1254             :         FBOX_DEFINE_FLAGS_S( GF_ISOM_BOX_TYPE_VPCC, vpcc, "vp08 vp09 encv resv", 1, 0, "vp"),
    1255             :         BOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_VP08, video_sample_entry, "stsd", "vp"),
    1256             :         BOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_VP09, video_sample_entry, "stsd", "vp"),
    1257             :         FBOX_DEFINE_FLAGS_S(GF_ISOM_BOX_TYPE_SMDM, SmDm, "vp08 vp09 encv resv", 1, 0, "vp"),
    1258             :         FBOX_DEFINE_FLAGS_S(GF_ISOM_BOX_TYPE_COLL, CoLL, "vp08 vp09 encv resv", 1, 0, "vp"),
    1259             : 
    1260             :         //Opus in ISOBMFF boxes
    1261             : #ifndef GPAC_DISABLE_OGG
    1262             :         BOX_DEFINE_S_CHILD(GF_ISOM_BOX_TYPE_OPUS, audio_sample_entry, "stsd", "Opus"),
    1263             :         BOX_DEFINE_S(GF_ISOM_BOX_TYPE_DOPS, dOps, "Opus wave enca", "Opus"),
    1264             : #endif
    1265             : 
    1266             :         //part20 boxes
    1267             :         BOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_LSR1, lsr1, "stsd", "p20"),
    1268             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_LSRC, lsrc, "lsr1", "p20"),
    1269             : 
    1270             :         //part30 boxes
    1271             : #ifndef GPAC_DISABLE_TTXT
    1272             :         BOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_STXT, metx, "stsd"),
    1273             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_TXTC, txtc, "stxt mett sbtt", 0),
    1274             :         //we allow mime in any sample entry, not restricted in the spec ...
    1275             :         FBOX_DEFINE( GF_ISOM_BOX_TYPE_MIME, txtc, "sample_entry", 0),
    1276             : #ifndef GPAC_DISABLE_VTT
    1277             :         BOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_WVTT, wvtt, "stsd", "p30"),
    1278             :         BOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_VTCC_CUE, vtcu, "vtt_sample", "p30"),
    1279             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_VTTE, vtte, "vtt_sample", "p30"),
    1280             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_VTTC_CONFIG, boxstring, "wvtt", "p30"),
    1281             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_CTIM, boxstring, "vttc", "p30"),
    1282             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_IDEN, boxstring, "vttc", "p30"),
    1283             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_STTG, boxstring, "vttc", "p30"),
    1284             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_PAYL, boxstring, "vttc", "p30"),
    1285             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_VTTA, boxstring, "vttc", "p30"),
    1286             : #endif
    1287             :         BOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_STPP, metx, "stsd"),
    1288             :         BOX_DEFINE_CHILD( GF_ISOM_BOX_TYPE_SBTT, metx, "stsd"),
    1289             : #endif
    1290             : 
    1291             :         //Image File Format
    1292             :         BOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_IPRP, iprp, "meta", "iff"),
    1293             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_IPCO, ipco, "iprp", "iff"),
    1294             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_ISPE, ispe, "ipco", 0, "iff"),
    1295             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_COLR, colr, "video_sample_entry ipco encv resv", "iff"),
    1296             :         //defined as a secondary box for now to avoid conflicts with master hashes
    1297             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_COLR, colr, "jp2h", "iff"),
    1298             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_PIXI, pixi, "ipco", 0, "iff"),
    1299             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_RLOC, rloc, "ipco", 0, "iff"),
    1300             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_IROT, irot, "ipco", "iff"),
    1301             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_IMIR, imir, "ipco", "iff"),
    1302             :         FBOX_DEFINE_FLAGS_S( GF_ISOM_BOX_TYPE_IPMA, ipma, "iprp", 1, 1, "iff"),
    1303             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_GRPL, grpl, "meta", "iff"),
    1304             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_CCST, ccst, "sample_entry", 0, "iff"),
    1305             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_AUXI, auxi, "sample_entry", 0, "iff"),
    1306             :         TRGT_DEFINE(GF_ISOM_BOX_TYPE_GRPT, grptype, "grpl", GF_ISOM_BOX_TYPE_ALTR, 0, "iff"),
    1307             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_AUXC, auxc, "ipco", 0, "iff"),
    1308             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_OINF, oinf, "ipco", 0, "iff"),
    1309             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_TOLS, tols, "ipco", 0, "iff"),
    1310             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_IENC, ienc, "ipco", 0, "cenc"),
    1311             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_IAUX, iaux, "ipco", 0, "cenc"),
    1312             : 
    1313             :         //MIAF
    1314             :         BOX_DEFINE_S(GF_ISOM_BOX_TYPE_CLLI, clli, "mp4v jpeg avc1 avc2 avc3 avc4 svc1 svc2 hvc1 hev1 hvc2 hev2 lhv1 lhe1 vvc1 vvi1 encv resv", "miaf"),
    1315             :         BOX_DEFINE_S(GF_ISOM_BOX_TYPE_MDCV, mdcv, "mp4v jpeg avc1 avc2 avc3 avc4 svc1 svc2 hvc1 hev1 hvc2 hev2 lhv1 lhe1 vvc1 vvi1 encv resv", "miaf"),
    1316             : 
    1317             :         //other MPEG boxes
    1318             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_RVCC, rvcc, "avc1 avc2 avc3 avc4 svc1 svc2 hvc1 hev1 hvc2 hev2 lhv1 lhe1 encv resv", "rvc"),
    1319             : 
    1320             :         //3GPP boxes
    1321             :         BOX_DEFINE_S_CHILD( GF_ISOM_SUBTYPE_3GP_AMR, audio_sample_entry, "stsd", "3gpp"),
    1322             :         BOX_DEFINE_S_CHILD( GF_ISOM_SUBTYPE_3GP_AMR_WB, audio_sample_entry, "stsd", "3gpp"),
    1323             :         BOX_DEFINE_S_CHILD( GF_ISOM_SUBTYPE_3GP_QCELP, audio_sample_entry, "stsd", "3gpp"),
    1324             :         BOX_DEFINE_S_CHILD( GF_ISOM_SUBTYPE_3GP_EVRC, audio_sample_entry, "stsd", "3gpp"),
    1325             :         BOX_DEFINE_S_CHILD( GF_ISOM_SUBTYPE_3GP_SMV, audio_sample_entry, "stsd", "3gpp"),
    1326             :         BOX_DEFINE_S_CHILD( GF_ISOM_SUBTYPE_3GP_H263, video_sample_entry, "stsd", "3gpp"),
    1327             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_DAMR, gppc, "samr sawb enca", "3gpp"),
    1328             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_DEVC, gppc, "sevc enca", "3gpp"),
    1329             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_DQCP, gppc, "sqcp enca", "3gpp"),
    1330             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_DSMV, gppc, "ssmv enca", "3gpp"),
    1331             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_D263, gppc, "s263 encv", "3gpp"),
    1332             :         //3gpp timed text
    1333             :         BOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_TX3G, tx3g, "stsd", "3gpp"),
    1334             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_TEXT, text, "stsd", "apple"),
    1335             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_FTAB, ftab, "tx3g text enct", "3gpp"),
    1336             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_STYL, styl, "text_sample", "3gpp"),
    1337             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_HLIT, hlit, "text_sample", "3gpp"),
    1338             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_HCLR, hclr, "text_sample", "3gpp"),
    1339             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_KROK, krok, "text_sample", "3gpp"),
    1340             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_DLAY, dlay, "text_sample", "3gpp"),
    1341             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_HREF, href, "text_sample", "3gpp"),
    1342             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_TBOX, tbox, "text_sample", "3gpp"),
    1343             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_BLNK, blnk, "text_sample", "3gpp"),
    1344             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_TWRP, twrp, "text_sample", "3gpp"),
    1345             :         //3GPP dims
    1346             :         BOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_DIMS, dims, "stsd", "3gpp"),
    1347             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_DIMC, dimC, "dims encs", "3gpp"),
    1348             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_DIST, diST, "dims", "3gpp"),
    1349             : 
    1350             : 
    1351             :         //CENC boxes
    1352             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_PSSH, pssh, "moov moof meta", 0, "cenc"),
    1353             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_TENC, tenc, "schi", 1, "cenc"),
    1354             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_SENC, senc, "trak traf", "cenc"),
    1355             : 
    1356             :         // ISMA 1.1 boxes
    1357             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_IKMS, iKMS, "schi", 0, "isma"),
    1358             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_ISFM, iSFM, "schi", 0, "isma"),
    1359             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_ISLT, iSLT, "schi", 0, "isma"),
    1360             : 
    1361             :         //OMA boxes
    1362             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_ODKM, odkm, "schi", 0, "oma"),
    1363             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_OHDR, ohdr, "odkm", 0, "oma"),
    1364             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_GRPI, grpi, "ohdr", 0, "oma"),
    1365             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_MDRI, mdri, "file", "oma"),
    1366             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_ODTT, odtt, "mdri", 0, "oma"),
    1367             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_ODRB, odrb, "mdri", 0, "oma"),
    1368             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_ODAF, iSFM, "schi", 0, "oma"),
    1369             : 
    1370             :         //apple boxes
    1371             :         BOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_MP3, audio_sample_entry, "stsd", "apple"),
    1372             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_CHPL, chpl, "udta", 0, "apple"),
    1373             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_VOID, void, "", "apple"),
    1374             :         BOX_DEFINE_S(GF_QT_BOX_TYPE_WIDE, wide, "*", "apple"),
    1375             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_ILST, ilst, "meta", "apple"),
    1376             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_DATA, databox, "ilst *", 0, "apple"),
    1377             : 
    1378             :         ITUNES_TAG(GF_ISOM_ITUNE_NAME),
    1379             :         ITUNES_TAG(GF_ISOM_ITUNE_ARTIST),
    1380             :         ITUNES_TAG(GF_ISOM_ITUNE_ALBUM_ARTIST),
    1381             :         ITUNES_TAG(GF_ISOM_ITUNE_ALBUM),
    1382             :         ITUNES_TAG(GF_ISOM_ITUNE_GROUP),
    1383             :         ITUNES_TAG(GF_ISOM_ITUNE_WRITER),
    1384             :         ITUNES_TAG(GF_ISOM_ITUNE_COMMENT),
    1385             :         ITUNES_TAG(GF_ISOM_ITUNE_GENRE_USER),
    1386             :         ITUNES_TAG(GF_ISOM_ITUNE_GENRE),
    1387             :         ITUNES_TAG(GF_ISOM_ITUNE_CREATED),
    1388             :         ITUNES_TAG(GF_ISOM_ITUNE_TRACKNUMBER),
    1389             :         ITUNES_TAG(GF_ISOM_ITUNE_DISK),
    1390             :         ITUNES_TAG(GF_ISOM_ITUNE_TEMPO),
    1391             :         ITUNES_TAG(GF_ISOM_ITUNE_COMPILATION),
    1392             :         ITUNES_TAG(GF_ISOM_ITUNE_TV_SHOW),
    1393             :         ITUNES_TAG(GF_ISOM_ITUNE_TV_EPISODE),
    1394             :         ITUNES_TAG(GF_ISOM_ITUNE_TV_SEASON),
    1395             :         ITUNES_TAG(GF_ISOM_ITUNE_TV_EPISODE_NUM),
    1396             :         ITUNES_TAG(GF_ISOM_ITUNE_TV_NETWORK),
    1397             :         ITUNES_TAG(GF_ISOM_ITUNE_DESCRIPTION),
    1398             :         ITUNES_TAG(GF_ISOM_ITUNE_LONG_DESCRIPTION),
    1399             :         ITUNES_TAG(GF_ISOM_ITUNE_LYRICS),
    1400             :         ITUNES_TAG(GF_ISOM_ITUNE_SORT_NAME),
    1401             :         ITUNES_TAG(GF_ISOM_ITUNE_SORT_ARTIST),
    1402             :         ITUNES_TAG(GF_ISOM_ITUNE_SORT_ALB_ARTIST),
    1403             :         ITUNES_TAG(GF_ISOM_ITUNE_SORT_ALBUM),
    1404             :         ITUNES_TAG(GF_ISOM_ITUNE_SORT_COMPOSER),
    1405             :         ITUNES_TAG(GF_ISOM_ITUNE_SORT_SHOW),
    1406             :         ITUNES_TAG(GF_ISOM_ITUNE_COVER_ART),
    1407             :         ITUNES_TAG(GF_ISOM_ITUNE_COPYRIGHT),
    1408             :         ITUNES_TAG(GF_ISOM_ITUNE_TOOL),
    1409             :         ITUNES_TAG(GF_ISOM_ITUNE_ENCODER),
    1410             :         ITUNES_TAG(GF_ISOM_ITUNE_PURCHASE_DATE),
    1411             :         ITUNES_TAG(GF_ISOM_ITUNE_PODCAST),
    1412             :         ITUNES_TAG(GF_ISOM_ITUNE_PODCAST_URL),
    1413             :         ITUNES_TAG(GF_ISOM_ITUNE_KEYWORDS),
    1414             :         ITUNES_TAG(GF_ISOM_ITUNE_CATEGORY),
    1415             :         ITUNES_TAG(GF_ISOM_ITUNE_HD_VIDEO),
    1416             :         ITUNES_TAG(GF_ISOM_ITUNE_MEDIA_TYPE),
    1417             :         ITUNES_TAG(GF_ISOM_ITUNE_RATING),
    1418             :         ITUNES_TAG(GF_ISOM_ITUNE_GAPLESS),
    1419             :         ITUNES_TAG(GF_ISOM_ITUNE_COMPOSER),
    1420             :         ITUNES_TAG(GF_ISOM_ITUNE_TRACK),
    1421             :         ITUNES_TAG(GF_ISOM_ITUNE_CONDUCTOR),
    1422             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_iTunesSpecificInfo, ilst_item, "ilst data", "apple"),
    1423             :         BOX_DEFINE_S(GF_ISOM_BOX_TYPE_GMHD, def_parent, "minf", "apple"),
    1424             :         BOX_DEFINE_S(GF_QT_BOX_TYPE_LOAD, load, "trak", "apple"),
    1425             :         BOX_DEFINE_S(GF_QT_BOX_TYPE_TAPT, def_parent, "trak", "apple"),
    1426             :         FBOX_DEFINE_S( GF_QT_BOX_TYPE_GMIN, gmin, "gmhd", 0, "apple"),
    1427             :         FBOX_DEFINE_FLAGS_S( GF_QT_BOX_TYPE_ALIS, alis, "dref", 0, 1, "apple"),
    1428             :         FBOX_DEFINE_S( GF_QT_BOX_TYPE_CLEF, clef, "tapt", 0, "apple"),
    1429             :         FBOX_DEFINE_S( GF_QT_BOX_TYPE_PROF, clef, "tapt", 0, "apple"),
    1430             :         FBOX_DEFINE_S( GF_QT_BOX_TYPE_ENOF, clef, "tapt", 0, "apple"),
    1431             :         BOX_DEFINE_S( GF_QT_BOX_TYPE_WAVE, def_parent, "audio_sample_entry", "apple"),
    1432             :         FBOX_DEFINE_S( GF_QT_BOX_TYPE_CHAN, chan, "audio_sample_entry", 0, "apple"),
    1433             :         BOX_DEFINE_S( GF_QT_BOX_TYPE_FRMA, frma, "wave", "apple"),
    1434             :         BOX_DEFINE_S( GF_QT_BOX_TYPE_TERMINATOR, unkn, "wave", "apple"),
    1435             :         BOX_DEFINE_S( GF_QT_BOX_TYPE_ENDA, chrm, "wave", "apple"),
    1436             :         BOX_DEFINE_S( GF_QT_BOX_TYPE_TMCD, def_parent, "gmhd", "apple"),
    1437             :         BOX_DEFINE_S( GF_QT_BOX_TYPE_NAME, unkn, "tmcd", "apple"),
    1438             :         FBOX_DEFINE_S( GF_QT_BOX_TYPE_TCMI, tcmi, "tmcd", 0, "apple"),
    1439             :         BOX_DEFINE_S( GF_QT_BOX_TYPE_FIEL, fiel, "video_sample_entry", "apple"),
    1440             :         BOX_DEFINE_S( GF_QT_BOX_TYPE_GAMA, gama, "video_sample_entry", "apple"),
    1441             :         BOX_DEFINE_S( GF_QT_BOX_TYPE_CHRM, chrm, "video_sample_entry", "apple"),
    1442             :         BOX_DEFINE_S( GF_ISOM_SUBTYPE_TEXT, unkn, "gmhd", "apple"),
    1443             : 
    1444             :         //QT and prores sample entry types
    1445             :         BOX_DEFINE_S( GF_QT_BOX_TYPE_TMCD, tmcd, "stsd", "apple"),
    1446             :         BOX_DEFINE_S( GF_QT_SUBTYPE_C608, gen_sample_entry, "stsd", "apple"),
    1447             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_APCH, video_sample_entry, "stsd", "apple"),
    1448             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_APCO, video_sample_entry, "stsd", "apple"),
    1449             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_APCS, video_sample_entry, "stsd", "apple"),
    1450             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_APCN, video_sample_entry, "stsd", "apple"),
    1451             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_AP4X, video_sample_entry, "stsd", "apple"),
    1452             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_AP4H, video_sample_entry, "stsd", "apple"),
    1453             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_RAW_AUD, audio_sample_entry, "stsd", "apple"),
    1454             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_TWOS, audio_sample_entry, "stsd", "apple"),
    1455             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_SOWT, audio_sample_entry, "stsd", "apple"),
    1456             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_FL32, audio_sample_entry, "stsd", "apple"),
    1457             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_FL64, audio_sample_entry, "stsd", "apple"),
    1458             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_IN24, audio_sample_entry, "stsd", "apple"),
    1459             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_IN32, audio_sample_entry, "stsd", "apple"),
    1460             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_ULAW, audio_sample_entry, "stsd", "apple"),
    1461             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_ALAW, audio_sample_entry, "stsd", "apple"),
    1462             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_ADPCM, audio_sample_entry, "stsd", "apple"),
    1463             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_IMA_ADPCM, audio_sample_entry, "stsd", "apple"),
    1464             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_DVCA, audio_sample_entry, "stsd", "apple"),
    1465             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_QDMC, audio_sample_entry, "stsd", "apple"),
    1466             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_QDMC2, audio_sample_entry, "stsd", "apple"),
    1467             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_QCELP, audio_sample_entry, "stsd", "apple"),
    1468             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_kMP3, audio_sample_entry, "stsd", "apple"),
    1469             : 
    1470             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_RAW_VID, video_sample_entry, "stsd", "apple"),
    1471             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_YUYV, video_sample_entry, "stsd", "apple"),
    1472             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_UYVY, video_sample_entry, "stsd", "apple"),
    1473             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_YUV444, video_sample_entry, "stsd", "apple"),
    1474             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_YUVA444, video_sample_entry, "stsd", "apple"),
    1475             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_YUV422_10, video_sample_entry, "stsd", "apple"),
    1476             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_YUV444_10, video_sample_entry, "stsd", "apple"),
    1477             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_YUV422_16, video_sample_entry, "stsd", "apple"),
    1478             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_YUV420, video_sample_entry, "stsd", "apple"),
    1479             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_I420, video_sample_entry, "stsd", "apple"),
    1480             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_IYUV, video_sample_entry, "stsd", "apple"),
    1481             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_YV12, video_sample_entry, "stsd", "apple"),
    1482             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_YVYU, video_sample_entry, "stsd", "apple"),
    1483             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_RGBA, video_sample_entry, "stsd", "apple"),
    1484             :         BOX_DEFINE_S_CHILD( GF_QT_SUBTYPE_ABGR, video_sample_entry, "stsd", "apple"),
    1485             :         
    1486             :         
    1487             :         //dolby boxes
    1488             :         BOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_AC3, audio_sample_entry, "stsd", "dolby"),
    1489             :         BOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_EC3, audio_sample_entry, "stsd", "dolby"),
    1490             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_DAC3, dac3, "ac-3 wave", "dolby"),
    1491             :         {GF_ISOM_BOX_TYPE_DEC3, dec3_box_new, dac3_box_del, dac3_box_read, dac3_box_write, dac3_box_size, dac3_box_dump, 0, 0, 0, "ec-3 enca", "dolby" },
    1492             :         BOX_DEFINE_S(GF_ISOM_BOX_TYPE_DVCC, dvcC, "dvhe dvav dva1 dvh1 avc1 avc2 avc3 avc4 hev1 encv resv", "DolbyVision"),
    1493             :         BOX_DEFINE_S_CHILD(GF_ISOM_BOX_TYPE_DVHE, video_sample_entry, "stsd", "DolbyVision"),
    1494             :         BOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_MLPA, audio_sample_entry, "stsd", "dolby"),
    1495             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_DMLP, dmlp, "mlpa", "dolby"),
    1496             : 
    1497             :         //Adobe boxes
    1498             : #ifndef GPAC_DISABLE_ISOM_ADOBE
    1499             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_ABST, abst, "file", 0, "adobe"),
    1500             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_AFRA, afra, "file", 0, "adobe"),
    1501             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_ASRT, asrt, "abst", 0, "adobe"),
    1502             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_AFRT, afrt, "abst", 0, "adobe"),
    1503             : #endif
    1504             :         /*Adobe's protection boxes*/
    1505             :         FBOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_ADKM, adkm, "schi", 0, "adobe"),
    1506             :         FBOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_AHDR, ahdr, "adkm", 0, "adobe"),
    1507             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_ADAF, adaf, "adkm", 0, "adobe"),
    1508             :         FBOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_APRM, aprm, "ahdr", 0, "adobe"),
    1509             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_AEIB, aeib, "aprm", 0, "adobe"),
    1510             :         FBOX_DEFINE_S_CHILD( GF_ISOM_BOX_TYPE_AKEY, akey, "aprm", 0, "adobe"),
    1511             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_FLXS, flxs, "akey", "adobe"),
    1512             : 
    1513             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_TRIK, trik, "traf", 0, "dece"),
    1514             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_BLOC, bloc, "file", 0, "dece"),
    1515             :         FBOX_DEFINE_FLAGS_S(GF_ISOM_BOX_TYPE_AINF, ainf, "moov", 0, 0x000001, "dece"),
    1516             : 
    1517             : 
    1518             :         //internally handled UUID for smooth - the code points are only used during creation and assigned to UUIDBox->internal4CC
    1519             :         //the box type is still "uuid", and the factory is used to read/write/size/dump the code
    1520             :         BOX_DEFINE_S(GF_ISOM_BOX_UUID_TENC, piff_tenc, "schi", "smooth"),
    1521             :         BOX_DEFINE_S(GF_ISOM_BOX_UUID_PSEC, piff_psec, "trak traf", "smooth"),
    1522             :         BOX_DEFINE_S(GF_ISOM_BOX_UUID_PSSH, piff_pssh, "moov moof", "smooth"),
    1523             :         BOX_DEFINE_S(GF_ISOM_BOX_UUID_TFXD, tfxd, "traf", "smooth"),
    1524             :         BOX_DEFINE_S(GF_ISOM_BOX_UUID_TFRF, tfrf, "traf", "smooth"),
    1525             :         BOX_DEFINE_S(GF_ISOM_BOX_UUID_MSSM, uuid, "file", "smooth"),
    1526             :         BOX_DEFINE_S(GF_ISOM_BOX_UUID_TFRF, uuid, "traf", "smooth"),
    1527             : 
    1528             : 
    1529             :         //J2K boxes
    1530             :         BOX_DEFINE_S_CHILD(GF_ISOM_BOX_TYPE_MJP2, video_sample_entry, "stsd", "j2k"),
    1531             :         BOX_DEFINE_S_CHILD(GF_ISOM_BOX_TYPE_JP2H, jp2h, "mjp2 encv", "j2k"),
    1532             :         BOX_DEFINE_S(GF_ISOM_BOX_TYPE_IHDR, ihdr, "jp2h", "j2k"),
    1533             : 
    1534             :         /* Image tracks */
    1535             :         BOX_DEFINE_S_CHILD(GF_ISOM_BOX_TYPE_JPEG, video_sample_entry, "stsd", "apple"),
    1536             :         BOX_DEFINE_S_CHILD(GF_ISOM_BOX_TYPE_JP2K, video_sample_entry, "stsd", "apple"),
    1537             :         BOX_DEFINE_S_CHILD(GF_ISOM_BOX_TYPE_PNG, video_sample_entry, "stsd", "apple"),
    1538             : 
    1539             : 
    1540             :         //Opus in ISOBMFF boxes
    1541             :         BOX_DEFINE_S_CHILD(GF_ISOM_BOX_TYPE_FLAC, audio_sample_entry, "stsd", "Flac"),
    1542             :         FBOX_DEFINE_S(GF_ISOM_BOX_TYPE_DFLA, dfla, "fLaC enca", 0, "Flac"),
    1543             : 
    1544             :         BOX_DEFINE_S(GF_ISOM_BOX_TYPE_XTRA, xtra, "udta", "WMA"),
    1545             : 
    1546             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_ST3D, st3d, "video_sample_entry", 0, "youtube"),
    1547             : 
    1548             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_SV3D, def_parent, "video_sample_entry", "youtube"),
    1549             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_SVHD, svhd, "sv3d", 0, "youtube"),
    1550             :         BOX_DEFINE_S( GF_ISOM_BOX_TYPE_PROJ, def_parent, "sv3d", "youtube"),
    1551             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_PRHD, prhd, "proj", 0, "youtube"),
    1552             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_CBMP, proj_type, "proj", 0, "youtube"),
    1553             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_EQUI, proj_type, "proj", 0, "youtube"),
    1554             :         FBOX_DEFINE_S( GF_ISOM_BOX_TYPE_MESH, proj_type, "proj", 0, "youtube"),
    1555             : 
    1556             : /*
    1557             :         GF_ISOM_BOX_TYPE_CBMP   = GF_4CC( 'c', 'b', 'm', 'p' ),
    1558             :         GF_ISOM_BOX_TYPE_EQUI   = GF_4CC( 'e', 'q', 'u', 'i' ),
    1559             :         GF_ISOM_BOX_TYPE_MSHP   = GF_4CC( 'm', 's', 'h', 'p' ),
    1560             :         GF_ISOM_BOX_TYPE_MESH   = GF_4CC( 'm', 'e', 's', 'h' ),
    1561             : */
    1562             : 
    1563             : };
    1564             : 
    1565        3028 : Bool gf_box_valid_in_parent(GF_Box *a, const char *parent_4cc)
    1566             : {
    1567        3028 :         if (!a || !a->registry || !a->registry->parents_4cc) return GF_FALSE;
    1568        3028 :         if (strstr(a->registry->parents_4cc, parent_4cc) != NULL) return GF_TRUE;
    1569           6 :         return GF_FALSE;
    1570             : }
    1571             : 
    1572             : GF_EXPORT
    1573      373610 : u32 gf_isom_get_num_supported_boxes()
    1574             : {
    1575      373610 :         return sizeof(box_registry) / sizeof(struct box_registry_entry);
    1576             : }
    1577             : 
    1578           4 : void gf_isom_registry_disable(u32 boxCode, Bool disable)
    1579             : {
    1580           4 :         u32 i=0, count = gf_isom_get_num_supported_boxes();
    1581         496 :         for (i=1; i<count; i++) {
    1582         496 :                 if (box_registry[i].box_4cc==boxCode) {
    1583           4 :                         box_registry[i].disabled = disable;
    1584           4 :                         return;
    1585             :                 }
    1586             :         }
    1587             : }
    1588             : 
    1589      373605 : static u32 get_box_reg_idx(u32 boxCode, u32 parent_type, u32 start_from)
    1590             : {
    1591      373605 :         u32 i=0, count = gf_isom_get_num_supported_boxes();
    1592      373605 :         const char *parent_name = parent_type ? gf_4cc_to_str(parent_type) : NULL;
    1593             : 
    1594      373605 :         if (!start_from) start_from = 1;
    1595             : 
    1596    53637243 :         for (i=start_from; i<count; i++) {
    1597             :                 u32 start_par_from;
    1598    54009572 :                 if (box_registry[i].box_4cc != boxCode)
    1599    53636994 :                         continue;
    1600             : 
    1601      372578 :                 if (!parent_type)
    1602             :                         return i;
    1603       93377 :                 if (strstr(box_registry[i].parents_4cc, parent_name) != NULL)
    1604             :                         return i;
    1605        4647 :                 if (strstr(box_registry[i].parents_4cc, "*") != NULL)
    1606             :                         return i;
    1607             : 
    1608        3679 :                 if (strstr(box_registry[i].parents_4cc, "sample_entry") == NULL)
    1609         222 :                         continue;
    1610             : 
    1611             :                 /*parent is a sample entry, check if the parent_type matches a sample entry box (eg its parent must be stsd)*/
    1612             : 
    1613        3457 :                 if (parent_type==GF_QT_SUBTYPE_RAW)
    1614             :                         return i;
    1615             : 
    1616             :                 start_par_from = 0;
    1617             :                 while (parent_type) {
    1618             :                         //locate parent registry
    1619        3484 :                         u32 j = get_box_reg_idx(parent_type, 0, start_par_from);
    1620        3484 :                         if (!j) break;
    1621             :                         //if parent registry has "stsd" as parent, this is a sample entry
    1622        3457 :                         if (box_registry[j].parents_4cc && (strstr(box_registry[j].parents_4cc, "stsd") != NULL))
    1623             :                                 return i;
    1624          27 :                         start_par_from = j+1;
    1625             :                 }
    1626             :         }
    1627             :         return 0;
    1628             : }
    1629             : 
    1630      370121 : GF_Box *gf_isom_box_new_ex(u32 boxType, u32 parentType, Bool skip_logs, Bool is_root_box)
    1631             : {
    1632             :         GF_Box *a;
    1633      370121 :         s32 idx = get_box_reg_idx(boxType, parentType, 0);
    1634      370121 :         if (idx==0) {
    1635             : #ifndef GPAC_DISABLE_LOG
    1636        2479 :                 if (!skip_logs && (boxType != GF_ISOM_BOX_TYPE_UNKNOWN) && (boxType != GF_ISOM_BOX_TYPE_UUID)) {
    1637        1224 :                         switch (parentType) {
    1638             :                         case GF_ISOM_BOX_TYPE_ILST:
    1639             :                         case GF_ISOM_BOX_TYPE_META:
    1640             :                         case GF_ISOM_BOX_TYPE_UDTA:
    1641             :                         case GF_ISOM_BOX_TYPE_UNKNOWN:
    1642             :                         case GF_ISOM_BOX_TYPE_iTunesSpecificInfo:
    1643             :                         case GF_QT_BOX_TYPE_WAVE:
    1644             :                                 break;
    1645          52 :                         default:
    1646          52 :                                 if (is_root_box) {
    1647           7 :                                         GF_LOG(GF_LOG_INFO, GF_LOG_CONTAINER, ("[iso file] Unknown top-level box type %s\n", gf_4cc_to_str(boxType)));
    1648          45 :                                 } else if (parentType) {
    1649             :                                         char szName[GF_4CC_MSIZE];
    1650          43 :                                         strcpy(szName, gf_4cc_to_str(parentType));
    1651          43 :                                         GF_LOG(GF_LOG_INFO, GF_LOG_CONTAINER, ("[iso file] Unknown box type %s in parent %s\n", gf_4cc_to_str(boxType), szName));
    1652             :                                 } else {
    1653           2 :                                         GF_LOG(GF_LOG_INFO, GF_LOG_CONTAINER, ("[iso file] Unknown box type %s\n", gf_4cc_to_str(boxType)));
    1654             :                                 }
    1655             :                                 break;
    1656             :                         }
    1657          25 :                 }
    1658             : #endif
    1659        1249 :         if (boxType==GF_ISOM_BOX_TYPE_UUID) {
    1660           6 :             a = uuid_box_new();
    1661           6 :             if (a) a->registry = &box_registry[1];
    1662             :         } else {
    1663        1243 :             a = unkn_box_new();
    1664        1243 :             if (a) {
    1665        1243 :                 ((GF_UnknownBox *)a)->original_4cc = boxType;
    1666        1243 :                 a->registry = &box_registry[0];
    1667             :                         }
    1668             :         }
    1669             :                 return a;
    1670             :         }
    1671      368872 :         a = box_registry[idx].new_fn();
    1672             : 
    1673      368872 :         if (a) {
    1674      368872 :                 if (a->type!=GF_ISOM_BOX_TYPE_UUID) {
    1675      368792 :                         if (a->type==GF_ISOM_BOX_TYPE_UNKNOWN) {
    1676         142 :                                 ((GF_UnknownBox *)a)->original_4cc = boxType;
    1677             :                         } else {
    1678      368650 :                                 a->type = boxType;
    1679             :                         }
    1680             :                 }
    1681      368872 :                 a->registry = &box_registry[idx];
    1682             : 
    1683      368872 :                 if ((a->type==GF_ISOM_BOX_TYPE_COLR) && (parentType==GF_ISOM_BOX_TYPE_JP2H)) {
    1684          27 :                         ((GF_ColourInformationBox *)a)->is_jp2 = GF_TRUE;
    1685             :                 }
    1686             : 
    1687             :         }
    1688             :         return a;
    1689             : }
    1690             : 
    1691             : GF_EXPORT
    1692      250470 : GF_Box *gf_isom_box_new(u32 boxType)
    1693             : {
    1694      250470 :         return gf_isom_box_new_ex(boxType, 0, 0, GF_FALSE);
    1695             : }
    1696             : 
    1697       40243 : GF_Err gf_isom_box_array_read_ex(GF_Box *parent, GF_BitStream *bs, u32 parent_type)
    1698             : {
    1699             :         GF_Err e;
    1700       40243 :         GF_Box *a = NULL;
    1701       40243 :         Bool skip_logs = (gf_bs_get_cookie(bs) & GF_ISOM_BS_COOKIE_NO_LOGS ) ? GF_TRUE : GF_FALSE;
    1702             : 
    1703             :         //we may have terminators in some QT files (4 bytes set to 0 ...)
    1704      172232 :         while (parent->size>=8) {
    1705       91749 :                 e = gf_isom_box_parse_ex(&a, bs, parent_type, GF_FALSE);
    1706       91749 :                 if (e) {
    1707           0 :                         if (a) gf_isom_box_del(a);
    1708             :                         return e;
    1709             :                 }
    1710             :                 //sub box parsing aborted with no error
    1711       91749 :                 if (!a) return GF_OK;
    1712             : 
    1713       91746 :                 if (parent->size < a->size) {
    1714           0 :                         if (!skip_logs) {
    1715           0 :                                 GF_LOG(GF_LOG_WARNING, GF_LOG_CONTAINER, ("[iso file] Box \"%s\" is larger than container box\n", gf_4cc_to_str(a->type)));
    1716             :                         }
    1717           0 :                         parent->size = 0;
    1718             :                 } else {
    1719       91746 :                         parent->size -= a->size;
    1720             :                 }
    1721             : 
    1722             :                 //check container validity
    1723       91746 :                 if (strlen(a->registry->parents_4cc)) {
    1724             :                         Bool parent_OK = GF_FALSE;
    1725       91746 :                         const char *parent_code = gf_4cc_to_str(parent->type);
    1726       91746 :                         if (parent->type == GF_ISOM_BOX_TYPE_UNKNOWN)
    1727         968 :                                 parent_code = gf_4cc_to_str( ((GF_UnknownBox*)parent)->original_4cc );
    1728       91746 :                         if (strstr(a->registry->parents_4cc, parent_code) != NULL) {
    1729             :                                 parent_OK = GF_TRUE;
    1730        4651 :                         } else if (!strcmp(a->registry->parents_4cc, "*") || strstr(a->registry->parents_4cc, "* ") || strstr(a->registry->parents_4cc, " *")) {
    1731             :                                 parent_OK = GF_TRUE;
    1732             :                         } else {
    1733             :                                 //parent must be a sample entry
    1734        3683 :                                 if (strstr(a->registry->parents_4cc, "sample_entry") != NULL) {
    1735             :                                         //parent is in an stsd
    1736        3430 :                                         if (strstr(parent->registry->parents_4cc, "stsd") != NULL) {
    1737        3430 :                                                 if (strstr(a->registry->parents_4cc, "video_sample_entry") !=   NULL) {
    1738         241 :                                                         if (((GF_SampleEntryBox*)parent)->internal_type==GF_ISOM_SAMPLE_ENTRY_VIDEO) {
    1739             :                                                                 parent_OK = GF_TRUE;
    1740             :                                                         }
    1741             :                                                 } else {
    1742             :                                                         parent_OK = GF_TRUE;
    1743             :                                                 }
    1744             :                                         }
    1745             :                                 }
    1746             :                                 //other types are sample formats, eg a 3GPP text sample, RTP hint sample or VTT cue. Not handled at this level
    1747         253 :                                 else if (a->type==GF_ISOM_BOX_TYPE_UNKNOWN) parent_OK = GF_TRUE;
    1748           6 :                                 else if (a->type==GF_ISOM_BOX_TYPE_UUID) parent_OK = GF_TRUE;
    1749             :                         }
    1750       91746 :                         if (! parent_OK && !skip_logs) {
    1751           0 :                                 GF_LOG(GF_LOG_WARNING, GF_LOG_CONTAINER, ("[iso file] Box \"%s\" is invalid in container %s\n", gf_4cc_to_str(a->type), parent_code));
    1752             :                         }
    1753             :                 }
    1754             : 
    1755             :                 //always register boxes
    1756       91746 :                 if (!parent->child_boxes) {
    1757       35996 :                         parent->child_boxes = gf_list_new();
    1758       35996 :                         if (!parent->child_boxes) return GF_OUT_OF_MEM;
    1759             :                 }
    1760       91746 :                 e = gf_list_add(parent->child_boxes, a);
    1761       91746 :                 if (e) return e;
    1762             : 
    1763       91746 :                 if (parent->registry->add_rem_fn) {
    1764       87275 :                         e = parent->registry->add_rem_fn(parent, a, GF_FALSE);
    1765       87275 :                         if (e) {
    1766           0 :                                 if (e == GF_ISOM_INVALID_MEDIA) return GF_OK;
    1767             :                                 //if the box is no longer present, consider it destroyed
    1768           0 :                                 if (gf_list_find(parent->child_boxes, a) >=0) {
    1769           0 :                                         gf_isom_box_del_parent(&parent->child_boxes, a);
    1770             :                                 }
    1771             :                                 return e;
    1772             :                         }
    1773             :                 }
    1774             :         }
    1775             :         return GF_OK;
    1776             : }
    1777             : 
    1778             : GF_EXPORT
    1779      370731 : void gf_isom_box_del(GF_Box *a)
    1780             : {
    1781             :         GF_List *child_boxes;
    1782             :         const struct box_registry_entry *a_box_registry;
    1783      370731 :         if (!a) return;
    1784             : 
    1785      370651 :         child_boxes     = a->child_boxes;
    1786      370651 :         a->child_boxes = NULL;
    1787             : 
    1788      370651 :         a_box_registry = a->registry;
    1789      370651 :         if (!a_box_registry) {
    1790           0 :                 GF_LOG(GF_LOG_ERROR, GF_LOG_CONTAINER, ("[iso file] Delete invalid box type %s without registry\n", gf_4cc_to_str(a->type) ));
    1791             :         } else {
    1792      370651 :                 a_box_registry->del_fn(a);
    1793             :         }
    1794             :         //delete the other boxes after deleting the box for dumper case where all child boxes are stored in otherbox
    1795      370651 :         if (child_boxes) {
    1796       77798 :                 gf_isom_box_array_del(child_boxes);
    1797             :         }
    1798             : }
    1799             : 
    1800             : 
    1801      115518 : GF_Err gf_isom_box_read(GF_Box *a, GF_BitStream *bs)
    1802             : {
    1803      115518 :         if (!a) return GF_BAD_PARAM;
    1804      115518 :         if (!a->registry) {
    1805           0 :                 GF_LOG(GF_LOG_ERROR, GF_LOG_CONTAINER, ("[iso file] Read invalid box type %s without registry\n", gf_4cc_to_str(a->type) ));
    1806             :                 return GF_ISOM_INVALID_FILE;
    1807             :         }
    1808      115518 :         return a->registry->read_fn(a, bs);
    1809             : }
    1810             : 
    1811             : #ifndef GPAC_DISABLE_ISOM_WRITE
    1812             : 
    1813      154720 : GF_Err gf_isom_box_write_listing(GF_Box *a, GF_BitStream *bs)
    1814             : {
    1815      154720 :         if (!a) return GF_BAD_PARAM;
    1816      154720 :         if (!a->registry) {
    1817           0 :                 GF_LOG(GF_LOG_ERROR, GF_LOG_CONTAINER, ("[iso file] Write invalid box type %s without registry\n", gf_4cc_to_str(a->type) ));
    1818             :                 return GF_ISOM_INVALID_FILE;
    1819             :         }
    1820      154720 :         return a->registry->write_fn(a, bs);
    1821             : }
    1822             : 
    1823             : 
    1824      384458 : void gf_isom_check_position(GF_Box *s, GF_Box *child, u32 *pos)
    1825             : {
    1826      384458 :         if (!s || !s->child_boxes || !child || !pos) return;
    1827      191018 :         if (s->internal_flags & GF_ISOM_ORDER_FREEZE)
    1828             :                 return;
    1829             : 
    1830      190147 :         s32 cur_pos = gf_list_find(s->child_boxes, child);
    1831             : 
    1832             :         assert (cur_pos >= 0);
    1833             : 
    1834      190147 :         if (cur_pos != (s32) *pos) {
    1835       11402 :                 gf_list_del_item(s->child_boxes, child);
    1836       11402 :                 gf_list_insert(s->child_boxes, child, *pos);
    1837             :         }
    1838      190147 :         (*pos)++;
    1839             : }
    1840             : 
    1841       99844 : void gf_isom_check_position_list(GF_Box *s, GF_List *childlist, u32 *pos)
    1842             : {
    1843             :         u32 i, count;
    1844       99844 :         if (!s || (s->internal_flags & GF_ISOM_ORDER_FREEZE))
    1845             :                 return;
    1846       99072 :         count = gf_list_count(childlist);
    1847      132501 :         for (i=0; i<count; i++) {
    1848       33429 :                 GF_Box *child = gf_list_get(childlist, i);
    1849       33429 :                 gf_isom_check_position(s, child, pos);
    1850             :         }
    1851             : }
    1852             : 
    1853             : 
    1854             : GF_EXPORT
    1855      154951 : GF_Err gf_isom_box_write(GF_Box *a, GF_BitStream *bs)
    1856             : {
    1857             :         GF_Err e;
    1858      154951 :         u64 pos = gf_bs_get_position(bs);
    1859      154951 :         if (!a) return GF_BAD_PARAM;
    1860             :         //box has been disabled, do not write
    1861      154951 :         if (!a->size) return GF_OK;
    1862             :         
    1863      154720 :         if (a->registry->disabled) {
    1864           0 :                 GF_LOG(GF_LOG_DEBUG, GF_LOG_CONTAINER, ("[iso file] Box %s disabled registry, skip write\n", gf_4cc_to_str(a->type)));
    1865             :                 return GF_OK;
    1866             :         }
    1867             : 
    1868      154720 :         GF_LOG(GF_LOG_DEBUG, GF_LOG_CONTAINER, ("[iso file] Box %s size %d write\n", gf_4cc_to_str(a->type), a->size));
    1869      154720 :         e = gf_isom_box_write_listing(a, bs);
    1870      154720 :         if (e) return e;
    1871      154718 :         if (a->child_boxes) {
    1872       52156 :                 e = gf_isom_box_array_write(a, a->child_boxes, bs);
    1873             :         }
    1874      154718 :         pos = gf_bs_get_position(bs) - pos;
    1875      154718 :         if (pos != a->size) {
    1876        1053 :                 if ((a->type==GF_ISOM_BOX_TYPE_MDAT) || (a->type==GF_ISOM_BOX_TYPE_IDAT)) {
    1877             : 
    1878             :                 } else {
    1879           6 :                         GF_LOG(GF_LOG_WARNING, GF_LOG_CONTAINER, ("[iso file] Box %s wrote "LLU" bytes but size is "LLU"\n", gf_4cc_to_str(a->type), pos, a->size ));
    1880             :                 }
    1881             :         }
    1882             :         return e;
    1883             : }
    1884             : 
    1885      288848 : static GF_Err gf_isom_box_size_listing(GF_Box *a)
    1886             : {
    1887      288848 :         if (!a) return GF_BAD_PARAM;
    1888      288848 :         if (!a->registry) {
    1889           0 :                 GF_LOG(GF_LOG_ERROR, GF_LOG_CONTAINER, ("[iso file] Size invalid box type %s without registry\n", gf_4cc_to_str(a->type) ));
    1890             :                 return GF_ISOM_INVALID_FILE;
    1891             :         }
    1892      288848 :         a->size = 8;
    1893             : 
    1894      288848 :         if (a->type == GF_ISOM_BOX_TYPE_UUID) {
    1895          92 :                 a->size += 16;
    1896             :         }
    1897             :         //the large size is handled during write, cause at this stage we don't know the size
    1898      288848 :         if (a->registry->max_version_plus_one) {
    1899      138250 :                 a->size += 4;
    1900             :         }
    1901      288848 :         return a->registry->size_fn(a);
    1902             : }
    1903             : 
    1904             : GF_EXPORT
    1905      288848 : GF_Err gf_isom_box_size(GF_Box *a)
    1906             : {
    1907             :         GF_Err e;
    1908      288848 :         if (!a) return GF_BAD_PARAM;
    1909      288848 :         if (a->registry->disabled) {
    1910           0 :                 a->size = 0;
    1911           0 :                 return GF_OK;
    1912             :         }
    1913      288848 :         e = gf_isom_box_size_listing(a);
    1914      288848 :         if (e) return e;
    1915             :         //box size set to 0 (not even a header), abort traversal
    1916      288846 :         if (!a->size) return GF_OK;
    1917             : 
    1918      288525 :         if (a->child_boxes) {
    1919       96777 :                 e = gf_isom_box_array_size(a, a->child_boxes);
    1920       96777 :                 if (e) return e;
    1921             :         }
    1922             :         return GF_OK;
    1923             : }
    1924             : 
    1925             : #endif /*GPAC_DISABLE_ISOM_WRITE*/
    1926             : 
    1927      115512 : static GF_Err gf_isom_full_box_read(GF_Box *ptr, GF_BitStream *bs)
    1928             : {
    1929      115512 :         if (ptr->registry->max_version_plus_one) {
    1930             :                 GF_FullBox *self = (GF_FullBox *) ptr;
    1931       62116 :                 ISOM_DECREASE_SIZE(ptr, 4)
    1932       62116 :                 self->version = gf_bs_read_u8(bs);
    1933       62116 :                 self->flags = gf_bs_read_u24(bs);
    1934             :         }
    1935             :         return GF_OK;
    1936             : }
    1937             : 
    1938             : 
    1939             : GF_EXPORT
    1940         497 : GF_Err gf_isom_dump_supported_box(u32 idx, FILE * trace)
    1941             : {
    1942             :         u32 i;
    1943             :         u32 nb_versions=0;
    1944             :         GF_Err e;
    1945             : 
    1946         497 :         if (box_registry[idx].max_version_plus_one) {
    1947         165 :                 nb_versions = box_registry[idx].max_version_plus_one - 1;
    1948             :         }
    1949        1027 :         for (i = 0; i <= nb_versions; i++) {
    1950         530 :                 GF_Box *a = box_registry[idx].new_fn();
    1951         530 :                 if (!a) return GF_OUT_OF_MEM;
    1952             : 
    1953         530 :                 a->registry = &box_registry[idx];
    1954             : 
    1955         530 :                 if (box_registry[idx].alt_4cc) {
    1956          62 :                         if (a->type==GF_ISOM_BOX_TYPE_REFT)
    1957          29 :                                 ((GF_TrackReferenceTypeBox*)a)->reference_type = box_registry[idx].alt_4cc;
    1958          33 :                         else if (a->type==GF_ISOM_BOX_TYPE_REFI)
    1959           3 :                                 ((GF_ItemReferenceTypeBox*)a)->reference_type = box_registry[idx].alt_4cc;
    1960          30 :                         else if (a->type==GF_ISOM_BOX_TYPE_TRGT)
    1961           3 :                                 ((GF_TrackGroupTypeBox*)a)->group_type = box_registry[idx].alt_4cc;
    1962          27 :                         else if (a->type==GF_ISOM_BOX_TYPE_SGPD)
    1963          26 :                                 ((GF_SampleGroupDescriptionBox*)a)->grouping_type = box_registry[idx].alt_4cc;
    1964           1 :                         else if (a->type==GF_ISOM_BOX_TYPE_GRPT)
    1965           1 :                                 ((GF_EntityToGroupTypeBox*)a)->grouping_type = box_registry[idx].alt_4cc;
    1966             :                 }
    1967         530 :                 if (box_registry[idx].max_version_plus_one) {
    1968         198 :                         ((GF_FullBox *)a)->version = i;
    1969             :                 }
    1970         530 :                 if (box_registry[idx].flags) {
    1971             :                         u32 flag_mask=1;
    1972             :                         u32 flags = box_registry[idx].flags;
    1973          15 :                         ((GF_FullBox *)a)->flags = 0;
    1974          15 :                         e = gf_isom_box_dump(a, trace);
    1975             : 
    1976             :                         //we dump all flags individually and this for all version, in order to simplify the XSLT processing
    1977          66 :                         while (!e) {
    1978          51 :                                 u32 flag = flags & flag_mask;
    1979          51 :                                 flag_mask <<= 1;
    1980          51 :                                 if (flag) {
    1981          34 :                                         ((GF_FullBox *)a)->flags = flag;
    1982          34 :                                         e = gf_isom_box_dump(a, trace);
    1983             :                                 }
    1984          51 :                                 if (flag_mask > flags) break;
    1985          36 :                                 if (flag_mask == 0x80000000) break;
    1986             :                         }
    1987             : 
    1988             :                 } else {
    1989         515 :                         e = gf_isom_box_dump(a, trace);
    1990             :                 }
    1991             : 
    1992         530 :                 gf_isom_box_del(a);
    1993             :         }
    1994             :         return e;
    1995             : }
    1996             : 
    1997             : GF_EXPORT
    1998         497 : u32 gf_isom_get_supported_box_type(u32 idx)
    1999             : {
    2000         497 :         return box_registry[idx].box_4cc;
    2001             : }
    2002             : 
    2003             : #ifndef GPAC_DISABLE_ISOM_DUMP
    2004             : 
    2005        3960 : GF_Err gf_isom_box_dump_start(GF_Box *a, const char *name, FILE * trace)
    2006             : {
    2007        3960 :         gf_fprintf(trace, "<%s ", name);
    2008        3960 :         if (a->size > 0xFFFFFFFF) {
    2009           0 :                 gf_fprintf(trace, "LargeSize=\""LLU"\" ", a->size);
    2010             :         } else {
    2011        3960 :                 gf_fprintf(trace, "Size=\"%u\" ", (u32) a->size);
    2012             :         }
    2013        3960 :         if (a->type==GF_ISOM_BOX_TYPE_UNKNOWN) {
    2014           9 :                 gf_fprintf(trace, "Type=\"%s\" ", gf_4cc_to_str(((GF_UnknownBox*)a)->original_4cc));
    2015             :         } else {
    2016        3951 :                 gf_fprintf(trace, "Type=\"%s\" ", gf_4cc_to_str(a->type));
    2017             :         }
    2018             : 
    2019        3960 :         if (a->type == GF_ISOM_BOX_TYPE_UUID) {
    2020             :                 u32 i;
    2021          12 :                 gf_fprintf(trace, "UUID=\"{");
    2022         204 :                 for (i=0; i<16; i++) {
    2023         192 :                         gf_fprintf(trace, "%02X", (unsigned char) ((GF_UUIDBox*)a)->uuid[i]);
    2024         192 :                         if ((i<15) && (i%4)==3) gf_fprintf(trace, "-");
    2025             :                 }
    2026          12 :                 gf_fprintf(trace, "}\" ");
    2027             :         }
    2028             : 
    2029        3960 :         if (a->registry->max_version_plus_one) {
    2030        2109 :                 gf_fprintf(trace, "Version=\"%d\" Flags=\"%d\" ", ((GF_FullBox*)a)->version,((GF_FullBox*)a)->flags);
    2031             :         }
    2032        3960 :         gf_fprintf(trace, "Specification=\"%s\" ", a->registry->spec);
    2033             :         //we don't want to rewrite our hashes
    2034        3960 :         if (gf_sys_is_test_mode() && (a->type==GF_ISOM_BOX_TYPE_FTYP)) {
    2035         115 :                 gf_fprintf(trace, "Container=\"file\" ");
    2036             :         } else {
    2037        3845 :                 gf_fprintf(trace, "Container=\"%s\" ", a->registry->parents_4cc);
    2038             :         }
    2039        3960 :         return GF_OK;
    2040             : }
    2041             : 
    2042        3981 : GF_Err gf_isom_box_dump(void *ptr, FILE * trace)
    2043             : {
    2044             :         GF_Box *a = (GF_Box *) ptr;
    2045             : 
    2046        3981 :         if (!a) {
    2047           0 :                 gf_fprintf(trace, "<!--ERROR: NULL Box Found-->\n");
    2048           0 :                 return GF_OK;
    2049             :         }
    2050        3981 :         if (!a->registry) {
    2051           0 :                 GF_LOG(GF_LOG_ERROR, GF_LOG_CONTAINER, ("[isom] trying to dump box %s not registered\n", gf_4cc_to_str(a->type) ));
    2052             :                 return GF_ISOM_INVALID_FILE;
    2053             :         }
    2054        3981 :         a->registry->dump_fn(a, trace);
    2055        3981 :         return GF_OK;
    2056             : }
    2057             : 
    2058        3958 : void gf_isom_box_dump_done(const char *name, GF_Box *ptr, FILE *trace)
    2059             : {
    2060        3958 :         if (ptr && ptr->child_boxes) {
    2061        1222 :                 gf_isom_box_array_dump(ptr->child_boxes, trace);
    2062             :         }
    2063        3958 :         if (name)
    2064        3958 :                 gf_fprintf(trace, "</%s>\n", name);
    2065        3958 : }
    2066             : 
    2067         489 : Bool gf_isom_box_is_file_level(GF_Box *s)
    2068             : {
    2069         489 :         if (!s || !s->registry) return GF_FALSE;
    2070         489 :         if (strstr(s->registry->parents_4cc, "file")!= NULL) return GF_TRUE;
    2071         114 :         if (strstr(s->registry->parents_4cc, "*")!= NULL) return GF_TRUE;
    2072           0 :         return GF_FALSE;
    2073             : }
    2074             : #endif
    2075             : 
    2076             : 
    2077       70716 : GF_Box *gf_isom_box_find_child(GF_List *children, u32 code)
    2078             : {
    2079             :         u32 i, count;
    2080       70716 :         if (!children) return NULL;
    2081       69403 :         count = gf_list_count(children);
    2082      190912 :         for (i=0; i<count; i++) {
    2083      149545 :                 GF_Box *c = gf_list_get(children, i);
    2084      149545 :                 if (c->type==code) return c;
    2085             : 
    2086      121511 :                 if (c->type==GF_ISOM_BOX_TYPE_UNKNOWN) {
    2087         368 :                         if (((GF_UnknownBox*)c)->original_4cc==code)
    2088             :                                 return c;
    2089             :                 }
    2090      121509 :                 if (c->type==GF_ISOM_BOX_TYPE_UUID) {
    2091          72 :                         if (((GF_UUIDBox*)c)->internal_4cc==code)
    2092             :                                 return c;
    2093             :                 }
    2094             :         }
    2095             :         return NULL;
    2096             : }
    2097             : 
    2098         416 : Bool gf_isom_box_check_unique(GF_List *children, GF_Box *a)
    2099             : {
    2100             :         u32 i, count;
    2101         416 :         if (!children) return GF_TRUE;
    2102         416 :         count = gf_list_count(children);
    2103        1259 :         for (i=0; i<count; i++) {
    2104         843 :                 GF_Box *c = gf_list_get(children, i);
    2105         843 :                 if (c==a) continue;
    2106         427 :                 if (c->type==a->type) return GF_FALSE;
    2107             :         }
    2108             :         return GF_TRUE;
    2109             : }
    2110             : 
    2111      125854 : void gf_isom_box_del_parent(GF_List **child_boxes, GF_Box*b)
    2112             : {
    2113      125854 :         if (child_boxes) {
    2114      125854 :                 gf_list_del_item(*child_boxes, b);
    2115      125854 :                 if (!gf_list_count(*child_boxes)) {
    2116          75 :                         gf_list_del(*child_boxes);
    2117          75 :                         *child_boxes = NULL;
    2118             :                 }
    2119             :         }
    2120      125854 :         gf_isom_box_del(b);
    2121      125854 : }
    2122             : 
    2123           1 : void gf_isom_box_remove_from_parent(GF_Box *parent_box, GF_Box *box)
    2124             : {
    2125           1 :         if (parent_box && parent_box->registry && parent_box->registry->add_rem_fn) {
    2126           1 :                 parent_box->registry->add_rem_fn(parent_box, box, GF_TRUE);
    2127             :         }
    2128           1 : }
    2129             : 
    2130      203412 : GF_Box *gf_isom_box_new_parent(GF_List **parent, u32 code)
    2131             : {
    2132      203412 :         GF_Box *b = gf_isom_box_new(code);
    2133      203412 :         if (!b) return NULL;
    2134      203412 :         if (! (*parent) ) (*parent)  = gf_list_new();
    2135      203412 :         gf_list_add(*parent, b);
    2136      203412 :         return b;
    2137             : }
    2138             : 
    2139         889 : void gf_isom_box_freeze_order(GF_Box *box)
    2140             : {
    2141         889 :         u32 i=0;
    2142             :         GF_Box *child;
    2143         889 :         if (!box) return;
    2144         889 :         box->internal_flags |= GF_ISOM_ORDER_FREEZE;
    2145             : 
    2146        2520 :         while ((child = gf_list_enum(box->child_boxes, &i))) {
    2147         742 :                 gf_isom_box_freeze_order(child);
    2148             :         }
    2149             : 
    2150             : }
    2151             : #endif /*GPAC_DISABLE_ISOM*/

Generated by: LCOV version 1.13