LCOV - code coverage report
Current view: top level - isomedia - box_dump.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 2710 3526 76.9 %
Date: 2021-04-29 23:48:07 Functions: 283 285 99.3 %

          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             : #include <gpac/utf.h>
      28             : #include <gpac/network.h>
      29             : #include <gpac/color.h>
      30             : #include <gpac/avparse.h>
      31             : #include <gpac/base_coding.h>
      32             : 
      33             : #ifndef GPAC_DISABLE_ISOM_DUMP
      34             : 
      35             : 
      36         243 : static void dump_data(FILE *trace, char *data, u32 dataLength)
      37             : {
      38             :         u32 i;
      39         243 :         gf_fprintf(trace, "data:application/octet-string,");
      40        3776 :         for (i=0; i<dataLength; i++) {
      41        3533 :                 gf_fprintf(trace, "%02X", (unsigned char) data[i]);
      42             :         }
      43         243 : }
      44             : 
      45         283 : static void dump_data_hex(FILE *trace, char *data, u32 dataLength)
      46             : {
      47             :         u32 i;
      48         283 :         gf_fprintf(trace, "0x");
      49        4072 :         for (i=0; i<dataLength; i++) {
      50        3789 :                 gf_fprintf(trace, "%02X", (unsigned char) data[i]);
      51             :         }
      52         283 : }
      53             : 
      54           7 : static void dump_data_attribute(FILE *trace, char *name, u8 *data, u32 data_size)
      55             : {
      56             :         u32 i;
      57           7 :         if (!data || !data_size) {
      58           4 :                 gf_fprintf(trace, "%s=\"\"", name);
      59           4 :                 return;
      60             :         }
      61           3 :         gf_fprintf(trace, "%s=\"0x", name);
      62           3 :         for (i=0; i<data_size; i++) gf_fprintf(trace, "%02X", (unsigned char) data[i]);
      63           3 :         gf_fprintf(trace, "\" ");
      64             : }
      65             : 
      66           9 : static void dump_data_string(FILE *trace, char *data, u32 dataLength)
      67             : {
      68             :         u32 i;
      69           9 :         for (i=0; i<dataLength; i++) {
      70           0 :                 switch ((unsigned char) data[i]) {
      71           0 :                 case '\'':
      72           0 :                         gf_fprintf(trace, "&apos;");
      73           0 :                         break;
      74           0 :                 case '\"':
      75           0 :                         gf_fprintf(trace, "&quot;");
      76           0 :                         break;
      77           0 :                 case '&':
      78           0 :                         gf_fprintf(trace, "&amp;");
      79           0 :                         break;
      80           0 :                 case '>':
      81           0 :                         gf_fprintf(trace, "&gt;");
      82           0 :                         break;
      83           0 :                 case '<':
      84           0 :                         gf_fprintf(trace, "&lt;");
      85           0 :                         break;
      86           0 :                 default:
      87           0 :                         gf_fprintf(trace, "%c", (u8) data[i]);
      88           0 :                         break;
      89             :                 }
      90             :         }
      91           9 : }
      92             : 
      93             : 
      94        1226 : GF_Err gf_isom_box_array_dump(GF_List *list, FILE * trace)
      95             : {
      96             :         u32 i;
      97             :         GF_Box *a;
      98        1226 :         if (!list) return GF_OK;
      99        1226 :         i=0;
     100        5353 :         while ((a = (GF_Box *)gf_list_enum(list, &i))) {
     101        2901 :                 gf_isom_box_dump(a, trace);
     102             :         }
     103             :         return GF_OK;
     104             : }
     105             : 
     106             : static Bool dump_skip_samples = GF_FALSE;
     107             : GF_EXPORT
     108         117 : GF_Err gf_isom_dump(GF_ISOFile *mov, FILE * trace, Bool skip_init, Bool skip_samples)
     109             : {
     110             :         u32 i;
     111             :         const char *fname;
     112             :         GF_Box *box;
     113         117 :         if (!mov || !trace) return GF_BAD_PARAM;
     114             : 
     115         117 :         gf_fprintf(trace, "<!--MP4Box dump trace-->\n");
     116             : 
     117         117 :         fname = strrchr(mov->fileName, '/');
     118         117 :         if (!fname) fname = strrchr(mov->fileName, '\\');
     119         117 :         if (!fname) fname = mov->fileName;
     120         117 :         else fname+=1;
     121         117 :         gf_fprintf(trace, "<IsoMediaFile xmlns=\"urn:mpeg:isobmff:schema:file:2016\" Name=\"%s\">\n", fname);
     122             : 
     123         117 :         dump_skip_samples = skip_samples;
     124         117 :         i=0;
     125         117 :         if (skip_init)
     126           2 :                 i = mov->nb_box_init_seg;
     127             : 
     128         606 :         while ((box = (GF_Box *)gf_list_enum(mov->TopBoxes, &i))) {
     129         489 :                 if (box->type==GF_ISOM_BOX_TYPE_UNKNOWN) {
     130           0 :                         gf_fprintf(trace, "<!--WARNING: Unknown Top-level Box Found -->\n");
     131         489 :                 } else if (box->type==GF_ISOM_BOX_TYPE_UUID) {
     132         489 :                 } else if (!gf_isom_box_is_file_level(box)) {
     133           0 :                         gf_fprintf(trace, "<!--ERROR: Invalid Top-level Box Found (\"%s\")-->\n", gf_4cc_to_str(box->type));
     134             :                 }
     135         489 :                 gf_isom_box_dump(box, trace);
     136             :         }
     137         117 :         gf_fprintf(trace, "</IsoMediaFile>\n");
     138         117 :         return GF_OK;
     139             : }
     140             : 
     141          30 : GF_Err reftype_box_dump(GF_Box *a, FILE * trace)
     142             : {
     143             :         u32 i;
     144             :         GF_TrackReferenceTypeBox *p = (GF_TrackReferenceTypeBox *)a;
     145          30 :         if (!p->reference_type) return GF_OK;
     146          30 :         p->type = p->reference_type;
     147             : 
     148          30 :         gf_isom_box_dump_start(a, "TrackReferenceTypeBox", trace);
     149          30 :         gf_fprintf(trace, ">\n");
     150          31 :         for (i=0; i<p->trackIDCount; i++) {
     151           1 :                 gf_fprintf(trace, "<TrackReferenceEntry TrackID=\"%d\"/>\n", p->trackIDs[i]);
     152             :         }
     153          30 :         if (!p->size)
     154          29 :                 gf_fprintf(trace, "<TrackReferenceEntry TrackID=\"\"/>\n");
     155             : 
     156          30 :         gf_isom_box_dump_done("TrackReferenceTypeBox", a, trace);
     157          30 :         p->type = GF_ISOM_BOX_TYPE_REFT;
     158          30 :         return GF_OK;
     159             : }
     160             : 
     161          24 : GF_Err ireftype_box_dump(GF_Box *a, FILE * trace)
     162             : {
     163             :         u32 i;
     164             :         GF_ItemReferenceTypeBox *p = (GF_ItemReferenceTypeBox *)a;
     165          24 :         if (!p->reference_type) return GF_OK;
     166             : 
     167          24 :         p->type = p->reference_type;
     168          24 :         gf_isom_box_dump_start(a, "ItemReferenceBox", trace);
     169          24 :         gf_fprintf(trace, "from_item_id=\"%d\">\n", p->from_item_id);
     170          53 :         for (i = 0; i < p->reference_count; i++) {
     171          29 :                 gf_fprintf(trace, "<ItemReferenceBoxEntry ItemID=\"%d\"/>\n", p->to_item_IDs[i]);
     172             :         }
     173          24 :         if (!p->size)
     174           3 :                 gf_fprintf(trace, "<ItemReferenceBoxEntry ItemID=\"\"/>\n");
     175             : 
     176          24 :         gf_isom_box_dump_done("ItemReferenceBox", a, trace);
     177             : 
     178          24 :         p->type = GF_ISOM_BOX_TYPE_REFI;
     179          24 :         return GF_OK;
     180             : }
     181             : 
     182         116 : GF_Err free_box_dump(GF_Box *a, FILE * trace)
     183             : {
     184             :         GF_FreeSpaceBox *p = (GF_FreeSpaceBox *)a;
     185         116 :         gf_isom_box_dump_start(a, (a->type==GF_ISOM_BOX_TYPE_FREE) ? "FreeSpaceBox" : "SkipBox", trace);
     186         116 :         gf_fprintf(trace, "dataSize=\"%d\">\n", p->dataSize);
     187         116 :         gf_isom_box_dump_done( (a->type==GF_ISOM_BOX_TYPE_FREE) ? "FreeSpaceBox" : "SkipBox", a, trace);
     188         116 :         return GF_OK;
     189             : }
     190             : 
     191           1 : GF_Err wide_box_dump(GF_Box *a, FILE * trace)
     192             : {
     193           1 :         gf_isom_box_dump_start(a, "WideBox", trace);
     194           1 :         gf_fprintf(trace, ">\n");
     195           1 :         gf_isom_box_dump_done("WideBox", a, trace);
     196           1 :         return GF_OK;
     197             : }
     198             : 
     199         129 : GF_Err mdat_box_dump(GF_Box *a, FILE * trace)
     200             : {
     201             :         GF_MediaDataBox *p;
     202         129 :         const char *name = (a->type==GF_ISOM_BOX_TYPE_IDAT ? "ItemDataBox" : "MediaDataBox");
     203             :         p = (GF_MediaDataBox *)a;
     204         129 :         gf_isom_box_dump_start(a, name, trace);
     205         129 :         gf_fprintf(trace, "dataSize=\""LLD"\">\n", p->dataSize);
     206         129 :         gf_isom_box_dump_done(name, a, trace);
     207         129 :         return GF_OK;
     208             : }
     209             : 
     210          95 : GF_Err moov_box_dump(GF_Box *a, FILE * trace)
     211             : {
     212             :         GF_MovieBox *p = (GF_MovieBox *) a;
     213          95 :         gf_isom_box_dump_start(a, "MovieBox", trace);
     214          95 :         if (p->internal_flags & GF_ISOM_BOX_COMPRESSED)
     215           0 :                 gf_fprintf(trace, "compressedSize=\""LLU"\"", p->size - p->compressed_diff);
     216          95 :         gf_fprintf(trace, ">\n");
     217          95 :         gf_isom_box_dump_done("MovieBox", a, trace);
     218          95 :         return GF_OK;
     219             : }
     220             : 
     221          96 : GF_Err mvhd_box_dump(GF_Box *a, FILE * trace)
     222             : {
     223             :         GF_MovieHeaderBox *p;
     224             : 
     225             :         p = (GF_MovieHeaderBox *) a;
     226             : 
     227          96 :         gf_isom_box_dump_start(a, "MovieHeaderBox", trace);
     228          96 :         gf_fprintf(trace, "CreationTime=\""LLD"\" ", p->creationTime);
     229          96 :         gf_fprintf(trace, "ModificationTime=\""LLD"\" ", p->modificationTime);
     230          96 :         gf_fprintf(trace, "TimeScale=\"%d\" ", p->timeScale);
     231          96 :         gf_fprintf(trace, "Duration=\""LLD"\" ", p->duration);
     232          96 :         gf_fprintf(trace, "NextTrackID=\"%d\">\n", p->nextTrackID);
     233             : 
     234          96 :         gf_isom_box_dump_done("MovieHeaderBox", a, trace);
     235          96 :         return GF_OK;
     236             : }
     237             : 
     238         117 : GF_Err mdhd_box_dump(GF_Box *a, FILE * trace)
     239             : {
     240             :         GF_MediaHeaderBox *p;
     241             : 
     242             :         p = (GF_MediaHeaderBox *)a;
     243         117 :         gf_isom_box_dump_start(a, "MediaHeaderBox", trace);
     244         117 :         gf_fprintf(trace, "CreationTime=\""LLD"\" ", p->creationTime);
     245         117 :         gf_fprintf(trace, "ModificationTime=\""LLD"\" ", p->modificationTime);
     246         117 :         gf_fprintf(trace, "TimeScale=\"%d\" ", p->timeScale);
     247         117 :         gf_fprintf(trace, "Duration=\""LLD"\" ", p->duration);
     248         117 :         gf_fprintf(trace, "LanguageCode=\"%c%c%c\">\n", p->packedLanguage[0], p->packedLanguage[1], p->packedLanguage[2]);
     249         117 :         gf_isom_box_dump_done("MediaHeaderBox", a, trace);
     250         117 :         return GF_OK;
     251             : }
     252             : 
     253          38 : GF_Err vmhd_box_dump(GF_Box *a, FILE * trace)
     254             : {
     255          38 :         gf_isom_box_dump_start(a, "VideoMediaHeaderBox", trace);
     256          38 :         gf_fprintf(trace, ">\n");
     257          38 :         gf_isom_box_dump_done("VideoMediaHeaderBox", a, trace);
     258          38 :         return GF_OK;
     259             : }
     260             : 
     261           1 : GF_Err gmin_box_dump(GF_Box *a, FILE * trace)
     262             : {
     263             :         GF_GenericMediaHeaderInfoBox *p = (GF_GenericMediaHeaderInfoBox *)a;
     264           1 :         gf_isom_box_dump_start(a, "GenericMediaHeaderInformationBox", trace);
     265           5 :         gf_fprintf(trace, " graphicsMode=\"%d\" opcolorRed=\"%d\" opcolorGreen=\"%d\" opcolorBlue=\"%d\" balance=\"%d\">\n",
     266           5 :                 p->graphics_mode, p->op_color_red, p->op_color_green, p->op_color_blue, p->balance);
     267           1 :         gf_isom_box_dump_done("GenericMediaHeaderInformationBox", a, trace);
     268           1 :         return GF_OK;
     269             : }
     270             : 
     271           3 : GF_Err clef_box_dump(GF_Box *a, FILE * trace)
     272             : {
     273             :         Float w, h;
     274             :         const char *name = "TrackCleanApertureDimensionsBox";
     275             :         GF_ApertureBox *p = (GF_ApertureBox *)a;
     276           3 :         if (p->type==GF_QT_BOX_TYPE_PROF)
     277             :                 name = "TrackProductionApertureDimensionsBox";
     278           3 :         else if (p->type==GF_QT_BOX_TYPE_ENOF)
     279             :                 name = "TrackEncodedPixelsDimensionsBox";
     280             : 
     281           3 :         gf_isom_box_dump_start(a, name, trace);
     282           3 :         w = (Float) (p->width&0xFFFF);
     283           3 :         w /= 0xFFFF;
     284           3 :         w += (p->width>>16);
     285             : 
     286           3 :         h = (Float) (p->height&0xFFFF);
     287           3 :         h /= 0xFFFF;
     288           3 :         h += (p->height>>16);
     289             : 
     290           3 :         gf_fprintf(trace, " width=\"%g\" height=\"%g\">\n", w, h);
     291           3 :         gf_isom_box_dump_done(name, a, trace);
     292           3 :         return GF_OK;
     293             : }
     294             : 
     295          44 : GF_Err smhd_box_dump(GF_Box *a, FILE * trace)
     296             : {
     297          44 :         gf_isom_box_dump_start(a, "SoundMediaHeaderBox", trace);
     298          44 :         gf_fprintf(trace, ">\n");
     299          44 :         gf_isom_box_dump_done("SoundMediaHeaderBox", a, trace);
     300          44 :         return GF_OK;
     301             : }
     302             : 
     303           1 : GF_Err hmhd_box_dump(GF_Box *a, FILE * trace)
     304             : {
     305             :         GF_HintMediaHeaderBox *p;
     306             : 
     307             :         p = (GF_HintMediaHeaderBox *)a;
     308             : 
     309           1 :         gf_isom_box_dump_start(a, "HintMediaHeaderBox", trace);
     310           1 :         gf_fprintf(trace, "MaximumPDUSize=\"%d\" ", p->maxPDUSize);
     311           1 :         gf_fprintf(trace, "AveragePDUSize=\"%d\" ", p->avgPDUSize);
     312           1 :         gf_fprintf(trace, "MaxBitRate=\"%d\" ", p->maxBitrate);
     313           1 :         gf_fprintf(trace, "AverageBitRate=\"%d\">\n", p->avgBitrate);
     314             : 
     315           1 :         gf_isom_box_dump_done("HintMediaHeaderBox", a, trace);
     316           1 :         return GF_OK;
     317             : }
     318             : 
     319          35 : GF_Err nmhd_box_dump(GF_Box *a, FILE * trace)
     320             : {
     321          35 :         gf_isom_box_dump_start(a, "MPEGMediaHeaderBox", trace);
     322          35 :         gf_fprintf(trace, ">\n");
     323          35 :         gf_isom_box_dump_done("MPEGMediaHeaderBox", a, trace);
     324          35 :         return GF_OK;
     325             : }
     326             : 
     327         116 : GF_Err stbl_box_dump(GF_Box *a, FILE * trace)
     328             : {
     329         116 :         gf_isom_box_dump_start(a, "SampleTableBox", trace);
     330         116 :         gf_fprintf(trace, ">\n");
     331         116 :         gf_isom_box_dump_done("SampleTableBox", a, trace);
     332         116 :         return GF_OK;
     333             : }
     334             : 
     335         116 : GF_Err dinf_box_dump(GF_Box *a, FILE * trace)
     336             : {
     337         116 :         gf_isom_box_dump_start(a, "DataInformationBox", trace);
     338         116 :         gf_fprintf(trace, ">\n");
     339         116 :         gf_isom_box_dump_done("DataInformationBox", a, trace);
     340         116 :         return GF_OK;
     341             : }
     342             : 
     343         117 : GF_Err url_box_dump(GF_Box *a, FILE * trace)
     344             : {
     345             :         GF_DataEntryURLBox *p;
     346             : 
     347             :         p = (GF_DataEntryURLBox *)a;
     348         117 :         gf_isom_box_dump_start(a, "URLDataEntryBox", trace);
     349         117 :         if (p->location) {
     350           0 :                 gf_fprintf(trace, " URL=\"%s\">\n", p->location);
     351             :         } else {
     352         117 :                 gf_fprintf(trace, ">\n");
     353         117 :                 if (p->size) {
     354         113 :                         if (! (p->flags & 1) ) {
     355           0 :                                 gf_fprintf(trace, "<!--ERROR: No location indicated-->\n");
     356             :                         } else {
     357         113 :                                 gf_fprintf(trace, "<!--Data is contained in the movie file-->\n");
     358             :                         }
     359             :                 }
     360             :         }
     361         117 :         gf_isom_box_dump_done("URLDataEntryBox", a, trace);
     362         117 :         return GF_OK;
     363             : }
     364             : 
     365           2 : GF_Err urn_box_dump(GF_Box *a, FILE * trace)
     366             : {
     367             :         GF_DataEntryURNBox *p;
     368             : 
     369             :         p = (GF_DataEntryURNBox *)a;
     370           2 :         gf_isom_box_dump_start(a, "URNDataEntryBox", trace);
     371           2 :         if (p->nameURN) gf_fprintf(trace, " URN=\"%s\"", p->nameURN);
     372           2 :         if (p->location) gf_fprintf(trace, " URL=\"%s\"", p->location);
     373           2 :         gf_fprintf(trace, ">\n");
     374             : 
     375           2 :         gf_isom_box_dump_done("URNDataEntryBox", a, trace);
     376           2 :         return GF_OK;
     377             : }
     378             : 
     379           2 : GF_Err alis_box_dump(GF_Box *a, FILE * trace)
     380             : {
     381             : //      GF_DataEntryAliasBox *p = (GF_DataEntryAliasBox *)a;
     382           2 :         gf_isom_box_dump_start(a, "AliasDataEntryBox", trace);
     383           2 :         gf_fprintf(trace, ">\n");
     384             : 
     385           2 :         gf_isom_box_dump_done("AliasDataEntryBox", a, trace);
     386           2 :         return GF_OK;
     387             : }
     388             : 
     389           1 : GF_Err cprt_box_dump(GF_Box *a, FILE * trace)
     390             : {
     391             :         GF_CopyrightBox *p;
     392             : 
     393             :         p = (GF_CopyrightBox *)a;
     394           1 :         gf_isom_box_dump_start(a, "CopyrightBox", trace);
     395           1 :         gf_fprintf(trace, "LanguageCode=\"%s\" CopyrightNotice=\"%s\">\n", p->packedLanguageCode, p->notice);
     396           1 :         gf_isom_box_dump_done("CopyrightBox", a, trace);
     397           1 :         return GF_OK;
     398             : }
     399             : 
     400           3 : GF_Err kind_box_dump(GF_Box *a, FILE * trace)
     401             : {
     402             :         GF_KindBox *p;
     403             : 
     404             :         p = (GF_KindBox *)a;
     405           3 :         gf_isom_box_dump_start(a, "KindBox", trace);
     406           3 :         gf_fprintf(trace, "schemeURI=\"%s\" value=\"%s\">\n", p->schemeURI, (p->value ? p->value : ""));
     407           3 :         gf_isom_box_dump_done("KindBox", a, trace);
     408           3 :         return GF_OK;
     409             : }
     410             : 
     411             : 
     412           0 : static char *format_duration(u64 dur, u32 timescale, char *szDur)
     413             : {
     414             :         u32 h, m, s, ms;
     415           0 :         if (!timescale) return NULL;
     416           0 :         dur = (u32) (( ((Double) (s64) dur)/timescale)*1000);
     417           0 :         h = (u32) (dur / 3600000);
     418           0 :         dur -= h*3600000;
     419           0 :         m = (u32) (dur / 60000);
     420           0 :         dur -= m*60000;
     421           0 :         s = (u32) (dur/1000);
     422           0 :         dur -= s*1000;
     423           0 :         ms = (u32) (dur);
     424             : 
     425           0 :         if (h<=24) {
     426             :                 sprintf(szDur, "%02d:%02d:%02d.%03d", h, m, s, ms);
     427             :         } else {
     428           0 :                 u32 d = (u32) (dur / 3600000 / 24);
     429           0 :                 h = (u32) (dur/3600000)-24*d;
     430           0 :                 if (d<=365) {
     431             :                         sprintf(szDur, "%d Days, %02d:%02d:%02d.%03d", d, h, m, s, ms);
     432             :                 } else {
     433             :                         u32 y=0;
     434           0 :                         while (d>365) {
     435           0 :                                 y++;
     436           0 :                                 d-=365;
     437           0 :                                 if (y%4) d--;
     438             :                         }
     439             :                         sprintf(szDur, "%d Years %d Days, %02d:%02d:%02d.%03d", y, d, h, m, s, ms);
     440             :                 }
     441             :         }
     442             :         return szDur;
     443             : }
     444             : 
     445           1 : static void dump_escape_string(FILE * trace, char *name)
     446             : {
     447           1 :         u32 i, len = name ? (u32) strlen(name) : 0;
     448           1 :         for (i=0; i<len; i++) {
     449           0 :                 if (name[i]=='"') gf_fprintf(trace, "&quot;");
     450           0 :                 else gf_fputc(name[i], trace);
     451             :         }
     452           1 : }
     453             : 
     454           1 : GF_Err chpl_box_dump(GF_Box *a, FILE * trace)
     455             : {
     456             :         u32 i, count;
     457             :         GF_ChapterListBox *p = (GF_ChapterListBox *)a;
     458           1 :         gf_isom_box_dump_start(a, "ChapterListBox", trace);
     459           1 :         gf_fprintf(trace, ">\n");
     460             : 
     461           1 :         if (p->size) {
     462           0 :                 count = gf_list_count(p->list);
     463           0 :                 for (i=0; i<count; i++) {
     464             :                         char szDur[20];
     465           0 :                         GF_ChapterEntry *ce = (GF_ChapterEntry *)gf_list_get(p->list, i);
     466           0 :                         gf_fprintf(trace, "<Chapter name=\"");
     467           0 :                         dump_escape_string(trace, ce->name);
     468           0 :                         gf_fprintf(trace, "\" startTime=\"%s\" />\n", format_duration(ce->start_time, 1000*10000, szDur));
     469             :                 }
     470             :         } else {
     471           1 :                 gf_fprintf(trace, "<Chapter name=\"\" startTime=\"\"/>\n");
     472             :         }
     473             : #ifdef GPAC_ENABLE_COVERAGE
     474           1 :         if (gf_sys_is_cov_mode()) {
     475             :                 format_duration(0, 0, NULL);
     476           1 :                 dump_escape_string(NULL, NULL);
     477             :         }
     478             : #endif
     479           1 :         gf_isom_box_dump_done("ChapterListBox", a, trace);
     480           1 :         return GF_OK;
     481             : }
     482             : 
     483           1 : GF_Err pdin_box_dump(GF_Box *a, FILE * trace)
     484             : {
     485             :         u32 i;
     486             :         GF_ProgressiveDownloadBox *p = (GF_ProgressiveDownloadBox *)a;
     487           1 :         gf_isom_box_dump_start(a, "ProgressiveDownloadBox", trace);
     488           1 :         gf_fprintf(trace, ">\n");
     489             : 
     490           1 :         if (p->size) {
     491           0 :                 for (i=0; i<p->count; i++) {
     492           0 :                         gf_fprintf(trace, "<DownloadInfo rate=\"%d\" estimatedTime=\"%d\" />\n", p->rates[i], p->times[i]);
     493             :                 }
     494             :         } else {
     495           1 :                 gf_fprintf(trace, "<DownloadInfo rate=\"\" estimatedTime=\"\" />\n");
     496             :         }
     497           1 :         gf_isom_box_dump_done("ProgressiveDownloadBox", a, trace);
     498           1 :         return GF_OK;
     499             : }
     500             : 
     501         138 : GF_Err hdlr_box_dump(GF_Box *a, FILE * trace)
     502             : {
     503             :         GF_HandlerBox *p = (GF_HandlerBox *)a;
     504         138 :         gf_isom_box_dump_start(a, "HandlerBox", trace);
     505         138 :         if (p->nameUTF8 && (u32) p->nameUTF8[0] == strlen(p->nameUTF8)-1) {
     506           0 :                 gf_fprintf(trace, "hdlrType=\"%s\" Name=\"%s\" ", gf_4cc_to_str(p->handlerType), p->nameUTF8+1);
     507             :         } else {
     508         138 :                 gf_fprintf(trace, "hdlrType=\"%s\" Name=\"%s\" ", gf_4cc_to_str(p->handlerType), p->nameUTF8);
     509             :         }
     510         138 :         gf_fprintf(trace, "reserved1=\"%d\" reserved2=\"", p->reserved1);
     511         138 :         dump_data(trace, (char *) p->reserved2, 12);
     512         138 :         gf_fprintf(trace, "\"");
     513             : 
     514         138 :         gf_fprintf(trace, ">\n");
     515         138 :         gf_isom_box_dump_done("HandlerBox", a, trace);
     516         138 :         return GF_OK;
     517             : }
     518             : 
     519          43 : GF_Err iods_box_dump(GF_Box *a, FILE * trace)
     520             : {
     521             :         GF_ObjectDescriptorBox *p;
     522             : 
     523             :         p = (GF_ObjectDescriptorBox *)a;
     524          43 :         gf_isom_box_dump_start(a, "ObjectDescriptorBox", trace);
     525          43 :         gf_fprintf(trace, ">\n");
     526             : 
     527          43 :         if (p->descriptor) {
     528             : #ifndef GPAC_DISABLE_OD_DUMP
     529          42 :                 gf_odf_dump_desc(p->descriptor, trace, 1, GF_TRUE);
     530             : #else
     531             :                 gf_fprintf(trace, "<!-- Object Descriptor Dumping disabled in this build of GPAC -->\n");
     532             : #endif
     533           1 :         } else if (p->size) {
     534           0 :                 gf_fprintf(trace, "<!--WARNING: Object Descriptor not present-->\n");
     535             :         }
     536          43 :         gf_isom_box_dump_done("ObjectDescriptorBox", a, trace);
     537          43 :         return GF_OK;
     538             : }
     539             : 
     540         116 : GF_Err trak_box_dump(GF_Box *a, FILE * trace)
     541             : {
     542             :         GF_TrackBox *p;
     543             : 
     544             :         p = (GF_TrackBox *)a;
     545         116 :         gf_isom_box_dump_start(a, "TrackBox", trace);
     546         116 :         gf_fprintf(trace, ">\n");
     547         116 :         if (p->size && !p->Header) {
     548           0 :                 gf_fprintf(trace, "<!--INVALID FILE: Missing Track Header-->\n");
     549             :         }
     550         116 :         gf_isom_box_dump_done("TrackBox", a, trace);
     551         116 :         return GF_OK;
     552             : }
     553             : 
     554           7 : GF_Err mp4s_box_dump(GF_Box *a, FILE * trace)
     555             : {
     556             :         GF_MPEGSampleEntryBox *p;
     557             : 
     558             :         p = (GF_MPEGSampleEntryBox *)a;
     559           7 :         gf_isom_box_dump_start(a, "MPEGSystemsSampleDescriptionBox", trace);
     560           7 :         gf_fprintf(trace, "DataReferenceIndex=\"%d\">\n", p->dataReferenceIndex);
     561           7 :         if (!p->esd && p->size) {
     562           0 :                 gf_fprintf(trace, "<!--INVALID MP4 FILE: ESDBox not present in MPEG Sample Description -->\n");
     563             :         }
     564           7 :         gf_isom_box_dump_done("MPEGSystemsSampleDescriptionBox", a, trace);
     565           7 :         return GF_OK;
     566             : }
     567             : 
     568             : 
     569          91 : GF_Err video_sample_entry_box_dump(GF_Box *a, FILE * trace)
     570             : {
     571             :         Bool full_dump=GF_FALSE;
     572             :         GF_MPEGVisualSampleEntryBox *p = (GF_MPEGVisualSampleEntryBox *)a;
     573             :         const char *name;
     574             : 
     575          91 :         switch (p->type) {
     576             :         case GF_ISOM_SUBTYPE_AVC_H264:
     577             :         case GF_ISOM_SUBTYPE_AVC2_H264:
     578             :         case GF_ISOM_SUBTYPE_AVC3_H264:
     579             :         case GF_ISOM_SUBTYPE_AVC4_H264:
     580             :                 name = "AVCSampleEntryBox";
     581             :                 break;
     582           0 :         case GF_ISOM_SUBTYPE_MVC_H264:
     583             :                 name = "MVCSampleEntryBox";
     584           0 :                 break;
     585           0 :         case GF_ISOM_SUBTYPE_SVC_H264:
     586             :                 name = "SVCSampleEntryBox";
     587           0 :                 break;
     588           4 :         case GF_ISOM_SUBTYPE_HVC1:
     589             :         case GF_ISOM_SUBTYPE_HEV1:
     590             :         case GF_ISOM_SUBTYPE_HVC2:
     591             :         case GF_ISOM_SUBTYPE_HEV2:
     592             :                 name = "HEVCSampleEntryBox";
     593           4 :                 break;
     594           0 :         case GF_ISOM_SUBTYPE_VVC1:
     595             :         case GF_ISOM_SUBTYPE_VVI1:
     596             :                 name = "VVCSampleEntryBox";
     597           0 :                 break;
     598           0 :         case GF_ISOM_SUBTYPE_LHV1:
     599             :         case GF_ISOM_SUBTYPE_LHE1:
     600             :                 name = "LHEVCSampleEntryBox";
     601           0 :                 break;
     602           8 :         case GF_ISOM_SUBTYPE_AV01:
     603             :                 name = "AV1SampleEntryBox";
     604           8 :                 break;
     605           1 :         case GF_ISOM_SUBTYPE_3GP_H263:
     606             :                 name = "H263SampleDescriptionBox";
     607           1 :                 break;
     608           2 :         case GF_ISOM_SUBTYPE_MJP2:
     609             :                 name = "MJ2KSampleDescriptionBox";
     610           2 :                 break;
     611           0 :         case GF_QT_SUBTYPE_APCH:
     612             :         case GF_QT_SUBTYPE_APCO:
     613             :         case GF_QT_SUBTYPE_APCN:
     614             :         case GF_QT_SUBTYPE_APCS:
     615             :         case GF_QT_SUBTYPE_AP4X:
     616             :         case GF_QT_SUBTYPE_AP4H:
     617             :                 name = "ProResSampleEntryBox";
     618             :                 full_dump=GF_TRUE;
     619           0 :                 break;
     620           0 :         case GF_QT_SUBTYPE_RAW:
     621             :                 name = "RGBSampleEntryBox";
     622             :                 full_dump=GF_TRUE;
     623           0 :                 break;
     624           0 :         case GF_QT_SUBTYPE_YUYV:
     625             :                 name = "YUV422SampleEntryBox";
     626             :                 full_dump=GF_TRUE;
     627           0 :                 break;
     628           0 :         case GF_QT_SUBTYPE_UYVY:
     629             :                 name = "YUV422SampleEntryBox";
     630             :                 full_dump=GF_TRUE;
     631           0 :                 break;
     632           0 :         case GF_QT_SUBTYPE_YUV420:
     633             :                 name = "YUV420SampleEntryBox";
     634             :                 full_dump=GF_TRUE;
     635           0 :                 break;
     636           0 :         case GF_QT_SUBTYPE_YUV422_10:
     637             :                 name = "YUV422_10_SampleEntryBox";
     638             :                 full_dump=GF_TRUE;
     639           0 :                 break;
     640           0 :         case GF_QT_SUBTYPE_YUV444:
     641             :                 name = "YUV444SampleEntryBox";
     642             :                 full_dump=GF_TRUE;
     643           0 :                 break;
     644           0 :         case GF_QT_SUBTYPE_YUV444_10:
     645             :                 name = "YUV444_10_SampleEntryBox";
     646             :                 full_dump=GF_TRUE;
     647           0 :                 break;
     648           0 :         case GF_QT_SUBTYPE_RAW_VID:
     649             :                 name = "RGB_SampleEntryBox";
     650             :                 full_dump=GF_TRUE;
     651           0 :                 break;
     652           0 :         case GF_QT_SUBTYPE_YUVA444:
     653             :                 name = "YUVA_SampleEntryBox";
     654             :                 full_dump=GF_TRUE;
     655           0 :                 break;
     656           0 :         case GF_QT_SUBTYPE_YUV422_16:
     657             :                 name = "YUV420_16_SampleEntryBox";
     658             :                 full_dump=GF_TRUE;
     659           0 :                 break;
     660           0 :         case GF_QT_SUBTYPE_I420:
     661             :                 name = "I420_SampleEntryBox";
     662             :                 full_dump=GF_TRUE;
     663           0 :                 break;
     664           0 :         case GF_QT_SUBTYPE_IYUV:
     665             :                 name = "IUYV_SampleEntryBox";
     666             :                 full_dump=GF_TRUE;
     667           0 :                 break;
     668           0 :         case GF_QT_SUBTYPE_YV12:
     669             :                 name = "YV12_SampleEntryBox";
     670             :                 full_dump=GF_TRUE;
     671           0 :                 break;
     672           0 :         case GF_QT_SUBTYPE_YVYU:
     673             :                 name = "YVYU_SampleEntryBox";
     674             :                 full_dump=GF_TRUE;
     675           0 :                 break;
     676           0 :         case GF_QT_SUBTYPE_RGBA:
     677             :                 name = "RGBA_SampleEntryBox";
     678             :                 full_dump=GF_TRUE;
     679           0 :                 break;
     680           0 :         case GF_QT_SUBTYPE_ABGR:
     681             :                 name = "ABGR_SampleEntryBox";
     682             :                 full_dump=GF_TRUE;
     683           0 :                 break;
     684             : 
     685          66 :         default:
     686             :                 //DO NOT TOUCH FOR NOW, this breaks all hashes
     687             :                 name = "MPEGVisualSampleDescriptionBox";
     688          66 :                 break;
     689             :         }
     690             : 
     691             : 
     692          91 :         gf_isom_box_dump_start(a, name, trace);
     693             : 
     694          91 :         gf_fprintf(trace, " DataReferenceIndex=\"%d\" Width=\"%d\" Height=\"%d\"", p->dataReferenceIndex, p->Width, p->Height);
     695             : 
     696          91 :         if (full_dump) {
     697             :                 Float dpih, dpiv;
     698           0 :                 gf_fprintf(trace, " Version=\"%d\" Revision=\"%d\" Vendor=\"%s\" TemporalQuality=\"%d\" SpatialQuality=\"%d\" FramesPerSample=\"%d\" ColorTableIndex=\"%d\"",
     699           0 :                         p->version, p->revision, gf_4cc_to_str(p->vendor), p->temporal_quality, p->spatial_quality, p->frames_per_sample, p->color_table_index);
     700             : 
     701           0 :                 dpih = (Float) (p->horiz_res&0xFFFF);
     702           0 :                 dpih /= 0xFFFF;
     703           0 :                 dpih += (p->vert_res>>16);
     704           0 :                 dpiv = (Float) (p->vert_res&0xFFFF);
     705           0 :                 dpiv /= 0xFFFF;
     706           0 :                 dpiv += (p->vert_res>>16);
     707             : 
     708           0 :                 gf_fprintf(trace, " XDPI=\"%g\" YDPI=\"%g\" BitDepth=\"%d\"", dpih, dpiv, p->bit_depth);
     709             :         } else {
     710             :                 //dump reserved info
     711          91 :                 gf_fprintf(trace, " XDPI=\"%d\" YDPI=\"%d\" BitDepth=\"%d\"", p->horiz_res, p->vert_res, p->bit_depth);
     712             :         }
     713          91 :         if (strlen((const char*)p->compressor_name) ) {
     714           7 :                 if (isalnum(p->compressor_name[0])) {
     715           0 :                         gf_fprintf(trace, " CompressorName=\"%s\"\n", p->compressor_name);
     716             :                 } else {
     717           7 :                         gf_fprintf(trace, " CompressorName=\"%s\"\n", p->compressor_name+1);
     718             :                 }
     719             :         }
     720             : 
     721          91 :         gf_fprintf(trace, ">\n");
     722          91 :         gf_isom_box_dump_done(name, a, trace);
     723          91 :         return GF_OK;
     724             : }
     725             : 
     726             : 
     727          79 : void base_audio_entry_dump(GF_AudioSampleEntryBox *p, FILE * trace)
     728             : {
     729          79 :         gf_fprintf(trace, " DataReferenceIndex=\"%d\"", p->dataReferenceIndex);
     730          79 :         if (p->version)
     731           2 :                 gf_fprintf(trace, " Version=\"%d\"", p->version);
     732             : 
     733          79 :         if (p->samplerate_lo) {
     734           1 :                 if (p->type==GF_ISOM_SUBTYPE_MLPA) {
     735           1 :                         u32 sr = p->samplerate_hi;
     736           1 :                         sr <<= 16;
     737           1 :                         sr |= p->samplerate_lo;
     738           1 :                         gf_fprintf(trace, " SampleRate=\"%d\"", sr);
     739             :                 } else {
     740           0 :                         gf_fprintf(trace, " SampleRate=\"%d.%d\"", p->samplerate_hi, p->samplerate_lo);
     741             :                 }
     742             :         } else {
     743          78 :                 gf_fprintf(trace, " SampleRate=\"%d\"", p->samplerate_hi);
     744             :         }
     745          79 :         gf_fprintf(trace, " Channels=\"%d\" BitsPerSample=\"%d\"", p->channel_count, p->bitspersample);
     746          79 :         if (p->qtff_mode) {
     747           1 :                 gf_fprintf(trace, " isQTFF=\"%d\"", p->qtff_mode);
     748           1 :                 gf_fprintf(trace, " qtRevisionLevel=\"%d\"", p->revision);
     749           1 :                 gf_fprintf(trace, " qtVendor=\"%d\"", p->vendor);
     750           1 :                 gf_fprintf(trace, " qtCompressionId=\"%d\"", p->compression_id);
     751           1 :                 gf_fprintf(trace, " qtPacketSize=\"%d\"", p->packet_size);
     752           1 :                 if (p->version == 1) {
     753           1 :                         gf_fprintf(trace, " qtSamplesPerPacket=\"%d\"", p->extensions[0]<<24 | p->extensions[1]<<16 | p->extensions[2]<<8 | p->extensions[3]);
     754           1 :                         gf_fprintf(trace, " qtBytesPerPacket=\"%d\"", p->extensions[4]<<24 | p->extensions[5]<<16 | p->extensions[6]<<8 | p->extensions[7]);
     755           1 :                         gf_fprintf(trace, " qtBytesPerFrame=\"%d\"", p->extensions[8]<<24 | p->extensions[9]<<16 | p->extensions[10]<<8 | p->extensions[11]);
     756           1 :                         gf_fprintf(trace, " qtBytesPerSample=\"%d\"", p->extensions[12]<<24 | p->extensions[13]<<16 | p->extensions[14]<<8 | p->extensions[15]);
     757             :                 }
     758             :         }
     759          79 : }
     760             : 
     761          79 : GF_Err audio_sample_entry_box_dump(GF_Box *a, FILE * trace)
     762             : {
     763             :         char *szName;
     764             :         const char *error=NULL;
     765             :         GF_MPEGAudioSampleEntryBox *p = (GF_MPEGAudioSampleEntryBox *)a;
     766             : 
     767          79 :         switch (p->type) {
     768           1 :         case GF_ISOM_SUBTYPE_3GP_AMR:
     769             :                 szName = "AMRSampleDescriptionBox";
     770           1 :                 if (!p->cfg_3gpp)
     771             :                         error = "<!-- INVALID 3GPP FILE: Config not present in Sample Description-->";
     772             :                 break;
     773           1 :         case GF_ISOM_SUBTYPE_3GP_AMR_WB:
     774             :                 szName = "AMR_WB_SampleDescriptionBox";
     775           1 :                 if (!p->cfg_3gpp)
     776             :                         error = "<!-- INVALID 3GPP FILE: Config not present in Sample Description-->";
     777             :                 break;
     778           1 :         case GF_ISOM_SUBTYPE_3GP_EVRC:
     779             :                 szName = "EVRCSampleDescriptionBox";
     780           1 :                 if (!p->cfg_3gpp)
     781             :                         error = "<!-- INVALID 3GPP FILE: Config not present in Sample Description-->";
     782             :                 break;
     783           1 :         case GF_ISOM_SUBTYPE_3GP_QCELP:
     784             :                 szName = "QCELPSampleDescriptionBox";
     785           1 :                 if (!p->cfg_3gpp)
     786             :                         error = "<!-- INVALID 3GPP Entry: Config not present in Audio Sample Description-->";
     787             :                 break;
     788           0 :         case GF_ISOM_SUBTYPE_3GP_SMV:
     789             :                 szName = "SMVSampleDescriptionBox";
     790           0 :                 if (!p->cfg_3gpp)
     791             :                         error = "<!-- INVALID 3GPP Entry: Config not present in Audio Sample Description-->";
     792             :                 break;
     793          60 :         case GF_ISOM_BOX_TYPE_MP4A:
     794             :                 szName = "MPEGAudioSampleDescriptionBox";
     795          60 :                 if (!p->esd)
     796             :                         error = "<!--INVALID MP4 Entry: ESDBox not present in Audio Sample Description -->";
     797             :                 break;
     798           2 :         case GF_ISOM_BOX_TYPE_AC3:
     799             :                 szName = "AC3SampleEntryBox";
     800           2 :                 if (!p->cfg_ac3)
     801             :                         error = "<!--INVALID AC3 Entry: AC3Config not present in Audio Sample Description -->";
     802             :                 break;
     803           1 :         case GF_ISOM_BOX_TYPE_EC3:
     804             :                 szName = "EC3SampleEntryBox";
     805           1 :                 if (!p->cfg_ac3)
     806             :                         error = "<!--INVALID EC3 Entry: AC3Config not present in Audio Sample Description -->";
     807             :                 break;
     808           0 :         case GF_ISOM_BOX_TYPE_MHA1:
     809             :         case GF_ISOM_BOX_TYPE_MHA2:
     810           0 :                 if (!p->cfg_mha)
     811             :                         error = "<!--INVALID MPEG-H 3D Audio Entry: MHA config not present in Audio Sample Description -->";
     812             :         case GF_ISOM_BOX_TYPE_MHM1:
     813             :         case GF_ISOM_BOX_TYPE_MHM2:
     814             :                 szName = "MHASampleEntry";
     815             :                 break;
     816           1 :         case GF_ISOM_BOX_TYPE_MLPA:
     817           1 :                 if (!p->cfg_mlp)
     818             :                         error = "<!--INVALID TrueHD Audio Entry: DMLP config not present in Audio Sample Description -->";
     819             :                 szName = "TrueHDSampleEntry";
     820             :                 break;
     821             :         default:
     822             :                 szName = "AudioSampleDescriptionBox";
     823             :                 break;
     824             :         }
     825             : 
     826          79 :         gf_isom_box_dump_start(a, szName, trace);
     827          79 :         base_audio_entry_dump((GF_AudioSampleEntryBox *)p, trace);
     828          79 :         gf_fprintf(trace, ">\n");
     829             : 
     830          79 :         if (error) {
     831          35 :                 gf_fprintf(trace, "%s\n", error);
     832             :         }
     833          79 :         gf_isom_box_dump_done(szName, a, trace);
     834          79 :         return GF_OK;
     835             : }
     836             : 
     837           1 : GF_Err gen_sample_entry_box_dump(GF_Box *a, FILE * trace)
     838             : {
     839             :         char *szName;
     840             :         GF_SampleEntryBox *p = (GF_SampleEntryBox *)a;
     841             : 
     842           1 :         switch (p->type) {
     843             :         case GF_QT_SUBTYPE_C608:
     844             :                 szName = "ClosedCaption";
     845             :                 break;
     846           0 :         default:
     847             :                 szName = "GenericSampleDescriptionBox";
     848           0 :                 break;
     849             :         }
     850             : 
     851           1 :         gf_isom_box_dump_start(a, szName, trace);
     852           1 :         gf_fprintf(trace, ">\n");
     853           1 :         gf_isom_box_dump_done(szName, a, trace);
     854           1 :         return GF_OK;
     855             : }
     856             : 
     857           1 : GF_Err gnrm_box_dump(GF_Box *a, FILE * trace)
     858             : {
     859             :         GF_GenericSampleEntryBox *p = (GF_GenericSampleEntryBox *)a;
     860           1 :         if (p->EntryType)
     861           0 :                 a->type = p->EntryType;
     862             : 
     863           1 :         gf_isom_box_dump_start(a, "SampleDescriptionEntryBox", trace);
     864           1 :         gf_fprintf(trace, "DataReferenceIndex=\"%d\" ExtensionDataSize=\"%d\">\n", p->dataReferenceIndex, p->data_size);
     865           1 :         a->type = GF_ISOM_BOX_TYPE_GNRM;
     866           1 :         gf_isom_box_dump_done("SampleDescriptionEntryBox", a, trace);
     867           1 :         return GF_OK;
     868             : }
     869             : 
     870           1 : GF_Err gnrv_box_dump(GF_Box *a, FILE * trace)
     871             : {
     872             :         GF_GenericVisualSampleEntryBox *p = (GF_GenericVisualSampleEntryBox *)a;
     873           1 :         if (p->EntryType)
     874           0 :                 a->type = p->EntryType;
     875             : 
     876           1 :         gf_isom_box_dump_start(a, "VisualSampleDescriptionBox", trace);
     877           7 :         gf_fprintf(trace, "DataReferenceIndex=\"%d\" Version=\"%d\" Revision=\"%d\" Vendor=\"%d\" TemporalQuality=\"%d\" SpacialQuality=\"%d\" Width=\"%d\" Height=\"%d\" HorizontalResolution=\"%d\" VerticalResolution=\"%d\" CompressorName=\"%s\" BitDepth=\"%d\">\n",
     878           7 :                 p->dataReferenceIndex, p->version, p->revision, p->vendor, p->temporal_quality, p->spatial_quality, p->Width, p->Height, p->horiz_res, p->vert_res, isalnum(p->compressor_name[0]) ? p->compressor_name : p->compressor_name+1, p->bit_depth);
     879           1 :         a->type = GF_ISOM_BOX_TYPE_GNRV;
     880           1 :         gf_isom_box_dump_done("VisualSampleDescriptionBox", a, trace);
     881           1 :         return GF_OK;
     882             : }
     883             : 
     884           1 : GF_Err gnra_box_dump(GF_Box *a, FILE * trace)
     885             : {
     886             :         GF_GenericAudioSampleEntryBox *p = (GF_GenericAudioSampleEntryBox *)a;
     887           1 :         if (p->EntryType)
     888           0 :                 a->type = p->EntryType;
     889             : 
     890           1 :         gf_isom_box_dump_start(a, "AudioSampleDescriptionBox", trace);
     891           6 :         gf_fprintf(trace, "DataReferenceIndex=\"%d\" Version=\"%d\" Revision=\"%d\" Vendor=\"%d\" ChannelCount=\"%d\" BitsPerSample=\"%d\" Samplerate=\"%d\">\n",
     892           6 :                 p->dataReferenceIndex, p->version, p->revision, p->vendor, p->channel_count, p->bitspersample, p->samplerate_hi);
     893           1 :         a->type = GF_ISOM_BOX_TYPE_GNRA;
     894           1 :         gf_isom_box_dump_done("AudioSampleDescriptionBox", a, trace);
     895           1 :         return GF_OK;
     896             : }
     897             : 
     898          16 : GF_Err edts_box_dump(GF_Box *a, FILE * trace)
     899             : {
     900          16 :         gf_isom_box_dump_start(a, "EditBox", trace);
     901          16 :         gf_fprintf(trace, ">\n");
     902          16 :         gf_isom_box_dump_done("EditBox", a, trace);
     903          16 :         return GF_OK;
     904             : }
     905             : 
     906           4 : GF_Err udta_box_dump(GF_Box *a, FILE * trace)
     907             : {
     908             :         GF_UserDataBox *p;
     909             :         GF_UserDataMap *map;
     910             :         u32 i;
     911             : 
     912             :         p = (GF_UserDataBox *)a;
     913           4 :         gf_isom_box_dump_start(a, "UserDataBox", trace);
     914           4 :         gf_fprintf(trace, ">\n");
     915             : 
     916           4 :         i=0;
     917          11 :         while ((map = (GF_UserDataMap *)gf_list_enum(p->recordList, &i))) {
     918           3 :                 gf_isom_box_array_dump(map->boxes, trace);
     919             :         }
     920           4 :         gf_isom_box_dump_done("UserDataBox", a, trace);
     921           4 :         return GF_OK;
     922             : }
     923             : 
     924         116 : GF_Err dref_box_dump(GF_Box *a, FILE * trace)
     925             : {
     926             : //      GF_DataReferenceBox *p = (GF_DataReferenceBox *)a;
     927         116 :         gf_isom_box_dump_start(a, "DataReferenceBox", trace);
     928         116 :         gf_fprintf(trace, ">\n");
     929         116 :         gf_isom_box_dump_done("DataReferenceBox", a, trace);
     930         116 :         return GF_OK;
     931             : }
     932             : 
     933         116 : GF_Err stsd_box_dump(GF_Box *a, FILE * trace)
     934             : {
     935             :         GF_SampleDescriptionBox *p = (GF_SampleDescriptionBox *)a;
     936         116 :         gf_isom_box_dump_start(a, "SampleDescriptionBox", trace);
     937         116 :         if (p->version)
     938           1 :                 gf_fprintf(trace, " version=\"%d\"", p->version);
     939         116 :         gf_fprintf(trace, ">\n");
     940         116 :         gf_isom_box_dump_done("SampleDescriptionBox", a, trace);
     941         116 :         return GF_OK;
     942             : }
     943             : 
     944         116 : GF_Err stts_box_dump(GF_Box *a, FILE * trace)
     945             : {
     946             :         GF_TimeToSampleBox *p;
     947             :         u32 i, nb_samples;
     948             : 
     949         116 :         if (dump_skip_samples)
     950             :                 return GF_OK;
     951             : 
     952             :         p = (GF_TimeToSampleBox *)a;
     953         116 :         gf_isom_box_dump_start(a, "TimeToSampleBox", trace);
     954         116 :         gf_fprintf(trace, "EntryCount=\"%d\">\n", p->nb_entries);
     955             : 
     956             :         nb_samples = 0;
     957        2371 :         for (i=0; i<p->nb_entries; i++) {
     958        2255 :                 gf_fprintf(trace, "<TimeToSampleEntry SampleDelta=\"%d\" SampleCount=\"%d\"/>\n", p->entries[i].sampleDelta, p->entries[i].sampleCount);
     959        2255 :                 nb_samples += p->entries[i].sampleCount;
     960             :         }
     961         116 :         if (p->size)
     962         115 :                 gf_fprintf(trace, "<!-- counted %d samples in STTS entries -->\n", nb_samples);
     963             :         else
     964           1 :                 gf_fprintf(trace, "<TimeToSampleEntry SampleDelta=\"\" SampleCount=\"\"/>\n");
     965             : 
     966         116 :         gf_isom_box_dump_done("TimeToSampleBox", a, trace);
     967         116 :         return GF_OK;
     968             : }
     969             : 
     970          17 : GF_Err ctts_box_dump(GF_Box *a, FILE * trace)
     971             : {
     972             :         GF_CompositionOffsetBox *p;
     973             :         u32 i, nb_samples;
     974             :         p = (GF_CompositionOffsetBox *)a;
     975             : 
     976          17 :         if (dump_skip_samples)
     977             :                 return GF_OK;
     978             : 
     979          17 :         gf_isom_box_dump_start(a, "CompositionOffsetBox", trace);
     980          17 :         gf_fprintf(trace, "EntryCount=\"%d\">\n", p->nb_entries);
     981             : 
     982             :         nb_samples = 0;
     983        3811 :         for (i=0; i<p->nb_entries; i++) {
     984        3794 :                 gf_fprintf(trace, "<CompositionOffsetEntry CompositionOffset=\"%d\" SampleCount=\"%d\"/>\n", p->entries[i].decodingOffset, p->entries[i].sampleCount);
     985        3794 :                 nb_samples += p->entries[i].sampleCount;
     986             :         }
     987          17 :         if (p->size)
     988          15 :                 gf_fprintf(trace, "<!-- counted %d samples in CTTS entries -->\n", nb_samples);
     989             :         else
     990           2 :                 gf_fprintf(trace, "<CompositionOffsetEntry CompositionOffset=\"\" SampleCount=\"\"/>\n");
     991             : 
     992          17 :         gf_isom_box_dump_done("CompositionOffsetBox", a, trace);
     993          17 :         return GF_OK;
     994             : }
     995             : 
     996           2 : GF_Err cslg_box_dump(GF_Box *a, FILE * trace)
     997             : {
     998             :         GF_CompositionToDecodeBox *p;
     999             : 
    1000             :         p = (GF_CompositionToDecodeBox *)a;
    1001           2 :         gf_isom_box_dump_start(a, "CompositionToDecodeBox", trace);
    1002           2 :         gf_fprintf(trace, "compositionToDTSShift=\"%d\" leastDecodeToDisplayDelta=\"%d\" greatestDecodeToDisplayDelta=\"%d\" compositionStartTime=\"%d\" compositionEndTime=\"%d\">\n", p->compositionToDTSShift, p->leastDecodeToDisplayDelta, p->greatestDecodeToDisplayDelta, p->compositionStartTime, p->compositionEndTime);
    1003           2 :         gf_isom_box_dump_done("CompositionToDecodeBox", a, trace);
    1004           2 :         return GF_OK;
    1005             : }
    1006             : 
    1007           1 : GF_Err ccst_box_dump(GF_Box *a, FILE * trace)
    1008             : {
    1009             :         GF_CodingConstraintsBox *p = (GF_CodingConstraintsBox *)a;
    1010           1 :         gf_isom_box_dump_start(a, "CodingConstraintsBox", trace);
    1011           1 :         gf_fprintf(trace, "all_ref_pics_intra=\"%d\" intra_pred_used=\"%d\" max_ref_per_pic=\"%d\" reserved=\"%d\">\n", p->all_ref_pics_intra, p->intra_pred_used, p->max_ref_per_pic, p->reserved);
    1012           1 :         gf_isom_box_dump_done("CodingConstraintsBox", a, trace);
    1013           1 :         return GF_OK;
    1014             : }
    1015             : 
    1016           1 : GF_Err stsh_box_dump(GF_Box *a, FILE * trace)
    1017             : {
    1018             :         GF_ShadowSyncBox *p;
    1019             :         u32 i;
    1020             :         GF_StshEntry *t;
    1021             : 
    1022             :         p = (GF_ShadowSyncBox *)a;
    1023           1 :         gf_isom_box_dump_start(a, "SyncShadowBox", trace);
    1024           1 :         gf_fprintf(trace, "EntryCount=\"%d\">\n", gf_list_count(p->entries));
    1025           1 :         i=0;
    1026           2 :         while ((t = (GF_StshEntry *)gf_list_enum(p->entries, &i))) {
    1027           0 :                 gf_fprintf(trace, "<SyncShadowEntry ShadowedSample=\"%d\" SyncSample=\"%d\"/>\n", t->shadowedSampleNumber, t->syncSampleNumber);
    1028             :         }
    1029           1 :         if (!p->size) {
    1030           1 :                 gf_fprintf(trace, "<SyncShadowEntry ShadowedSample=\"\" SyncSample=\"\"/>\n");
    1031             :         }
    1032           1 :         gf_isom_box_dump_done("SyncShadowBox", a, trace);
    1033           1 :         return GF_OK;
    1034             : }
    1035             : 
    1036          17 : GF_Err elst_box_dump(GF_Box *a, FILE * trace)
    1037             : {
    1038             :         GF_EditListBox *p;
    1039             :         u32 i;
    1040             :         GF_EdtsEntry *t;
    1041             : 
    1042             :         p = (GF_EditListBox *)a;
    1043          17 :         gf_isom_box_dump_start(a, "EditListBox", trace);
    1044          17 :         gf_fprintf(trace, "EntryCount=\"%d\">\n", gf_list_count(p->entryList));
    1045             : 
    1046          17 :         i=0;
    1047          49 :         while ((t = (GF_EdtsEntry *)gf_list_enum(p->entryList, &i))) {
    1048          15 :                 u32 rate_int = t->mediaRate>>16;
    1049          15 :                 u32 rate_frac = t->mediaRate&0xFFFF;
    1050          15 :                 if (rate_frac)
    1051           0 :                         gf_fprintf(trace, "<EditListEntry Duration=\""LLD"\" MediaTime=\""LLD"\" MediaRate=\"%u.%u\"/>\n", t->segmentDuration, t->mediaTime, rate_int, rate_frac*100/0xFFFF);
    1052             :                 else
    1053          15 :                         gf_fprintf(trace, "<EditListEntry Duration=\""LLD"\" MediaTime=\""LLD"\" MediaRate=\"%u\"/>\n", t->segmentDuration, t->mediaTime, rate_int);
    1054             :         }
    1055          17 :         if (!p->size) {
    1056           2 :                 gf_fprintf(trace, "<EditListEntry Duration=\"\" MediaTime=\"\" MediaRate=\"\"/>\n");
    1057             :         }
    1058          17 :         gf_isom_box_dump_done("EditListBox", a, trace);
    1059          17 :         return GF_OK;
    1060             : }
    1061             : 
    1062         116 : GF_Err stsc_box_dump(GF_Box *a, FILE * trace)
    1063             : {
    1064             :         GF_SampleToChunkBox *p;
    1065             :         u32 i, nb_samples;
    1066             : 
    1067         116 :         if (dump_skip_samples)
    1068             :                 return GF_OK;
    1069             : 
    1070             :         p = (GF_SampleToChunkBox *)a;
    1071         116 :         gf_isom_box_dump_start(a, "SampleToChunkBox", trace);
    1072         116 :         gf_fprintf(trace, "EntryCount=\"%d\">\n", p->nb_entries);
    1073             : 
    1074             :         nb_samples = 0;
    1075         598 :         for (i=0; i<p->nb_entries; i++) {
    1076         366 :                 gf_fprintf(trace, "<SampleToChunkEntry FirstChunk=\"%d\" SamplesPerChunk=\"%d\" SampleDescriptionIndex=\"%d\"/>\n", p->entries[i].firstChunk, p->entries[i].samplesPerChunk, p->entries[i].sampleDescriptionIndex);
    1077         366 :                 if (i+1<p->nb_entries) {
    1078         256 :                         nb_samples += (p->entries[i+1].firstChunk - p->entries[i].firstChunk) * p->entries[i].samplesPerChunk;
    1079             :                 } else {
    1080         110 :                         nb_samples += p->entries[i].samplesPerChunk;
    1081             :                 }
    1082             :         }
    1083         116 :         if (p->size)
    1084         115 :                 gf_fprintf(trace, "<!-- counted %d samples in STSC entries (could be less than sample count) -->\n", nb_samples);
    1085             :         else
    1086           1 :                 gf_fprintf(trace, "<SampleToChunkEntry FirstChunk=\"\" SamplesPerChunk=\"\" SampleDescriptionIndex=\"\"/>\n");
    1087             : 
    1088         116 :         gf_isom_box_dump_done("SampleToChunkBox", a, trace);
    1089         116 :         return GF_OK;
    1090             : }
    1091             : 
    1092         117 : GF_Err stsz_box_dump(GF_Box *a, FILE * trace)
    1093             : {
    1094             :         GF_SampleSizeBox *p;
    1095             :         u32 i;
    1096             :         p = (GF_SampleSizeBox *)a;
    1097         117 :         if (dump_skip_samples)
    1098             :                 return GF_OK;
    1099             : 
    1100         117 :         if (a->type == GF_ISOM_BOX_TYPE_STSZ) {
    1101         115 :                 gf_isom_box_dump_start(a, "SampleSizeBox", trace);
    1102             :         }
    1103             :         else {
    1104           2 :                 gf_isom_box_dump_start(a, "CompactSampleSizeBox", trace);
    1105             :         }
    1106             : 
    1107         117 :         gf_fprintf(trace, "SampleCount=\"%d\"",  p->sampleCount);
    1108         117 :         if (a->type == GF_ISOM_BOX_TYPE_STSZ) {
    1109         115 :                 if (p->sampleSize) {
    1110          29 :                         gf_fprintf(trace, " ConstantSampleSize=\"%d\"", p->sampleSize);
    1111             :                 }
    1112             :         } else {
    1113           2 :                 gf_fprintf(trace, " SampleSizeBits=\"%d\"", p->sampleSize);
    1114             :         }
    1115         117 :         gf_fprintf(trace, ">\n");
    1116             : 
    1117         117 :         if ((a->type != GF_ISOM_BOX_TYPE_STSZ) || !p->sampleSize) {
    1118          88 :                 if (!p->sizes && p->size) {
    1119           5 :                         gf_fprintf(trace, "<!--WARNING: No Sample Size indications-->\n");
    1120          83 :                 } else if (p->sizes) {
    1121       90596 :                         for (i=0; i<p->sampleCount; i++) {
    1122       90596 :                                 gf_fprintf(trace, "<SampleSizeEntry Size=\"%d\"/>\n", p->sizes[i]);
    1123             :                         }
    1124             :                 }
    1125             :         }
    1126         117 :         if (!p->size) {
    1127           2 :                 gf_fprintf(trace, "<SampleSizeEntry Size=\"\"/>\n");
    1128             :         }
    1129         117 :         gf_isom_box_dump_done((a->type == GF_ISOM_BOX_TYPE_STSZ) ? "SampleSizeBox" : "CompactSampleSizeBox", a, trace);
    1130         117 :         return GF_OK;
    1131             : }
    1132             : 
    1133         116 : GF_Err stco_box_dump(GF_Box *a, FILE * trace)
    1134             : {
    1135             :         GF_ChunkOffsetBox *p;
    1136             :         u32 i;
    1137             : 
    1138         116 :         if (dump_skip_samples)
    1139             :                 return GF_OK;
    1140             : 
    1141             :         p = (GF_ChunkOffsetBox *)a;
    1142         116 :         gf_isom_box_dump_start(a, "ChunkOffsetBox", trace);
    1143         116 :         gf_fprintf(trace, "EntryCount=\"%d\">\n", p->nb_entries);
    1144             : 
    1145         116 :         if (!p->offsets && p->size) {
    1146           5 :                 gf_fprintf(trace, "<!--Warning: No Chunk Offsets indications-->\n");
    1147         111 :         } else if (p->offsets) {
    1148        8798 :                 for (i=0; i<p->nb_entries; i++) {
    1149        8798 :                         gf_fprintf(trace, "<ChunkEntry offset=\"%u\"/>\n", p->offsets[i]);
    1150             :                 }
    1151             :         }
    1152         116 :         if (!p->size) {
    1153           1 :                 gf_fprintf(trace, "<ChunkEntry offset=\"\"/>\n");
    1154             :         }
    1155         116 :         gf_isom_box_dump_done("ChunkOffsetBox", a, trace);
    1156         116 :         return GF_OK;
    1157             : }
    1158             : 
    1159          38 : GF_Err stss_box_dump(GF_Box *a, FILE * trace)
    1160             : {
    1161             :         GF_SyncSampleBox *p;
    1162             :         u32 i;
    1163             : 
    1164          38 :         if (dump_skip_samples)
    1165             :                 return GF_OK;
    1166             : 
    1167             :         p = (GF_SyncSampleBox *)a;
    1168          38 :         gf_isom_box_dump_start(a, "SyncSampleBox", trace);
    1169          38 :         gf_fprintf(trace, "EntryCount=\"%d\">\n", p->nb_entries);
    1170             : 
    1171          38 :         if (!p->sampleNumbers && p->size) {
    1172           0 :                 gf_fprintf(trace, "<!--Warning: No Key Frames indications-->\n");
    1173          38 :         } else if (p->sampleNumbers) {
    1174        1252 :                 for (i=0; i<p->nb_entries; i++) {
    1175        1252 :                         gf_fprintf(trace, "<SyncSampleEntry sampleNumber=\"%u\"/>\n", p->sampleNumbers[i]);
    1176             :                 }
    1177             :         }
    1178          38 :         if (!p->size) {
    1179           1 :                         gf_fprintf(trace, "<SyncSampleEntry sampleNumber=\"\"/>\n");
    1180             :         }
    1181          38 :         gf_isom_box_dump_done("SyncSampleBox", a, trace);
    1182          38 :         return GF_OK;
    1183             : }
    1184             : 
    1185           1 : GF_Err stdp_box_dump(GF_Box *a, FILE * trace)
    1186             : {
    1187             :         GF_DegradationPriorityBox *p;
    1188             :         u32 i;
    1189             : 
    1190           1 :         if (dump_skip_samples)
    1191             :                 return GF_OK;
    1192             : 
    1193             :         p = (GF_DegradationPriorityBox *)a;
    1194           1 :         gf_isom_box_dump_start(a, "DegradationPriorityBox", trace);
    1195           1 :         gf_fprintf(trace, "EntryCount=\"%d\">\n", p->nb_entries);
    1196             : 
    1197           1 :         if (!p->priorities && p->size) {
    1198           0 :                 gf_fprintf(trace, "<!--Warning: No Degradation Priority indications-->\n");
    1199           1 :         } else if (p->priorities) {
    1200           0 :                 for (i=0; i<p->nb_entries; i++) {
    1201           0 :                         gf_fprintf(trace, "<DegradationPriorityEntry DegradationPriority=\"%d\"/>\n", p->priorities[i]);
    1202             :                 }
    1203             :         }
    1204           1 :         if (!p->size) {
    1205           1 :                 gf_fprintf(trace, "<DegradationPriorityEntry DegradationPriority=\"\"/>\n");
    1206             :         }
    1207           1 :         gf_isom_box_dump_done("DegradationPriorityBox", a, trace);
    1208           1 :         return GF_OK;
    1209             : }
    1210             : 
    1211           6 : GF_Err sdtp_box_dump(GF_Box *a, FILE * trace)
    1212             : {
    1213             :         GF_SampleDependencyTypeBox *p;
    1214             :         u32 i;
    1215             : 
    1216           6 :         if (dump_skip_samples)
    1217             :                 return GF_OK;
    1218             : 
    1219             :         p = (GF_SampleDependencyTypeBox*)a;
    1220           6 :         gf_isom_box_dump_start(a, "SampleDependencyTypeBox", trace);
    1221           6 :         gf_fprintf(trace, "SampleCount=\"%d\">\n", p->sampleCount);
    1222             : 
    1223           6 :         if (!p->sample_info) {
    1224           1 :                 gf_fprintf(trace, "<!--Warning: No sample dependencies indications-->\n");
    1225             :         } else {
    1226          99 :                 for (i=0; i<p->sampleCount; i++) {
    1227             :                         const char *type;
    1228          99 :                         u8 flag = p->sample_info[i];
    1229          99 :                         gf_fprintf(trace, "<SampleDependencyEntry ");
    1230          99 :                         switch ( (flag >> 6) & 3) {
    1231             :                         case 1: type="openGOP"; break;
    1232           0 :                         case 2: type="no"; break;
    1233           0 :                         case 3: type="SAP2"; break;
    1234          99 :                         default:
    1235          99 :                         case 0: type="unknown"; break;
    1236             :                         }
    1237          99 :                         gf_fprintf(trace, "isLeading=\"%s\" ", type);
    1238             : 
    1239          99 :                         switch ( (flag >> 4) & 3) {
    1240             :                         case 1: type="yes"; break;
    1241           5 :                         case 2: type="no"; break;
    1242           0 :                         case 3: type="RESERVED"; break;
    1243           0 :                         default:
    1244           0 :                         case 0: type="unknown"; break;
    1245             :                         }
    1246          99 :                         gf_fprintf(trace, "dependsOnOther=\"%s\" ", type);
    1247             : 
    1248          99 :                         switch ( (flag >> 2) & 3) {
    1249             :                         case 1: type="yes"; break;
    1250           3 :                         case 2: type="no"; break;
    1251           0 :                         case 3: type="RESERVED"; break;
    1252           0 :                         default:
    1253           0 :                         case 0: type="unknown"; break;
    1254             :                         }
    1255          99 :                         gf_fprintf(trace, "dependedOn=\"%s\" ", type);
    1256             : 
    1257          99 :                         switch ( flag & 3) {
    1258             :                         case 1: type="yes"; break;
    1259           0 :                         case 2: type="no"; break;
    1260           0 :                         case 3: type="RESERVED"; break;
    1261          99 :                         default:
    1262          99 :                         case 0: type="unknown"; break;
    1263             :                         }
    1264          99 :                         gf_fprintf(trace, "hasRedundancy=\"%s\"/>\n", type);
    1265             :                 }
    1266             :         }
    1267           6 :         if (!p->size) {
    1268           1 :                 gf_fprintf(trace, "<SampleDependencyEntry dependsOnOther=\"unknown|yes|no|RESERVED\" dependedOn=\"unknown|yes|no|RESERVED\" hasRedundancy=\"unknown|yes|no|RESERVED\"/>\n");
    1269             :         }
    1270           6 :         gf_isom_box_dump_done("SampleDependencyTypeBox", a, trace);
    1271           6 :         return GF_OK;
    1272             : }
    1273             : 
    1274           1 : GF_Err co64_box_dump(GF_Box *a, FILE * trace)
    1275             : {
    1276             :         GF_ChunkLargeOffsetBox *p;
    1277             :         u32 i;
    1278             : 
    1279           1 :         if (dump_skip_samples)
    1280             :                 return GF_OK;
    1281             : 
    1282             :         p = (GF_ChunkLargeOffsetBox *)a;
    1283           1 :         gf_isom_box_dump_start(a, "ChunkLargeOffsetBox", trace);
    1284           1 :         gf_fprintf(trace, "EntryCount=\"%d\">\n", p->nb_entries);
    1285             : 
    1286           1 :         if (!p->offsets && p->size) {
    1287           0 :                 gf_fprintf(trace, "<!-- Warning: No Chunk Offsets indications/>\n");
    1288           1 :         } else if (p->offsets) {
    1289           0 :                 for (i=0; i<p->nb_entries; i++)
    1290           0 :                         gf_fprintf(trace, "<ChunkOffsetEntry offset=\""LLU"\"/>\n", p->offsets[i]);
    1291             :         }
    1292           1 :         if (!p->size) {
    1293           1 :                 gf_fprintf(trace, "<ChunkOffsetEntry offset=\"\"/>\n");
    1294             :         }
    1295           1 :         gf_isom_box_dump_done("ChunkLargeOffsetBox", a, trace);
    1296           1 :         return GF_OK;
    1297             : }
    1298             : 
    1299          37 : GF_Err esds_box_dump(GF_Box *a, FILE * trace)
    1300             : {
    1301             :         GF_ESDBox *p;
    1302             : 
    1303             :         p = (GF_ESDBox *)a;
    1304          37 :         gf_isom_box_dump_start(a, "MPEG4ESDescriptorBox", trace);
    1305          37 :         gf_fprintf(trace, ">\n");
    1306             : 
    1307          37 :         if (p->desc) {
    1308             : #ifndef GPAC_DISABLE_OD_DUMP
    1309          36 :                 gf_odf_dump_desc((GF_Descriptor *) p->desc, trace, 1, GF_TRUE);
    1310             : #else
    1311             :                 gf_fprintf(trace, "<!-- Object Descriptor Dumping disabled in this build of GPAC -->\n");
    1312             : #endif
    1313           1 :         } else if (p->size) {
    1314           0 :                 gf_fprintf(trace, "<!--INVALID MP4 FILE: ESD not present in MPEG Sample Description or corrupted-->\n");
    1315             :         }
    1316          37 :         gf_isom_box_dump_done("MPEG4ESDescriptorBox", a, trace);
    1317          37 :         return GF_OK;
    1318             : }
    1319             : 
    1320         116 : GF_Err minf_box_dump(GF_Box *a, FILE * trace)
    1321             : {
    1322         116 :         gf_isom_box_dump_start(a, "MediaInformationBox", trace);
    1323         116 :         gf_fprintf(trace, ">\n");
    1324         116 :         gf_isom_box_dump_done("MediaInformationBox", a, trace);
    1325         116 :         return GF_OK;
    1326             : }
    1327             : 
    1328         125 : GF_Err tkhd_box_dump(GF_Box *a, FILE * trace)
    1329             : {
    1330             :         GF_TrackHeaderBox *p;
    1331             :         p = (GF_TrackHeaderBox *)a;
    1332         125 :         gf_isom_box_dump_start(a, "TrackHeaderBox", trace);
    1333             : 
    1334         125 :         gf_fprintf(trace, "CreationTime=\""LLD"\" ModificationTime=\""LLD"\" TrackID=\"%u\" Duration=\""LLD"\"",
    1335             :                         p->creationTime, p->modificationTime, p->trackID, p->duration);
    1336             : 
    1337         125 :         if (p->alternate_group) gf_fprintf(trace, " AlternateGroupID=\"%d\"", p->alternate_group);
    1338         125 :         if (p->volume) {
    1339          44 :                 gf_fprintf(trace, " Volume=\"%.2f\"", (Float)p->volume / 256);
    1340          81 :         } else if (p->width || p->height) {
    1341          64 :                 gf_fprintf(trace, " Width=\"%.2f\" Height=\"%.2f\"", (Float)p->width / 65536, (Float)p->height / 65536);
    1342          64 :                 if (p->layer) gf_fprintf(trace, " Layer=\"%d\"", p->layer);
    1343             :         }
    1344         125 :         gf_fprintf(trace, ">\n");
    1345         125 :         if (p->width || p->height) {
    1346          65 :                 gf_fprintf(trace, "<Matrix m11=\"0x%.8x\" m12=\"0x%.8x\" m13=\"0x%.8x\" ", p->matrix[0], p->matrix[1], p->matrix[2]);
    1347          65 :                 gf_fprintf(trace, "m21=\"0x%.8x\" m22=\"0x%.8x\" m23=\"0x%.8x\" ", p->matrix[3], p->matrix[4], p->matrix[5]);
    1348          65 :                 gf_fprintf(trace, "m31=\"0x%.8x\" m32=\"0x%.8x\" m33=\"0x%.8x\"/>\n", p->matrix[6], p->matrix[7], p->matrix[8]);
    1349             :         }
    1350             : 
    1351         125 :         gf_isom_box_dump_done("TrackHeaderBox", a, trace);
    1352         125 :         return GF_OK;
    1353             : }
    1354             : 
    1355           2 : GF_Err tref_box_dump(GF_Box *a, FILE * trace)
    1356             : {
    1357           2 :         gf_isom_box_dump_start(a, "TrackReferenceBox", trace);
    1358           2 :         gf_fprintf(trace, ">\n");
    1359           2 :         gf_isom_box_dump_done("TrackReferenceBox", a, trace);
    1360           2 :         return GF_OK;
    1361             : }
    1362             : 
    1363         116 : GF_Err mdia_box_dump(GF_Box *a, FILE * trace)
    1364             : {
    1365         116 :         gf_isom_box_dump_start(a, "MediaBox", trace);
    1366         116 :         gf_fprintf(trace, ">\n");
    1367         116 :         gf_isom_box_dump_done("MediaBox", a, trace);
    1368         116 :         return GF_OK;
    1369             : }
    1370             : 
    1371           2 : GF_Err mfra_box_dump(GF_Box *a, FILE * trace)
    1372             : {
    1373           2 :         gf_isom_box_dump_start(a, "MovieFragmentRandomAccessBox", trace);
    1374           2 :         gf_fprintf(trace, ">\n");
    1375           2 :         gf_isom_box_dump_done("MovieFragmentRandomAccessBox", a, trace);
    1376           2 :         return GF_OK;
    1377             : }
    1378             : 
    1379           5 : GF_Err tfra_box_dump(GF_Box *a, FILE * trace)
    1380             : {
    1381             :         u32 i;
    1382             :         GF_TrackFragmentRandomAccessBox *p = (GF_TrackFragmentRandomAccessBox *)a;
    1383           5 :         gf_isom_box_dump_start(a, "TrackFragmentRandomAccessBox", trace);
    1384           5 :         gf_fprintf(trace, "TrackId=\"%u\" number_of_entries=\"%u\">\n", p->track_id, p->nb_entries);
    1385           8 :         for (i=0; i<p->nb_entries; i++) {
    1386           3 :                 gf_fprintf(trace, "<RandomAccessEntry time=\""LLU"\" moof_offset=\""LLU"\" traf=\"%u\" trun=\"%u\" sample=\"%u\"/>\n",
    1387             :                         p->entries[i].time, p->entries[i].moof_offset,
    1388           3 :                         p->entries[i].traf_number, p->entries[i].trun_number, p->entries[i].sample_number);
    1389             :         }
    1390           5 :         if (!p->size) {
    1391           2 :                 gf_fprintf(trace, "<RandomAccessEntry time=\"\" moof_offset=\"\" traf=\"\" trun=\"\" sample=\"\"/>\n");
    1392             :         }
    1393           5 :         gf_isom_box_dump_done("TrackFragmentRandomAccessBox", a, trace);
    1394           5 :         return GF_OK;
    1395             : }
    1396             : 
    1397           2 : GF_Err mfro_box_dump(GF_Box *a, FILE * trace)
    1398             : {
    1399             :         GF_MovieFragmentRandomAccessOffsetBox *p = (GF_MovieFragmentRandomAccessOffsetBox *)a;
    1400             : 
    1401           2 :         gf_isom_box_dump_start(a, "MovieFragmentRandomAccessOffsetBox", trace);
    1402             : 
    1403           2 :         gf_fprintf(trace, "container_size=\"%d\" >\n", p->container_size);
    1404           2 :         gf_isom_box_dump_done("MovieFragmentRandomAccessOffsetBox", a, trace);
    1405           2 :         return GF_OK;
    1406             : }
    1407             : 
    1408             : 
    1409          14 : GF_Err elng_box_dump(GF_Box *a, FILE * trace)
    1410             : {
    1411             :         GF_ExtendedLanguageBox *p = (GF_ExtendedLanguageBox *)a;
    1412          14 :         gf_isom_box_dump_start(a, "ExtendedLanguageBox", trace);
    1413          14 :         gf_fprintf(trace, "LanguageCode=\"%s\">\n", p->extended_language);
    1414          14 :         gf_isom_box_dump_done("ExtendedLanguageBox", a, trace);
    1415          14 :         return GF_OK;
    1416             : }
    1417             : 
    1418           9 : GF_Err unkn_box_dump(GF_Box *a, FILE * trace)
    1419             : {
    1420             :         Bool str_dump = GF_FALSE;
    1421             :         const char *name = "UnknownBox";
    1422             :         GF_UnknownBox *u = (GF_UnknownBox *)a;
    1423           9 :         if (!a->type && (a->size==8)) {
    1424             :                 name = "TerminatorBox";
    1425           9 :         } else if (u->original_4cc==GF_4CC('n','a','m','e') && (u->dataSize>4) && !u->data[0] && !u->data[1] && !u->data[2] && !u->data[3]) {
    1426             :                 name = "iTunesName";
    1427             :                 str_dump = GF_TRUE;
    1428           9 :         } else if (u->original_4cc==GF_4CC('m','e','a','n') && (u->dataSize>4) && !u->data[0] && !u->data[1] && !u->data[2] && !u->data[3]) {
    1429             :                 name = "iTunesMean";
    1430             :                 str_dump = GF_TRUE;
    1431             :         }
    1432             : 
    1433           9 :         gf_isom_box_dump_start(a, name, trace);
    1434             : 
    1435           9 :         if (str_dump) {
    1436             :                 u32 i;
    1437           0 :                 gf_fprintf(trace, " value=\"");
    1438           0 :                 for (i=4; i<u->dataSize; i++)
    1439           0 :                         gf_fprintf(trace, "%c", (char) u->data[i]);
    1440           0 :                 gf_fprintf(trace, "\"");
    1441           9 :         } else if (u->dataSize && u->dataSize<100) {
    1442           3 :                 dump_data_attribute(trace, "data", u->data, u->dataSize);
    1443             :         }
    1444             : 
    1445           9 :         gf_fprintf(trace, ">\n");
    1446           9 :         gf_isom_box_dump_done(name, a, trace);
    1447             : #ifdef GPAC_ENABLE_COVERAGE
    1448           9 :         if (gf_sys_is_cov_mode()) {
    1449           9 :                 dump_data_string(NULL, NULL, 0);
    1450             :         }
    1451             : #endif
    1452           9 :         return GF_OK;
    1453             : }
    1454             : 
    1455           3 : GF_Err uuid_box_dump(GF_Box *a, FILE * trace)
    1456             : {
    1457           3 :         gf_isom_box_dump_start(a, "UUIDBox", trace);
    1458           3 :         gf_fprintf(trace, ">\n");
    1459           3 :         gf_isom_box_dump_done("UUIDBox", a, trace);
    1460           3 :         return GF_OK;
    1461             : }
    1462             : 
    1463           1 : GF_Err void_box_dump(GF_Box *a, FILE * trace)
    1464             : {
    1465           1 :         gf_isom_box_dump_start(a, "VoidBox", trace);
    1466           1 :         gf_fprintf(trace, ">\n");
    1467           1 :         gf_isom_box_dump_done("VoidBox", a, trace);
    1468           1 :         return GF_OK;
    1469             : }
    1470             : 
    1471         117 : GF_Err ftyp_box_dump(GF_Box *a, FILE * trace)
    1472             : {
    1473             :         GF_FileTypeBox *p;
    1474             :         u32 i;
    1475             : 
    1476             :         p = (GF_FileTypeBox *)a;
    1477         117 :         gf_isom_box_dump_start(a, (a->type == GF_ISOM_BOX_TYPE_FTYP ? "FileTypeBox" : "SegmentTypeBox"), trace);
    1478         117 :         gf_fprintf(trace, "MajorBrand=\"%s\" MinorVersion=\"%d\">\n", gf_4cc_to_str(p->majorBrand), p->minorVersion);
    1479             : 
    1480         278 :         for (i=0; i<p->altCount; i++) {
    1481         161 :                 gf_fprintf(trace, "<BrandEntry AlternateBrand=\"%s\"/>\n", gf_4cc_to_str(p->altBrand[i]));
    1482             :         }
    1483         117 :         if (!p->type) {
    1484           0 :                 gf_fprintf(trace, "<BrandEntry AlternateBrand=\"4CC\"/>\n");
    1485             :         }
    1486         117 :         gf_isom_box_dump_done((a->type == GF_ISOM_BOX_TYPE_FTYP ? "FileTypeBox" : "SegmentTypeBox"), a, trace);
    1487         117 :         return GF_OK;
    1488             : }
    1489             : 
    1490           1 : GF_Err padb_box_dump(GF_Box *a, FILE * trace)
    1491             : {
    1492             :         GF_PaddingBitsBox *p;
    1493             :         u32 i;
    1494             : 
    1495             :         p = (GF_PaddingBitsBox *)a;
    1496           1 :         gf_isom_box_dump_start(a, "PaddingBitsBox", trace);
    1497           1 :         gf_fprintf(trace, "EntryCount=\"%d\">\n", p->SampleCount);
    1498           1 :         for (i=0; i<p->SampleCount; i+=1) {
    1499           0 :                 gf_fprintf(trace, "<PaddingBitsEntry PaddingBits=\"%d\"/>\n", p->padbits[i]);
    1500             :         }
    1501           1 :         if (!p->size) {
    1502           1 :                 gf_fprintf(trace, "<PaddingBitsEntry PaddingBits=\"\"/>\n");
    1503             :         }
    1504           1 :         gf_isom_box_dump_done("PaddingBitsBox", a, trace);
    1505           1 :         return GF_OK;
    1506             : }
    1507             : 
    1508          10 : GF_Err gppc_box_dump(GF_Box *a, FILE * trace)
    1509             : {
    1510             :         GF_3GPPConfigBox *p = (GF_3GPPConfigBox *)a;
    1511          10 :         switch (p->cfg.type) {
    1512           2 :         case GF_ISOM_SUBTYPE_3GP_AMR:
    1513             :         case GF_ISOM_SUBTYPE_3GP_AMR_WB:
    1514           2 :                 gf_isom_box_dump_start(a, "AMRConfigurationBox", trace);
    1515           2 :                 gf_fprintf(trace, "Vendor=\"%s\" Version=\"%d\"", gf_4cc_to_str(p->cfg.vendor), p->cfg.decoder_version);
    1516           2 :                 gf_fprintf(trace, " FramesPerSample=\"%d\" SupportedModes=\"%x\" ModeRotating=\"%d\"", p->cfg.frames_per_sample, p->cfg.AMR_mode_set, p->cfg.AMR_mode_change_period);
    1517           2 :                 gf_fprintf(trace, ">\n");
    1518           2 :                 gf_isom_box_dump_done("AMRConfigurationBox", a, trace);
    1519           2 :                 break;
    1520           1 :         case GF_ISOM_SUBTYPE_3GP_EVRC:
    1521           1 :                 gf_isom_box_dump_start(a, "EVRCConfigurationBox", trace);
    1522           1 :                 gf_fprintf(trace, "Vendor=\"%s\" Version=\"%d\" FramesPerSample=\"%d\" >\n", gf_4cc_to_str(p->cfg.vendor), p->cfg.decoder_version, p->cfg.frames_per_sample);
    1523           1 :                 gf_isom_box_dump_done("EVRCConfigurationBox", a, trace);
    1524           1 :                 break;
    1525           1 :         case GF_ISOM_SUBTYPE_3GP_QCELP:
    1526           1 :                 gf_isom_box_dump_start(a, "QCELPConfigurationBox", trace);
    1527           1 :                 gf_fprintf(trace, "Vendor=\"%s\" Version=\"%d\" FramesPerSample=\"%d\" >\n", gf_4cc_to_str(p->cfg.vendor), p->cfg.decoder_version, p->cfg.frames_per_sample);
    1528           1 :                 gf_isom_box_dump_done("QCELPConfigurationBox", a, trace);
    1529           1 :                 break;
    1530           0 :         case GF_ISOM_SUBTYPE_3GP_SMV:
    1531           0 :                 gf_isom_box_dump_start(a, "SMVConfigurationBox", trace);
    1532           0 :                 gf_fprintf(trace, "Vendor=\"%s\" Version=\"%d\" FramesPerSample=\"%d\" >\n", gf_4cc_to_str(p->cfg.vendor), p->cfg.decoder_version, p->cfg.frames_per_sample);
    1533           0 :                 gf_isom_box_dump_done("SMVConfigurationBox", a, trace);
    1534           0 :                 break;
    1535           1 :         case GF_ISOM_SUBTYPE_3GP_H263:
    1536           1 :                 gf_isom_box_dump_start(a, "H263ConfigurationBox", trace);
    1537           1 :                 gf_fprintf(trace, "Vendor=\"%s\" Version=\"%d\"", gf_4cc_to_str(p->cfg.vendor), p->cfg.decoder_version);
    1538           1 :                 gf_fprintf(trace, " Profile=\"%d\" Level=\"%d\"", p->cfg.H263_profile, p->cfg.H263_level);
    1539           1 :                 gf_fprintf(trace, ">\n");
    1540           1 :                 gf_isom_box_dump_done("H263ConfigurationBox", a, trace);
    1541           1 :                 break;
    1542             :         default:
    1543             :                 break;
    1544             :         }
    1545          10 :         return GF_OK;
    1546             : }
    1547             : 
    1548             : 
    1549          25 : GF_Err avcc_box_dump(GF_Box *a, FILE * trace)
    1550             : {
    1551             :         u32 i, count;
    1552             :         GF_AVCConfigurationBox *p = (GF_AVCConfigurationBox *) a;
    1553          25 :         const char *name = (p->type==GF_ISOM_BOX_TYPE_MVCC) ? "MVC" : (p->type==GF_ISOM_BOX_TYPE_SVCC) ? "SVC" : "AVC";
    1554             :         char boxname[256];
    1555             :         sprintf(boxname, "%sConfigurationBox", name);
    1556          25 :         gf_isom_box_dump_start(a, boxname, trace);
    1557          25 :         gf_fprintf(trace, ">\n");
    1558             : 
    1559          25 :         gf_fprintf(trace, "<%sDecoderConfigurationRecord", name);
    1560             : 
    1561          25 :         if (! p->config) {
    1562           3 :                 if (p->size) {
    1563           0 :                         gf_fprintf(trace, ">\n");
    1564           0 :                         gf_fprintf(trace, "<!-- INVALID AVC ENTRY : no AVC/SVC config record -->\n");
    1565             :                 } else {
    1566             : 
    1567           3 :                         gf_fprintf(trace, " configurationVersion=\"\" AVCProfileIndication=\"\" profile_compatibility=\"\" AVCLevelIndication=\"\" nal_unit_size=\"\" complete_representation=\"\"");
    1568             : 
    1569           3 :                         gf_fprintf(trace, " chroma_format=\"\" luma_bit_depth=\"\" chroma_bit_depth=\"\"");
    1570           3 :                         gf_fprintf(trace, ">\n");
    1571             : 
    1572           3 :                         gf_fprintf(trace, "<SequenceParameterSet size=\"\" content=\"\"/>\n");
    1573           3 :                         gf_fprintf(trace, "<PictureParameterSet size=\"\" content=\"\"/>\n");
    1574           3 :                         gf_fprintf(trace, "<SequenceParameterSetExtensions size=\"\" content=\"\"/>\n");
    1575             :                 }
    1576           3 :                 gf_fprintf(trace, "</%sDecoderConfigurationRecord>\n", name);
    1577           3 :                 gf_isom_box_dump_done(boxname, a, trace);
    1578           3 :                 return GF_OK;
    1579             :         }
    1580             : 
    1581          22 :         gf_fprintf(trace, " configurationVersion=\"%d\" AVCProfileIndication=\"%d\" profile_compatibility=\"%d\" AVCLevelIndication=\"%d\" nal_unit_size=\"%d\"", p->config->configurationVersion, p->config->AVCProfileIndication, p->config->profile_compatibility, p->config->AVCLevelIndication, p->config->nal_unit_size);
    1582             : 
    1583             : 
    1584          22 :         if ((p->type==GF_ISOM_BOX_TYPE_SVCC) || (p->type==GF_ISOM_BOX_TYPE_MVCC) )
    1585           1 :                 gf_fprintf(trace, " complete_representation=\"%d\"", p->config->complete_representation);
    1586             : 
    1587          22 :         if (p->type==GF_ISOM_BOX_TYPE_AVCC) {
    1588          21 :                 if (gf_avc_is_rext_profile(p->config->AVCProfileIndication)) {
    1589          16 :                         gf_fprintf(trace, " chroma_format=\"%s\" luma_bit_depth=\"%d\" chroma_bit_depth=\"%d\"", gf_avc_hevc_get_chroma_format_name(p->config->chroma_format), p->config->luma_bit_depth, p->config->chroma_bit_depth);
    1590             :                 }
    1591             :         }
    1592             : 
    1593          22 :         gf_fprintf(trace, ">\n");
    1594             : 
    1595          22 :         count = gf_list_count(p->config->sequenceParameterSets);
    1596          44 :         for (i=0; i<count; i++) {
    1597          22 :                 GF_NALUFFParam *c = (GF_NALUFFParam *)gf_list_get(p->config->sequenceParameterSets, i);
    1598          22 :                 gf_fprintf(trace, "<SequenceParameterSet size=\"%d\" content=\"", c->size);
    1599          22 :                 dump_data(trace, c->data, c->size);
    1600          22 :                 gf_fprintf(trace, "\"/>\n");
    1601             :         }
    1602          22 :         count = gf_list_count(p->config->pictureParameterSets);
    1603          44 :         for (i=0; i<count; i++) {
    1604          22 :                 GF_NALUFFParam *c = (GF_NALUFFParam *)gf_list_get(p->config->pictureParameterSets, i);
    1605          22 :                 gf_fprintf(trace, "<PictureParameterSet size=\"%d\" content=\"", c->size);
    1606          22 :                 dump_data(trace, c->data, c->size);
    1607          22 :                 gf_fprintf(trace, "\"/>\n");
    1608             :         }
    1609             : 
    1610          22 :         if (p->config->sequenceParameterSetExtensions) {
    1611           0 :                 count = gf_list_count(p->config->sequenceParameterSetExtensions);
    1612           0 :                 for (i=0; i<count; i++) {
    1613           0 :                         GF_NALUFFParam *c = (GF_NALUFFParam *)gf_list_get(p->config->sequenceParameterSetExtensions, i);
    1614           0 :                         gf_fprintf(trace, "<SequenceParameterSetExtensions size=\"%d\" content=\"", c->size);
    1615           0 :                         dump_data(trace, c->data, c->size);
    1616           0 :                         gf_fprintf(trace, "\"/>\n");
    1617             :                 }
    1618             :         }
    1619             : 
    1620          22 :         gf_fprintf(trace, "</%sDecoderConfigurationRecord>\n", name);
    1621             : 
    1622          22 :         gf_isom_box_dump_done(boxname, a, trace);
    1623          22 :         return GF_OK;
    1624             : }
    1625             : 
    1626          18 : GF_Err hvcc_box_dump(GF_Box *a, FILE * trace)
    1627             : {
    1628             :         u32 i, count;
    1629          18 :         const char *name = (a->type==GF_ISOM_BOX_TYPE_HVCC) ? "HEVC" : "L-HEVC";
    1630             :         char boxname[256];
    1631             :         GF_HEVCConfigurationBox *p = (GF_HEVCConfigurationBox *) a;
    1632             : 
    1633             :         sprintf(boxname, "%sConfigurationBox", name);
    1634          18 :         gf_isom_box_dump_start(a, boxname, trace);
    1635          18 :         gf_fprintf(trace, ">\n");
    1636             : 
    1637          18 :         if (! p->config) {
    1638           2 :                 if (p->size) {
    1639           0 :                         gf_fprintf(trace, "<!-- INVALID HEVC ENTRY: no HEVC/SHVC config record -->\n");
    1640             :                 } else {
    1641           2 :                         gf_fprintf(trace, "<%sDecoderConfigurationRecord nal_unit_size=\"\" configurationVersion=\"\" ", name);
    1642           2 :                         if (a->type==GF_ISOM_BOX_TYPE_HVCC) {
    1643           2 :                                 gf_fprintf(trace, "profile_space=\"\" tier_flag=\"\" profile_idc=\"\" general_profile_compatibility_flags=\"\" progressive_source_flag=\"\" interlaced_source_flag=\"\" non_packed_constraint_flag=\"\" frame_only_constraint_flag=\"\" constraint_indicator_flags=\"\" level_idc=\"\" ");
    1644             :                         }
    1645           2 :                         gf_fprintf(trace, "min_spatial_segmentation_idc=\"\" parallelismType=\"\" ");
    1646             : 
    1647           2 :                         if (a->type==GF_ISOM_BOX_TYPE_HVCC)
    1648           2 :                                 gf_fprintf(trace, "chroma_format=\"\" luma_bit_depth=\"\" chroma_bit_depth=\"\" avgFrameRate=\"\" constantFrameRate=\"\" numTemporalLayers=\"\" temporalIdNested=\"\"");
    1649             : 
    1650           2 :                         gf_fprintf(trace, ">\n");
    1651           2 :                         gf_fprintf(trace, "<ParameterSetArray nalu_type=\"\" complete_set=\"\">\n");
    1652           2 :                         gf_fprintf(trace, "<ParameterSet size=\"\" content=\"\"/>\n");
    1653           2 :                         gf_fprintf(trace, "</ParameterSetArray>\n");
    1654           2 :                         gf_fprintf(trace, "</%sDecoderConfigurationRecord>\n", name);
    1655             :                 }
    1656           2 :                 gf_fprintf(trace, "</%sConfigurationBox>\n", name);
    1657           2 :                 return GF_OK;
    1658             :         }
    1659             : 
    1660          16 :         gf_fprintf(trace, "<%sDecoderConfigurationRecord nal_unit_size=\"%d\" ", name, p->config->nal_unit_size);
    1661          16 :         gf_fprintf(trace, "configurationVersion=\"%u\" ", p->config->configurationVersion);
    1662          16 :         if (a->type==GF_ISOM_BOX_TYPE_HVCC) {
    1663          16 :                 gf_fprintf(trace, "profile_space=\"%u\" ", p->config->profile_space);
    1664          16 :                 gf_fprintf(trace, "tier_flag=\"%u\" ", p->config->tier_flag);
    1665          16 :                 gf_fprintf(trace, "profile_idc=\"%u\" ", p->config->profile_idc);
    1666          16 :                 gf_fprintf(trace, "general_profile_compatibility_flags=\"%X\" ", p->config->general_profile_compatibility_flags);
    1667          16 :                 gf_fprintf(trace, "progressive_source_flag=\"%u\" ", p->config->progressive_source_flag);
    1668          16 :                 gf_fprintf(trace, "interlaced_source_flag=\"%u\" ", p->config->interlaced_source_flag);
    1669          16 :                 gf_fprintf(trace, "non_packed_constraint_flag=\"%u\" ", p->config->non_packed_constraint_flag);
    1670          16 :                 gf_fprintf(trace, "frame_only_constraint_flag=\"%u\" ", p->config->frame_only_constraint_flag);
    1671          16 :                 gf_fprintf(trace, "constraint_indicator_flags=\""LLX"\" ", p->config->constraint_indicator_flags);
    1672          16 :                 gf_fprintf(trace, "level_idc=\"%d\" ", p->config->level_idc);
    1673             :         }
    1674          16 :         gf_fprintf(trace, "min_spatial_segmentation_idc=\"%u\" ", p->config->min_spatial_segmentation_idc);
    1675          16 :         gf_fprintf(trace, "parallelismType=\"%u\" ", p->config->parallelismType);
    1676             : 
    1677          16 :         if (a->type==GF_ISOM_BOX_TYPE_HVCC)
    1678         112 :                 gf_fprintf(trace, "chroma_format=\"%s\" luma_bit_depth=\"%u\" chroma_bit_depth=\"%u\" avgFrameRate=\"%u\" constantFrameRate=\"%u\" numTemporalLayers=\"%u\" temporalIdNested=\"%u\"",
    1679         112 :                 gf_avc_hevc_get_chroma_format_name(p->config->chromaFormat), p->config->luma_bit_depth, p->config->chroma_bit_depth, p->config->avgFrameRate, p->config->constantFrameRate, p->config->numTemporalLayers, p->config->temporalIdNested);
    1680             : 
    1681          16 :         gf_fprintf(trace, ">\n");
    1682             : 
    1683          16 :         count = gf_list_count(p->config->param_array);
    1684          64 :         for (i=0; i<count; i++) {
    1685             :                 u32 nalucount, j;
    1686          48 :                 GF_NALUFFParamArray *ar = (GF_NALUFFParamArray*)gf_list_get(p->config->param_array, i);
    1687          48 :                 gf_fprintf(trace, "<ParameterSetArray nalu_type=\"%d\" complete_set=\"%d\">\n", ar->type, ar->array_completeness);
    1688          48 :                 nalucount = gf_list_count(ar->nalus);
    1689          96 :                 for (j=0; j<nalucount; j++) {
    1690          48 :                         GF_NALUFFParam *c = (GF_NALUFFParam *)gf_list_get(ar->nalus, j);
    1691          48 :                         gf_fprintf(trace, "<ParameterSet size=\"%d\" content=\"", c->size);
    1692          48 :                         dump_data(trace, c->data, c->size);
    1693          48 :                         gf_fprintf(trace, "\"/>\n");
    1694             :                 }
    1695          48 :                 gf_fprintf(trace, "</ParameterSetArray>\n");
    1696             :         }
    1697             : 
    1698          16 :         gf_fprintf(trace, "</%sDecoderConfigurationRecord>\n", name);
    1699             : 
    1700          16 :         gf_isom_box_dump_done(boxname, a, trace);
    1701          16 :         return GF_OK;
    1702             : }
    1703             : 
    1704           1 : GF_Err vvcc_box_dump(GF_Box *a, FILE * trace)
    1705             : {
    1706             :         u32 i, count;
    1707             :         char boxname[256];
    1708             :         GF_VVCConfigurationBox *p = (GF_VVCConfigurationBox *) a;
    1709             : 
    1710             :         sprintf(boxname, "VVCConfigurationBox");
    1711           1 :         gf_isom_box_dump_start(a, boxname, trace);
    1712           1 :         gf_fprintf(trace, ">\n");
    1713             : 
    1714           1 :         if (! p->config) {
    1715           1 :                 if (p->size) {
    1716           0 :                         gf_fprintf(trace, "<!-- INVALID VVC ENTRY: no VVC config record -->\n");
    1717             :                 } else {
    1718           1 :                         gf_fprintf(trace, "<VVCDecoderConfigurationRecord nal_unit_size=\"\" configurationVersion=\"\" ");
    1719           1 :                         gf_fprintf(trace, "general_profile_idc=\"\" general_tier_flag=\"\" general_sub_profile_idc=\"\" general_constraint_info=\"\" general_level_idc=\"\" ");
    1720           1 :                         gf_fprintf(trace, "chroma_format=\"\" luma_bit_depth=\"\" chroma_bit_depth=\"\" avgFrameRate=\"\" constantFrameRate=\"\" numTemporalLayers=\"\"");
    1721             : 
    1722           1 :                         gf_fprintf(trace, ">\n");
    1723           1 :                         gf_fprintf(trace, "<ParameterSetArray nalu_type=\"\" complete_set=\"\">\n");
    1724           1 :                         gf_fprintf(trace, "<ParameterSet size=\"\" content=\"\"/>\n");
    1725           1 :                         gf_fprintf(trace, "</ParameterSetArray>\n");
    1726           1 :                         gf_fprintf(trace, "</VVCDecoderConfigurationRecord>\n");
    1727             :                 }
    1728           1 :                 gf_fprintf(trace, "</VVCConfigurationBox>\n");
    1729           1 :                 return GF_OK;
    1730             :         }
    1731             : 
    1732           0 :         gf_fprintf(trace, "<VVCDecoderConfigurationRecord nal_unit_size=\"%d\" ", p->config->nal_unit_size);
    1733           0 :         gf_fprintf(trace, "configurationVersion=\"%u\" ", p->config->configurationVersion);
    1734           0 :         gf_fprintf(trace, "general_profile_idc=\"%u\" ", p->config->general_profile_idc);
    1735           0 :         gf_fprintf(trace, "general_tier_flag=\"%u\" ", p->config->general_tier_flag);
    1736           0 :         gf_fprintf(trace, "general_sub_profile_idc=\"%u\" ", p->config->general_sub_profile_idc);
    1737           0 :         if (p->config->general_constraint_info) {
    1738           0 :                 gf_fprintf(trace, "general_constraint_info=\"");
    1739           0 :                 dump_data_hex(trace, p->config->general_constraint_info, p->config->num_constraint_info);
    1740           0 :                 gf_fprintf(trace, "\" ");
    1741             :         }
    1742           0 :         gf_fprintf(trace, "general_level_idc=\"%u\" ", p->config->general_level_idc);
    1743             : 
    1744           0 :         gf_fprintf(trace, "chroma_format=\"%s\" chroma_bit_depth=\"%u\" avgFrameRate=\"%u\" constantFrameRate=\"%u\" numTemporalLayers=\"%u\" ",
    1745           0 :                         p->config->chromaformat_plus_one ? gf_avc_hevc_get_chroma_format_name(p->config->chromaformat_plus_one) : "n/a",
    1746           0 :                         p->config->bit_depth_plus_one - 1, p->config->avgFrameRate, p->config->constantFrameRate, p->config->numTemporalLayers);
    1747             : 
    1748           0 :         gf_fprintf(trace, ">\n");
    1749             : 
    1750           0 :         count = gf_list_count(p->config->param_array);
    1751           0 :         for (i=0; i<count; i++) {
    1752             :                 u32 nalucount, j;
    1753           0 :                 GF_NALUFFParamArray *ar = (GF_NALUFFParamArray*)gf_list_get(p->config->param_array, i);
    1754           0 :                 gf_fprintf(trace, "<ParameterSetArray nalu_type=\"%d\" complete_set=\"%d\">\n", ar->type, ar->array_completeness);
    1755           0 :                 nalucount = gf_list_count(ar->nalus);
    1756           0 :                 for (j=0; j<nalucount; j++) {
    1757           0 :                         GF_NALUFFParam *c = (GF_NALUFFParam *)gf_list_get(ar->nalus, j);
    1758           0 :                         gf_fprintf(trace, "<ParameterSet size=\"%d\" content=\"", c->size);
    1759           0 :                         dump_data(trace, c->data, c->size);
    1760           0 :                         gf_fprintf(trace, "\"/>\n");
    1761             :                 }
    1762           0 :                 gf_fprintf(trace, "</ParameterSetArray>\n");
    1763             :         }
    1764             : 
    1765           0 :         gf_fprintf(trace, "</VVCDecoderConfigurationRecord>\n");
    1766             : 
    1767           0 :         gf_isom_box_dump_done(boxname, a, trace);
    1768           0 :         return GF_OK;
    1769             : }
    1770             : 
    1771          11 : GF_Err av1c_box_dump(GF_Box *a, FILE *trace) {
    1772             :         GF_AV1ConfigurationBox *ptr = (GF_AV1ConfigurationBox*)a;
    1773          11 :         gf_fprintf(trace, "<AV1ConfigurationBox>\n");
    1774          11 :         if (ptr->config) {
    1775          10 :                 u32 i, obu_count = gf_list_count(ptr->config->obu_array);
    1776             : 
    1777          10 :                 gf_fprintf(trace, "<AV1Config version=\"%u\" profile=\"%u\" level_idx0=\"%u\" tier=\"%u\" ", (u32)ptr->config->version, (u32)ptr->config->seq_profile, (u32)ptr->config->seq_level_idx_0, (u32)ptr->config->seq_tier_0);
    1778          10 :                 gf_fprintf(trace, "high_bitdepth=\"%u\" twelve_bit=\"%u\" monochrome=\"%u\" ", (u32)ptr->config->high_bitdepth, (u32)ptr->config->twelve_bit, (u32)ptr->config->monochrome);
    1779          10 :                 gf_fprintf(trace, "chroma_subsampling_x=\"%u\" chroma_subsampling_y=\"%u\" chroma_sample_position=\"%u\" ", (u32)ptr->config->chroma_subsampling_x, (u32)ptr->config->chroma_subsampling_y, (u32)ptr->config->chroma_sample_position);
    1780          10 :                 gf_fprintf(trace, "initial_presentation_delay=\"%u\" OBUs_count=\"%u\">\n", ptr->config->initial_presentation_delay_minus_one+1, obu_count);
    1781             : 
    1782          20 :                 for (i=0; i<obu_count; i++) {
    1783          10 :                         GF_AV1_OBUArrayEntry *obu_a = gf_list_get(ptr->config->obu_array, i);
    1784          10 :                         gf_fprintf(trace, "<OBU type=\"%d\" name=\"%s\" size=\"%d\" content=\"", obu_a->obu_type, gf_av1_get_obu_name(obu_a->obu_type), (u32) obu_a->obu_length);
    1785          10 :                         dump_data(trace, (char *)obu_a->obu, (u32) obu_a->obu_length);
    1786          10 :                         gf_fprintf(trace, "\"/>\n");
    1787             :                 }
    1788          10 :                 gf_fprintf(trace, "</AV1Config>\n");
    1789             :         }
    1790          11 :         gf_fprintf(trace, "</AV1ConfigurationBox>\n");
    1791          11 :         return GF_OK;
    1792             : }
    1793             : 
    1794             : 
    1795           5 : GF_Err vpcc_box_dump(GF_Box *a, FILE *trace) {
    1796             :         GF_VPConfigurationBox *ptr = (GF_VPConfigurationBox*)a;
    1797           5 :         gf_fprintf(trace, "<VPConfigurationBox>\n");
    1798           5 :         if (ptr->config) {
    1799           3 :                 gf_fprintf(trace, "<VPConfig");
    1800             : 
    1801           3 :                 gf_fprintf(trace, " profile=\"%u\"", ptr->config->profile);
    1802           3 :                 gf_fprintf(trace, " level=\"%u\"", ptr->config->level);
    1803           3 :                 gf_fprintf(trace, " bit_depth=\"%u\"", ptr->config->bit_depth);
    1804           3 :                 gf_fprintf(trace, " chroma_subsampling=\"%u\"", ptr->config->chroma_subsampling);
    1805           3 :                 gf_fprintf(trace, " video_fullRange_flag=\"%u\"", ptr->config->video_fullRange_flag);
    1806           3 :                 gf_fprintf(trace, " colour_primaries=\"%u\"", ptr->config->colour_primaries);
    1807           3 :                 gf_fprintf(trace, " transfer_characteristics=\"%u\"", ptr->config->transfer_characteristics);
    1808           3 :                 gf_fprintf(trace, " matrix_coefficients=\"%u\"", ptr->config->matrix_coefficients);
    1809           3 :                 gf_fprintf(trace, " codec_initdata_size=\"%u\"", ptr->config->codec_initdata_size);
    1810             : 
    1811           3 :                 gf_fprintf(trace, ">\n</VPConfig>\n");
    1812             :         }
    1813           5 :         gf_fprintf(trace, "</VPConfigurationBox>\n");
    1814           5 :         return GF_OK;
    1815             : }
    1816             : 
    1817           2 : GF_Err SmDm_box_dump(GF_Box *a, FILE *trace) {
    1818             :         GF_SMPTE2086MasteringDisplayMetadataBox * ptr = (GF_SMPTE2086MasteringDisplayMetadataBox *)a;
    1819           2 :         if (!a) return GF_BAD_PARAM;
    1820           2 :         gf_isom_box_dump_start(a, "SMPTE2086MasteringDisplayMetadataBox", trace);
    1821           2 :         gf_fprintf(trace, "primaryRChromaticity_x=\"%u\" ", ptr->primaryRChromaticity_x);
    1822           2 :         gf_fprintf(trace, "primaryRChromaticity_y=\"%u\" ", ptr->primaryRChromaticity_y);
    1823           2 :         gf_fprintf(trace, "primaryGChromaticity_x=\"%u\" ", ptr->primaryGChromaticity_x);
    1824           2 :         gf_fprintf(trace, "primaryGChromaticity_y=\"%u\" ", ptr->primaryGChromaticity_y);
    1825           2 :         gf_fprintf(trace, "primaryBChromaticity_x=\"%u\" ", ptr->primaryBChromaticity_x);
    1826           2 :         gf_fprintf(trace, "primaryBChromaticity_y=\"%u\" ", ptr->primaryBChromaticity_y);
    1827           2 :         gf_fprintf(trace, "whitePointChromaticity_x=\"%u\" ", ptr->whitePointChromaticity_x);
    1828           2 :         gf_fprintf(trace, "whitePointChromaticity_y=\"%u\" ", ptr->whitePointChromaticity_y);
    1829           2 :         gf_fprintf(trace, "luminanceMax=\"%u\" ", ptr->luminanceMax);
    1830           2 :         gf_fprintf(trace, "luminanceMin=\"%u\">\n", ptr->luminanceMin);
    1831           2 :         gf_isom_box_dump_done("SMPTE2086MasteringDisplayMetadataBox", a, trace);
    1832           2 :         return GF_OK;
    1833             : }
    1834             : 
    1835           2 : GF_Err CoLL_box_dump(GF_Box *a, FILE *trace) {
    1836             :         GF_VPContentLightLevelBox * ptr = (GF_VPContentLightLevelBox *)a;
    1837           2 :         if (!a) return GF_BAD_PARAM;
    1838           2 :         gf_isom_box_dump_start(a, "VPContentLightLevelBox", trace);
    1839           2 :         gf_fprintf(trace, "maxCLL=\"%u\" maxFALL=\"%u\">\n", ptr->maxCLL, ptr->maxFALL);
    1840           2 :         gf_isom_box_dump_done("VPContentLightLevelBox", a, trace);
    1841           2 :         return GF_OK;
    1842             : }
    1843             : 
    1844           2 : GF_Err m4ds_box_dump(GF_Box *a, FILE * trace)
    1845             : {
    1846             :         u32 i;
    1847             :         GF_Descriptor *desc;
    1848             :         GF_MPEG4ExtensionDescriptorsBox *p = (GF_MPEG4ExtensionDescriptorsBox *) a;
    1849           2 :         gf_isom_box_dump_start(a, "MPEG4ExtensionDescriptorsBox", trace);
    1850           2 :         gf_fprintf(trace, ">\n");
    1851             : 
    1852           2 :         i=0;
    1853           5 :         while ((desc = (GF_Descriptor *)gf_list_enum(p->descriptors, &i))) {
    1854             : #ifndef GPAC_DISABLE_OD_DUMP
    1855           1 :                 gf_odf_dump_desc(desc, trace, 1, GF_TRUE);
    1856             : #else
    1857             :                 gf_fprintf(trace, "<!-- Object Descriptor Dumping disabled in this build of GPAC -->\n");
    1858             : #endif
    1859             :         }
    1860           2 :         gf_isom_box_dump_done("MPEG4ExtensionDescriptorsBox", a, trace);
    1861           2 :         return GF_OK;
    1862             : }
    1863             : 
    1864          50 : GF_Err btrt_box_dump(GF_Box *a, FILE * trace)
    1865             : {
    1866             :         GF_BitRateBox *p = (GF_BitRateBox*)a;
    1867          50 :         gf_isom_box_dump_start(a, "BitRateBox", trace);
    1868          50 :         gf_fprintf(trace, "BufferSizeDB=\"%d\" avgBitRate=\"%d\" maxBitRate=\"%d\">\n", p->bufferSizeDB, p->avgBitrate, p->maxBitrate);
    1869          50 :         gf_isom_box_dump_done("BitRateBox", a, trace);
    1870          50 :         return GF_OK;
    1871             : }
    1872             : 
    1873          24 : GF_Err ftab_box_dump(GF_Box *a, FILE * trace)
    1874             : {
    1875             :         u32 i;
    1876             :         GF_FontTableBox *p = (GF_FontTableBox *)a;
    1877          24 :         gf_isom_box_dump_start(a, "FontTableBox", trace);
    1878          24 :         gf_fprintf(trace, ">\n");
    1879          47 :         for (i=0; i<p->entry_count; i++) {
    1880          23 :                 gf_fprintf(trace, "<FontRecord ID=\"%d\" name=\"%s\"/>\n", p->fonts[i].fontID, p->fonts[i].fontName ? p->fonts[i].fontName : "NULL");
    1881             :         }
    1882          24 :         if (!p->size) {
    1883           1 :                 gf_fprintf(trace, "<FontRecord ID=\"\" name=\"\"/>\n");
    1884             :         }
    1885          24 :         gf_isom_box_dump_done("FontTableBox", a, trace);
    1886          24 :         return GF_OK;
    1887             : }
    1888             : 
    1889          72 : static void tx3g_dump_rgba8(FILE * trace, char *name, u32 col)
    1890             : {
    1891          72 :         gf_fprintf(trace, "%s=\"%x %x %x %x\"", name, (col>>16)&0xFF, (col>>8)&0xFF, (col)&0xFF, (col>>24)&0xFF);
    1892          72 : }
    1893             : static void tx3g_dump_rgb16(FILE * trace, char *name, char col[6])
    1894             : {
    1895           1 :         gf_fprintf(trace, "%s=\"%x %x %x\"", name, *((u16*)col), *((u16*)(col+2)), *((u16*)(col+4)));
    1896             : }
    1897             : static void tx3g_dump_box(FILE * trace, GF_BoxRecord *rec)
    1898             : {
    1899          26 :         gf_fprintf(trace, "<BoxRecord top=\"%d\" left=\"%d\" bottom=\"%d\" right=\"%d\"/>\n", rec->top, rec->left, rec->bottom, rec->right);
    1900             : }
    1901          24 : static void tx3g_dump_style(FILE * trace, GF_StyleRecord *rec)
    1902             : {
    1903          24 :         gf_fprintf(trace, "<StyleRecord startChar=\"%d\" endChar=\"%d\" fontID=\"%d\" styles=\"", rec->startCharOffset, rec->endCharOffset, rec->fontID);
    1904          24 :         if (!rec->style_flags) {
    1905          24 :                 gf_fprintf(trace, "Normal");
    1906             :         } else {
    1907           0 :                 if (rec->style_flags & 1) gf_fprintf(trace, "Bold ");
    1908           0 :                 if (rec->style_flags & 2) gf_fprintf(trace, "Italic ");
    1909           0 :                 if (rec->style_flags & 4) gf_fprintf(trace, "Underlined ");
    1910             :         }
    1911          24 :         gf_fprintf(trace, "\" fontSize=\"%d\" ", rec->font_size);
    1912          24 :         tx3g_dump_rgba8(trace, "textColor", rec->text_color);
    1913          24 :         gf_fprintf(trace, "/>\n");
    1914          24 : }
    1915             : 
    1916          24 : GF_Err tx3g_box_dump(GF_Box *a, FILE * trace)
    1917             : {
    1918             :         GF_Tx3gSampleEntryBox *p = (GF_Tx3gSampleEntryBox *)a;
    1919          24 :         gf_isom_box_dump_start(a, "Tx3gSampleEntryBox", trace);
    1920          72 :         gf_fprintf(trace, "dataReferenceIndex=\"%d\" displayFlags=\"%x\" horizontal-justification=\"%d\" vertical-justification=\"%d\" ",
    1921          72 :                 p->dataReferenceIndex, p->displayFlags, p->horizontal_justification, p->vertical_justification);
    1922             : 
    1923          24 :         tx3g_dump_rgba8(trace, "backgroundColor", p->back_color);
    1924          24 :         gf_fprintf(trace, ">\n");
    1925          24 :         gf_fprintf(trace, "<DefaultBox>\n");
    1926             :         tx3g_dump_box(trace, &p->default_box);
    1927             : 
    1928          24 :         gf_fprintf(trace, "<DefaultStyle>\n");
    1929          24 :         tx3g_dump_style(trace, &p->default_style);
    1930          24 :         gf_fprintf(trace, "</DefaultStyle>\n");
    1931          24 :         gf_isom_box_dump_done("Tx3gSampleEntryBox", a, trace);
    1932          24 :         return GF_OK;
    1933             : }
    1934             : 
    1935           1 : GF_Err text_box_dump(GF_Box *a, FILE * trace)
    1936             : {
    1937             :         GF_TextSampleEntryBox *p = (GF_TextSampleEntryBox *)a;
    1938           1 :         gf_isom_box_dump_start(a, "TextSampleEntryBox", trace);
    1939           2 :         gf_fprintf(trace, "dataReferenceIndex=\"%d\" displayFlags=\"%x\" textJustification=\"%d\"  ",
    1940           1 :                 p->dataReferenceIndex, p->displayFlags, p->textJustification);
    1941           1 :         if (p->textName)
    1942           0 :                 gf_fprintf(trace, "textName=\"%s\" ", p->textName);
    1943             :         tx3g_dump_rgb16(trace, "background-color", p->background_color);
    1944             :         tx3g_dump_rgb16(trace, " foreground-color", p->foreground_color);
    1945           1 :         gf_fprintf(trace, ">\n");
    1946             : 
    1947           1 :         gf_fprintf(trace, "<DefaultBox>\n");
    1948             :         tx3g_dump_box(trace, &p->default_box);
    1949           1 :         gf_isom_box_dump_done("DefaultBox", a, trace);
    1950           1 :         gf_isom_box_dump_done("TextSampleEntryBox", a, trace);
    1951           1 :         return GF_OK;
    1952             : }
    1953             : 
    1954           1 : GF_Err styl_box_dump(GF_Box *a, FILE * trace)
    1955             : {
    1956             :         u32 i;
    1957             :         GF_TextStyleBox*p = (GF_TextStyleBox*)a;
    1958           1 :         gf_isom_box_dump_start(a, "TextStyleBox", trace);
    1959           1 :         gf_fprintf(trace, ">\n");
    1960           1 :         for (i=0; i<p->entry_count; i++) tx3g_dump_style(trace, &p->styles[i]);
    1961           1 :         if (!p->size) {
    1962           1 :                 gf_fprintf(trace, "<StyleRecord startChar=\"\" endChar=\"\" fontID=\"\" styles=\"Normal|Bold|Italic|Underlined\" fontSize=\"\" textColor=\"\" />\n");
    1963             :         }
    1964           1 :         gf_isom_box_dump_done("TextStyleBox", a, trace);
    1965           1 :         return GF_OK;
    1966             : }
    1967           1 : GF_Err hlit_box_dump(GF_Box *a, FILE * trace)
    1968             : {
    1969             :         GF_TextHighlightBox*p = (GF_TextHighlightBox*)a;
    1970           1 :         gf_isom_box_dump_start(a, "TextHighlightBox", trace);
    1971           1 :         gf_fprintf(trace, "startcharoffset=\"%d\" endcharoffset=\"%d\">\n", p->startcharoffset, p->endcharoffset);
    1972           1 :         gf_isom_box_dump_done("TextHighlightBox", a, trace);
    1973           1 :         return GF_OK;
    1974             : }
    1975           1 : GF_Err hclr_box_dump(GF_Box *a, FILE * trace)
    1976             : {
    1977             :         GF_TextHighlightColorBox*p = (GF_TextHighlightColorBox*)a;
    1978           1 :         gf_isom_box_dump_start(a, "TextHighlightColorBox", trace);
    1979           1 :         tx3g_dump_rgba8(trace, "highlight_color", p->hil_color);
    1980           1 :         gf_fprintf(trace, ">\n");
    1981           1 :         gf_isom_box_dump_done("TextHighlightColorBox", a, trace);
    1982           1 :         return GF_OK;
    1983             : }
    1984             : 
    1985           1 : GF_Err krok_box_dump(GF_Box *a, FILE * trace)
    1986             : {
    1987             :         u32 i;
    1988             :         GF_TextKaraokeBox*p = (GF_TextKaraokeBox*)a;
    1989           1 :         gf_isom_box_dump_start(a, "TextKaraokeBox", trace);
    1990           1 :         gf_fprintf(trace, "highlight_starttime=\"%d\">\n", p->highlight_starttime);
    1991           1 :         for (i=0; i<p->nb_entries; i++) {
    1992           0 :                 gf_fprintf(trace, "<KaraokeRecord highlight_endtime=\"%d\" start_charoffset=\"%d\" end_charoffset=\"%d\"/>\n", p->records[i].highlight_endtime, p->records[i].start_charoffset, p->records[i].end_charoffset);
    1993             :         }
    1994           1 :         if (!p->size) {
    1995           1 :                 gf_fprintf(trace, "<KaraokeRecord highlight_endtime=\"\" start_charoffset=\"\" end_charoffset=\"\"/>\n");
    1996             :         }
    1997           1 :         gf_isom_box_dump_done("TextKaraokeBox", a, trace);
    1998           1 :         return GF_OK;
    1999             : }
    2000           1 : GF_Err dlay_box_dump(GF_Box *a, FILE * trace)
    2001             : {
    2002             :         GF_TextScrollDelayBox*p = (GF_TextScrollDelayBox*)a;
    2003           1 :         gf_isom_box_dump_start(a, "TextScrollDelayBox", trace);
    2004           1 :         gf_fprintf(trace, "scroll_delay=\"%d\">\n", p->scroll_delay);
    2005           1 :         gf_isom_box_dump_done("TextScrollDelayBox", a, trace);
    2006           1 :         return GF_OK;
    2007             : }
    2008           1 : GF_Err href_box_dump(GF_Box *a, FILE * trace)
    2009             : {
    2010             :         GF_TextHyperTextBox*p = (GF_TextHyperTextBox*)a;
    2011           1 :         gf_isom_box_dump_start(a, "TextHyperTextBox", trace);
    2012           1 :         gf_fprintf(trace, "startcharoffset=\"%d\" endcharoffset=\"%d\" URL=\"%s\" altString=\"%s\">\n", p->startcharoffset, p->endcharoffset, p->URL ? p->URL : "NULL", p->URL_hint ? p->URL_hint : "NULL");
    2013           1 :         gf_isom_box_dump_done("TextHyperTextBox", a, trace);
    2014           1 :         return GF_OK;
    2015             : }
    2016           1 : GF_Err tbox_box_dump(GF_Box *a, FILE * trace)
    2017             : {
    2018             :         GF_TextBoxBox*p = (GF_TextBoxBox*)a;
    2019           1 :         gf_isom_box_dump_start(a, "TextBoxBox", trace);
    2020           1 :         gf_fprintf(trace, ">\n");
    2021             :         tx3g_dump_box(trace, &p->box);
    2022           1 :         gf_isom_box_dump_done("TextBoxBox", a, trace);
    2023           1 :         return GF_OK;
    2024             : }
    2025           1 : GF_Err blnk_box_dump(GF_Box *a, FILE * trace)
    2026             : {
    2027             :         GF_TextBlinkBox*p = (GF_TextBlinkBox*)a;
    2028           1 :         gf_isom_box_dump_start(a, "TextBlinkBox", trace);
    2029           1 :         gf_fprintf(trace, "start_charoffset=\"%d\" end_charoffset=\"%d\">\n", p->startcharoffset, p->endcharoffset);
    2030           1 :         gf_isom_box_dump_done("TextBlinkBox", a, trace);
    2031           1 :         return GF_OK;
    2032             : }
    2033           1 : GF_Err twrp_box_dump(GF_Box *a, FILE * trace)
    2034             : {
    2035             :         GF_TextWrapBox*p = (GF_TextWrapBox*)a;
    2036           1 :         gf_isom_box_dump_start(a, "TextWrapBox", trace);
    2037           1 :         gf_fprintf(trace, "wrap_flag=\"%s\">\n", p->wrap_flag ? ( (p->wrap_flag>1) ? "Reserved" : "Automatic" ) : "No Wrap");
    2038           1 :         gf_isom_box_dump_done("TextWrapBox", a, trace);
    2039           1 :         return GF_OK;
    2040             : }
    2041             : 
    2042             : 
    2043          23 : GF_Err meta_box_dump(GF_Box *a, FILE * trace)
    2044             : {
    2045          23 :         gf_isom_box_dump_start(a, "MetaBox", trace);
    2046          23 :         gf_fprintf(trace, ">\n");
    2047          23 :         gf_isom_box_dump_done("MetaBox", a, trace);
    2048          23 :         return GF_OK;
    2049             : }
    2050             : 
    2051             : 
    2052           1 : GF_Err xml_box_dump(GF_Box *a, FILE * trace)
    2053             : {
    2054             :         GF_XMLBox *p = (GF_XMLBox *)a;
    2055           1 :         gf_isom_box_dump_start(a, "XMLBox", trace);
    2056           1 :         gf_fprintf(trace, ">\n");
    2057           1 :         gf_fprintf(trace, "<![CDATA[\n");
    2058           1 :         if (p->xml)
    2059           0 :                 gf_fwrite(p->xml, strlen(p->xml), trace);
    2060           1 :         gf_fprintf(trace, "]]>\n");
    2061           1 :         gf_isom_box_dump_done("XMLBox", a, trace);
    2062           1 :         return GF_OK;
    2063             : }
    2064             : 
    2065             : 
    2066           1 : GF_Err bxml_box_dump(GF_Box *a, FILE * trace)
    2067             : {
    2068             :         GF_BinaryXMLBox *p = (GF_BinaryXMLBox *)a;
    2069           1 :         gf_isom_box_dump_start(a, "BinaryXMLBox", trace);
    2070           1 :         gf_fprintf(trace, "binarySize=\"%d\">\n", p->data_length);
    2071           1 :         gf_isom_box_dump_done("BinaryXMLBox", a, trace);
    2072           1 :         return GF_OK;
    2073             : }
    2074             : 
    2075             : 
    2076          17 : GF_Err pitm_box_dump(GF_Box *a, FILE * trace)
    2077             : {
    2078             :         GF_PrimaryItemBox *p = (GF_PrimaryItemBox *)a;
    2079          17 :         gf_isom_box_dump_start(a, "PrimaryItemBox", trace);
    2080          17 :         gf_fprintf(trace, "item_ID=\"%d\">\n", p->item_ID);
    2081          17 :         gf_isom_box_dump_done("PrimaryItemBox", a, trace);
    2082          17 :         return GF_OK;
    2083             : }
    2084             : 
    2085          11 : GF_Err ipro_box_dump(GF_Box *a, FILE * trace)
    2086             : {
    2087          11 :         gf_isom_box_dump_start(a, "ItemProtectionBox", trace);
    2088          11 :         gf_fprintf(trace, ">\n");
    2089          11 :         gf_isom_box_dump_done("ItemProtectionBox", a, trace);
    2090          11 :         return GF_OK;
    2091             : }
    2092             : 
    2093          47 : GF_Err infe_box_dump(GF_Box *a, FILE * trace)
    2094             : {
    2095             :         GF_ItemInfoEntryBox *p = (GF_ItemInfoEntryBox *)a;
    2096          47 :         gf_isom_box_dump_start(a, "ItemInfoEntryBox", trace);
    2097          47 :         gf_fprintf(trace, "item_ID=\"%d\" item_protection_index=\"%d\" item_name=\"%s\" content_type=\"%s\" content_encoding=\"%s\" item_type=\"%s\">\n", p->item_ID, p->item_protection_index, p->item_name, p->content_type, p->content_encoding, gf_4cc_to_str(p->item_type));
    2098          47 :         gf_isom_box_dump_done("ItemInfoEntryBox", a, trace);
    2099          47 :         return GF_OK;
    2100             : }
    2101             : 
    2102          24 : GF_Err iinf_box_dump(GF_Box *a, FILE * trace)
    2103             : {
    2104          24 :         gf_isom_box_dump_start(a, "ItemInfoBox", trace);
    2105          24 :         gf_fprintf(trace, ">\n");
    2106          24 :         gf_isom_box_dump_done("ItemInfoBox", a, trace);
    2107          24 :         return GF_OK;
    2108             : }
    2109             : 
    2110          25 : GF_Err iloc_box_dump(GF_Box *a, FILE * trace)
    2111             : {
    2112             :         u32 i, j, count, count2;
    2113             :         GF_ItemLocationBox *p = (GF_ItemLocationBox*)a;
    2114          25 :         gf_isom_box_dump_start(a, "ItemLocationBox", trace);
    2115          25 :         gf_fprintf(trace, "offset_size=\"%d\" length_size=\"%d\" base_offset_size=\"%d\" index_size=\"%d\">\n", p->offset_size, p->length_size, p->base_offset_size, p->index_size);
    2116          25 :         count = gf_list_count(p->location_entries);
    2117          68 :         for (i=0; i<count; i++) {
    2118          43 :                 GF_ItemLocationEntry *ie = (GF_ItemLocationEntry *)gf_list_get(p->location_entries, i);
    2119          43 :                 count2 = gf_list_count(ie->extent_entries);
    2120          43 :                 gf_fprintf(trace, "<ItemLocationEntry item_ID=\"%d\" data_reference_index=\"%d\" base_offset=\""LLD"\" construction_method=\"%d\">\n", ie->item_ID, ie->data_reference_index, ie->base_offset, ie->construction_method);
    2121          94 :                 for (j=0; j<count2; j++) {
    2122          51 :                         GF_ItemExtentEntry *iee = (GF_ItemExtentEntry *)gf_list_get(ie->extent_entries, j);
    2123          51 :                         gf_fprintf(trace, "<ItemExtentEntry extent_offset=\""LLD"\" extent_length=\""LLD"\" extent_index=\""LLD"\" />\n", iee->extent_offset, iee->extent_length, iee->extent_index);
    2124             :                 }
    2125          43 :                 gf_fprintf(trace, "</ItemLocationEntry>\n");
    2126             :         }
    2127          25 :         if (!p->size) {
    2128           3 :                 gf_fprintf(trace, "<ItemLocationEntry item_ID=\"\" data_reference_index=\"\" base_offset=\"\" construction_method=\"\">\n");
    2129           3 :                 gf_fprintf(trace, "<ItemExtentEntry extent_offset=\"\" extent_length=\"\" extent_index=\"\" />\n");
    2130           3 :                 gf_fprintf(trace, "</ItemLocationEntry>\n");
    2131             :         }
    2132          25 :         gf_isom_box_dump_done("ItemLocationBox", a, trace);
    2133          25 :         return GF_OK;
    2134             : }
    2135             : 
    2136          14 : GF_Err iref_box_dump(GF_Box *a, FILE * trace)
    2137             : {
    2138          14 :         gf_isom_box_dump_start(a, "ItemReferenceBox", trace);
    2139          14 :         gf_fprintf(trace, ">\n");
    2140          14 :         gf_isom_box_dump_done("ItemReferenceBox", a, trace);
    2141          14 :         return GF_OK;
    2142             : }
    2143             : 
    2144           1 : GF_Err hinf_box_dump(GF_Box *a, FILE * trace)
    2145             : {
    2146             : //      GF_HintInfoBox *p  = (GF_HintInfoBox *)a;
    2147           1 :         gf_isom_box_dump_start(a, "HintInfoBox", trace);
    2148           1 :         gf_fprintf(trace, ">\n");
    2149           1 :         gf_isom_box_dump_done("HintInfoBox", a, trace);
    2150           1 :         return GF_OK;
    2151             : }
    2152             : 
    2153           1 : GF_Err trpy_box_dump(GF_Box *a, FILE * trace)
    2154             : {
    2155             :         GF_TRPYBox *p = (GF_TRPYBox *)a;
    2156           1 :         gf_isom_box_dump_start(a, "LargeTotalRTPBytesBox", trace);
    2157           1 :         gf_fprintf(trace, "RTPBytesSent=\""LLD"\">\n", p->nbBytes);
    2158           1 :         gf_isom_box_dump_done("LargeTotalRTPBytesBox", a, trace);
    2159           1 :         return GF_OK;
    2160             : }
    2161             : 
    2162           1 : GF_Err totl_box_dump(GF_Box *a, FILE * trace)
    2163             : {
    2164             :         GF_TOTLBox *p;
    2165             : 
    2166             :         p = (GF_TOTLBox *)a;
    2167           1 :         gf_isom_box_dump_start(a, "TotalRTPBytesBox", trace);
    2168           1 :         gf_fprintf(trace, "RTPBytesSent=\"%d\">\n", p->nbBytes);
    2169           1 :         gf_isom_box_dump_done("TotalRTPBytesBox", a, trace);
    2170           1 :         return GF_OK;
    2171             : }
    2172             : 
    2173           1 : GF_Err nump_box_dump(GF_Box *a, FILE * trace)
    2174             : {
    2175             :         GF_NUMPBox *p;
    2176             : 
    2177             :         p = (GF_NUMPBox *)a;
    2178           1 :         gf_isom_box_dump_start(a, "LargeTotalPacketBox", trace);
    2179           1 :         gf_fprintf(trace, "PacketsSent=\""LLD"\">\n", p->nbPackets);
    2180           1 :         gf_isom_box_dump_done("LargeTotalPacketBox", a, trace);
    2181           1 :         return GF_OK;
    2182             : }
    2183             : 
    2184           1 : GF_Err npck_box_dump(GF_Box *a, FILE * trace)
    2185             : {
    2186             :         GF_NPCKBox *p;
    2187             :         p = (GF_NPCKBox *)a;
    2188           1 :         gf_isom_box_dump_start(a, "TotalPacketBox", trace);
    2189           1 :         gf_fprintf(trace, "packetsSent=\"%d\">\n", p->nbPackets);
    2190           1 :         gf_isom_box_dump_done("TotalPacketBox", a, trace);
    2191           1 :         return GF_OK;
    2192             : }
    2193             : 
    2194           1 : GF_Err tpyl_box_dump(GF_Box *a, FILE * trace)
    2195             : {
    2196             :         GF_NTYLBox *p;
    2197             :         p = (GF_NTYLBox *)a;
    2198           1 :         gf_isom_box_dump_start(a, "LargeTotalMediaBytesBox", trace);
    2199           1 :         gf_fprintf(trace, "BytesSent=\""LLD"\">\n", p->nbBytes);
    2200           1 :         gf_isom_box_dump_done("LargeTotalMediaBytesBox", a, trace);
    2201           1 :         return GF_OK;
    2202             : }
    2203             : 
    2204           1 : GF_Err tpay_box_dump(GF_Box *a, FILE * trace)
    2205             : {
    2206             :         GF_TPAYBox *p;
    2207             :         p = (GF_TPAYBox *)a;
    2208           1 :         gf_isom_box_dump_start(a, "TotalMediaBytesBox", trace);
    2209           1 :         gf_fprintf(trace, "BytesSent=\"%d\">\n", p->nbBytes);
    2210           1 :         gf_isom_box_dump_done("TotalMediaBytesBox", a, trace);
    2211           1 :         return GF_OK;
    2212             : }
    2213             : 
    2214           1 : GF_Err maxr_box_dump(GF_Box *a, FILE * trace)
    2215             : {
    2216             :         GF_MAXRBox *p;
    2217             :         p = (GF_MAXRBox *)a;
    2218           1 :         gf_isom_box_dump_start(a, "MaxDataRateBox", trace);
    2219           1 :         gf_fprintf(trace, "MaxDataRate=\"%d\" Granularity=\"%d\">\n", p->maxDataRate, p->granularity);
    2220           1 :         gf_isom_box_dump_done("MaxDataRateBox", a, trace);
    2221           1 :         return GF_OK;
    2222             : }
    2223             : 
    2224           1 : GF_Err dmed_box_dump(GF_Box *a, FILE * trace)
    2225             : {
    2226             :         GF_DMEDBox *p;
    2227             : 
    2228             :         p = (GF_DMEDBox *)a;
    2229           1 :         gf_isom_box_dump_start(a, "BytesFromMediaTrackBox", trace);
    2230           1 :         gf_fprintf(trace, "BytesSent=\""LLD"\">\n", p->nbBytes);
    2231           1 :         gf_isom_box_dump_done("BytesFromMediaTrackBox", a, trace);
    2232           1 :         return GF_OK;
    2233             : }
    2234             : 
    2235           1 : GF_Err dimm_box_dump(GF_Box *a, FILE * trace)
    2236             : {
    2237             :         GF_DIMMBox *p;
    2238             :         p = (GF_DIMMBox *)a;
    2239           1 :         gf_isom_box_dump_start(a, "ImmediateDataBytesBox", trace);
    2240           1 :         gf_fprintf(trace, "BytesSent=\""LLD"\">\n", p->nbBytes);
    2241           1 :         gf_isom_box_dump_done("ImmediateDataBytesBox", a, trace);
    2242           1 :         return GF_OK;
    2243             : }
    2244             : 
    2245           1 : GF_Err drep_box_dump(GF_Box *a, FILE * trace)
    2246             : {
    2247             :         GF_DREPBox *p;
    2248             :         p = (GF_DREPBox *)a;
    2249           1 :         gf_isom_box_dump_start(a, "RepeatedDataBytesBox", trace);
    2250           1 :         gf_fprintf(trace, "RepeatedBytes=\""LLD"\">\n", p->nbBytes);
    2251           1 :         gf_isom_box_dump_done("RepeatedDataBytesBox", a, trace);
    2252           1 :         return GF_OK;
    2253             : }
    2254             : 
    2255           1 : GF_Err tssy_box_dump(GF_Box *a, FILE * trace)
    2256             : {
    2257             :         GF_TimeStampSynchronyBox *p = (GF_TimeStampSynchronyBox *)a;
    2258           1 :         gf_isom_box_dump_start(a, "TimeStampSynchronyBox", trace);
    2259           1 :         gf_fprintf(trace, "timestamp_sync=\"%d\">\n", p->timestamp_sync);
    2260           1 :         gf_isom_box_dump_done("TimeStampSynchronyBox", a, trace);
    2261           1 :         return GF_OK;
    2262             : }
    2263             : 
    2264           1 : GF_Err rssr_box_dump(GF_Box *a, FILE * trace)
    2265             : {
    2266             :         GF_ReceivedSsrcBox *p = (GF_ReceivedSsrcBox *)a;
    2267           1 :         gf_isom_box_dump_start(a, "ReceivedSsrcBox", trace);
    2268           1 :         gf_fprintf(trace, "SSRC=\"%d\">\n", p->ssrc);
    2269           1 :         gf_isom_box_dump_done("ReceivedSsrcBox", a, trace);
    2270           1 :         return GF_OK;
    2271             : }
    2272             : 
    2273           1 : GF_Err tmin_box_dump(GF_Box *a, FILE * trace)
    2274             : {
    2275             :         GF_TMINBox *p;
    2276             :         p = (GF_TMINBox *)a;
    2277           1 :         gf_isom_box_dump_start(a, "MinTransmissionTimeBox", trace);
    2278           1 :         gf_fprintf(trace, "MinimumTransmitTime=\"%d\">\n", p->minTime);
    2279           1 :         gf_isom_box_dump_done("MinTransmissionTimeBox", a, trace);
    2280           1 :         return GF_OK;
    2281             : }
    2282             : 
    2283           1 : GF_Err tmax_box_dump(GF_Box *a, FILE * trace)
    2284             : {
    2285             :         GF_TMAXBox *p;
    2286             :         p = (GF_TMAXBox *)a;
    2287           1 :         gf_isom_box_dump_start(a, "MaxTransmissionTimeBox", trace);
    2288           1 :         gf_fprintf(trace, "MaximumTransmitTime=\"%d\">\n", p->maxTime);
    2289           1 :         gf_isom_box_dump_done("MaxTransmissionTimeBox", a, trace);
    2290           1 :         return GF_OK;
    2291             : }
    2292             : 
    2293           1 : GF_Err pmax_box_dump(GF_Box *a, FILE * trace)
    2294             : {
    2295             :         GF_PMAXBox *p;
    2296             :         p = (GF_PMAXBox *)a;
    2297           1 :         gf_isom_box_dump_start(a, "MaxPacketSizeBox", trace);
    2298           1 :         gf_fprintf(trace, "MaximumSize=\"%d\">\n", p->maxSize);
    2299           1 :         gf_isom_box_dump_done("MaxPacketSizeBox", a, trace);
    2300           1 :         return GF_OK;
    2301             : }
    2302             : 
    2303           1 : GF_Err dmax_box_dump(GF_Box *a, FILE * trace)
    2304             : {
    2305             :         GF_DMAXBox *p;
    2306             :         p = (GF_DMAXBox *)a;
    2307           1 :         gf_isom_box_dump_start(a, "MaxPacketDurationBox", trace);
    2308           1 :         gf_fprintf(trace, "MaximumDuration=\"%d\">\n", p->maxDur);
    2309           1 :         gf_isom_box_dump_done("MaxPacketDurationBox", a, trace);
    2310           1 :         return GF_OK;
    2311             : }
    2312             : 
    2313           1 : GF_Err payt_box_dump(GF_Box *a, FILE * trace)
    2314             : {
    2315             :         GF_PAYTBox *p;
    2316             :         p = (GF_PAYTBox *)a;
    2317           1 :         gf_isom_box_dump_start(a, "PayloadTypeBox", trace);
    2318           1 :         gf_fprintf(trace, "PayloadID=\"%d\" PayloadString=\"%s\">\n", p->payloadCode, p->payloadString);
    2319           1 :         gf_isom_box_dump_done("PayloadTypeBox", a, trace);
    2320           1 :         return GF_OK;
    2321             : }
    2322             : 
    2323           1 : GF_Err name_box_dump(GF_Box *a, FILE * trace)
    2324             : {
    2325             :         GF_NameBox *p;
    2326             :         p = (GF_NameBox *)a;
    2327           1 :         gf_isom_box_dump_start(a, "NameBox", trace);
    2328           1 :         gf_fprintf(trace, "Name=\"%s\">\n", p->string);
    2329           1 :         gf_isom_box_dump_done("NameBox", a, trace);
    2330           1 :         return GF_OK;
    2331             : }
    2332             : 
    2333           1 : GF_Err rely_box_dump(GF_Box *a, FILE * trace)
    2334             : {
    2335             :         GF_RelyHintBox *p;
    2336             :         p = (GF_RelyHintBox *)a;
    2337           1 :         gf_isom_box_dump_start(a, "RelyTransmissionBox", trace);
    2338           1 :         gf_fprintf(trace, "preferred=\"%d\" required=\"%d\">\n", p->preferred, p->required);
    2339           1 :         gf_isom_box_dump_done("RelyTransmissionBox", a, trace);
    2340           1 :         return GF_OK;
    2341             : }
    2342             : 
    2343           1 : GF_Err snro_box_dump(GF_Box *a, FILE * trace)
    2344             : {
    2345             :         GF_SeqOffHintEntryBox *p;
    2346             :         p = (GF_SeqOffHintEntryBox *)a;
    2347           1 :         gf_isom_box_dump_start(a, "PacketSequenceOffsetBox", trace);
    2348           1 :         gf_fprintf(trace, "SeqNumOffset=\"%d\">\n", p->SeqOffset);
    2349           1 :         gf_isom_box_dump_done("PacketSequenceOffsetBox", a, trace);
    2350           1 :         return GF_OK;
    2351             : }
    2352             : 
    2353           1 : GF_Err tims_box_dump(GF_Box *a, FILE * trace)
    2354             : {
    2355             :         GF_TSHintEntryBox *p;
    2356             :         p = (GF_TSHintEntryBox *)a;
    2357           1 :         gf_isom_box_dump_start(a, "RTPTimeScaleBox", trace);
    2358           1 :         gf_fprintf(trace, "TimeScale=\"%d\">\n", p->timeScale);
    2359           1 :         gf_isom_box_dump_done("RTPTimeScaleBox", a, trace);
    2360           1 :         return GF_OK;
    2361             : }
    2362             : 
    2363           1 : GF_Err tsro_box_dump(GF_Box *a, FILE * trace)
    2364             : {
    2365             :         GF_TimeOffHintEntryBox *p;
    2366             :         p = (GF_TimeOffHintEntryBox *)a;
    2367           1 :         gf_isom_box_dump_start(a, "TimeStampOffsetBox", trace);
    2368           1 :         gf_fprintf(trace, "TimeStampOffset=\"%d\">\n", p->TimeOffset);
    2369           1 :         gf_isom_box_dump_done("TimeStampOffsetBox", a, trace);
    2370           1 :         return GF_OK;
    2371             : }
    2372             : 
    2373             : 
    2374           5 : GF_Err ghnt_box_dump(GF_Box *a, FILE * trace)
    2375             : {
    2376             :         char *name;
    2377             :         GF_HintSampleEntryBox *p;
    2378             :         p = (GF_HintSampleEntryBox *)a;
    2379             : 
    2380           5 :         if (a->type == GF_ISOM_BOX_TYPE_RTP_STSD) {
    2381             :                 name = "RTPHintSampleEntryBox";
    2382           5 :         } else if (a->type == GF_ISOM_BOX_TYPE_SRTP_STSD) {
    2383             :                 name = "SRTPHintSampleEntryBox";
    2384           5 :         } else if (a->type == GF_ISOM_BOX_TYPE_FDP_STSD) {
    2385             :                 name = "FDPHintSampleEntryBox";
    2386           5 :         } else if (a->type == GF_ISOM_BOX_TYPE_RRTP_STSD) {
    2387             :                 name = "RTPReceptionHintSampleEntryBox";
    2388           5 :         } else if (a->type == GF_ISOM_BOX_TYPE_RTCP_STSD) {
    2389             :                 name = "RTCPReceptionHintSampleEntryBox";
    2390             :         } else {
    2391             :                 name = "GenericHintSampleEntryBox";
    2392             :         }
    2393           5 :         gf_isom_box_dump_start(a, name, trace);
    2394           5 :         gf_fprintf(trace, "DataReferenceIndex=\"%d\" HintTrackVersion=\"%d\" LastCompatibleVersion=\"%d\"", p->dataReferenceIndex, p->HintTrackVersion, p->LastCompatibleVersion);
    2395           5 :         if ((a->type == GF_ISOM_BOX_TYPE_RTP_STSD) || (a->type == GF_ISOM_BOX_TYPE_SRTP_STSD) || (a->type == GF_ISOM_BOX_TYPE_RRTP_STSD) || (a->type == GF_ISOM_BOX_TYPE_RTCP_STSD)) {
    2396           0 :                 gf_fprintf(trace, " MaxPacketSize=\"%d\"", p->MaxPacketSize);
    2397           5 :         } else if (a->type == GF_ISOM_BOX_TYPE_FDP_STSD) {
    2398           0 :                 gf_fprintf(trace, " partition_entry_ID=\"%d\" FEC_overhead=\"%d\"", p->partition_entry_ID, p->FEC_overhead);
    2399             :         }
    2400           5 :         gf_fprintf(trace, ">\n");
    2401             : 
    2402           5 :         gf_isom_box_dump_done(name, a, trace);
    2403           5 :         return GF_OK;
    2404             : }
    2405             : 
    2406           1 : GF_Err hnti_box_dump(GF_Box *a, FILE * trace)
    2407             : {
    2408           1 :         gf_isom_box_dump_start(a, "HintTrackInfoBox", trace);
    2409           1 :         gf_fprintf(trace, ">\n");
    2410           1 :         gf_isom_box_dump_done("HintTrackInfoBox", a, trace);
    2411           1 :         return GF_OK;
    2412             : }
    2413             : 
    2414           1 : GF_Err sdp_box_dump(GF_Box *a, FILE * trace)
    2415             : {
    2416             :         GF_SDPBox *p = (GF_SDPBox *)a;
    2417           1 :         gf_isom_box_dump_start(a, "SDPBox", trace);
    2418           1 :         gf_fprintf(trace, ">\n");
    2419           1 :         if (p->sdpText)
    2420           0 :                 gf_fprintf(trace, "<!-- sdp text: %s -->\n", p->sdpText);
    2421           1 :         gf_isom_box_dump_done("SDPBox", a, trace);
    2422           1 :         return GF_OK;
    2423             : }
    2424             : 
    2425           1 : GF_Err rtp_hnti_box_dump(GF_Box *a, FILE * trace)
    2426             : {
    2427             :         GF_RTPBox *p = (GF_RTPBox *)a;
    2428           1 :         gf_isom_box_dump_start(a, "RTPMovieHintInformationBox", trace);
    2429           1 :         gf_fprintf(trace, "descriptionformat=\"%s\">\n", gf_4cc_to_str(p->subType));
    2430           1 :         if (p->sdpText)
    2431           0 :                 gf_fprintf(trace, "<!-- sdp text: %s -->\n", p->sdpText);
    2432           1 :         gf_isom_box_dump_done("RTPMovieHintInformationBox", a, trace);
    2433           1 :         return GF_OK;
    2434             : }
    2435             : 
    2436           1 : GF_Err rtpo_box_dump(GF_Box *a, FILE * trace)
    2437             : {
    2438             :         GF_RTPOBox *p;
    2439             :         p = (GF_RTPOBox *)a;
    2440           1 :         gf_isom_box_dump_start(a, "RTPTimeOffsetBox", trace);
    2441           1 :         gf_fprintf(trace, "PacketTimeOffset=\"%d\">\n", p->timeOffset);
    2442           1 :         gf_isom_box_dump_done("RTPTimeOffsetBox", a, trace);
    2443           1 :         return GF_OK;
    2444             : }
    2445             : 
    2446             : #ifndef GPAC_DISABLE_ISOM_FRAGMENTS
    2447             : 
    2448           4 : GF_Err mvex_box_dump(GF_Box *a, FILE * trace)
    2449             : {
    2450           4 :         gf_isom_box_dump_start(a, "MovieExtendsBox", trace);
    2451           4 :         gf_fprintf(trace, ">\n");
    2452           4 :         gf_isom_box_dump_done("MovieExtendsBox", a, trace);
    2453           4 :         return GF_OK;
    2454             : }
    2455             : 
    2456           3 : GF_Err mehd_box_dump(GF_Box *a, FILE * trace)
    2457             : {
    2458             :         GF_MovieExtendsHeaderBox *p = (GF_MovieExtendsHeaderBox*)a;
    2459           3 :         gf_isom_box_dump_start(a, "MovieExtendsHeaderBox", trace);
    2460           3 :         gf_fprintf(trace, "fragmentDuration=\""LLD"\" >\n", p->fragment_duration);
    2461           3 :         gf_isom_box_dump_done("MovieExtendsHeaderBox", a, trace);
    2462           3 :         return GF_OK;
    2463             : }
    2464             : 
    2465          19 : void sample_flags_dump(const char *name, u32 sample_flags, FILE * trace)
    2466             : {
    2467          19 :         gf_fprintf(trace, "<%s", name);
    2468          19 :         gf_fprintf(trace, " IsLeading=\"%d\"", GF_ISOM_GET_FRAG_LEAD(sample_flags) );
    2469          19 :         gf_fprintf(trace, " SampleDependsOn=\"%d\"", GF_ISOM_GET_FRAG_DEPENDS(sample_flags) );
    2470          19 :         gf_fprintf(trace, " SampleIsDependedOn=\"%d\"", GF_ISOM_GET_FRAG_DEPENDED(sample_flags) );
    2471          19 :         gf_fprintf(trace, " SampleHasRedundancy=\"%d\"", GF_ISOM_GET_FRAG_REDUNDANT(sample_flags) );
    2472          19 :         gf_fprintf(trace, " SamplePadding=\"%d\"", GF_ISOM_GET_FRAG_PAD(sample_flags) );
    2473          19 :         gf_fprintf(trace, " SampleSync=\"%d\"", GF_ISOM_GET_FRAG_SYNC(sample_flags));
    2474          19 :         gf_fprintf(trace, " SampleDegradationPriority=\"%d\"", GF_ISOM_GET_FRAG_DEG(sample_flags));
    2475          19 :         gf_fprintf(trace, "/>\n");
    2476          19 : }
    2477             : 
    2478           6 : GF_Err trex_box_dump(GF_Box *a, FILE * trace)
    2479             : {
    2480             :         GF_TrackExtendsBox *p;
    2481             :         p = (GF_TrackExtendsBox *)a;
    2482           6 :         gf_isom_box_dump_start(a, "TrackExtendsBox", trace);
    2483           6 :         gf_fprintf(trace, "TrackID=\"%d\"", p->trackID);
    2484           6 :         gf_fprintf(trace, " SampleDescriptionIndex=\"%d\" SampleDuration=\"%d\" SampleSize=\"%d\"", p->def_sample_desc_index, p->def_sample_duration, p->def_sample_size);
    2485           6 :         gf_fprintf(trace, ">\n");
    2486           6 :         sample_flags_dump("DefaultSampleFlags", p->def_sample_flags, trace);
    2487           6 :         gf_isom_box_dump_done("TrackExtendsBox", a, trace);
    2488           6 :         return GF_OK;
    2489             : }
    2490             : 
    2491           1 : GF_Err trep_box_dump(GF_Box *a, FILE * trace)
    2492             : {
    2493             :         GF_TrackExtensionPropertiesBox *p = (GF_TrackExtensionPropertiesBox*)a;
    2494           1 :         gf_isom_box_dump_start(a, "TrackExtensionPropertiesBox", trace);
    2495           1 :         gf_fprintf(trace, "TrackID=\"%d\">\n", p->trackID);
    2496           1 :         gf_isom_box_dump_done("TrackExtensionPropertiesBox", a, trace);
    2497           1 :         return GF_OK;
    2498             : }
    2499             : 
    2500          16 : GF_Err moof_box_dump(GF_Box *a, FILE * trace)
    2501             : {
    2502             :         GF_MovieFragmentBox *p;
    2503             :         p = (GF_MovieFragmentBox *)a;
    2504          16 :         gf_isom_box_dump_start(a, "MovieFragmentBox", trace);
    2505          16 :         gf_fprintf(trace, "TrackFragments=\"%d\"", gf_list_count(p->TrackList));
    2506          16 :         if (p->internal_flags & GF_ISOM_BOX_COMPRESSED)
    2507           0 :                 gf_fprintf(trace, " compressedSize=\""LLU"\"", p->size - p->compressed_diff);
    2508          16 :         gf_fprintf(trace, ">\n");
    2509          16 :         gf_isom_box_dump_done("MovieFragmentBox", a, trace);
    2510          16 :         return GF_OK;
    2511             : }
    2512             : 
    2513          16 : GF_Err mfhd_box_dump(GF_Box *a, FILE * trace)
    2514             : {
    2515             :         GF_MovieFragmentHeaderBox *p;
    2516             :         p = (GF_MovieFragmentHeaderBox *)a;
    2517          16 :         gf_isom_box_dump_start(a, "MovieFragmentHeaderBox", trace);
    2518          16 :         gf_fprintf(trace, "FragmentSequenceNumber=\"%d\">\n", p->sequence_number);
    2519          16 :         gf_isom_box_dump_done("MovieFragmentHeaderBox", a, trace);
    2520          16 :         return GF_OK;
    2521             : }
    2522             : 
    2523          16 : GF_Err traf_box_dump(GF_Box *a, FILE * trace)
    2524             : {
    2525          16 :         gf_isom_box_dump_start(a, "TrackFragmentBox", trace);
    2526          16 :         gf_fprintf(trace, ">\n");
    2527          16 :         gf_isom_box_dump_done("TrackFragmentBox", a, trace);
    2528          16 :         return GF_OK;
    2529             : }
    2530             : 
    2531           9 : static void frag_dump_sample_flags(FILE * trace, u32 flags, u32 field_idx)
    2532             : {
    2533           9 :         if (!field_idx) return;
    2534           9 :         if (field_idx==1) {
    2535           0 :                 gf_fprintf(trace, " IsLeading=\"%d\" DependsOn=\"%d\"", GF_ISOM_GET_FRAG_LEAD(flags), GF_ISOM_GET_FRAG_DEPENDS(flags));
    2536           9 :         } else if (field_idx==2) {
    2537           0 :                 gf_fprintf(trace, " IsLeading=\"%d\" DependsOn=\"%d\" IsDependedOn=\"%d\" HasRedundancy=\"%d\" SamplePadding=\"%d\" Sync=\"%d\"",
    2538           0 :                 GF_ISOM_GET_FRAG_LEAD(flags), GF_ISOM_GET_FRAG_DEPENDS(flags), GF_ISOM_GET_FRAG_DEPENDED(flags), GF_ISOM_GET_FRAG_REDUNDANT(flags), GF_ISOM_GET_FRAG_PAD(flags), GF_ISOM_GET_FRAG_SYNC(flags));
    2539             :         } else {
    2540          54 :                 gf_fprintf(trace, " SamplePadding=\"%d\" Sync=\"%d\" DegradationPriority=\"%d\" IsLeading=\"%d\" DependsOn=\"%d\" IsDependedOn=\"%d\" HasRedundancy=\"%d\"",
    2541          18 :                 GF_ISOM_GET_FRAG_PAD(flags), GF_ISOM_GET_FRAG_SYNC(flags), GF_ISOM_GET_FRAG_DEG(flags),
    2542          36 :                 GF_ISOM_GET_FRAG_LEAD(flags), GF_ISOM_GET_FRAG_DEPENDS(flags), GF_ISOM_GET_FRAG_DEPENDED(flags), GF_ISOM_GET_FRAG_REDUNDANT(flags));
    2543             :         }
    2544             : }
    2545             : 
    2546          23 : GF_Err tfhd_box_dump(GF_Box *a, FILE * trace)
    2547             : {
    2548             :         GF_TrackFragmentHeaderBox *p;
    2549             :         p = (GF_TrackFragmentHeaderBox *)a;
    2550          23 :         gf_isom_box_dump_start(a, "TrackFragmentHeaderBox", trace);
    2551          23 :         gf_fprintf(trace, "TrackID=\"%u\"", p->trackID);
    2552             : 
    2553          23 :         if (p->flags & GF_ISOM_TRAF_BASE_OFFSET) {
    2554           1 :                 gf_fprintf(trace, " BaseDataOffset=\""LLU"\"", p->base_data_offset);
    2555             :         } else {
    2556          22 :                 gf_fprintf(trace, " BaseDataOffset=\"%s\"", (p->flags & GF_ISOM_MOOF_BASE_OFFSET) ? "moof" : "moof-or-previous-traf");
    2557             :         }
    2558             : 
    2559          23 :         if (p->flags & GF_ISOM_TRAF_SAMPLE_DESC)
    2560           4 :                 gf_fprintf(trace, " SampleDescriptionIndex=\"%u\"", p->sample_desc_index);
    2561          23 :         if (p->flags & GF_ISOM_TRAF_SAMPLE_DUR)
    2562           1 :                 gf_fprintf(trace, " SampleDuration=\"%u\"", p->def_sample_duration);
    2563          23 :         if (p->flags & GF_ISOM_TRAF_SAMPLE_SIZE)
    2564           1 :                 gf_fprintf(trace, " SampleSize=\"%u\"", p->def_sample_size);
    2565             : 
    2566          23 :         if (p->flags & GF_ISOM_TRAF_SAMPLE_FLAGS) {
    2567           3 :                 frag_dump_sample_flags(trace, p->def_sample_flags, 3);
    2568             :         }
    2569             : 
    2570          23 :         gf_fprintf(trace, ">\n");
    2571             : 
    2572          23 :         gf_isom_box_dump_done("TrackFragmentHeaderBox", a, trace);
    2573          23 :         return GF_OK;
    2574             : }
    2575             : 
    2576           4 : GF_Err tfxd_box_dump(GF_Box *a, FILE * trace)
    2577             : {
    2578             :         GF_MSSTimeExtBox *ptr = (GF_MSSTimeExtBox*)a;
    2579           4 :         if (!a) return GF_BAD_PARAM;
    2580           4 :         gf_isom_box_dump_start(a, "MSSTimeExtensionBox", trace);
    2581           4 :         gf_fprintf(trace, "AbsoluteTime=\""LLU"\" FragmentDuration=\""LLU"\">\n", ptr->absolute_time_in_track_timescale, ptr->fragment_duration_in_track_timescale);
    2582           4 :         gf_fprintf(trace, "<FullBoxInfo Version=\"%d\" Flags=\"%d\"/>\n", ptr->version, ptr->flags);
    2583           4 :         gf_isom_box_dump_done("MSSTimeExtensionBox", a, trace);
    2584           4 :         return GF_OK;
    2585             : }
    2586             : 
    2587           1 : GF_Err tfrf_box_dump(GF_Box *a, FILE * trace)
    2588             : {
    2589             :         u32 i;
    2590             :         GF_MSSTimeRefBox *ptr = (GF_MSSTimeRefBox*)a;
    2591           1 :         if (!a) return GF_BAD_PARAM;
    2592           1 :         gf_isom_box_dump_start(a, "MSSTimeReferenceBox", trace);
    2593           1 :         gf_fprintf(trace, "FragmentsCount=\"%d\">\n", ptr->frags_count);
    2594           1 :         gf_fprintf(trace, "<FullBoxInfo Version=\"%d\" Flags=\"%d\"/>\n", ptr->version, ptr->flags);
    2595           1 :         for (i=0; i<ptr->frags_count; i++) {
    2596           0 :                 gf_fprintf(trace, "<Fragment AbsoluteTime=\""LLU"\" FragmentDuration=\""LLU"\">\n", ptr->frags[i].absolute_time_in_track_timescale, ptr->frags[i].fragment_duration_in_track_timescale);
    2597             :         }
    2598           1 :         gf_isom_box_dump_done("MSSTimeReferenceBox", a, trace);
    2599           1 :         return GF_OK;
    2600             : }
    2601          22 : GF_Err trun_box_dump(GF_Box *a, FILE * trace)
    2602             : {
    2603             :         u32 i, flags;
    2604             :         Bool full_dump = GF_FALSE;
    2605             :         GF_TrackFragmentRunBox *p;
    2606             : 
    2607             :         p = (GF_TrackFragmentRunBox *)a;
    2608          22 :         flags = p->flags;
    2609             : #ifdef GF_ENABLE_CTRN
    2610             :         if (p->use_ctrn) {
    2611             :                 p->flags = p->ctrn_flags;
    2612             :                 p->type = GF_ISOM_BOX_TYPE_CTRN;
    2613             :         }
    2614             :         gf_isom_box_dump_start(a, p->use_ctrn ? "CompactTrackRunBox" : "TrackRunBox", trace);
    2615             : #else
    2616          22 :         gf_isom_box_dump_start(a, "TrackRunBox", trace);
    2617             : #endif
    2618          22 :         p->flags = flags;
    2619          22 :         p->type = GF_ISOM_BOX_TYPE_TRUN;
    2620          22 :         gf_fprintf(trace, "SampleCount=\"%d\"", p->sample_count);
    2621             : 
    2622          22 :         if (p->flags & GF_ISOM_TRUN_DATA_OFFSET)
    2623          16 :                 gf_fprintf(trace, " DataOffset=\"%d\"", p->data_offset);
    2624             : 
    2625             : #ifdef GF_ENABLE_CTRN
    2626             :         if (p->use_ctrn) {
    2627             :                 if (p->ctrn_flags & GF_ISOM_CTRN_DATAOFFSET_16)
    2628             :                         gf_fprintf(trace, " dataOffset16Bits=\"yes\"");
    2629             : 
    2630             :                 if (p->ctso_multiplier)
    2631             :                         gf_fprintf(trace, " ctsoMultiplier=\"%d\"", p->ctso_multiplier);
    2632             : 
    2633             :                 if (p->ctrn_flags & GF_ISOM_CTRN_INHERIT_DUR)
    2634             :                         gf_fprintf(trace, " inheritDuration=\"yes\"");
    2635             :                 if (p->ctrn_flags & GF_ISOM_CTRN_INHERIT_SIZE)
    2636             :                         gf_fprintf(trace, " inheritSize=\"yes\"");
    2637             :                 if (p->ctrn_flags & GF_ISOM_CTRN_INHERIT_FLAGS)
    2638             :                         gf_fprintf(trace, " inheritFlags=\"yes\"");
    2639             :                 if (p->ctrn_flags & GF_ISOM_CTRN_INHERIT_CTSO)
    2640             :                         gf_fprintf(trace, " inheritCTSOffset=\"yes\"");
    2641             : 
    2642             :                 gf_fprintf(trace, " firstSampleDurationBits=\"%d\"", gf_isom_ctrn_field_size_bits(p->ctrn_first_dur));
    2643             :                 gf_fprintf(trace, " firstSampleSizeBits=\"%d\"", gf_isom_ctrn_field_size_bits(p->ctrn_first_size));
    2644             :                 gf_fprintf(trace, " firstSampleFlagsBits=\"%d\"", gf_isom_ctrn_field_size_bits(p->ctrn_first_sample_flags));
    2645             :                 gf_fprintf(trace, " firstSampleCTSOBits=\"%d\"", gf_isom_ctrn_field_size_bits(p->ctrn_first_ctts));
    2646             :                 gf_fprintf(trace, " sampleDurationBits=\"%d\"", gf_isom_ctrn_field_size_bits(p->ctrn_dur));
    2647             :                 gf_fprintf(trace, " sampleSizeBits=\"%d\"", gf_isom_ctrn_field_size_bits(p->ctrn_size));
    2648             :                 gf_fprintf(trace, " sampleFlagsBits=\"%d\"", gf_isom_ctrn_field_size_bits(p->ctrn_sample_flags));
    2649             :                 gf_fprintf(trace, " sampleCTSOBits=\"%d\"", gf_isom_ctrn_field_size_bits(p->ctrn_ctts));
    2650             :                 if (p->ctrn_flags & 0x00FFFF00)
    2651             :                         full_dump = GF_TRUE;
    2652             : 
    2653             :                 gf_fprintf(trace, ">\n");
    2654             :         } else
    2655             : #endif
    2656             :         {
    2657          22 :                 gf_fprintf(trace, ">\n");
    2658             : 
    2659          22 :                 if (p->flags & GF_ISOM_TRUN_FIRST_FLAG) {
    2660          13 :                         sample_flags_dump("FirstSampleFlags", p->first_sample_flags, trace);
    2661             :                 }
    2662          22 :                 if (p->flags & (GF_ISOM_TRUN_DURATION|GF_ISOM_TRUN_SIZE|GF_ISOM_TRUN_CTS_OFFSET|GF_ISOM_TRUN_FLAGS)) {
    2663             :                         full_dump = GF_TRUE;
    2664             :                 }
    2665             :         }
    2666             : 
    2667             :         if (full_dump) {
    2668         349 :                 for (i=0; i<p->nb_samples; i++) {
    2669         349 :                         GF_TrunEntry *ent = &p->samples[i];
    2670             :                         
    2671         349 :                         gf_fprintf(trace, "<TrackRunEntry");
    2672             : 
    2673             : #ifdef GF_ENABLE_CTRN
    2674             :                         if (p->use_ctrn) {
    2675             :                                 if ((i==1) && (p->ctrn_flags&GF_ISOM_CTRN_FIRST_SAMPLE) ) {
    2676             :                                         if (p->ctrn_first_dur)
    2677             :                                                 gf_fprintf(trace, " Duration=\"%u\"", ent->Duration);
    2678             :                                         if (p->ctrn_first_size)
    2679             :                                                 gf_fprintf(trace, " Size=\"%u\"", ent->size);
    2680             :                                         if (p->ctrn_first_ctts) {
    2681             :                                                 if (p->version == 0)
    2682             :                                                         gf_fprintf(trace, " CTSOffset=\"%u\"", (u32) ent->CTS_Offset);
    2683             :                                                 else
    2684             :                                                         gf_fprintf(trace, " CTSOffset=\"%d\"", ent->CTS_Offset);
    2685             :                                         }
    2686             :                                         if (p->ctrn_first_sample_flags)
    2687             :                                                 frag_dump_sample_flags(trace, ent->flags, p->ctrn_first_sample_flags);
    2688             :                                 } else {
    2689             :                                         if (p->ctrn_dur)
    2690             :                                                 gf_fprintf(trace, " Duration=\"%u\"", ent->Duration);
    2691             :                                         if (p->ctrn_size)
    2692             :                                                 gf_fprintf(trace, " Size=\"%u\"", ent->size);
    2693             :                                         if (p->ctrn_ctts) {
    2694             :                                                 if (p->version == 0)
    2695             :                                                         gf_fprintf(trace, " CTSOffset=\"%u\"", (u32) ent->CTS_Offset);
    2696             :                                                 else
    2697             :                                                         gf_fprintf(trace, " CTSOffset=\"%d\"", ent->CTS_Offset);
    2698             :                                         }
    2699             :                                         if (p->ctrn_sample_flags)
    2700             :                                                 frag_dump_sample_flags(trace, ent->flags, p->ctrn_sample_flags);
    2701             :                                 }
    2702             :                         } else
    2703             : #endif
    2704             :                         {
    2705             : 
    2706         349 :                                 if (p->flags & GF_ISOM_TRUN_DURATION)
    2707          99 :                                         gf_fprintf(trace, " Duration=\"%u\"", ent->Duration);
    2708         349 :                                 if (p->flags & GF_ISOM_TRUN_SIZE)
    2709         349 :                                         gf_fprintf(trace, " Size=\"%u\"", ent->size);
    2710         349 :                                 if (p->flags & GF_ISOM_TRUN_CTS_OFFSET)
    2711             :                                 {
    2712          48 :                                         if (p->version == 0)
    2713          48 :                                                 gf_fprintf(trace, " CTSOffset=\"%u\"", (u32) ent->CTS_Offset);
    2714             :                                         else
    2715           0 :                                                 gf_fprintf(trace, " CTSOffset=\"%d\"", ent->CTS_Offset);
    2716             :                                 }
    2717             : 
    2718         349 :                                 if (p->flags & GF_ISOM_TRUN_FLAGS) {
    2719           3 :                                         frag_dump_sample_flags(trace, ent->flags, 3);
    2720             :                                 }
    2721             :                         }
    2722         349 :                         gf_fprintf(trace, "/>\n");
    2723             :                 }
    2724           3 :         } else if (p->size) {
    2725           0 :                 gf_fprintf(trace, "<!-- all default values used -->\n");
    2726             :         } else {
    2727           3 :                 gf_fprintf(trace, "<TrackRunEntry Duration=\"\" Size=\"\" CTSOffset=\"\"");
    2728           3 :                 frag_dump_sample_flags(trace, 0, 3);
    2729           3 :                 gf_fprintf(trace, "/>\n");
    2730             :         }
    2731             : 
    2732             : #ifdef GF_ENABLE_CTRN
    2733             :         gf_isom_box_dump_done(p->use_ctrn ? "CompactTrackRunBox" : "TrackRunBox", a, trace);
    2734             : #else
    2735          22 :         gf_isom_box_dump_done("TrackRunBox", a, trace);
    2736             : #endif
    2737          22 :         return GF_OK;
    2738             : }
    2739             : 
    2740             : #endif
    2741             : 
    2742             : #ifndef GPAC_DISABLE_ISOM_HINTING
    2743             : 
    2744         385 : GF_Err DTE_Dump(GF_List *dte, FILE * trace)
    2745             : {
    2746             :         u32 i, count;
    2747             : 
    2748         385 :         count = gf_list_count(dte);
    2749        1155 :         for (i=0; i<count; i++) {
    2750             :                 GF_GenericDTE *p;
    2751             :                 GF_ImmediateDTE *i_p;
    2752             :                 GF_SampleDTE *s_p;
    2753             :                 GF_StreamDescDTE *sd_p;
    2754         770 :                 p = (GF_GenericDTE *)gf_list_get(dte, i);
    2755         770 :                 switch (p->source) {
    2756           0 :                 case 0:
    2757           0 :                         gf_fprintf(trace, "<EmptyDataEntry/>\n");
    2758           0 :                         break;
    2759         385 :                 case 1:
    2760             :                         i_p = (GF_ImmediateDTE *) p;
    2761         385 :                         gf_fprintf(trace, "<ImmediateDataEntry DataSize=\"%d\"/>\n", i_p->dataLength);
    2762         385 :                         break;
    2763         385 :                 case 2:
    2764             :                         s_p = (GF_SampleDTE *) p;
    2765         770 :                         gf_fprintf(trace, "<SampleDataEntry DataSize=\"%d\" SampleOffset=\"%d\" SampleNumber=\"%d\" TrackReference=\"%d\"/>\n",
    2766         770 :                                 s_p->dataLength, s_p->byteOffset, s_p->sampleNumber, s_p->trackRefIndex);
    2767         385 :                         break;
    2768           0 :                 case 3:
    2769             :                         sd_p = (GF_StreamDescDTE *) p;
    2770           0 :                         gf_fprintf(trace, "<SampleDescriptionEntry DataSize=\"%d\" DescriptionOffset=\"%d\" StreamDescriptionindex=\"%d\" TrackReference=\"%d\"/>\n",
    2771           0 :                                 sd_p->dataLength, sd_p->byteOffset, sd_p->streamDescIndex, sd_p->trackRefIndex);
    2772           0 :                         break;
    2773           0 :                 default:
    2774           0 :                         gf_fprintf(trace, "<UnknownTableEntry/>\n");
    2775           0 :                         break;
    2776             :                 }
    2777             :         }
    2778         385 :         return GF_OK;
    2779             : }
    2780             : 
    2781             : 
    2782             : GF_EXPORT
    2783         385 : GF_Err gf_isom_dump_hint_sample(GF_ISOFile *the_file, u32 trackNumber, u32 SampleNum, FILE * trace)
    2784             : {
    2785             :         GF_ISOSample *tmp;
    2786             :         GF_HintSampleEntryBox *entry;
    2787             :         u32 descIndex, count, count2, i;
    2788             :         GF_Err e=GF_OK;
    2789             :         GF_BitStream *bs;
    2790             :         GF_HintSample *s;
    2791             :         GF_TrackBox *trak;
    2792             :         GF_RTPPacket *pck;
    2793             :         char *szName;
    2794             : 
    2795         385 :         trak = gf_isom_get_track_from_file(the_file, trackNumber);
    2796         385 :         if (!trak || !IsHintTrack(trak)) return GF_BAD_PARAM;
    2797             : 
    2798         385 :         tmp = gf_isom_get_sample(the_file, trackNumber, SampleNum, &descIndex);
    2799         385 :         if (!tmp) return GF_BAD_PARAM;
    2800             : 
    2801         385 :         e = Media_GetSampleDesc(trak->Media, descIndex, (GF_SampleEntryBox **) &entry, &count);
    2802         385 :         if (e) {
    2803           0 :                 gf_isom_sample_del(&tmp);
    2804           0 :                 return e;
    2805             :         }
    2806             : 
    2807             :         //check we can read the sample
    2808         385 :         switch (entry->type) {
    2809             :         case GF_ISOM_BOX_TYPE_RTP_STSD:
    2810             :         case GF_ISOM_BOX_TYPE_SRTP_STSD:
    2811             :         case GF_ISOM_BOX_TYPE_RRTP_STSD:
    2812             :                 szName = "RTP";
    2813             :                 break;
    2814           0 :         case GF_ISOM_BOX_TYPE_RTCP_STSD:
    2815             :                 szName = "RCTP";
    2816           0 :                 break;
    2817           0 :         case GF_ISOM_BOX_TYPE_FDP_STSD:
    2818             :                 szName = "FDP";
    2819           0 :                 break;
    2820           0 :         default:
    2821           0 :                 gf_isom_sample_del(&tmp);
    2822           0 :                 return GF_NOT_SUPPORTED;
    2823             :         }
    2824             : 
    2825         385 :         bs = gf_bs_new(tmp->data, tmp->dataLength, GF_BITSTREAM_READ);
    2826         385 :         s = gf_isom_hint_sample_new(entry->type);
    2827         385 :         s->trackID = trak->Header->trackID;
    2828         385 :         s->sampleNumber = SampleNum;
    2829             : 
    2830         385 :         gf_isom_hint_sample_read(s, bs, tmp->dataLength);
    2831         385 :         gf_bs_del(bs);
    2832             : 
    2833         385 :         count = gf_list_count(s->packetTable);
    2834             : 
    2835         385 :         gf_fprintf(trace, "<%sHintSample SampleNumber=\"%d\" DecodingTime=\""LLD"\" RandomAccessPoint=\"%d\" PacketCount=\"%u\" reserved=\"%u\">\n", szName, SampleNum, tmp->DTS, tmp->IsRAP, s->packetCount, s->reserved);
    2836             : 
    2837         385 :         if (s->hint_subtype==GF_ISOM_BOX_TYPE_FDP_STSD) {
    2838           0 :                 e = gf_isom_box_dump((GF_Box*) s, trace);
    2839           0 :                 goto err_exit;
    2840             :         }
    2841             : 
    2842         385 :         if (s->packetCount != count) {
    2843           0 :                 gf_fprintf(trace, "<!-- WARNING: Broken %s hint sample, %d entries indicated but only %d parsed -->\n", szName, s->packetCount, count);
    2844             :         }
    2845             : 
    2846             : 
    2847         385 :         for (i=0; i<count; i++) {
    2848         385 :                 pck = (GF_RTPPacket *)gf_list_get(s->packetTable, i);
    2849             : 
    2850         385 :                 if (pck->hint_subtype==GF_ISOM_BOX_TYPE_RTCP_STSD) {
    2851             :                         GF_RTCPPacket *rtcp_pck = (GF_RTCPPacket *) pck;
    2852           0 :                         gf_fprintf(trace, "<RTCPHintPacket PacketNumber=\"%d\" V=\"%d\" P=\"%d\" Count=\"%d\" PayloadType=\"%d\" ",
    2853           0 :                         i+1,  rtcp_pck->Version, rtcp_pck->Padding, rtcp_pck->Count, rtcp_pck->PayloadType);
    2854             : 
    2855           0 :                         if (rtcp_pck->data) dump_data_attribute(trace, "payload", (char*)rtcp_pck->data, rtcp_pck->length);
    2856           0 :                         gf_fprintf(trace, ">\n");
    2857           0 :                         gf_fprintf(trace, "</RTCPHintPacket>\n");
    2858             : 
    2859             :                 } else {
    2860        1540 :                         gf_fprintf(trace, "<RTPHintPacket PacketNumber=\"%d\" P=\"%d\" X=\"%d\" M=\"%d\" PayloadType=\"%d\"",
    2861        1540 :                         i+1,  pck->P_bit, pck->X_bit, pck->M_bit, pck->payloadType);
    2862             : 
    2863        1540 :                         gf_fprintf(trace, " SequenceNumber=\"%d\" RepeatedPacket=\"%d\" DropablePacket=\"%d\" RelativeTransmissionTime=\"%d\" FullPacketSize=\"%d\">\n",
    2864        1155 :                         pck->SequenceNumber, pck->R_bit, pck->B_bit, pck->relativeTransTime, gf_isom_hint_rtp_length(pck));
    2865             : 
    2866             : 
    2867             :                         //TLV is made of Boxes
    2868         385 :                         count2 = gf_list_count(pck->TLV);
    2869         385 :                         if (count2) {
    2870           0 :                                 gf_fprintf(trace, "<PrivateExtensionTable EntryCount=\"%d\">\n", count2);
    2871           0 :                                 gf_fprintf(trace, "</PrivateExtensionTable>\n");
    2872             :                         }
    2873             :                         //DTE is made of NON boxes
    2874         385 :                         count2 = gf_list_count(pck->DataTable);
    2875         385 :                         if (count2) {
    2876         385 :                                 gf_fprintf(trace, "<PacketDataTable EntryCount=\"%d\">\n", count2);
    2877         385 :                                 DTE_Dump(pck->DataTable, trace);
    2878         385 :                                 gf_fprintf(trace, "</PacketDataTable>\n");
    2879             :                         }
    2880         385 :                         gf_fprintf(trace, "</RTPHintPacket>\n");
    2881             :                 }
    2882             :         }
    2883             : 
    2884         385 : err_exit:
    2885         385 :         gf_fprintf(trace, "</%sHintSample>\n", szName);
    2886         385 :         gf_isom_sample_del(&tmp);
    2887         385 :         gf_isom_hint_sample_del(s);
    2888         385 :         return e;
    2889             : }
    2890             : 
    2891             : #endif /*GPAC_DISABLE_ISOM_HINTING*/
    2892             : 
    2893             : static void tx3g_dump_box_nobox(FILE * trace, GF_BoxRecord *rec)
    2894             : {
    2895           4 :         gf_fprintf(trace, "<TextBox top=\"%d\" left=\"%d\" bottom=\"%d\" right=\"%d\"/>\n", rec->top, rec->left, rec->bottom, rec->right);
    2896             : }
    2897             : 
    2898          15 : static void tx3g_print_char_offsets(FILE * trace, u32 start, u32 end, u32 *shift_offset, u32 so_count)
    2899             : {
    2900             :         u32 i;
    2901          15 :         if (shift_offset) {
    2902           0 :                 for (i=0; i<so_count; i++) {
    2903           0 :                         if (start>shift_offset[i]) {
    2904           0 :                                 start --;
    2905           0 :                                 break;
    2906             :                         }
    2907             :                 }
    2908          15 :                 for (i=0; i<so_count; i++) {
    2909           0 :                         if (end>shift_offset[i]) {
    2910           0 :                                 end --;
    2911           0 :                                 break;
    2912             :                         }
    2913             :                 }
    2914             :         }
    2915          15 :         if (start || end) gf_fprintf(trace, "fromChar=\"%d\" toChar=\"%d\" ", start, end);
    2916          15 : }
    2917             : 
    2918          19 : static void tx3g_dump_style_nobox(FILE * trace, GF_StyleRecord *rec, u32 *shift_offset, u32 so_count)
    2919             : {
    2920          19 :         gf_fprintf(trace, "<Style ");
    2921          19 :         if (rec->startCharOffset || rec->endCharOffset)
    2922          15 :                 tx3g_print_char_offsets(trace, rec->startCharOffset, rec->endCharOffset, shift_offset, so_count);
    2923             : 
    2924          19 :         gf_fprintf(trace, "styles=\"");
    2925          19 :         if (!rec->style_flags) {
    2926           4 :                 gf_fprintf(trace, "Normal");
    2927             :         } else {
    2928          15 :                 if (rec->style_flags & 1) gf_fprintf(trace, "Bold ");
    2929          15 :                 if (rec->style_flags & 2) gf_fprintf(trace, "Italic ");
    2930          15 :                 if (rec->style_flags & 4) gf_fprintf(trace, "Underlined ");
    2931             :         }
    2932          19 :         gf_fprintf(trace, "\" fontID=\"%d\" fontSize=\"%d\" ", rec->fontID, rec->font_size);
    2933          19 :         tx3g_dump_rgba8(trace, "color", rec->text_color);
    2934          19 :         gf_fprintf(trace, "/>\n");
    2935          19 : }
    2936             : 
    2937          74 : static char *tx3g_format_time(u64 ts, u32 timescale, char *szDur, Bool is_srt)
    2938             : {
    2939             :         u32 h, m, s, ms;
    2940          74 :         ts = (u32) (ts*1000 / timescale);
    2941          74 :         h = (u32) (ts / 3600000);
    2942          74 :         m = (u32) (ts/ 60000) - h*60;
    2943          74 :         s = (u32) (ts/1000) - h*3600 - m*60;
    2944          74 :         ms = (u32) (ts) - h*3600000 - m*60000 - s*1000;
    2945          74 :         if (is_srt) {
    2946             :                 sprintf(szDur, "%02d:%02d:%02d,%03d", h, m, s, ms);
    2947             :         } else {
    2948             :                 sprintf(szDur, "%02d:%02d:%02d.%03d", h, m, s, ms);
    2949             :         }
    2950          74 :         return szDur;
    2951             : }
    2952             : 
    2953           4 : static GF_Err gf_isom_dump_ttxt_track(GF_ISOFile *the_file, u32 track, FILE *dump, GF_TextDumpType dump_type)
    2954             : {
    2955             :         u32 i, j, count, di, nb_descs, shift_offset[20], so_count;
    2956             :         u64 last_DTS;
    2957             :         size_t len;
    2958             :         GF_Box *a;
    2959             :         Bool has_scroll;
    2960             :         char szDur[100];
    2961             :         GF_Tx3gSampleEntryBox *txt_e;
    2962             :         Bool box_dump = (dump_type==GF_TEXTDUMPTYPE_TTXT_BOXES) ? GF_TRUE : GF_FALSE;
    2963             :         Bool skip_empty = (dump_type==GF_TEXTDUMPTYPE_TTXT_CHAP) ? GF_TRUE : GF_FALSE;
    2964             : 
    2965           4 :         GF_TrackBox *trak = gf_isom_get_track_from_file(the_file, track);
    2966           4 :         if (!trak) return GF_BAD_PARAM;
    2967           4 :         switch (trak->Media->handler->handlerType) {
    2968             :         case GF_ISOM_MEDIA_TEXT:
    2969             :         case GF_ISOM_MEDIA_SUBT:
    2970             :                 break;
    2971             :         default:
    2972             :                 return GF_BAD_PARAM;
    2973             :         }
    2974             : 
    2975           4 :         txt_e = (GF_Tx3gSampleEntryBox *)gf_list_get(trak->Media->information->sampleTable->SampleDescription->child_boxes, 0);
    2976           4 :         switch (txt_e->type) {
    2977             :         case GF_ISOM_BOX_TYPE_TX3G:
    2978             :         case GF_ISOM_BOX_TYPE_TEXT:
    2979             :                 break;
    2980             :         case GF_ISOM_BOX_TYPE_STPP:
    2981             :         case GF_ISOM_BOX_TYPE_SBTT:
    2982             :         default:
    2983             :                 return GF_BAD_PARAM;
    2984             :         }
    2985             : 
    2986           4 :         if (box_dump) {
    2987           0 :                 gf_fprintf(dump, "<TextTrack trackID=\"%d\" version=\"1.1\">\n", gf_isom_get_track_id(the_file, track) );
    2988             :         } else {
    2989           4 :                 gf_fprintf(dump, "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
    2990           4 :                 gf_fprintf(dump, "<!-- GPAC 3GPP Text Stream -->\n");
    2991             : 
    2992           4 :                 gf_fprintf(dump, "<TextStream version=\"1.1\">\n");
    2993             :         }
    2994           4 :         gf_fprintf(dump, "<TextStreamHeader width=\"%d\" height=\"%d\" layer=\"%d\" translation_x=\"%d\" translation_y=\"%d\">\n", trak->Header->width >> 16 , trak->Header->height >> 16, trak->Header->layer, trak->Header->matrix[6] >> 16, trak->Header->matrix[7] >> 16);
    2995             : 
    2996           4 :         nb_descs = gf_list_count(trak->Media->information->sampleTable->SampleDescription->child_boxes);
    2997           8 :         for (i=0; i<nb_descs; i++) {
    2998           4 :                 txt_e = (GF_Tx3gSampleEntryBox *)gf_list_get(trak->Media->information->sampleTable->SampleDescription->child_boxes, i);
    2999           4 :                 if (!txt_e) break;
    3000             : 
    3001           4 :                 if (box_dump) {
    3002           0 :                         gf_isom_box_dump((GF_Box*) txt_e, dump);
    3003           4 :                 } else if  (txt_e->type==GF_ISOM_BOX_TYPE_TX3G) {
    3004           4 :                         gf_fprintf(dump, "<TextSampleDescription horizontalJustification=\"");
    3005           4 :                         switch (txt_e->horizontal_justification) {
    3006           4 :                         case 1:
    3007           4 :                                 gf_fprintf(dump, "center");
    3008           4 :                                 break;
    3009           0 :                         case -1:
    3010           0 :                                 gf_fprintf(dump, "right");
    3011           0 :                                 break;
    3012           0 :                         default:
    3013           0 :                                 gf_fprintf(dump, "left");
    3014           0 :                                 break;
    3015             :                         }
    3016           4 :                         gf_fprintf(dump, "\" verticalJustification=\"");
    3017           4 :                         switch (txt_e->vertical_justification) {
    3018           0 :                         case 1:
    3019           0 :                                 gf_fprintf(dump, "center");
    3020           0 :                                 break;
    3021           4 :                         case -1:
    3022           4 :                                 gf_fprintf(dump, "bottom");
    3023           4 :                                 break;
    3024           0 :                         default:
    3025           0 :                                 gf_fprintf(dump, "top");
    3026           0 :                                 break;
    3027             :                         }
    3028           4 :                         gf_fprintf(dump, "\" ");
    3029           4 :                         tx3g_dump_rgba8(dump, "backColor", txt_e->back_color);
    3030           4 :                         gf_fprintf(dump, " verticalText=\"%s\"", (txt_e->displayFlags & GF_TXT_VERTICAL) ? "yes" : "no");
    3031           4 :                         gf_fprintf(dump, " fillTextRegion=\"%s\"", (txt_e->displayFlags & GF_TXT_FILL_REGION) ? "yes" : "no");
    3032           4 :                         gf_fprintf(dump, " continuousKaraoke=\"%s\"", (txt_e->displayFlags & GF_TXT_KARAOKE) ? "yes" : "no");
    3033             :                         has_scroll = GF_FALSE;
    3034           4 :                         if (txt_e->displayFlags & GF_TXT_SCROLL_IN) {
    3035             :                                 has_scroll = GF_TRUE;
    3036           0 :                                 if (txt_e->displayFlags & GF_TXT_SCROLL_OUT) gf_fprintf(dump, " scroll=\"InOut\"");
    3037           0 :                                 else gf_fprintf(dump, " scroll=\"In\"");
    3038           4 :                         } else if (txt_e->displayFlags & GF_TXT_SCROLL_OUT) {
    3039             :                                 has_scroll = GF_TRUE;
    3040           0 :                                 gf_fprintf(dump, " scroll=\"Out\"");
    3041             :                         } else {
    3042           4 :                                 gf_fprintf(dump, " scroll=\"None\"");
    3043             :                         }
    3044             :                         if (has_scroll) {
    3045           0 :                                 u32 mode = (txt_e->displayFlags & GF_TXT_SCROLL_DIRECTION)>>7;
    3046           0 :                                 switch (mode) {
    3047           0 :                                 case GF_TXT_SCROLL_CREDITS:
    3048           0 :                                         gf_fprintf(dump, " scrollMode=\"Credits\"");
    3049           0 :                                         break;
    3050           0 :                                 case GF_TXT_SCROLL_MARQUEE:
    3051           0 :                                         gf_fprintf(dump, " scrollMode=\"Marquee\"");
    3052           0 :                                         break;
    3053           0 :                                 case GF_TXT_SCROLL_DOWN:
    3054           0 :                                         gf_fprintf(dump, " scrollMode=\"Down\"");
    3055           0 :                                         break;
    3056           0 :                                 case GF_TXT_SCROLL_RIGHT:
    3057           0 :                                         gf_fprintf(dump, " scrollMode=\"Right\"");
    3058           0 :                                         break;
    3059           0 :                                 default:
    3060           0 :                                         gf_fprintf(dump, " scrollMode=\"Unknown\"");
    3061           0 :                                         break;
    3062             :                                 }
    3063             :                         }
    3064           4 :                         gf_fprintf(dump, ">\n");
    3065           4 :                         gf_fprintf(dump, "<FontTable>\n");
    3066           4 :                         if (txt_e->font_table) {
    3067           8 :                                 for (j=0; j<txt_e->font_table->entry_count; j++) {
    3068           4 :                                         gf_fprintf(dump, "<FontTableEntry fontName=\"%s\" fontID=\"%d\"/>\n", txt_e->font_table->fonts[j].fontName, txt_e->font_table->fonts[j].fontID);
    3069             : 
    3070             :                                 }
    3071             :                         }
    3072           4 :                         gf_fprintf(dump, "</FontTable>\n");
    3073           4 :                         if ((txt_e->default_box.bottom == txt_e->default_box.top) || (txt_e->default_box.right == txt_e->default_box.left)) {
    3074           0 :                                 txt_e->default_box.top = txt_e->default_box.left = 0;
    3075           0 :                                 txt_e->default_box.right = trak->Header->width / 65536;
    3076           0 :                                 txt_e->default_box.bottom = trak->Header->height / 65536;
    3077             :                         }
    3078             :                         tx3g_dump_box_nobox(dump, &txt_e->default_box);
    3079           4 :                         tx3g_dump_style_nobox(dump, &txt_e->default_style, NULL, 0);
    3080           4 :                         gf_fprintf(dump, "</TextSampleDescription>\n");
    3081             :                 } else {
    3082           0 :                         GF_TextSampleEntryBox *text = (GF_TextSampleEntryBox *)gf_list_get(trak->Media->information->sampleTable->SampleDescription->child_boxes, i);
    3083           0 :                         gf_fprintf(dump, "<TextSampleDescription horizontalJustification=\"");
    3084           0 :                         switch (text->textJustification) {
    3085           0 :                         case 1:
    3086           0 :                                 gf_fprintf(dump, "center");
    3087           0 :                                 break;
    3088           0 :                         case -1:
    3089           0 :                                 gf_fprintf(dump, "right");
    3090           0 :                                 break;
    3091           0 :                         default:
    3092           0 :                                 gf_fprintf(dump, "left");
    3093           0 :                                 break;
    3094             :                         }
    3095           0 :                         gf_fprintf(dump, "\"");
    3096             : 
    3097             :                         tx3g_dump_rgb16(dump, " backColor", text->background_color);
    3098             : 
    3099           0 :                         if ((text->default_box.bottom == text->default_box.top) || (text->default_box.right == text->default_box.left)) {
    3100           0 :                                 text->default_box.top = text->default_box.left = 0;
    3101           0 :                                 text->default_box.right = trak->Header->width / 65536;
    3102           0 :                                 text->default_box.bottom = trak->Header->height / 65536;
    3103             :                         }
    3104             : 
    3105           0 :                         if (text->displayFlags & GF_TXT_SCROLL_IN) {
    3106           0 :                                 if (text->displayFlags & GF_TXT_SCROLL_OUT) gf_fprintf(dump, " scroll=\"InOut\"");
    3107           0 :                                 else gf_fprintf(dump, " scroll=\"In\"");
    3108           0 :                         } else if (text->displayFlags & GF_TXT_SCROLL_OUT) {
    3109           0 :                                 gf_fprintf(dump, " scroll=\"Out\"");
    3110             :                         } else {
    3111           0 :                                 gf_fprintf(dump, " scroll=\"None\"");
    3112             :                         }
    3113           0 :                         gf_fprintf(dump, ">\n");
    3114             : 
    3115             :                         tx3g_dump_box_nobox(dump, &text->default_box);
    3116           0 :                         gf_fprintf(dump, "</TextSampleDescription>\n");
    3117             :                 }
    3118             :         }
    3119           4 :         gf_fprintf(dump, "</TextStreamHeader>\n");
    3120             : 
    3121             :         last_DTS = 0;
    3122           4 :         count = gf_isom_get_sample_count(the_file, track);
    3123          52 :         for (i=0; i<count; i++) {
    3124             :                 GF_BitStream *bs;
    3125             :                 GF_TextSample *s_txt;
    3126          44 :                 GF_ISOSample *s = gf_isom_get_sample(the_file, track, i+1, &di);
    3127          44 :                 if (!s) continue;
    3128             : 
    3129          44 :                 bs = gf_bs_new(s->data, s->dataLength, GF_BITSTREAM_READ);
    3130          44 :                 s_txt = gf_isom_parse_text_sample(bs);
    3131          44 :                 gf_bs_del(bs);
    3132             : 
    3133          44 :                 if (skip_empty && (s_txt->len<1)) {
    3134           0 :                         gf_isom_sample_del(&s);
    3135           0 :                         gf_isom_delete_text_sample(s_txt);
    3136           0 :                         gf_set_progress("TTXT Extract", i, count);
    3137           0 :                         continue;
    3138             :                 }
    3139             : 
    3140          44 :                 gf_fprintf(dump, "<TextSample sampleTime=\"%s\" sampleDescriptionIndex=\"%d\"", tx3g_format_time(s->DTS, trak->Media->mediaHeader->timeScale, szDur, GF_FALSE), di);
    3141             : 
    3142          44 :                 if (!box_dump) {
    3143          44 :                         if (s_txt->highlight_color) {
    3144           0 :                                 gf_fprintf(dump, " ");
    3145           0 :                                 tx3g_dump_rgba8(dump, "highlightColor", s_txt->highlight_color->hil_color);
    3146             :                         }
    3147          44 :                         if (s_txt->scroll_delay) {
    3148           0 :                                 Double delay = s_txt->scroll_delay->scroll_delay;
    3149           0 :                                 delay /= trak->Media->mediaHeader->timeScale;
    3150           0 :                                 gf_fprintf(dump, " scrollDelay=\"%g\"", delay);
    3151             :                         }
    3152          44 :                         if (s_txt->wrap) gf_fprintf(dump, " wrap=\"%s\"", (s_txt->wrap->wrap_flag==0x01) ? "Automatic" : "None");
    3153             :                 }
    3154             : 
    3155             :                 so_count = 0;
    3156             : 
    3157          44 :                 gf_fprintf(dump, " xml:space=\"preserve\">");
    3158          44 :                 if (!s_txt->len) {
    3159          24 :                         last_DTS = (u32) trak->Media->mediaHeader->duration;
    3160             :                 } else {
    3161             :                         unsigned short utf16Line[10000];
    3162          20 :                         last_DTS = s->DTS;
    3163             :                         /*UTF16*/
    3164          20 :                         if ((s_txt->len>2) && ((unsigned char) s_txt->text[0] == (unsigned char) 0xFE) && ((unsigned char) s_txt->text[1] == (unsigned char) 0xFF)) {
    3165             :                                 /*copy 2 more chars because the lib always add 2 '0' at the end for UTF16 end of string*/
    3166           0 :                                 memcpy((char *) utf16Line, s_txt->text+2, sizeof(char) * (s_txt->len));
    3167           0 :                                 len = gf_utf8_wcslen((const u16*)utf16Line);
    3168             :                         } else {
    3169             :                                 char *str;
    3170          20 :                                 str = s_txt->text;
    3171          20 :                                 len = gf_utf8_mbstowcs((u16*)utf16Line, 10000, (const char **) &str);
    3172             :                         }
    3173          20 :                         if (len != (size_t) -1) {
    3174          20 :                                 utf16Line[len] = 0;
    3175         476 :                                 for (j=0; j<len; j++) {
    3176         456 :                                         if ((utf16Line[j]=='\n') || (utf16Line[j]=='\r') || (utf16Line[j]==0x85) || (utf16Line[j]==0x2028) || (utf16Line[j]==0x2029) ) {
    3177           8 :                                                 gf_fprintf(dump, "\n");
    3178           8 :                                                 if ((utf16Line[j]=='\r') && (utf16Line[j+1]=='\n')) {
    3179           0 :                                                         shift_offset[so_count] = j;
    3180           0 :                                                         so_count++;
    3181           0 :                                                         j++;
    3182             :                                                 }
    3183             :                                         }
    3184             :                                         else {
    3185         448 :                                                 switch (utf16Line[j]) {
    3186           2 :                                                 case '\'':
    3187           2 :                                                         gf_fprintf(dump, "&apos;");
    3188           2 :                                                         break;
    3189           0 :                                                 case '\"':
    3190           0 :                                                         gf_fprintf(dump, "&quot;");
    3191           0 :                                                         break;
    3192           0 :                                                 case '&':
    3193           0 :                                                         gf_fprintf(dump, "&amp;");
    3194           0 :                                                         break;
    3195           0 :                                                 case '>':
    3196           0 :                                                         gf_fprintf(dump, "&gt;");
    3197           0 :                                                         break;
    3198           0 :                                                 case '<':
    3199           0 :                                                         gf_fprintf(dump, "&lt;");
    3200           0 :                                                         break;
    3201         446 :                                                 default:
    3202         446 :                                                         if (utf16Line[j] < 128) {
    3203         429 :                                                                 gf_fprintf(dump, "%c", (u8) utf16Line[j]);
    3204             :                                                         } else {
    3205          17 :                                                                 gf_fprintf(dump, "&#%d;", utf16Line[j]);
    3206             :                                                         }
    3207             :                                                         break;
    3208             :                                                 }
    3209             :                                         }
    3210             :                                 }
    3211             :                         }
    3212             :                 }
    3213             : 
    3214          44 :                 if (box_dump) {
    3215             : 
    3216           0 :                         if (s_txt->highlight_color)
    3217           0 :                                 gf_isom_box_dump((GF_Box*) s_txt->highlight_color, dump);
    3218           0 :                         if (s_txt->scroll_delay)
    3219           0 :                                 gf_isom_box_dump((GF_Box*) s_txt->scroll_delay, dump);
    3220           0 :                         if (s_txt->wrap)
    3221           0 :                                 gf_isom_box_dump((GF_Box*) s_txt->wrap, dump);
    3222           0 :                         if (s_txt->box)
    3223           0 :                                 gf_isom_box_dump((GF_Box*) s_txt->box, dump);
    3224           0 :                         if (s_txt->styles)
    3225           0 :                                 gf_isom_box_dump((GF_Box*) s_txt->styles, dump);
    3226             :                 } else {
    3227             : 
    3228          44 :                         if (s_txt->box) tx3g_dump_box_nobox(dump, &s_txt->box->box);
    3229          44 :                         if (s_txt->styles) {
    3230          27 :                                 for (j=0; j<s_txt->styles->entry_count; j++) {
    3231          15 :                                         tx3g_dump_style_nobox(dump, &s_txt->styles->styles[j], shift_offset, so_count);
    3232             :                                 }
    3233             :                         }
    3234             :                 }
    3235          44 :                 j=0;
    3236          88 :                 while ((a = (GF_Box *)gf_list_enum(s_txt->others, &j))) {
    3237           0 :                         if (box_dump) {
    3238           0 :                                 gf_isom_box_dump((GF_Box*) a, dump);
    3239           0 :                                 continue;
    3240             :                         }
    3241             : 
    3242           0 :                         switch (a->type) {
    3243           0 :                         case GF_ISOM_BOX_TYPE_HLIT:
    3244           0 :                                 gf_fprintf(dump, "<Highlight ");
    3245           0 :                                 tx3g_print_char_offsets(dump, ((GF_TextHighlightBox *)a)->startcharoffset, ((GF_TextHighlightBox *)a)->endcharoffset, shift_offset, so_count);
    3246           0 :                                 gf_fprintf(dump, "/>\n");
    3247           0 :                                 break;
    3248           0 :                         case GF_ISOM_BOX_TYPE_HREF:
    3249             :                         {
    3250             :                                 GF_TextHyperTextBox *ht = (GF_TextHyperTextBox *)a;
    3251           0 :                                 gf_fprintf(dump, "<HyperLink ");
    3252           0 :                                 tx3g_print_char_offsets(dump, ht->startcharoffset, ht->endcharoffset, shift_offset, so_count);
    3253           0 :                                 gf_fprintf(dump, "URL=\"%s\" URLToolTip=\"%s\"/>\n", ht->URL ? ht->URL : "", ht->URL_hint ? ht->URL_hint : "");
    3254             :                         }
    3255           0 :                         break;
    3256           0 :                         case GF_ISOM_BOX_TYPE_BLNK:
    3257           0 :                                 gf_fprintf(dump, "<Blinking ");
    3258           0 :                                 tx3g_print_char_offsets(dump, ((GF_TextBlinkBox *)a)->startcharoffset, ((GF_TextBlinkBox *)a)->endcharoffset, shift_offset, so_count);
    3259           0 :                                 gf_fprintf(dump, "/>\n");
    3260           0 :                                 break;
    3261           0 :                         case GF_ISOM_BOX_TYPE_KROK:
    3262             :                         {
    3263             :                                 u32 k;
    3264             :                                 Double t;
    3265             :                                 GF_TextKaraokeBox *krok = (GF_TextKaraokeBox *)a;
    3266           0 :                                 t = krok->highlight_starttime;
    3267           0 :                                 t /= trak->Media->mediaHeader->timeScale;
    3268           0 :                                 gf_fprintf(dump, "<Karaoke startTime=\"%g\">\n", t);
    3269           0 :                                 for (k=0; k<krok->nb_entries; k++) {
    3270           0 :                                         t = krok->records[k].highlight_endtime;
    3271           0 :                                         t /= trak->Media->mediaHeader->timeScale;
    3272           0 :                                         gf_fprintf(dump, "<KaraokeRange ");
    3273           0 :                                         tx3g_print_char_offsets(dump, krok->records[k].start_charoffset, krok->records[k].end_charoffset, shift_offset, so_count);
    3274           0 :                                         gf_fprintf(dump, "endTime=\"%g\"/>\n", t);
    3275             :                                 }
    3276           0 :                                 gf_fprintf(dump, "</Karaoke>\n");
    3277             :                         }
    3278           0 :                                 break;
    3279             :                         }
    3280             :                 }
    3281             : 
    3282          44 :                 gf_fprintf(dump, "</TextSample>\n");
    3283          44 :                 gf_isom_sample_del(&s);
    3284          44 :                 gf_isom_delete_text_sample(s_txt);
    3285          44 :                 gf_set_progress("TTXT Extract", i, count);
    3286             :         }
    3287           4 :         if (!skip_empty && (last_DTS < trak->Media->mediaHeader->duration)) {
    3288           0 :                 gf_fprintf(dump, "<TextSample sampleTime=\"%s\" text=\"\" />\n", tx3g_format_time(trak->Media->mediaHeader->duration, trak->Media->mediaHeader->timeScale, szDur, GF_FALSE));
    3289             :         }
    3290             : 
    3291           4 :         if (box_dump) {
    3292           0 :                 gf_fprintf(dump, "</TextTrack>\n");
    3293             :         } else {
    3294           4 :                 gf_fprintf(dump, "</TextStream>\n");
    3295             :         }
    3296           4 :         if (count) gf_set_progress("TTXT Extract", count, count);
    3297             :         return GF_OK;
    3298             : }
    3299             : 
    3300             : #include <gpac/webvtt.h>
    3301           4 : static GF_Err gf_isom_dump_srt_track(GF_ISOFile *the_file, u32 track, FILE *dump)
    3302             : {
    3303             :         u32 i, j, k, count, di, len, ts, cur_frame;
    3304             :         u64 start, end;
    3305             :         GF_Tx3gSampleEntryBox *txtd;
    3306             :         char szDur[100];
    3307             :         Bool is_wvtt = GF_FALSE;
    3308           4 :         GF_TrackBox *trak = gf_isom_get_track_from_file(the_file, track);
    3309           4 :         u32 subtype = gf_isom_get_media_subtype(the_file, track, 1);
    3310           4 :         if (!trak) return GF_BAD_PARAM;
    3311           4 :         switch (trak->Media->handler->handlerType) {
    3312             :         case GF_ISOM_MEDIA_TEXT:
    3313             :         case GF_ISOM_MEDIA_SUBT:
    3314             :                 break;
    3315             :         default:
    3316             :                 return GF_BAD_PARAM;
    3317             :         }
    3318             : 
    3319           4 :         ts = trak->Media->mediaHeader->timeScale;
    3320             :         cur_frame = 0;
    3321             :         end = 0;
    3322             : 
    3323           4 :         switch (subtype) {
    3324             :         case GF_ISOM_SUBTYPE_TX3G:
    3325             :         case GF_ISOM_SUBTYPE_TEXT:
    3326             :         case GF_ISOM_SUBTYPE_STXT:
    3327             :                 break;
    3328           1 :         case GF_ISOM_SUBTYPE_WVTT:
    3329             :                 is_wvtt = GF_TRUE;
    3330           1 :                 break;
    3331             :         default:
    3332             :                 return GF_NOT_SUPPORTED;
    3333             :         }
    3334             : 
    3335           4 :         count = gf_isom_get_sample_count(the_file, track);
    3336          53 :         for (i=0; i<count; i++) {
    3337             :                 GF_BitStream *bs;
    3338             :                 GF_TextSample *txt;
    3339          45 :                 GF_ISOSample *s = gf_isom_get_sample(the_file, track, i+1, &di);
    3340          75 :                 if (!s) continue;
    3341             : 
    3342          45 :                 start = s->DTS;
    3343          45 :                 if (s->dataLength==2) {
    3344          17 :                         gf_isom_sample_del(&s);
    3345          17 :                         continue;
    3346             :                 }
    3347          28 :                 if (i+1<count) {
    3348          26 :                         GF_ISOSample *next = gf_isom_get_sample_info(the_file, track, i+2, NULL, NULL);
    3349          26 :                         if (next) {
    3350          26 :                                 end = next->DTS;
    3351          26 :                                 gf_isom_sample_del(&next);
    3352             :                         }
    3353             :                 } else {
    3354           2 :                         end = gf_isom_get_media_duration(the_file, track) ;
    3355             :                 }
    3356          28 :                 if (!is_wvtt) {
    3357          15 :                         cur_frame++;
    3358          15 :                         gf_fprintf(dump, "%d\n", cur_frame);
    3359          15 :                         tx3g_format_time(start, ts, szDur, GF_TRUE);
    3360          15 :                         gf_fprintf(dump, "%s --> ", szDur);
    3361          15 :                         tx3g_format_time(end, ts, szDur, GF_TRUE);
    3362          15 :                         gf_fprintf(dump, "%s\n", szDur);
    3363             :                 }
    3364             : 
    3365             : 
    3366          28 :                 if (is_wvtt) {
    3367             :                         u64 start_ts, end_ts;
    3368             :                         void webvtt_write_cue(GF_BitStream *bs, GF_WebVTTCue *cue, Bool write_srt);
    3369             :                         GF_List *cues;
    3370             :                         u32 nb_cues;
    3371             :                         u8 *data;
    3372             :                         u32 data_len;
    3373             : 
    3374          13 :                         start_ts = s->DTS * 1000;
    3375          13 :                         start_ts /= trak->Media->mediaHeader->timeScale;
    3376          13 :                         end_ts = end * 1000;
    3377          13 :                         end_ts /= trak->Media->mediaHeader->timeScale;
    3378          13 :                         cues = gf_webvtt_parse_cues_from_data(s->data, s->dataLength, start_ts, end_ts);
    3379          13 :                         gf_isom_sample_del(&s);
    3380          13 :                         nb_cues = gf_list_count(cues);
    3381             : 
    3382          13 :                         if (!nb_cues) {
    3383           6 :                                 gf_list_del(cues);
    3384           6 :                                 continue;
    3385             :                         }
    3386             : 
    3387           7 :                         cur_frame++;
    3388           7 :                         gf_fprintf(dump, "%d\n", cur_frame);
    3389             : 
    3390           7 :                         bs = gf_bs_new(NULL, 0, GF_BITSTREAM_WRITE);
    3391          14 :                         for (j = 0; j < gf_list_count(cues); j++) {
    3392           7 :                                 GF_WebVTTCue *cue = (GF_WebVTTCue *)gf_list_get(cues, j);
    3393           7 :                                 webvtt_write_cue(bs, cue, GF_TRUE);
    3394           7 :                                 gf_webvtt_cue_del(cue);
    3395             :                         }
    3396           7 :                         gf_list_del(cues);
    3397           7 :                         gf_bs_write_u16(bs, 0);
    3398           7 :                         gf_bs_get_content(bs, &data, &data_len);
    3399           7 :                         gf_bs_del(bs);
    3400             : 
    3401           7 :                         if (data) {
    3402           7 :                                 gf_fprintf(dump, "%s\n", data);
    3403           7 :                                 gf_free(data);
    3404             :                         } else {
    3405           0 :                                 gf_fprintf(dump, "\n");
    3406             :                         }
    3407           7 :                         continue;
    3408          15 :                 } else if (subtype == GF_ISOM_SUBTYPE_STXT) {
    3409           0 :                         if (s->dataLength)
    3410           0 :                                 gf_fprintf(dump, "%s\n", s->data);
    3411           0 :                         gf_isom_sample_del(&s);
    3412           0 :                         continue;
    3413             :                 }
    3414          15 :                 else if ((subtype!=GF_ISOM_SUBTYPE_TX3G) && (subtype!=GF_ISOM_SUBTYPE_TEXT)) {
    3415           0 :                         gf_fprintf(dump, "unknwon\n");
    3416           0 :                         gf_isom_sample_del(&s);
    3417           0 :                         continue;
    3418             :                 }
    3419          15 :                 bs = gf_bs_new(s->data, s->dataLength, GF_BITSTREAM_READ);
    3420          15 :                 txt = gf_isom_parse_text_sample(bs);
    3421          15 :                 gf_bs_del(bs);
    3422             : 
    3423          15 :                 txtd = (GF_Tx3gSampleEntryBox *)gf_list_get(trak->Media->information->sampleTable->SampleDescription->child_boxes, di-1);
    3424             : 
    3425          15 :                 if (!txt || !txt->len) {
    3426           0 :                         gf_fprintf(dump, "\n");
    3427             :                 } else {
    3428             :                         u32 styles, char_num, new_styles, color, new_color;
    3429             :                         u16 utf16Line[10000];
    3430             : 
    3431             :                         /*UTF16*/
    3432          15 :                         if ((txt->len>2) && ((unsigned char) txt->text[0] == (unsigned char) 0xFE) && ((unsigned char) txt->text[1] == (unsigned char) 0xFF)) {
    3433           0 :                                 memcpy(utf16Line, txt->text+2, sizeof(char)*txt->len);
    3434           0 :                                 ( ((char *)utf16Line)[txt->len] ) = 0;
    3435           0 :                                 len = txt->len;
    3436             :                         } else {
    3437          15 :                                 u8 *str = (u8 *) (txt->text);
    3438          15 :                                 size_t res = gf_utf8_mbstowcs(utf16Line, 10000, (const char **) &str);
    3439          15 :                                 if (res==(size_t)-1) return GF_NON_COMPLIANT_BITSTREAM;
    3440          15 :                                 len = (u32) res;
    3441          15 :                                 utf16Line[len] = 0;
    3442             :                         }
    3443             :                         char_num = 0;
    3444             :                         styles = 0;
    3445          15 :                         new_styles = txtd->default_style.style_flags;
    3446          15 :                         color = new_color = txtd->default_style.text_color;
    3447             : 
    3448         360 :                         for (j=0; j<len; j++) {
    3449             :                                 Bool is_new_line;
    3450             : 
    3451         345 :                                 if (txt->styles) {
    3452         186 :                                         new_styles = txtd->default_style.style_flags;
    3453         186 :                                         new_color = txtd->default_style.text_color;
    3454         206 :                                         for (k=0; k<txt->styles->entry_count; k++) {
    3455         206 :                                                 if (txt->styles->styles[k].startCharOffset>char_num) continue;
    3456         206 :                                                 if (txt->styles->styles[k].endCharOffset<char_num+1) continue;
    3457             : 
    3458         186 :                                                 if (txt->styles->styles[k].style_flags & (GF_TXT_STYLE_ITALIC | GF_TXT_STYLE_BOLD | GF_TXT_STYLE_UNDERLINED | GF_TXT_STYLE_STRIKETHROUGH)) {
    3459         186 :                                                         new_styles = txt->styles->styles[k].style_flags;
    3460         186 :                                                         new_color = txt->styles->styles[k].text_color;
    3461         186 :                                                         break;
    3462             :                                                 }
    3463             :                                         }
    3464             :                                 }
    3465         345 :                                 if (new_styles != styles) {
    3466           9 :                                         if ((new_styles & GF_TXT_STYLE_BOLD) && !(styles & GF_TXT_STYLE_BOLD)) gf_fprintf(dump, "<b>");
    3467           9 :                                         if ((new_styles & GF_TXT_STYLE_ITALIC) && !(styles & GF_TXT_STYLE_ITALIC)) gf_fprintf(dump, "<i>");
    3468           9 :                                         if ((new_styles & GF_TXT_STYLE_UNDERLINED) && !(styles & GF_TXT_STYLE_UNDERLINED)) gf_fprintf(dump, "<u>");
    3469           9 :                                         if ((new_styles & GF_TXT_STYLE_STRIKETHROUGH) && !(styles & GF_TXT_STYLE_STRIKETHROUGH)) gf_fprintf(dump, "<strike>");
    3470             : 
    3471           9 :                                         if ((styles & GF_TXT_STYLE_STRIKETHROUGH) && !(new_styles & GF_TXT_STYLE_STRIKETHROUGH)) gf_fprintf(dump, "</strike>");
    3472           9 :                                         if ((styles & GF_TXT_STYLE_UNDERLINED) && !(new_styles & GF_TXT_STYLE_UNDERLINED)) gf_fprintf(dump, "</u>");
    3473           9 :                                         if ((styles & GF_TXT_STYLE_ITALIC) && !(new_styles & GF_TXT_STYLE_ITALIC)) gf_fprintf(dump, "</i>");
    3474           9 :                                         if ((styles & GF_TXT_STYLE_BOLD) && !(new_styles & GF_TXT_STYLE_BOLD)) gf_fprintf(dump, "</b>");
    3475             : 
    3476             :                                         styles = new_styles;
    3477             :                                 }
    3478         345 :                                 if (new_color != color) {
    3479           4 :                                         if (new_color ==txtd->default_style.text_color) {
    3480           2 :                                                 gf_fprintf(dump, "</font>");
    3481             :                                         } else {
    3482           2 :                                                 gf_fprintf(dump, "<font color=\"%s\">", gf_color_get_name(new_color) );
    3483             :                                         }
    3484             :                                         color = new_color;
    3485             :                                 }
    3486             : 
    3487             :                                 /*not sure if styles must be reseted at line breaks in srt...*/
    3488             :                                 is_new_line = GF_FALSE;
    3489         345 :                                 if ((utf16Line[j]=='\n') || (utf16Line[j]=='\r') ) {
    3490           6 :                                         if ((utf16Line[j]=='\r') && (utf16Line[j+1]=='\n')) j++;
    3491           6 :                                         gf_fprintf(dump, "\n");
    3492             :                                         is_new_line = GF_TRUE;
    3493             :                                 }
    3494             : 
    3495             :                                 if (!is_new_line) {
    3496             :                                         size_t sl;
    3497             :                                         char szChar[30];
    3498             :                                         s16 swT[2], *swz;
    3499         339 :                                         swT[0] = utf16Line[j];
    3500         339 :                                         swT[1] = 0;
    3501         339 :                                         swz= (s16 *)swT;
    3502         339 :                                         sl = gf_utf8_wcstombs(szChar, 30, (const unsigned short **) &swz);
    3503         339 :                                         if (sl == (size_t)-1) sl=0;
    3504         339 :                                         szChar[(u32) sl]=0;
    3505         339 :                                         gf_fprintf(dump, "%s", szChar);
    3506             :                                 }
    3507         345 :                                 char_num++;
    3508             :                         }
    3509             :                         new_styles = 0;
    3510          15 :                         if (new_styles != styles) {
    3511           9 :                                 if (styles & GF_TXT_STYLE_STRIKETHROUGH) gf_fprintf(dump, "</strike>");
    3512           9 :                                 if (styles & GF_TXT_STYLE_UNDERLINED) gf_fprintf(dump, "</u>");
    3513           9 :                                 if (styles & GF_TXT_STYLE_ITALIC) gf_fprintf(dump, "</i>");
    3514           9 :                                 if (styles & GF_TXT_STYLE_BOLD) gf_fprintf(dump, "</b>");
    3515             : 
    3516             : //                              styles = 0;
    3517             :                         }
    3518             : 
    3519          15 :                         if (color != txtd->default_style.text_color) {
    3520           0 :                                 gf_fprintf(dump, "</font>");
    3521             : //                              color = txtd->default_style.text_color;
    3522             :                         }
    3523          15 :                         gf_fprintf(dump, "\n");
    3524             :                 }
    3525          15 :                 gf_isom_sample_del(&s);
    3526          15 :                 gf_isom_delete_text_sample(txt);
    3527          15 :                 gf_fprintf(dump, "\n");
    3528          15 :                 gf_set_progress("SRT Extract", i, count);
    3529             :         }
    3530           4 :         if (count) gf_set_progress("SRT Extract", i, count);
    3531             :         return GF_OK;
    3532             : }
    3533             : 
    3534           2 : static GF_Err gf_isom_dump_svg_track(GF_ISOFile *the_file, u32 track, FILE *dump)
    3535             : {
    3536             :         char nhmlFileName[1024];
    3537             :         FILE *nhmlFile;
    3538             :         u32 i, count, di, ts, cur_frame;
    3539             :         u64 start, end;
    3540             :         GF_BitStream *bs;
    3541             : 
    3542           2 :         GF_TrackBox *trak = gf_isom_get_track_from_file(the_file, track);
    3543           2 :         if (!trak) return GF_BAD_PARAM;
    3544           2 :         switch (trak->Media->handler->handlerType) {
    3545             :         case GF_ISOM_MEDIA_TEXT:
    3546             :         case GF_ISOM_MEDIA_SUBT:
    3547             :                 break;
    3548             :         default:
    3549             :                 return GF_BAD_PARAM;
    3550             :         }
    3551             : 
    3552           2 :         strcpy(nhmlFileName, the_file->fileName);
    3553             :         strcat(nhmlFileName, ".nhml");
    3554           2 :         nhmlFile = gf_fopen(nhmlFileName, "wt");
    3555           2 :         gf_fprintf(nhmlFile, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
    3556           2 :         gf_fprintf(nhmlFile, "<NHNTStream streamType=\"3\" objectTypeIndication=\"10\" timeScale=\"%d\" baseMediaFile=\"file.svg\" inRootOD=\"yes\">\n", trak->Media->mediaHeader->timeScale);
    3557           2 :         gf_fprintf(nhmlFile, "<NHNTSample isRAP=\"yes\" DTS=\"0\" xmlFrom=\"doc.start\" xmlTo=\"text_1.start\"/>\n");
    3558             : 
    3559           2 :         ts = trak->Media->mediaHeader->timeScale;
    3560             :         cur_frame = 0;
    3561             :         end = 0;
    3562             : 
    3563           2 :         gf_fprintf(dump, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
    3564           2 :         gf_fprintf(dump, "<svg version=\"1.2\" baseProfile=\"tiny\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"%d\" height=\"%d\" fill=\"black\">\n", trak->Header->width >> 16 , trak->Header->height >> 16);
    3565           2 :         gf_fprintf(dump, "<g transform=\"translate(%d, %d)\" text-anchor=\"middle\">\n", (trak->Header->width >> 16)/2 , (trak->Header->height >> 16)/2);
    3566             : 
    3567           2 :         count = gf_isom_get_sample_count(the_file, track);
    3568          26 :         for (i=0; i<count; i++) {
    3569             :                 GF_TextSample *txt;
    3570          22 :                 GF_ISOSample *s = gf_isom_get_sample(the_file, track, i+1, &di);
    3571          34 :                 if (!s) continue;
    3572             : 
    3573          22 :                 start = s->DTS;
    3574          22 :                 if (s->dataLength==2) {
    3575          12 :                         gf_isom_sample_del(&s);
    3576          12 :                         continue;
    3577             :                 }
    3578          10 :                 if (i+1<count) {
    3579          10 :                         GF_ISOSample *next = gf_isom_get_sample_info(the_file, track, i+2, NULL, NULL);
    3580          10 :                         if (next) {
    3581          10 :                                 end = next->DTS;
    3582          10 :                                 gf_isom_sample_del(&next);
    3583             :                         }
    3584             :                 }
    3585             : 
    3586          10 :                 cur_frame++;
    3587          10 :                 bs = gf_bs_new(s->data, s->dataLength, GF_BITSTREAM_READ);
    3588          10 :                 txt = gf_isom_parse_text_sample(bs);
    3589          10 :                 gf_bs_del(bs);
    3590             : 
    3591          10 :                 if (!txt->len) continue;
    3592             : 
    3593          10 :                 gf_fprintf(dump, " <text id=\"text_%d\" display=\"none\">%s\n", cur_frame, txt->text);
    3594          10 :                 gf_fprintf(dump, "  <set attributeName=\"display\" to=\"inline\" begin=\"%g\" end=\"%g\"/>\n", ((s64)start*1.0)/ts, ((s64)end*1.0)/ts);
    3595          10 :                 gf_fprintf(dump, "  <discard begin=\"%g\"/>\n", ((s64)end*1.0)/ts);
    3596          10 :                 gf_fprintf(dump, " </text>\n");
    3597          10 :                 gf_isom_sample_del(&s);
    3598          10 :                 gf_isom_delete_text_sample(txt);
    3599          10 :                 gf_fprintf(dump, "\n");
    3600          10 :                 gf_set_progress("SRT Extract", i, count);
    3601             : 
    3602          10 :                 if (i == count - 2) {
    3603           2 :                         gf_fprintf(nhmlFile, "<NHNTSample isRAP=\"no\" DTS=\"%f\" xmlFrom=\"text_%d.start\" xmlTo=\"doc.end\"/>\n", ((s64)start*1.0), cur_frame);
    3604             :                 } else {
    3605           8 :                         gf_fprintf(nhmlFile, "<NHNTSample isRAP=\"no\" DTS=\"%f\" xmlFrom=\"text_%d.start\" xmlTo=\"text_%d.start\"/>\n", ((s64)start*1.0), cur_frame, cur_frame+1);
    3606             :                 }
    3607             : 
    3608             :         }
    3609           2 :         gf_fprintf(dump, "</g>\n");
    3610           2 :         gf_fprintf(dump, "</svg>\n");
    3611             : 
    3612           2 :         gf_fprintf(nhmlFile, "</NHNTStream>\n");
    3613           2 :         gf_fclose(nhmlFile);
    3614           2 :         gf_file_delete(nhmlFileName);
    3615           2 :         if (count) gf_set_progress("SRT Extract", i, count);
    3616             :         return GF_OK;
    3617             : }
    3618             : 
    3619           0 : static GF_Err gf_isom_dump_ogg_chap(GF_ISOFile *the_file, u32 track, FILE *dump, GF_TextDumpType dump_type)
    3620             : {
    3621             :         u32 i, count, di, ts, cur_frame;
    3622             :         u64 start;
    3623             :         GF_BitStream *bs;
    3624             : 
    3625           0 :         GF_TrackBox *trak = gf_isom_get_track_from_file(the_file, track);
    3626           0 :         if (!trak) return GF_BAD_PARAM;
    3627           0 :         switch (trak->Media->handler->handlerType) {
    3628             :         case GF_ISOM_MEDIA_TEXT:
    3629             :         case GF_ISOM_MEDIA_SUBT:
    3630             :                 break;
    3631             :         default:
    3632             :                 return GF_BAD_PARAM;
    3633             :         }
    3634             : 
    3635           0 :         ts = trak->Media->mediaHeader->timeScale;
    3636             :         cur_frame = 0;
    3637             : 
    3638           0 :         count = gf_isom_get_sample_count(the_file, track);
    3639           0 :         for (i=0; i<count; i++) {
    3640             :                 GF_TextSample *txt;
    3641           0 :                 GF_ISOSample *s = gf_isom_get_sample(the_file, track, i+1, &di);
    3642           0 :                 if (!s) continue;
    3643             : 
    3644           0 :                 start = s->DTS;
    3645           0 :                 if (s->dataLength==2) {
    3646           0 :                         gf_isom_sample_del(&s);
    3647           0 :                         continue;
    3648             :                 }
    3649           0 :                 if (i+1<count) {
    3650           0 :                         GF_ISOSample *next = gf_isom_get_sample_info(the_file, track, i+2, NULL, NULL);
    3651           0 :                         if (next) {
    3652           0 :                                 gf_isom_sample_del(&next);
    3653             :                         }
    3654             :                 }
    3655             : 
    3656             :                 cur_frame++;
    3657           0 :                 bs = gf_bs_new(s->data, s->dataLength, GF_BITSTREAM_READ);
    3658           0 :                 txt = gf_isom_parse_text_sample(bs);
    3659           0 :                 gf_bs_del(bs);
    3660             : 
    3661           0 :                 if (!txt->len) continue;
    3662             : 
    3663           0 :                 if (dump_type==GF_TEXTDUMPTYPE_OGG_CHAP) {
    3664             :                         char szDur[20];
    3665           0 :                         fprintf(dump, "CHAPTER%02d=%s\n", i+1, format_duration(start, ts, szDur));
    3666           0 :                         fprintf(dump, "CHAPTER%02dNAME=%s\n", i+1, txt->text);
    3667             :                 } else {
    3668           0 :                         fprintf(dump, "AddChapterBySecond("LLD",%s)\n", start / ts, txt->text);
    3669             :                 }
    3670             : 
    3671           0 :                 gf_isom_sample_del(&s);
    3672           0 :                 gf_isom_delete_text_sample(txt);
    3673             :         }
    3674             :         return GF_OK;
    3675             : }
    3676             : GF_EXPORT
    3677          10 : GF_Err gf_isom_text_dump(GF_ISOFile *the_file, u32 track, FILE *dump, GF_TextDumpType dump_type)
    3678             : {
    3679          10 :         switch (dump_type) {
    3680           2 :         case GF_TEXTDUMPTYPE_SVG:
    3681           2 :                 return gf_isom_dump_svg_track(the_file, track, dump);
    3682           4 :         case GF_TEXTDUMPTYPE_SRT:
    3683           4 :                 return gf_isom_dump_srt_track(the_file, track, dump);
    3684           4 :         case GF_TEXTDUMPTYPE_TTXT:
    3685             :         case GF_TEXTDUMPTYPE_TTXT_BOXES:
    3686             :         case GF_TEXTDUMPTYPE_TTXT_CHAP:
    3687           4 :                 return gf_isom_dump_ttxt_track(the_file, track, dump, dump_type);
    3688           0 :         case GF_TEXTDUMPTYPE_OGG_CHAP:
    3689             :         case GF_TEXTDUMPTYPE_ZOOM_CHAP:
    3690           0 :                 return gf_isom_dump_ogg_chap(the_file, track, dump, dump_type);
    3691             :         default:
    3692             :                 return GF_BAD_PARAM;
    3693             :         }
    3694             : }
    3695             : 
    3696             : 
    3697             : /* ISMA 1.0 Encryption and Authentication V 1.0  dump */
    3698          17 : GF_Err sinf_box_dump(GF_Box *a, FILE * trace)
    3699             : {
    3700          17 :         gf_isom_box_dump_start(a, "ProtectionSchemeInfoBox", trace);
    3701          17 :         gf_fprintf(trace, ">\n");
    3702          17 :         gf_isom_box_dump_done("ProtectionSchemeInfoBox", a, trace);
    3703          17 :         return GF_OK;
    3704             : }
    3705             : 
    3706           8 : GF_Err frma_box_dump(GF_Box *a, FILE * trace)
    3707             : {
    3708             :         GF_OriginalFormatBox *p;
    3709             :         p = (GF_OriginalFormatBox *)a;
    3710           8 :         gf_isom_box_dump_start(a, "OriginalFormatBox", trace);
    3711           8 :         gf_fprintf(trace, "data_format=\"%s\">\n", gf_4cc_to_str(p->data_format));
    3712           8 :         gf_isom_box_dump_done("OriginalFormatBox", a, trace);
    3713           8 :         return GF_OK;
    3714             : }
    3715             : 
    3716          17 : GF_Err schm_box_dump(GF_Box *a, FILE * trace)
    3717             : {
    3718             :         GF_SchemeTypeBox *p;
    3719             :         p = (GF_SchemeTypeBox *)a;
    3720          17 :         gf_isom_box_dump_start(a, "SchemeTypeBox", trace);
    3721          17 :         gf_fprintf(trace, "scheme_type=\"%s\" scheme_version=\"%d\" ", gf_4cc_to_str(p->scheme_type), p->scheme_version);
    3722          17 :         if (p->URI) gf_fprintf(trace, "scheme_uri=\"%s\"", p->URI);
    3723          17 :         gf_fprintf(trace, ">\n");
    3724             : 
    3725          17 :         gf_isom_box_dump_done("SchemeTypeBox", a, trace);
    3726          17 :         return GF_OK;
    3727             : }
    3728             : 
    3729           6 : GF_Err schi_box_dump(GF_Box *a, FILE * trace)
    3730             : {
    3731           6 :         gf_isom_box_dump_start(a, "SchemeInformationBox", trace);
    3732           6 :         gf_fprintf(trace, ">\n");
    3733           6 :         gf_isom_box_dump_done("SchemeInformationBox", a, trace);
    3734           6 :         return GF_OK;
    3735             : }
    3736             : 
    3737           6 : GF_Err iKMS_box_dump(GF_Box *a, FILE * trace)
    3738             : {
    3739             :         GF_ISMAKMSBox *p;
    3740             :         p = (GF_ISMAKMSBox *)a;
    3741           6 :         gf_isom_box_dump_start(a, "KMSBox", trace);
    3742           6 :         gf_fprintf(trace, "kms_URI=\"%s\">\n", p->URI);
    3743           6 :         gf_isom_box_dump_done("KMSBox", a, trace);
    3744           6 :         return GF_OK;
    3745             : 
    3746             : }
    3747             : 
    3748           7 : GF_Err iSFM_box_dump(GF_Box *a, FILE * trace)
    3749             : {
    3750             :         GF_ISMASampleFormatBox *p;
    3751           7 :         const char *name = (a->type==GF_ISOM_BOX_TYPE_ISFM) ? "ISMASampleFormat" : "OMADRMAUFormatBox";
    3752             :         p = (GF_ISMASampleFormatBox *)a;
    3753           7 :         gf_isom_box_dump_start(a, name, trace);
    3754           7 :         gf_fprintf(trace, "selective_encryption=\"%d\" key_indicator_length=\"%d\" IV_length=\"%d\">\n", p->selective_encryption, p->key_indicator_length, p->IV_length);
    3755           7 :         gf_isom_box_dump_done(name, a, trace);
    3756           7 :         return GF_OK;
    3757             : }
    3758             : 
    3759           1 : GF_Err iSLT_box_dump(GF_Box *a, FILE * trace)
    3760             : {
    3761             :         GF_ISMACrypSaltBox *p = (GF_ISMACrypSaltBox *)a;
    3762           1 :         gf_isom_box_dump_start(a, "ISMACrypSaltBox", trace);
    3763           1 :         gf_fprintf(trace, "salt=\""LLU"\">\n", p->salt);
    3764           1 :         gf_isom_box_dump_done("ISMACrypSaltBox", a, trace);
    3765           1 :         return GF_OK;
    3766             : }
    3767             : 
    3768             : GF_EXPORT
    3769           5 : GF_Err gf_isom_dump_ismacryp_protection(GF_ISOFile *the_file, u32 trackNumber, FILE * trace)
    3770             : {
    3771             :         u32 i, count;
    3772             :         GF_SampleEntryBox *entry;
    3773             :         GF_Err e;
    3774             :         GF_TrackBox *trak;
    3775             : 
    3776           5 :         trak = gf_isom_get_track_from_file(the_file, trackNumber);
    3777           5 :         if (!trak) return GF_BAD_PARAM;
    3778             : 
    3779             : 
    3780           5 :         gf_fprintf(trace, "<ISMACrypSampleDescriptions>\n");
    3781           5 :         count = gf_isom_get_sample_description_count(the_file, trackNumber);
    3782          15 :         for (i=0; i<count; i++) {
    3783           5 :                 e = Media_GetSampleDesc(trak->Media, i+1, (GF_SampleEntryBox **) &entry, NULL);
    3784           5 :                 if (e) return e;
    3785             : 
    3786           5 :                 switch (entry->type) {
    3787             :                 case GF_ISOM_BOX_TYPE_ENCA:
    3788             :                 case GF_ISOM_BOX_TYPE_ENCV:
    3789             :                 case GF_ISOM_BOX_TYPE_ENCT:
    3790             :                 case GF_ISOM_BOX_TYPE_ENCS:
    3791             :                         break;
    3792           0 :                 default:
    3793           0 :                         continue;
    3794             :                 }
    3795           5 :                 gf_isom_box_dump(entry, trace);
    3796             :         }
    3797           5 :         gf_fprintf(trace, "</ISMACrypSampleDescriptions>\n");
    3798           5 :         return GF_OK;
    3799             : }
    3800             : 
    3801             : GF_EXPORT
    3802         932 : GF_Err gf_isom_dump_ismacryp_sample(GF_ISOFile *the_file, u32 trackNumber, u32 SampleNum, FILE * trace)
    3803             : {
    3804             :         GF_ISOSample *samp;
    3805             :         GF_ISMASample  *isma_samp;
    3806             :         u32 descIndex;
    3807             : 
    3808         932 :         samp = gf_isom_get_sample(the_file, trackNumber, SampleNum, &descIndex);
    3809         932 :         if (!samp) return GF_BAD_PARAM;
    3810             : 
    3811         932 :         isma_samp = gf_isom_get_ismacryp_sample(the_file, trackNumber, samp, descIndex);
    3812         932 :         if (!isma_samp) {
    3813           0 :                 gf_isom_sample_del(&samp);
    3814           0 :                 return GF_NOT_SUPPORTED;
    3815             :         }
    3816             : 
    3817         932 :         gf_fprintf(trace, "<ISMACrypSample SampleNumber=\"%d\" DataSize=\"%d\" CompositionTime=\""LLD"\" ", SampleNum, isma_samp->dataLength, (samp->DTS+samp->CTS_Offset) );
    3818         932 :         if (samp->CTS_Offset) gf_fprintf(trace, "DecodingTime=\""LLD"\" ", samp->DTS);
    3819         932 :         if (gf_isom_has_sync_points(the_file, trackNumber)) gf_fprintf(trace, "RandomAccessPoint=\"%s\" ", samp->IsRAP ? "Yes" : "No");
    3820         932 :         gf_fprintf(trace, "IsEncrypted=\"%s\" ", (isma_samp->flags & GF_ISOM_ISMA_IS_ENCRYPTED) ? "Yes" : "No");
    3821         932 :         if (isma_samp->flags & GF_ISOM_ISMA_IS_ENCRYPTED) {
    3822         932 :                 gf_fprintf(trace, "IV=\""LLD"\" ", isma_samp->IV);
    3823         932 :                 if (isma_samp->key_indicator) dump_data_attribute(trace, "KeyIndicator", (char*)isma_samp->key_indicator, isma_samp->KI_length);
    3824             :         }
    3825         932 :         gf_fprintf(trace, "/>\n");
    3826             : 
    3827         932 :         gf_isom_sample_del(&samp);
    3828         932 :         gf_isom_ismacryp_delete_sample(isma_samp);
    3829         932 :         return GF_OK;
    3830             : }
    3831             : 
    3832             : /* end of ISMA 1.0 Encryption and Authentication V 1.0 */
    3833             : 
    3834             : 
    3835             : /* Apple extensions */
    3836             : 
    3837          45 : GF_Err ilst_item_box_dump(GF_Box *a, FILE * trace)
    3838             : {
    3839             :         u32 val, itype=0;
    3840             :         Bool no_dump = GF_FALSE;
    3841             :         Bool unknown = GF_FALSE;
    3842             :         GF_DataBox *dbox = NULL;
    3843             :         const char *name = "UnknownBox";
    3844             :         GF_ListItemBox *itune = (GF_ListItemBox *)a;
    3845             : 
    3846             : 
    3847          45 :         if (itune->type==GF_ISOM_BOX_TYPE_iTunesSpecificInfo) {
    3848             :                 name = "iTunesSpecificBox";
    3849             :                 no_dump = GF_TRUE;
    3850           0 :                 dbox = itune->data;
    3851          45 :         } else if (itune->type==GF_ISOM_BOX_TYPE_UNKNOWN) {
    3852           0 :                 dbox = (GF_DataBox *) gf_isom_box_find_child(itune->child_boxes, GF_ISOM_BOX_TYPE_DATA);
    3853             :                 unknown = GF_TRUE;
    3854             :         } else {
    3855          45 :                 s32 idx = gf_itags_find_by_itag(itune->type);
    3856          45 :                 if (idx>=0) {
    3857          45 :                         name = gf_itags_get_name((u32) idx);
    3858          45 :                         itype = gf_itags_get_type((u32) idx);
    3859          45 :                         dbox = itune->data;
    3860             :                 }
    3861             :         }
    3862          45 :         gf_isom_box_dump_start(a, name, trace);
    3863             : 
    3864          45 :         if (!no_dump && dbox) {
    3865             :                 GF_BitStream *bs;
    3866           0 :                 switch (itune->type) {
    3867           0 :                 case GF_ISOM_ITUNE_DISK:
    3868             :                 case GF_ISOM_ITUNE_TRACKNUMBER:
    3869           0 :                         bs = gf_bs_new(dbox->data, dbox->dataSize, GF_BITSTREAM_READ);
    3870           0 :                         gf_bs_read_int(bs, 16);
    3871           0 :                         val = gf_bs_read_int(bs, 16);
    3872           0 :                         if (itune->type==GF_ISOM_ITUNE_DISK) {
    3873           0 :                                 gf_fprintf(trace, " DiskNumber=\"%d\" NbDisks=\"%d\" ", val, gf_bs_read_int(bs, 16) );
    3874             :                         } else {
    3875           0 :                                 gf_fprintf(trace, " TrackNumber=\"%d\" NbTracks=\"%d\" ", val, gf_bs_read_int(bs, 16) );
    3876             :                         }
    3877           0 :                         gf_bs_del(bs);
    3878           0 :                         break;
    3879           0 :                 case GF_ISOM_ITUNE_TEMPO:
    3880           0 :                         bs = gf_bs_new(dbox->data, dbox->dataSize, GF_BITSTREAM_READ);
    3881           0 :                         gf_fprintf(trace, " BPM=\"%d\" ", gf_bs_read_int(bs, 16) );
    3882           0 :                         gf_bs_del(bs);
    3883           0 :                         break;
    3884           0 :                 case GF_ISOM_ITUNE_COMPILATION:
    3885           0 :                         gf_fprintf(trace, " IsCompilation=\"%s\" ", (dbox && dbox->data && dbox->data[0]) ? "yes" : "no");
    3886           0 :                         break;
    3887           0 :                 case GF_ISOM_ITUNE_GAPLESS:
    3888           0 :                         gf_fprintf(trace, " IsGapeless=\"%s\" ", (dbox && dbox->data && itune->data->data[0]) ? "yes" : "no");
    3889           0 :                         break;
    3890           0 :                 default:
    3891           0 :                         if (dbox && dbox->data) {
    3892           0 :                                 gf_fprintf(trace, " value=\"");
    3893           0 :                                 if (!unknown && (itype==GF_ITAG_STR)) {
    3894           0 :                                         dump_data_string(trace, dbox->data, dbox->dataSize);
    3895             :                                 }
    3896           0 :                                 else if (!unknown && gf_utf8_is_legal(dbox->data, dbox->dataSize) ) {
    3897           0 :                                         dump_data_string(trace, dbox->data, dbox->dataSize);
    3898             :                                 } else {
    3899           0 :                                         dump_data(trace, dbox->data, dbox->dataSize);
    3900             :                                 }
    3901           0 :                                 gf_fprintf(trace, "\" ");
    3902             :                         }
    3903             :                         break;
    3904             :                 }
    3905          45 :         }
    3906          45 :         gf_fprintf(trace, ">\n");
    3907          45 :         gf_isom_box_dump_done(name, a, trace);
    3908          45 :         return GF_OK;
    3909             : }
    3910             : 
    3911             : #ifndef GPAC_DISABLE_ISOM_ADOBE
    3912             : 
    3913           1 : GF_Err abst_box_dump(GF_Box *a, FILE * trace)
    3914             : {
    3915             :         u32 i;
    3916             :         GF_AdobeBootstrapInfoBox *p = (GF_AdobeBootstrapInfoBox*)a;
    3917           1 :         gf_isom_box_dump_start(a, "AdobeBootstrapBox", trace);
    3918             : 
    3919           2 :         gf_fprintf(trace, "BootstrapinfoVersion=\"%u\" Profile=\"%u\" Live=\"%u\" Update=\"%u\" TimeScale=\"%u\" CurrentMediaTime=\""LLU"\" SmpteTimeCodeOffset=\""LLU"\" ",
    3920           1 :                 p->bootstrapinfo_version, p->profile, p->live, p->update, p->time_scale, p->current_media_time, p->smpte_time_code_offset);
    3921           1 :         if (p->movie_identifier)
    3922           0 :                 gf_fprintf(trace, "MovieIdentifier=\"%s\" ", p->movie_identifier);
    3923           1 :         if (p->drm_data)
    3924           0 :                 gf_fprintf(trace, "DrmData=\"%s\" ", p->drm_data);
    3925           1 :         if (p->meta_data)
    3926           0 :                 gf_fprintf(trace, "MetaData=\"%s\" ", p->meta_data);
    3927           1 :         gf_fprintf(trace, ">\n");
    3928             : 
    3929           1 :         for (i=0; i<p->server_entry_count; i++) {
    3930           0 :                 char *str = (char*)gf_list_get(p->server_entry_table, i);
    3931           0 :                 gf_fprintf(trace, "<ServerEntry>%s</ServerEntry>\n", str);
    3932             :         }
    3933             : 
    3934           0 :         for (i=0; i<p->quality_entry_count; i++) {
    3935           0 :                 char *str = (char*)gf_list_get(p->quality_entry_table, i);
    3936           0 :                 gf_fprintf(trace, "<QualityEntry>%s</QualityEntry>\n", str);
    3937             :         }
    3938             : 
    3939           0 :         for (i=0; i<p->segment_run_table_count; i++)
    3940           0 :                 gf_isom_box_dump(gf_list_get(p->segment_run_table_entries, i), trace);
    3941             : 
    3942           0 :         for (i=0; i<p->fragment_run_table_count; i++)
    3943           0 :                 gf_isom_box_dump(gf_list_get(p->fragment_run_table_entries, i), trace);
    3944             : 
    3945           1 :         gf_isom_box_dump_done("AdobeBootstrapBox", a, trace);
    3946           1 :         return GF_OK;
    3947             : }
    3948             : 
    3949           1 : GF_Err afra_box_dump(GF_Box *a, FILE * trace)
    3950             : {
    3951             :         u32 i;
    3952             :         GF_AdobeFragRandomAccessBox *p = (GF_AdobeFragRandomAccessBox*)a;
    3953           1 :         gf_isom_box_dump_start(a, "AdobeFragmentRandomAccessBox", trace);
    3954             : 
    3955           1 :         gf_fprintf(trace, "LongIDs=\"%u\" LongOffsets=\"%u\" TimeScale=\"%u\">\n", p->long_ids, p->long_offsets, p->time_scale);
    3956             : 
    3957           1 :         for (i=0; i<p->entry_count; i++) {
    3958           0 :                 GF_AfraEntry *ae = (GF_AfraEntry *)gf_list_get(p->local_access_entries, i);
    3959           0 :                 gf_fprintf(trace, "<LocalAccessEntry Time=\""LLU"\" Offset=\""LLU"\"/>\n", ae->time, ae->offset);
    3960             :         }
    3961             : 
    3962           0 :         for (i=0; i<p->global_entry_count; i++) {
    3963           0 :                 GF_GlobalAfraEntry *gae = (GF_GlobalAfraEntry *)gf_list_get(p->global_access_entries, i);
    3964           0 :                 gf_fprintf(trace, "<GlobalAccessEntry Time=\""LLU"\" Segment=\"%u\" Fragment=\"%u\" AfraOffset=\""LLU"\" OffsetFromAfra=\""LLU"\"/>\n",
    3965             :                         gae->time, gae->segment, gae->fragment, gae->afra_offset, gae->offset_from_afra);
    3966             :         }
    3967             : 
    3968           1 :         gf_isom_box_dump_done("AdobeFragmentRandomAccessBox", a, trace);
    3969           1 :         return GF_OK;
    3970             : }
    3971             : 
    3972           1 : GF_Err afrt_box_dump(GF_Box *a, FILE * trace)
    3973             : {
    3974             :         u32 i;
    3975             :         GF_AdobeFragmentRunTableBox *p = (GF_AdobeFragmentRunTableBox*)a;
    3976           1 :         gf_isom_box_dump_start(a, "AdobeFragmentRunTableBox", trace);
    3977             : 
    3978           1 :         gf_fprintf(trace, "TimeScale=\"%u\">\n", p->timescale);
    3979             : 
    3980           1 :         for (i=0; i<p->quality_entry_count; i++) {
    3981           0 :                 char *str = (char*)gf_list_get(p->quality_segment_url_modifiers, i);
    3982           0 :                 gf_fprintf(trace, "<QualityEntry>%s</QualityEntry>\n", str);
    3983             :         }
    3984             : 
    3985           0 :         for (i=0; i<p->fragment_run_entry_count; i++) {
    3986           0 :                 GF_AdobeFragmentRunEntry *fre = (GF_AdobeFragmentRunEntry *)gf_list_get(p->fragment_run_entry_table, i);
    3987           0 :                 gf_fprintf(trace, "<FragmentRunEntry FirstFragment=\"%u\" FirstFragmentTimestamp=\""LLU"\" FirstFragmentDuration=\"%u\"", fre->first_fragment, fre->first_fragment_timestamp, fre->fragment_duration);
    3988           0 :                 if (!fre->fragment_duration)
    3989           0 :                         gf_fprintf(trace, " DiscontinuityIndicator=\"%u\"", fre->discontinuity_indicator);
    3990           0 :                 gf_fprintf(trace, "/>\n");
    3991             :         }
    3992             : 
    3993           1 :         gf_isom_box_dump_done("AdobeFragmentRunTableBox", a, trace);
    3994           1 :         return GF_OK;
    3995             : }
    3996             : 
    3997           1 : GF_Err asrt_box_dump(GF_Box *a, FILE * trace)
    3998             : {
    3999             :         u32 i;
    4000             :         GF_AdobeSegmentRunTableBox *p = (GF_AdobeSegmentRunTableBox*)a;
    4001           1 :         gf_isom_box_dump_start(a, "AdobeSegmentRunTableBox", trace);
    4002             : 
    4003           1 :         gf_fprintf(trace, ">\n");
    4004             : 
    4005           1 :         for (i=0; i<p->quality_entry_count; i++) {
    4006           0 :                 char *str = (char*)gf_list_get(p->quality_segment_url_modifiers, i);
    4007           0 :                 gf_fprintf(trace, "<QualityEntry>%s</QualityEntry>\n", str);
    4008             :         }
    4009             : 
    4010           0 :         for (i=0; i<p->segment_run_entry_count; i++) {
    4011           0 :                 GF_AdobeSegmentRunEntry *sre = (GF_AdobeSegmentRunEntry *)gf_list_get(p->segment_run_entry_table, i);
    4012           0 :                 gf_fprintf(trace, "<SegmentRunEntry FirstSegment=\"%u\" FragmentsPerSegment=\"%u\"/>\n", sre->first_segment, sre->fragment_per_segment);
    4013             :         }
    4014             : 
    4015           1 :         gf_isom_box_dump_done("AdobeSegmentRunTableBox", a, trace);
    4016           1 :         return GF_OK;
    4017             : }
    4018             : 
    4019             : #endif /*GPAC_DISABLE_ISOM_ADOBE*/
    4020             : 
    4021           1 : GF_Err ilst_box_dump(GF_Box *a, FILE * trace)
    4022             : {
    4023             :         u32 i;
    4024             :         GF_Box *tag;
    4025             :         GF_Err e;
    4026             :         GF_ItemListBox *ptr;
    4027             :         ptr = (GF_ItemListBox *)a;
    4028           1 :         gf_isom_box_dump_start(a, "ItemListBox", trace);
    4029           1 :         gf_fprintf(trace, ">\n");
    4030             : 
    4031           1 :         i=0;
    4032           2 :         while ( (tag = (GF_Box*)gf_list_enum(ptr->child_boxes, &i))) {
    4033           0 :                 e = ilst_item_box_dump(tag, trace);
    4034           0 :                 if(e) return e;
    4035             :         }
    4036           1 :         gf_isom_box_dump_done("ItemListBox", NULL, trace);
    4037           1 :         return GF_OK;
    4038             : }
    4039             : 
    4040           1 : GF_Err databox_box_dump(GF_Box *a, FILE * trace)
    4041             : {
    4042           1 :         gf_isom_box_dump_start(a, "data", trace);
    4043             : 
    4044           1 :         gf_fprintf(trace, ">\n");
    4045           1 :         gf_isom_box_dump_done("data", a, trace);
    4046           1 :         return GF_OK;
    4047             : }
    4048             : 
    4049           1 : GF_Err ohdr_box_dump(GF_Box *a, FILE * trace)
    4050             : {
    4051             :         GF_OMADRMCommonHeaderBox *ptr = (GF_OMADRMCommonHeaderBox *)a;
    4052           1 :         gf_isom_box_dump_start(a, "OMADRMCommonHeaderBox", trace);
    4053             : 
    4054           3 :         gf_fprintf(trace, "EncryptionMethod=\"%d\" PaddingScheme=\"%d\" PlaintextLength=\""LLD"\" ",
    4055           2 :                 ptr->EncryptionMethod, ptr->PaddingScheme, ptr->PlaintextLength);
    4056           1 :         if (ptr->RightsIssuerURL) gf_fprintf(trace, "RightsIssuerURL=\"%s\" ", ptr->RightsIssuerURL);
    4057           1 :         if (ptr->ContentID) gf_fprintf(trace, "ContentID=\"%s\" ", ptr->ContentID);
    4058           1 :         if (ptr->TextualHeaders) {
    4059             :                 u32 i, offset;
    4060             :                 char *start = ptr->TextualHeaders;
    4061           0 :                 gf_fprintf(trace, "TextualHeaders=\"");
    4062             :                 i=offset=0;
    4063           0 :                 while (i<ptr->TextualHeadersLen) {
    4064           0 :                         if (start[i]==0) {
    4065           0 :                                 gf_fprintf(trace, "%s ", start+offset);
    4066           0 :                                 offset=i+1;
    4067             :                         }
    4068           0 :                         i++;
    4069             :                 }
    4070           0 :                 gf_fprintf(trace, "%s\"  ", start+offset);
    4071             :         }
    4072             : 
    4073           1 :         gf_fprintf(trace, ">\n");
    4074           1 :         gf_isom_box_dump_done("OMADRMCommonHeaderBox", a, trace);
    4075           1 :         return GF_OK;
    4076             : }
    4077           1 : GF_Err grpi_box_dump(GF_Box *a, FILE * trace)
    4078             : {
    4079             :         GF_OMADRMGroupIDBox *ptr = (GF_OMADRMGroupIDBox *)a;
    4080           1 :         gf_isom_box_dump_start(a, "OMADRMGroupIDBox", trace);
    4081             : 
    4082           1 :         gf_fprintf(trace, "GroupID=\"%s\" EncryptionMethod=\"%d\" GroupKey=\" ", ptr->GroupID, ptr->GKEncryptionMethod);
    4083           1 :         if (ptr->GroupKey)
    4084           0 :                 dump_data(trace, ptr->GroupKey, ptr->GKLength);
    4085           1 :         gf_fprintf(trace, "\">\n");
    4086           1 :         gf_isom_box_dump_done("OMADRMGroupIDBox", a, trace);
    4087           1 :         return GF_OK;
    4088             : }
    4089           1 : GF_Err mdri_box_dump(GF_Box *a, FILE * trace)
    4090             : {
    4091             :         //GF_OMADRMMutableInformationBox *ptr = (GF_OMADRMMutableInformationBox*)a;
    4092           1 :         gf_isom_box_dump_start(a, "OMADRMMutableInformationBox", trace);
    4093           1 :         gf_fprintf(trace, ">\n");
    4094           1 :         gf_isom_box_dump_done("OMADRMMutableInformationBox", a, trace);
    4095           1 :         return GF_OK;
    4096             : }
    4097           1 : GF_Err odtt_box_dump(GF_Box *a, FILE * trace)
    4098             : {
    4099             :         GF_OMADRMTransactionTrackingBox *ptr = (GF_OMADRMTransactionTrackingBox *)a;
    4100           1 :         gf_isom_box_dump_start(a, "OMADRMTransactionTrackingBox", trace);
    4101             : 
    4102           1 :         gf_fprintf(trace, "TransactionID=\"");
    4103           1 :         dump_data(trace, ptr->TransactionID, 16);
    4104           1 :         gf_fprintf(trace, "\">\n");
    4105           1 :         gf_isom_box_dump_done("OMADRMTransactionTrackingBox", a, trace);
    4106           1 :         return GF_OK;
    4107             : }
    4108           1 : GF_Err odrb_box_dump(GF_Box *a, FILE * trace)
    4109             : {
    4110             :         GF_OMADRMRightsObjectBox*ptr = (GF_OMADRMRightsObjectBox*)a;
    4111           1 :         gf_isom_box_dump_start(a, "OMADRMRightsObjectBox", trace);
    4112             : 
    4113           1 :         gf_fprintf(trace, "OMARightsObject=\"");
    4114           1 :         dump_data(trace, ptr->oma_ro, ptr->oma_ro_size);
    4115           1 :         gf_fprintf(trace, "\">\n");
    4116           1 :         gf_isom_box_dump_done("OMADRMRightsObjectBox", a, trace);
    4117           1 :         return GF_OK;
    4118             : }
    4119           1 : GF_Err odkm_box_dump(GF_Box *a, FILE * trace)
    4120             : {
    4121           1 :         gf_isom_box_dump_start(a, "OMADRMKMSBox", trace);
    4122           1 :         gf_fprintf(trace, ">\n");
    4123           1 :         gf_isom_box_dump_done("OMADRMKMSBox", a, trace);
    4124           1 :         return GF_OK;
    4125             : }
    4126             : 
    4127             : 
    4128          25 : GF_Err pasp_box_dump(GF_Box *a, FILE * trace)
    4129             : {
    4130             :         GF_PixelAspectRatioBox *ptr = (GF_PixelAspectRatioBox*)a;
    4131          25 :         gf_isom_box_dump_start(a, "PixelAspectRatioBox", trace);
    4132          25 :         gf_fprintf(trace, "hSpacing=\"%d\" vSpacing=\"%d\" >\n", ptr->hSpacing, ptr->vSpacing);
    4133          25 :         gf_isom_box_dump_done("PixelAspectRatioBox", a, trace);
    4134          25 :         return GF_OK;
    4135             : }
    4136             : 
    4137           1 : GF_Err clap_box_dump(GF_Box *a, FILE * trace)
    4138             : {
    4139             :         GF_CleanApertureBox *ptr = (GF_CleanApertureBox*)a;
    4140           1 :         gf_isom_box_dump_start(a, "CleanApertureBox", trace);
    4141           1 :         gf_fprintf(trace, "cleanApertureWidthN=\"%d\" cleanApertureWidthD=\"%d\" ", ptr->cleanApertureWidthN, ptr->cleanApertureWidthD);
    4142           1 :         gf_fprintf(trace, "cleanApertureHeightN=\"%d\" cleanApertureHeightD=\"%d\" ", ptr->cleanApertureHeightN, ptr->cleanApertureHeightD);
    4143           1 :         gf_fprintf(trace, "horizOffN=\"%d\" horizOffD=\"%d\" ", ptr->horizOffN, ptr->horizOffD);
    4144           1 :         gf_fprintf(trace, "vertOffN=\"%d\" vertOffD=\"%d\"", ptr->vertOffN, ptr->vertOffD);
    4145           1 :         gf_fprintf(trace, ">\n");
    4146           1 :         gf_isom_box_dump_done("CleanApertureBox", a, trace);
    4147           1 :         return GF_OK;
    4148             : }
    4149             : 
    4150             : 
    4151           1 : GF_Err tsel_box_dump(GF_Box *a, FILE * trace)
    4152             : {
    4153             :         u32 i;
    4154             :         GF_TrackSelectionBox *ptr = (GF_TrackSelectionBox *)a;
    4155           1 :         gf_isom_box_dump_start(a, "TrackSelectionBox", trace);
    4156             : 
    4157           1 :         gf_fprintf(trace, "switchGroup=\"%d\" >\n", ptr->switchGroup);
    4158           1 :         for (i=0; i<ptr->attributeListCount; i++) {
    4159           0 :                 gf_fprintf(trace, "<TrackSelectionCriteria value=\"%s\"/>\n", gf_4cc_to_str(ptr->attributeList[i]) );
    4160             :         }
    4161           1 :         if (!ptr->size)
    4162           1 :                 gf_fprintf(trace, "<TrackSelectionCriteria value=\"\"/>\n");
    4163             : 
    4164           1 :         gf_isom_box_dump_done("TrackSelectionBox", a, trace);
    4165           1 :         return GF_OK;
    4166             : }
    4167             : 
    4168          11 : GF_Err metx_box_dump(GF_Box *a, FILE * trace)
    4169             : {
    4170             :         GF_MetaDataSampleEntryBox *ptr = (GF_MetaDataSampleEntryBox*)a;
    4171             :         const char *name;
    4172          11 :         switch (ptr->type) {
    4173             :         case GF_ISOM_BOX_TYPE_METX:
    4174             :                 name = "XMLMetaDataSampleEntryBox";
    4175             :                 break;
    4176           0 :         case GF_ISOM_BOX_TYPE_METT:
    4177             :                 name = "TextMetaDataSampleEntryBox";
    4178           0 :                 break;
    4179           0 :         case GF_ISOM_BOX_TYPE_SBTT:
    4180             :                 name = "SubtitleSampleEntryBox";
    4181           0 :                 break;
    4182           0 :         case GF_ISOM_BOX_TYPE_STXT:
    4183             :                 name = "SimpleTextSampleEntryBox";
    4184           0 :                 break;
    4185           6 :         case GF_ISOM_BOX_TYPE_STPP:
    4186             :                 name = "XMLSubtitleSampleEntryBox";
    4187           6 :                 break;
    4188           0 :         default:
    4189             :                 name = "UnknownTextSampleEntryBox";
    4190           0 :                 break;
    4191             :         }
    4192          11 :         gf_isom_box_dump_start(a, name, trace);
    4193             : 
    4194          11 :         if (ptr->type==GF_ISOM_BOX_TYPE_METX) {
    4195           5 :                 gf_fprintf(trace, "namespace=\"%s\" ", ptr->xml_namespace);
    4196           5 :                 if (ptr->xml_schema_loc) gf_fprintf(trace, "schema_location=\"%s\" ", ptr->xml_schema_loc);
    4197           5 :                 if (ptr->content_encoding) gf_fprintf(trace, "content_encoding=\"%s\" ", ptr->content_encoding);
    4198             : 
    4199           6 :         } else if (ptr->type==GF_ISOM_BOX_TYPE_STPP) {
    4200           6 :                 gf_fprintf(trace, "namespace=\"%s\" ", ptr->xml_namespace);
    4201           6 :                 if (ptr->xml_schema_loc) gf_fprintf(trace, "schema_location=\"%s\" ", ptr->xml_schema_loc);
    4202           6 :                 if (ptr->mime_type) gf_fprintf(trace, "auxiliary_mime_types=\"%s\" ", ptr->mime_type);
    4203             :         }
    4204             :         //mett, sbtt, stxt
    4205             :         else {
    4206           0 :                 gf_fprintf(trace, "mime_type=\"%s\" ", ptr->mime_type);
    4207           0 :                 if (ptr->content_encoding) gf_fprintf(trace, "content_encoding=\"%s\" ", ptr->content_encoding);
    4208             :         }
    4209          11 :         gf_fprintf(trace, ">\n");
    4210          11 :         gf_isom_box_dump_done(name, a, trace);
    4211          11 :         return GF_OK;
    4212             : }
    4213             : 
    4214           2 : GF_Err txtc_box_dump(GF_Box *a, FILE * trace)
    4215             : {
    4216             :         GF_TextConfigBox *ptr = (GF_TextConfigBox*)a;
    4217           2 :         const char *name = (ptr->type==GF_ISOM_BOX_TYPE_TXTC) ?  "TextConfigBox" : "MIMEBox";
    4218             : 
    4219           2 :         gf_isom_box_dump_start(a, name, trace);
    4220           2 :         gf_fprintf(trace, ">\n");
    4221             : 
    4222           2 :         if (ptr->config) gf_fprintf(trace, "<![CDATA[%s]]>", ptr->config);
    4223             : 
    4224           2 :         gf_isom_box_dump_done(name, a, trace);
    4225           2 :         return GF_OK;
    4226             : }
    4227             : 
    4228           1 : GF_Err dims_box_dump(GF_Box *a, FILE * trace)
    4229             : {
    4230             :         GF_DIMSSampleEntryBox *p = (GF_DIMSSampleEntryBox*)a;
    4231           1 :         gf_isom_box_dump_start(a, "DIMSSampleEntryBox", trace);
    4232           1 :         gf_fprintf(trace, "dataReferenceIndex=\"%d\">\n", p->dataReferenceIndex);
    4233           1 :         gf_isom_box_dump_done("DIMSSampleEntryBox", a, trace);
    4234           1 :         return GF_OK;
    4235             : }
    4236             : 
    4237           1 : GF_Err diST_box_dump(GF_Box *a, FILE * trace)
    4238             : {
    4239             :         GF_DIMSScriptTypesBox *p = (GF_DIMSScriptTypesBox*)a;
    4240           1 :         gf_isom_box_dump_start(a, "DIMSScriptTypesBox", trace);
    4241           1 :         gf_fprintf(trace, "types=\"%s\">\n", p->content_script_types);
    4242           1 :         gf_isom_box_dump_done("DIMSScriptTypesBox", a, trace);
    4243           1 :         return GF_OK;
    4244             : }
    4245             : 
    4246           1 : GF_Err dimC_box_dump(GF_Box *a, FILE * trace)
    4247             : {
    4248             :         GF_DIMSSceneConfigBox *p = (GF_DIMSSceneConfigBox *)a;
    4249           1 :         gf_isom_box_dump_start(a, "DIMSSceneConfigBox", trace);
    4250           5 :         gf_fprintf(trace, "profile=\"%d\" level=\"%d\" pathComponents=\"%d\" useFullRequestHosts=\"%d\" streamType=\"%d\" containsRedundant=\"%d\" textEncoding=\"%s\" contentEncoding=\"%s\" >\n",
    4251           4 :                 p->profile, p->level, p->pathComponents, p->fullRequestHost, p->streamType, p->containsRedundant, p->textEncoding, p->contentEncoding);
    4252           1 :         gf_isom_box_dump_done("DIMSSceneConfigBox", a, trace);
    4253           1 :         return GF_OK;
    4254             : }
    4255             : 
    4256             : 
    4257           2 : GF_Err dOps_box_dump(GF_Box *a, FILE * trace)
    4258             : {
    4259             :         GF_OpusSpecificBox *p = (GF_OpusSpecificBox *)a;
    4260             : 
    4261           2 :         gf_isom_box_dump_start(a, "OpusSpecificBox", trace);
    4262          10 :         gf_fprintf(trace, "version=\"%d\" OutputChannelCount=\"%d\" PreSkip=\"%d\" InputSampleRate=\"%d\" OutputGain=\"%d\" ChannelMappingFamily=\"%d\"",
    4263          10 :                 p->version, p->OutputChannelCount, p->PreSkip, p->InputSampleRate, p->OutputGain, p->ChannelMappingFamily);
    4264             : 
    4265           2 :         if (p->ChannelMappingFamily) {
    4266             :                 u32 i;
    4267           1 :                 gf_fprintf(trace, " StreamCount=\"%d\" CoupledStreamCount=\"%d\" channelMapping=\"", p->StreamCount, p->CoupledCount);
    4268           7 :                 for (i=0; i<p->OutputChannelCount; i++) {
    4269           6 :                         gf_fprintf(trace, "%s%d", i ? " " : "", p->ChannelMapping[i]);
    4270             :                 }
    4271           1 :                 gf_fprintf(trace, "\"");
    4272             :         }
    4273           2 :         gf_fprintf(trace, ">\n");
    4274           2 :         gf_isom_box_dump_done("OpusSpecificBox", a, trace);
    4275             : 
    4276           2 :         return GF_OK;
    4277             : }
    4278             : 
    4279           5 : GF_Err dac3_box_dump(GF_Box *a, FILE * trace)
    4280             : {
    4281             :         GF_AC3ConfigBox *p = (GF_AC3ConfigBox *)a;
    4282             : 
    4283           5 :         if (p->cfg.is_ec3) {
    4284             :                 u32 i;
    4285           2 :                 a->type = GF_ISOM_BOX_TYPE_DEC3;
    4286           2 :                 gf_isom_box_dump_start(a, "EC3SpecificBox", trace);
    4287           2 :                 a->type = GF_ISOM_BOX_TYPE_DAC3;
    4288           2 :                 gf_fprintf(trace, "nb_streams=\"%d\" data_rate=\"%d\">\n", p->cfg.nb_streams, p->cfg.brcode);
    4289           3 :                 for (i=0; i<p->cfg.nb_streams; i++) {
    4290           8 :                         gf_fprintf(trace, "<EC3StreamConfig fscod=\"%d\" bsid=\"%d\" bsmod=\"%d\" acmod=\"%d\" lfon=\"%d\" asvc=\"%d\" num_sub_dep=\"%d\" chan_loc=\"%d\"/>\n",
    4291           8 :                                 p->cfg.streams[i].fscod, p->cfg.streams[i].bsid, p->cfg.streams[i].bsmod, p->cfg.streams[i].acmod, p->cfg.streams[i].lfon, p->cfg.streams[i].asvc, p->cfg.streams[i].nb_dep_sub, p->cfg.streams[i].chan_loc);
    4292             :                 }
    4293           2 :                 gf_isom_box_dump_done("EC3SpecificBox", a, trace);
    4294             :         } else {
    4295           3 :                 gf_isom_box_dump_start(a, "AC3SpecificBox", trace);
    4296          18 :                 gf_fprintf(trace, "fscod=\"%d\" bsid=\"%d\" bsmod=\"%d\" acmod=\"%d\" lfon=\"%d\" bit_rate_code=\"%d\">\n",
    4297          18 :                         p->cfg.streams[0].fscod, p->cfg.streams[0].bsid, p->cfg.streams[0].bsmod, p->cfg.streams[0].acmod, p->cfg.streams[0].lfon, p->cfg.brcode);
    4298           3 :                 gf_isom_box_dump_done("AC3SpecificBox", a, trace);
    4299             :         }
    4300           5 :         return GF_OK;
    4301             : }
    4302             : 
    4303           2 : GF_Err dmlp_box_dump(GF_Box *a, FILE * trace)
    4304             : {
    4305             :         GF_TrueHDConfigBox *p = (GF_TrueHDConfigBox *)a;
    4306             : 
    4307           2 :         gf_isom_box_dump_start(a, "TrueHDConfigBox", trace);
    4308           2 :         gf_fprintf(trace, "format_info=\"%u\" peak_data_rate=\"%u\">\n",
    4309           2 :                         p->format_info, p->peak_data_rate);
    4310           2 :         gf_isom_box_dump_done("TrueHDConfigBox", a, trace);
    4311           2 :         return GF_OK;
    4312             : }
    4313             : 
    4314           1 : GF_Err dvcC_box_dump(GF_Box *a, FILE * trace)
    4315             : {
    4316             :         GF_DOVIConfigurationBox *p = (GF_DOVIConfigurationBox *)a;
    4317           1 :         gf_isom_box_dump_start(a, "DOVIConfigurationBox", trace);
    4318           4 :         gf_fprintf(trace, "dv_version_major=\"%u\" dv_version_minor=\"%u\" dv_profile=\"%u\" dv_level=\"%u\" rpu_present_flag=\"%u\" el_present_flag=\"%u\" bl_present_flag=\"%u\">\n",
    4319           4 :                 p->DOVIConfig.dv_version_major, p->DOVIConfig.dv_version_minor, p->DOVIConfig.dv_profile, p->DOVIConfig.dv_level,
    4320           1 :                 p->DOVIConfig.rpu_present_flag, p->DOVIConfig.el_present_flag, p->DOVIConfig.bl_present_flag);
    4321           1 :         gf_isom_box_dump_done("DOVIConfigurationBox", a, trace);
    4322           1 :         return GF_OK;
    4323             : }
    4324             : 
    4325           1 : GF_Err lsrc_box_dump(GF_Box *a, FILE * trace)
    4326             : {
    4327             :         GF_LASERConfigurationBox *p = (GF_LASERConfigurationBox *)a;
    4328           1 :         gf_isom_box_dump_start(a, "LASeRConfigurationBox", trace);
    4329           1 :         dump_data_attribute(trace, "LASeRHeader", p->hdr, p->hdr_size);
    4330           1 :         gf_fprintf(trace, ">");
    4331           1 :         gf_isom_box_dump_done("LASeRConfigurationBox", a, trace);
    4332           1 :         return GF_OK;
    4333             : }
    4334             : 
    4335           1 : GF_Err lsr1_box_dump(GF_Box *a, FILE * trace)
    4336             : {
    4337             :         GF_LASeRSampleEntryBox *p = (GF_LASeRSampleEntryBox*)a;
    4338           1 :         gf_isom_box_dump_start(a, "LASeRSampleEntryBox", trace);
    4339           1 :         gf_fprintf(trace, "DataReferenceIndex=\"%d\">\n", p->dataReferenceIndex);
    4340           1 :         gf_isom_box_dump_done("LASeRSampleEntryBox", a, trace);
    4341           1 :         return GF_OK;
    4342             : }
    4343             : 
    4344             : 
    4345           4 : GF_Err sidx_box_dump(GF_Box *a, FILE * trace)
    4346             : {
    4347             :         u32 i;
    4348             :         GF_SegmentIndexBox *p = (GF_SegmentIndexBox *)a;
    4349           4 :         gf_isom_box_dump_start(a, "SegmentIndexBox", trace);
    4350             : 
    4351           4 :         gf_fprintf(trace, "reference_ID=\"%d\" timescale=\"%d\" earliest_presentation_time=\""LLD"\" first_offset=\""LLD"\"", p->reference_ID, p->timescale, p->earliest_presentation_time, p->first_offset);
    4352           4 :         if (p->internal_flags & GF_ISOM_BOX_COMPRESSED)
    4353           0 :                 gf_fprintf(trace, " compressedSize=\""LLU"\"", p->size - p->compressed_diff);
    4354           4 :         gf_fprintf(trace, ">\n");
    4355             : 
    4356          14 :         for (i=0; i<p->nb_refs; i++) {
    4357          10 :                 gf_fprintf(trace, "<Reference type=\"%d\" size=\"%d\" duration=\"%d\" startsWithSAP=\"%d\" SAP_type=\"%d\" SAPDeltaTime=\"%d\"/>\n", p->refs[i].reference_type, p->refs[i].reference_size, p->refs[i].subsegment_duration, p->refs[i].starts_with_SAP, p->refs[i].SAP_type, p->refs[i].SAP_delta_time);
    4358             :         }
    4359           4 :         if (!p->size) {
    4360           2 :                 gf_fprintf(trace, "<Reference type=\"\" size=\"\" duration=\"\" startsWithSAP=\"\" SAP_type=\"\" SAPDeltaTime=\"\"/>\n");
    4361             :         }
    4362           4 :         gf_isom_box_dump_done("SegmentIndexBox", a, trace);
    4363           4 :         return GF_OK;
    4364             : }
    4365             : 
    4366           1 : GF_Err ssix_box_dump(GF_Box *a, FILE * trace)
    4367             : {
    4368             :         u32 i, j;
    4369             :         GF_SubsegmentIndexBox *p = (GF_SubsegmentIndexBox *)a;
    4370           1 :         gf_isom_box_dump_start(a, "SubsegmentIndexBox", trace);
    4371             : 
    4372           1 :         gf_fprintf(trace, "subsegment_count=\"%d\"", p->subsegment_count);
    4373           1 :         if (p->internal_flags & GF_ISOM_BOX_COMPRESSED)
    4374           0 :                 gf_fprintf(trace, " compressedSize=\""LLU"\"", p->size - p->compressed_diff);
    4375           1 :         gf_fprintf(trace, ">\n");
    4376             : 
    4377           1 :         for (i = 0; i < p->subsegment_count; i++) {
    4378           0 :                 gf_fprintf(trace, "<Subsegment range_count=\"%d\">\n", p->subsegments[i].range_count);
    4379           0 :                 for (j = 0; j < p->subsegments[i].range_count; j++) {
    4380           0 :                         gf_fprintf(trace, "<Range level=\"%d\" range_size=\"%d\"/>\n", p->subsegments[i].ranges[j].level, p->subsegments[i].ranges[j].range_size);
    4381             :                 }
    4382           0 :                 gf_fprintf(trace, "</Subsegment>\n");
    4383             :         }
    4384           1 :         if (!p->size) {
    4385           1 :                 gf_fprintf(trace, "<Subsegment range_count=\"\">\n");
    4386           1 :                 gf_fprintf(trace, "<Range level=\"\" range_size=\"\"/>\n");
    4387           1 :                 gf_fprintf(trace, "</Subsegment>\n");
    4388             :         }
    4389           1 :         gf_isom_box_dump_done("SubsegmentIndexBox", a, trace);
    4390           1 :         return GF_OK;
    4391             : }
    4392             : 
    4393             : 
    4394           1 : GF_Err leva_box_dump(GF_Box *a, FILE * trace)
    4395             : {
    4396             :         u32 i;
    4397             :         GF_LevelAssignmentBox *p = (GF_LevelAssignmentBox *)a;
    4398           1 :         gf_isom_box_dump_start(a, "LevelAssignmentBox", trace);
    4399             : 
    4400           1 :         gf_fprintf(trace, "level_count=\"%d\" >\n", p->level_count);
    4401           1 :         for (i = 0; i < p->level_count; i++) {
    4402           0 :                 gf_fprintf(trace, "<Assignement track_id=\"%d\" padding_flag=\"%d\" assignement_type=\"%d\" grouping_type=\"%s\" grouping_type_parameter=\"%d\" sub_track_id=\"%d\" />\n", p->levels[i].track_id, p->levels[i].padding_flag, p->levels[i].type, gf_4cc_to_str(p->levels[i].grouping_type) , p->levels[i].grouping_type_parameter, p->levels[i].sub_track_id);
    4403             :         }
    4404           1 :         if (!p->size) {
    4405           1 :                 gf_fprintf(trace, "<Assignement track_id=\"\" padding_flag=\"\" assignement_type=\"\" grouping_type=\"\" grouping_type_parameter=\"\" sub_track_id=\"\" />\n");
    4406             :         }
    4407           1 :         gf_isom_box_dump_done("LevelAssignmentBox", a, trace);
    4408           1 :         return GF_OK;
    4409             : }
    4410             : 
    4411           1 : GF_Err strk_box_dump(GF_Box *a, FILE * trace)
    4412             : {
    4413           1 :         gf_isom_box_dump_start(a, "SubTrackBox", trace);
    4414           1 :         gf_fprintf(trace, ">\n");
    4415           1 :         gf_isom_box_dump_done("SubTrackBox", a, trace);
    4416           1 :         return GF_OK;
    4417             : }
    4418             : 
    4419           1 : GF_Err stri_box_dump(GF_Box *a, FILE * trace)
    4420             : {
    4421             :         u32 i;
    4422             :         GF_SubTrackInformationBox *p = (GF_SubTrackInformationBox *)a;
    4423           1 :         gf_isom_box_dump_start(a, "SubTrackInformationBox", trace);
    4424             : 
    4425           1 :         gf_fprintf(trace, "switch_group=\"%d\" alternate_group=\"%d\" sub_track_id=\"%d\">\n", p->switch_group, p->alternate_group, p->sub_track_id);
    4426             : 
    4427           1 :         for (i = 0; i < p->attribute_count; i++) {
    4428           0 :                 gf_fprintf(trace, "<SubTrackInformationAttribute value=\"%s\"/>\n", gf_4cc_to_str(p->attribute_list[i]) );
    4429             :         }
    4430           1 :         if (!p->size)
    4431           1 :                 gf_fprintf(trace, "<SubTrackInformationAttribute value=\"\"/>\n");
    4432             : 
    4433           1 :         gf_isom_box_dump_done("SubTrackInformationBox", a, trace);
    4434           1 :         return GF_OK;
    4435             : }
    4436             : 
    4437           1 : GF_Err stsg_box_dump(GF_Box *a, FILE * trace)
    4438             : {
    4439             :         u32 i;
    4440             :         GF_SubTrackSampleGroupBox *p = (GF_SubTrackSampleGroupBox *)a;
    4441           1 :         gf_isom_box_dump_start(a, "SubTrackSampleGroupBox", trace);
    4442             : 
    4443           1 :         if (p->grouping_type)
    4444           0 :                 gf_fprintf(trace, "grouping_type=\"%s\"", gf_4cc_to_str(p->grouping_type) );
    4445           1 :         gf_fprintf(trace, ">\n");
    4446             : 
    4447           1 :         for (i = 0; i < p->nb_groups; i++) {
    4448           0 :                 gf_fprintf(trace, "<SubTrackSampleGroupBoxEntry group_description_index=\"%d\"/>\n", p->group_description_index[i]);
    4449             :         }
    4450           1 :         if (!p->size)
    4451           1 :                 gf_fprintf(trace, "<SubTrackSampleGroupBoxEntry group_description_index=\"\"/>\n");
    4452             : 
    4453           1 :         gf_isom_box_dump_done("SubTrackSampleGroupBox", a, trace);
    4454           1 :         return GF_OK;
    4455             : }
    4456             : 
    4457           1 : GF_Err pcrb_box_dump(GF_Box *a, FILE * trace)
    4458             : {
    4459             :         u32 i;
    4460             :         GF_PcrInfoBox *p = (GF_PcrInfoBox *)a;
    4461           1 :         gf_isom_box_dump_start(a, "MPEG2TSPCRInfoBox", trace);
    4462           1 :         gf_fprintf(trace, "subsegment_count=\"%d\">\n", p->subsegment_count);
    4463             : 
    4464           1 :         for (i=0; i<p->subsegment_count; i++) {
    4465           0 :                 gf_fprintf(trace, "<PCRInfo PCR=\""LLU"\" />\n", p->pcr_values[i]);
    4466             :         }
    4467           1 :         if (!p->size) {
    4468           1 :                 gf_fprintf(trace, "<PCRInfo PCR=\"\" />\n");
    4469             :         }
    4470           1 :         gf_isom_box_dump_done("MPEG2TSPCRInfoBox", a, trace);
    4471           1 :         return GF_OK;
    4472             : }
    4473             : 
    4474           4 : GF_Err subs_box_dump(GF_Box *a, FILE * trace)
    4475             : {
    4476             :         u32 entry_count, i, j;
    4477             :         u16 subsample_count;
    4478             :         GF_SubSampleEntry *pSubSamp;
    4479             :         GF_SubSampleInformationBox *ptr = (GF_SubSampleInformationBox *) a;
    4480             : 
    4481           4 :         if (!a) return GF_BAD_PARAM;
    4482             : 
    4483           4 :         entry_count = gf_list_count(ptr->Samples);
    4484           4 :         gf_isom_box_dump_start(a, "SubSampleInformationBox", trace);
    4485             : 
    4486           4 :         gf_fprintf(trace, "EntryCount=\"%d\">\n", entry_count);
    4487             : 
    4488           4 :         for (i=0; i<entry_count; i++) {
    4489           0 :                 GF_SubSampleInfoEntry *pSamp = (GF_SubSampleInfoEntry*) gf_list_get(ptr->Samples, i);
    4490             : 
    4491           0 :                 subsample_count = gf_list_count(pSamp->SubSamples);
    4492             : 
    4493           0 :                 gf_fprintf(trace, "<SampleEntry SampleDelta=\"%d\" SubSampleCount=\"%d\">\n", pSamp->sample_delta, subsample_count);
    4494             : 
    4495           0 :                 for (j=0; j<subsample_count; j++) {
    4496           0 :                         pSubSamp = (GF_SubSampleEntry*) gf_list_get(pSamp->SubSamples, j);
    4497           0 :                         gf_fprintf(trace, "<SubSample Size=\"%u\" Priority=\"%u\" Discardable=\"%d\" Reserved=\"%08X\"/>\n", pSubSamp->subsample_size, pSubSamp->subsample_priority, pSubSamp->discardable, pSubSamp->reserved);
    4498             :                 }
    4499           0 :                 gf_fprintf(trace, "</SampleEntry>\n");
    4500             :         }
    4501           4 :         if (!ptr->size) {
    4502           4 :                 gf_fprintf(trace, "<SampleEntry SampleDelta=\"\" SubSampleCount=\"\">\n");
    4503           4 :                 gf_fprintf(trace, "<SubSample Size=\"\" Priority=\"\" Discardable=\"\" Reserved=\"\"/>\n");
    4504           4 :                 gf_fprintf(trace, "</SampleEntry>\n");
    4505             :         }
    4506             : 
    4507           4 :         gf_isom_box_dump_done("SubSampleInformationBox", a, trace);
    4508           4 :         return GF_OK;
    4509             : }
    4510             : 
    4511             : #ifndef GPAC_DISABLE_ISOM_FRAGMENTS
    4512           4 : GF_Err tfdt_box_dump(GF_Box *a, FILE * trace)
    4513             : {
    4514             :         GF_TFBaseMediaDecodeTimeBox *ptr = (GF_TFBaseMediaDecodeTimeBox*) a;
    4515           4 :         if (!a) return GF_BAD_PARAM;
    4516           4 :         gf_isom_box_dump_start(a, "TrackFragmentBaseMediaDecodeTimeBox", trace);
    4517             : 
    4518           4 :         gf_fprintf(trace, "baseMediaDecodeTime=\""LLD"\">\n", ptr->baseMediaDecodeTime);
    4519           4 :         gf_isom_box_dump_done("TrackFragmentBaseMediaDecodeTimeBox", a, trace);
    4520           4 :         return GF_OK;
    4521             : }
    4522             : #endif /*GPAC_DISABLE_ISOM_FRAGMENTS*/
    4523             : 
    4524           2 : GF_Err rvcc_box_dump(GF_Box *a, FILE * trace)
    4525             : {
    4526             :         GF_RVCConfigurationBox *ptr = (GF_RVCConfigurationBox*) a;
    4527           2 :         if (!a) return GF_BAD_PARAM;
    4528             : 
    4529           2 :         gf_isom_box_dump_start(a, "RVCConfigurationBox", trace);
    4530           2 :         gf_fprintf(trace, "predefined=\"%d\"", ptr->predefined_rvc_config);
    4531           2 :         if (! ptr->predefined_rvc_config) gf_fprintf(trace, " rvc_meta_idx=\"%d\"", ptr->rvc_meta_idx);
    4532           2 :         gf_fprintf(trace, ">\n");
    4533           2 :         gf_isom_box_dump_done("RVCConfigurationBox", a, trace);
    4534           2 :         return GF_OK;
    4535             : }
    4536             : 
    4537           2 : GF_Err sbgp_box_dump(GF_Box *a, FILE * trace)
    4538             : {
    4539             :         u32 i;
    4540             :         GF_SampleGroupBox *ptr = (GF_SampleGroupBox*) a;
    4541           2 :         if (!a) return GF_BAD_PARAM;
    4542             : 
    4543           2 :         if (dump_skip_samples)
    4544             :                 return GF_OK;
    4545             : 
    4546           2 :         gf_isom_box_dump_start(a, "SampleGroupBox", trace);
    4547             : 
    4548           2 :         if (ptr->grouping_type)
    4549           0 :                 gf_fprintf(trace, "grouping_type=\"%s\"", gf_4cc_to_str(ptr->grouping_type) );
    4550             : 
    4551           2 :         if (ptr->version==1) {
    4552           1 :                 if (isalnum(ptr->grouping_type_parameter&0xFF)) {
    4553           0 :                         gf_fprintf(trace, " grouping_type_parameter=\"%s\"", gf_4cc_to_str(ptr->grouping_type_parameter) );
    4554             :                 } else {
    4555           1 :                         gf_fprintf(trace, " grouping_type_parameter=\"%d\"", ptr->grouping_type_parameter);
    4556             :                 }
    4557             :         }
    4558           2 :         gf_fprintf(trace, ">\n");
    4559           2 :         for (i=0; i<ptr->entry_count; i++) {
    4560           0 :                 gf_fprintf(trace, "<SampleGroupBoxEntry sample_count=\"%d\" group_description_index=\"%d\"/>\n", ptr->sample_entries[i].sample_count, ptr->sample_entries[i].group_description_index );
    4561             :         }
    4562           2 :         if (!ptr->size) {
    4563           2 :                 gf_fprintf(trace, "<SampleGroupBoxEntry sample_count=\"\" group_description_index=\"\"/>\n");
    4564             :         }
    4565           2 :         gf_isom_box_dump_done("SampleGroupBox", a, trace);
    4566           2 :         return GF_OK;
    4567             : }
    4568             : 
    4569           2 : static void oinf_entry_dump(GF_OperatingPointsInformation *ptr, FILE * trace)
    4570             : {
    4571             :         u32 i, count;
    4572             : 
    4573           2 :         if (!ptr) {
    4574           1 :                 gf_fprintf(trace, "<OperatingPointsInformation scalability_mask=\"Multiview|Spatial scalability|Auxilary|unknown\" num_profile_tier_level=\"\" num_operating_points=\"\" dependency_layers=\"\">\n");
    4575             : 
    4576           1 :                 gf_fprintf(trace, " <ProfileTierLevel general_profile_space=\"\" general_tier_flag=\"\" general_profile_idc=\"\" general_profile_compatibility_flags=\"\" general_constraint_indicator_flags=\"\" />\n");
    4577             : 
    4578           1 :                 gf_fprintf(trace, "<OperatingPoint output_layer_set_idx=\"\" max_temporal_id=\"\" layer_count=\"\" minPicWidth=\"\" minPicHeight=\"\" maxPicWidth=\"\" maxPicHeight=\"\" maxChromaFormat=\"\" maxBitDepth=\"\" frame_rate_info_flag=\"\" bit_rate_info_flag=\"\" avgFrameRate=\"\" constantFrameRate=\"\" maxBitRate=\"\" avgBitRate=\"\"/>\n");
    4579             : 
    4580           1 :                 gf_fprintf(trace, "<Layer dependent_layerID=\"\" num_layers_dependent_on=\"\" dependent_on_layerID=\"\" dimension_identifier=\"\"/>\n");
    4581           1 :                 gf_fprintf(trace, "</OperatingPointsInformation>\n");
    4582           1 :                 return;
    4583             :         }
    4584             : 
    4585             : 
    4586           1 :         gf_fprintf(trace, "<OperatingPointsInformation");
    4587           1 :         gf_fprintf(trace, " scalability_mask=\"%u (", ptr->scalability_mask);
    4588           1 :         switch (ptr->scalability_mask) {
    4589           0 :         case 2:
    4590           0 :                 gf_fprintf(trace, "Multiview");
    4591           0 :                 break;
    4592           0 :         case 4:
    4593           0 :                 gf_fprintf(trace, "Spatial scalability");
    4594           0 :                 break;
    4595           0 :         case 8:
    4596           0 :                 gf_fprintf(trace, "Auxilary");
    4597           0 :                 break;
    4598           1 :         default:
    4599           1 :                 gf_fprintf(trace, "unknown");
    4600             :         }
    4601           1 :         gf_fprintf(trace, ")\" num_profile_tier_level=\"%u\"", gf_list_count(ptr->profile_tier_levels) );
    4602           1 :         gf_fprintf(trace, " num_operating_points=\"%u\" dependency_layers=\"%u\"", gf_list_count(ptr->operating_points), gf_list_count(ptr->dependency_layers));
    4603           1 :         gf_fprintf(trace, ">\n");
    4604             : 
    4605             : 
    4606           1 :         count=gf_list_count(ptr->profile_tier_levels);
    4607           1 :         for (i = 0; i < count; i++) {
    4608           0 :                 LHEVC_ProfileTierLevel *ptl = (LHEVC_ProfileTierLevel *)gf_list_get(ptr->profile_tier_levels, i);
    4609           0 :                 gf_fprintf(trace, " <ProfileTierLevel general_profile_space=\"%u\" general_tier_flag=\"%u\" general_profile_idc=\"%u\" general_profile_compatibility_flags=\"%X\" general_constraint_indicator_flags=\""LLX"\" />\n", ptl->general_profile_space, ptl->general_tier_flag, ptl->general_profile_idc, ptl->general_profile_compatibility_flags, ptl->general_constraint_indicator_flags);
    4610             :         }
    4611             : 
    4612             : 
    4613           1 :         count=gf_list_count(ptr->operating_points);
    4614           1 :         for (i = 0; i < count; i++) {
    4615           0 :                 LHEVC_OperatingPoint *op = (LHEVC_OperatingPoint *)gf_list_get(ptr->operating_points, i);
    4616           0 :                 gf_fprintf(trace, "<OperatingPoint output_layer_set_idx=\"%u\"", op->output_layer_set_idx);
    4617           0 :                 gf_fprintf(trace, " max_temporal_id=\"%u\" layer_count=\"%u\"", op->max_temporal_id, op->layer_count);
    4618           0 :                 gf_fprintf(trace, " minPicWidth=\"%u\" minPicHeight=\"%u\"", op->minPicWidth, op->minPicHeight);
    4619           0 :                 gf_fprintf(trace, " maxPicWidth=\"%u\" maxPicHeight=\"%u\"", op->maxPicWidth, op->maxPicHeight);
    4620           0 :                 gf_fprintf(trace, " maxChromaFormat=\"%u\" maxBitDepth=\"%u\"", op->maxChromaFormat, op->maxBitDepth);
    4621           0 :                 gf_fprintf(trace, " frame_rate_info_flag=\"%u\" bit_rate_info_flag=\"%u\"", op->frame_rate_info_flag, op->bit_rate_info_flag);
    4622           0 :                 if (op->frame_rate_info_flag)
    4623           0 :                         gf_fprintf(trace, " avgFrameRate=\"%u\" constantFrameRate=\"%u\"", op->avgFrameRate, op->constantFrameRate);
    4624           0 :                 if (op->bit_rate_info_flag)
    4625           0 :                         gf_fprintf(trace, " maxBitRate=\"%u\" avgBitRate=\"%u\"", op->maxBitRate, op->avgBitRate);
    4626           0 :                 gf_fprintf(trace, "/>\n");
    4627             :         }
    4628           1 :         count=gf_list_count(ptr->dependency_layers);
    4629           1 :         for (i = 0; i < count; i++) {
    4630             :                 u32 j;
    4631           0 :                 LHEVC_DependentLayer *dep = (LHEVC_DependentLayer *)gf_list_get(ptr->dependency_layers, i);
    4632           0 :                 gf_fprintf(trace, "<Layer dependent_layerID=\"%u\" num_layers_dependent_on=\"%u\"", dep->dependent_layerID, dep->num_layers_dependent_on);
    4633           0 :                 if (dep->num_layers_dependent_on) {
    4634           0 :                         gf_fprintf(trace, " dependent_on_layerID=\"");
    4635           0 :                         for (j = 0; j < dep->num_layers_dependent_on; j++)
    4636           0 :                                 gf_fprintf(trace, "%d ", dep->dependent_on_layerID[j]);
    4637           0 :                         gf_fprintf(trace, "\"");
    4638             :                 }
    4639           0 :                 gf_fprintf(trace, " dimension_identifier=\"");
    4640           0 :                 for (j = 0; j < 16; j++)
    4641           0 :                         if (ptr->scalability_mask & (1 << j))
    4642           0 :                                 gf_fprintf(trace, "%d ", dep->dimension_identifier[j]);
    4643           0 :                 gf_fprintf(trace, "\"/>\n");
    4644             :         }
    4645           1 :         gf_fprintf(trace, "</OperatingPointsInformation>\n");
    4646           1 :         return;
    4647             : }
    4648             : 
    4649           1 : static void linf_dump(GF_LHVCLayerInformation *ptr, FILE * trace)
    4650             : {
    4651             :         u32 i, count;
    4652           1 :         if (!ptr) {
    4653           1 :                 gf_fprintf(trace, "<LayerInformation num_layers=\"\">\n");
    4654           1 :                 gf_fprintf(trace, "<LayerInfoItem layer_id=\"\" min_temporalId=\"\" max_temporalId=\"\" sub_layer_presence_flags=\"\"/>\n");
    4655           1 :                 gf_fprintf(trace, "</LayerInformation>\n");
    4656           1 :                 return;
    4657             :         }
    4658             : 
    4659           0 :         count = gf_list_count(ptr->num_layers_in_track);
    4660           0 :         gf_fprintf(trace, "<LayerInformation num_layers=\"%d\">\n", count );
    4661           0 :         for (i = 0; i < count; i++) {
    4662           0 :                 LHVCLayerInfoItem *li = (LHVCLayerInfoItem *)gf_list_get(ptr->num_layers_in_track, i);
    4663           0 :                 gf_fprintf(trace, "<LayerInfoItem layer_id=\"%d\" min_temporalId=\"%d\" max_temporalId=\"%d\" sub_layer_presence_flags=\"%d\"/>\n", li->layer_id, li->min_TemporalId, li->max_TemporalId, li->sub_layer_presence_flags);
    4664             :         }
    4665           0 :         gf_fprintf(trace, "</LayerInformation>\n");
    4666           0 :         return;
    4667             : }
    4668             : 
    4669           1 : static void trif_dump(FILE * trace, char *data, u32 data_size)
    4670             : {
    4671             :         GF_BitStream *bs;
    4672             :         u32 id, independent, filter_disabled;
    4673             :         Bool full_picture, has_dep, tile_group;
    4674             : 
    4675           1 :         if (!data) {
    4676           1 :                 gf_fprintf(trace, "<TileRegionGroupEntry ID=\"\" tileGroup=\"\" independent=\"\" full_picture=\"\" filter_disabled=\"\" x=\"\" y=\"\" w=\"\" h=\"\">\n");
    4677           1 :                 gf_fprintf(trace, "<TileRegionDependency tileID=\"\"/>\n");
    4678           1 :                 gf_fprintf(trace, "</TileRegionGroupEntry>\n");
    4679           1 :                 return;
    4680             :         }
    4681             : 
    4682           0 :         bs = gf_bs_new(data, data_size, GF_BITSTREAM_READ);
    4683           0 :         id = gf_bs_read_u16(bs);
    4684           0 :         tile_group = gf_bs_read_int(bs, 1);
    4685           0 :         gf_fprintf(trace, "<TileRegionGroupEntry ID=\"%d\" tileGroup=\"%d\" ", id, tile_group);
    4686           0 :         if (tile_group) {
    4687           0 :                 independent = gf_bs_read_int(bs, 2);
    4688           0 :                 full_picture = (Bool)gf_bs_read_int(bs, 1);
    4689           0 :                 filter_disabled = gf_bs_read_int(bs, 1);
    4690           0 :                 has_dep = gf_bs_read_int(bs, 1);
    4691           0 :                 gf_bs_read_int(bs, 2);
    4692           0 :                 gf_fprintf(trace, "independent=\"%d\" full_picture=\"%d\" filter_disabled=\"%d\" ", independent, full_picture, filter_disabled);
    4693             : 
    4694           0 :                 if (!full_picture) {
    4695           0 :                         gf_fprintf(trace, "x=\"%d\" y=\"%d\" ", gf_bs_read_u16(bs), gf_bs_read_u16(bs));
    4696             :                 }
    4697           0 :                 gf_fprintf(trace, "w=\"%d\" h=\"%d\" ", gf_bs_read_u16(bs), gf_bs_read_u16(bs));
    4698           0 :                 if (!has_dep) {
    4699           0 :                         gf_fprintf(trace, "/>\n");
    4700             :                 } else {
    4701           0 :                         u32 count = gf_bs_read_u16(bs);
    4702           0 :                         gf_fprintf(trace, ">\n");
    4703           0 :                         while (count) {
    4704           0 :                                 count--;
    4705           0 :                                 gf_fprintf(trace, "<TileRegionDependency tileID=\"%d\"/>\n", gf_bs_read_u16(bs) );
    4706             :                         }
    4707           0 :                         gf_fprintf(trace, "</TileRegionGroupEntry>\n");
    4708             :                 }
    4709             :         }
    4710           0 :         gf_bs_del(bs);
    4711             : }
    4712             : 
    4713           1 : static void nalm_dump(FILE * trace, char *data, u32 data_size)
    4714             : {
    4715             :         GF_BitStream *bs;
    4716             : 
    4717             :         Bool rle, large_size;
    4718             :         u32 entry_count;
    4719             : 
    4720           1 :         if (!data) {
    4721           1 :                 gf_fprintf(trace, "<NALUMap rle=\"\" large_size=\"\">\n");
    4722           1 :                 gf_fprintf(trace, "<NALUMapEntry NALU_startNumber=\"\" groupID=\"\"/>\n");
    4723           1 :                 gf_fprintf(trace, "</NALUMap>\n");
    4724           1 :                 return;
    4725             :         }
    4726             : 
    4727           0 :         bs = gf_bs_new(data, data_size, GF_BITSTREAM_READ);
    4728           0 :         gf_bs_read_int(bs, 6);
    4729           0 :         large_size = gf_bs_read_int(bs, 1);
    4730           0 :         rle = gf_bs_read_int(bs, 1);
    4731           0 :         entry_count = gf_bs_read_int(bs, large_size ? 16 : 8);
    4732           0 :         gf_fprintf(trace, "<NALUMap rle=\"%d\" large_size=\"%d\">\n", rle, large_size);
    4733             : 
    4734           0 :         while (entry_count) {
    4735             :                 u32 ID;
    4736           0 :                 gf_fprintf(trace, "<NALUMapEntry ");
    4737           0 :                 if (rle) {
    4738           0 :                         u32 start_num = gf_bs_read_int(bs, large_size ? 16 : 8);
    4739           0 :                         gf_fprintf(trace, "NALU_startNumber=\"%d\" ", start_num);
    4740             :                 }
    4741           0 :                 ID = gf_bs_read_u16(bs);
    4742           0 :                 gf_fprintf(trace, "groupID=\"%d\"/>\n", ID);
    4743           0 :                 entry_count--;
    4744             :         }
    4745           0 :         gf_bs_del(bs);
    4746           0 :         gf_fprintf(trace, "</NALUMap>\n");
    4747           0 :         return;
    4748             : }
    4749             : 
    4750             : 
    4751          29 : GF_Err sgpd_box_dump(GF_Box *a, FILE * trace)
    4752             : {
    4753             :         u32 i;
    4754             :         GF_SampleGroupDescriptionBox *ptr = (GF_SampleGroupDescriptionBox*) a;
    4755          29 :         if (!a) return GF_BAD_PARAM;
    4756             : 
    4757          29 :         gf_isom_box_dump_start(a, "SampleGroupDescriptionBox", trace);
    4758             : 
    4759          29 :         if (ptr->grouping_type)
    4760          26 :                 gf_fprintf(trace, "grouping_type=\"%s\"", gf_4cc_to_str(ptr->grouping_type) );
    4761          29 :         if (ptr->version==1) gf_fprintf(trace, " default_length=\"%d\"", ptr->default_length);
    4762          29 :         if ((ptr->version>=2) && ptr->default_description_index) gf_fprintf(trace, " default_group_index=\"%d\"", ptr->default_description_index);
    4763          29 :         gf_fprintf(trace, ">\n");
    4764          29 :         for (i=0; i<gf_list_count(ptr->group_descriptions); i++) {
    4765           0 :                 void *entry = gf_list_get(ptr->group_descriptions, i);
    4766           0 :                 switch (ptr->grouping_type) {
    4767           0 :                 case GF_ISOM_SAMPLE_GROUP_ROLL:
    4768           0 :                         gf_fprintf(trace, "<RollRecoveryEntry roll_distance=\"%d\" />\n", ((GF_RollRecoveryEntry*)entry)->roll_distance );
    4769           0 :                         break;
    4770           0 :                 case GF_ISOM_SAMPLE_GROUP_PROL:
    4771           0 :                         gf_fprintf(trace, "<AudioPreRollEntry roll_distance=\"%d\" />\n", ((GF_RollRecoveryEntry*)entry)->roll_distance );
    4772           0 :                         break;
    4773           0 :                 case GF_ISOM_SAMPLE_GROUP_TELE:
    4774           0 :                         gf_fprintf(trace, "<TemporalLevelEntry level_independently_decodable=\"%d\"/>\n", ((GF_TemporalLevelEntry*)entry)->level_independently_decodable);
    4775           0 :                         break;
    4776           0 :                 case GF_ISOM_SAMPLE_GROUP_RAP:
    4777           0 :                         gf_fprintf(trace, "<VisualRandomAccessEntry num_leading_samples_known=\"%s\"", ((GF_VisualRandomAccessEntry*)entry)->num_leading_samples_known ? "yes" : "no");
    4778           0 :                         if (((GF_VisualRandomAccessEntry*)entry)->num_leading_samples_known)
    4779           0 :                                 gf_fprintf(trace, " num_leading_samples=\"%d\"", ((GF_VisualRandomAccessEntry*)entry)->num_leading_samples);
    4780           0 :                         gf_fprintf(trace, "/>\n");
    4781           0 :                         break;
    4782           0 :                 case GF_ISOM_SAMPLE_GROUP_SYNC:
    4783           0 :                         gf_fprintf(trace, "<SyncSampleGroupEntry NAL_unit_type=\"%d\"/>\n", ((GF_SYNCEntry*)entry)->NALU_type);
    4784           0 :                         break;
    4785           0 :                 case GF_ISOM_SAMPLE_GROUP_SEIG:
    4786             :                 {
    4787             :                         GF_CENCSampleEncryptionGroupEntry *seig = (GF_CENCSampleEncryptionGroupEntry *)entry;
    4788           0 :                         Bool use_mkey = seig->key_info[0] ? GF_TRUE : GF_FALSE;
    4789             : 
    4790           0 :                         gf_fprintf(trace, "<CENCSampleEncryptionGroupEntry IsEncrypted=\"%d\"", seig->IsProtected);
    4791           0 :                         if (use_mkey) {
    4792             :                                 u32 k, nb_keys, kpos=3;
    4793           0 :                                 nb_keys = seig->key_info[1];
    4794           0 :                                 nb_keys <<= 8;
    4795           0 :                                 nb_keys |= seig->key_info[2];
    4796             : 
    4797           0 :                                 gf_fprintf(trace, ">\n");
    4798           0 :                                 for (k=0; k<nb_keys; k++) {
    4799           0 :                                         if (kpos + 17 > seig->key_info_size)
    4800             :                                                 break;
    4801           0 :                                         u8 iv_size = seig->key_info[kpos];
    4802           0 :                                         gf_fprintf(trace, "<CENCKey IV_size=\"%d\" KID=\"", iv_size);
    4803           0 :                                         dump_data_hex(trace, seig->key_info+kpos+1, 16);
    4804             :                                         kpos += 17;
    4805           0 :                                         gf_fprintf(trace, "\"");
    4806           0 :                                         if ((seig->IsProtected == 1) && !iv_size) {
    4807           0 :                                                 if (kpos + 1 >= seig->key_info_size)
    4808             :                                                         break;
    4809           0 :                                                 u8 const_IV_size = seig->key_info[kpos];
    4810           0 :                                                 gf_fprintf(trace, " constant_IV_size=\"%d\"  constant_IV=\"", const_IV_size);
    4811           0 :                                                 if (kpos + 1 + const_IV_size >= seig->key_info_size)
    4812             :                                                         break;
    4813           0 :                                                 dump_data_hex(trace, (char *)seig->key_info + kpos + 1, const_IV_size);
    4814             :                                                 kpos += 1 + const_IV_size;
    4815           0 :                                                 gf_fprintf(trace, "\"");
    4816             :                                         }
    4817           0 :                                         gf_fprintf(trace, "/>\n");
    4818             :                                 }
    4819           0 :                                 gf_fprintf(trace, "</CENCSampleEncryptionGroupEntry>\n");
    4820             :                         } else {
    4821           0 :                                 gf_fprintf(trace, " IV_size=\"%d\" KID=\"", seig->key_info[3]);
    4822           0 :                                 dump_data_hex(trace, seig->key_info+4, 16);
    4823           0 :                                 if ((seig->IsProtected == 1) && !seig->key_info[3]) {
    4824           0 :                                         gf_fprintf(trace, "\" constant_IV_size=\"%d\"  constant_IV=\"", seig->key_info[20]);
    4825           0 :                                         dump_data_hex(trace, (char *)seig->key_info + 21, seig->key_info[20]);
    4826             :                                 }
    4827           0 :                                 gf_fprintf(trace, "\"/>\n");
    4828             :                         }
    4829             :                 }
    4830             :                         break;
    4831           0 :                 case GF_ISOM_SAMPLE_GROUP_OINF:
    4832           0 :                         oinf_entry_dump(entry, trace);
    4833           0 :                         break;
    4834           0 :                 case GF_ISOM_SAMPLE_GROUP_LINF:
    4835           0 :                         linf_dump(entry, trace);
    4836           0 :                         break;
    4837           0 :                 case GF_ISOM_SAMPLE_GROUP_TRIF:
    4838           0 :                         trif_dump(trace, (char *) ((GF_DefaultSampleGroupDescriptionEntry*)entry)->data,  ((GF_DefaultSampleGroupDescriptionEntry*)entry)->length);
    4839           0 :                         break;
    4840             : 
    4841           0 :                 case GF_ISOM_SAMPLE_GROUP_NALM:
    4842           0 :                         nalm_dump(trace, (char *) ((GF_DefaultSampleGroupDescriptionEntry*)entry)->data,  ((GF_DefaultSampleGroupDescriptionEntry*)entry)->length);
    4843           0 :                         break;
    4844           0 :                 case GF_ISOM_SAMPLE_GROUP_SAP:
    4845           0 :                         gf_fprintf(trace, "<SAPEntry dependent_flag=\"%d\" SAP_type=\"%d\" />\n", ((GF_SAPEntry*)entry)->dependent_flag, ((GF_SAPEntry*)entry)->SAP_type);
    4846           0 :                         break;
    4847           0 :                 default:
    4848           0 :                         gf_fprintf(trace, "<DefaultSampleGroupDescriptionEntry size=\"%d\" data=\"", ((GF_DefaultSampleGroupDescriptionEntry*)entry)->length);
    4849           0 :                         dump_data(trace, (char *) ((GF_DefaultSampleGroupDescriptionEntry*)entry)->data,  ((GF_DefaultSampleGroupDescriptionEntry*)entry)->length);
    4850           0 :                         gf_fprintf(trace, "\"/>\n");
    4851             :                 }
    4852             :         }
    4853          29 :         if (!ptr->size) {
    4854          29 :                 switch (ptr->grouping_type) {
    4855           1 :                 case GF_ISOM_SAMPLE_GROUP_ROLL:
    4856           1 :                         gf_fprintf(trace, "<RollRecoveryEntry roll_distance=\"\"/>\n");
    4857           1 :                         break;
    4858           1 :                 case GF_ISOM_SAMPLE_GROUP_PROL:
    4859           1 :                         gf_fprintf(trace, "<AudioPreRollEntry roll_distance=\"\"/>\n");
    4860           1 :                         break;
    4861           1 :                 case GF_ISOM_SAMPLE_GROUP_TELE:
    4862           1 :                         gf_fprintf(trace, "<TemporalLevelEntry level_independently_decodable=\"\"/>\n");
    4863           1 :                         break;
    4864           1 :                 case GF_ISOM_SAMPLE_GROUP_RAP:
    4865           1 :                         gf_fprintf(trace, "<VisualRandomAccessEntry num_leading_samples_known=\"yes|no\" num_leading_samples=\"\" />\n");
    4866           1 :                         break;
    4867           1 :                 case GF_ISOM_SAMPLE_GROUP_SYNC:
    4868           1 :                         gf_fprintf(trace, "<SyncSampleGroupEntry NAL_unit_type=\"\" />\n");
    4869           1 :                         break;
    4870           1 :                 case GF_ISOM_SAMPLE_GROUP_SEIG:
    4871           1 :                         gf_fprintf(trace, "<CENCSampleEncryptionGroupEntry IsEncrypted=\"\" IV_size=\"\" KID=\"\" constant_IV_size=\"\"  constant_IV=\"\"/>\n");
    4872           1 :                         break;
    4873           1 :                 case GF_ISOM_SAMPLE_GROUP_OINF:
    4874           1 :                         oinf_entry_dump(NULL, trace);
    4875           1 :                         break;
    4876           1 :                 case GF_ISOM_SAMPLE_GROUP_LINF:
    4877           1 :                         linf_dump(NULL, trace);
    4878           1 :                         break;
    4879           1 :                 case GF_ISOM_SAMPLE_GROUP_TRIF:
    4880           1 :                         trif_dump(trace, NULL, 0);
    4881           1 :                         break;
    4882           1 :                 case GF_ISOM_SAMPLE_GROUP_NALM:
    4883           1 :                         nalm_dump(trace, NULL, 0);
    4884           1 :                         break;
    4885           1 :                 case GF_ISOM_SAMPLE_GROUP_SAP:
    4886           1 :                         gf_fprintf(trace, "<SAPEntry dependent_flag=\"\" SAP_type=\"\" />\n");
    4887           1 :                         break;
    4888          18 :                 default:
    4889          18 :                         gf_fprintf(trace, "<DefaultSampleGroupDescriptionEntry size=\"\" data=\"\"/>\n");
    4890             :                 }
    4891           0 :         }
    4892             : 
    4893          29 :         gf_isom_box_dump_done("SampleGroupDescriptionBox", a, trace);
    4894          29 :         return GF_OK;
    4895             : }
    4896             : 
    4897           9 : GF_Err saiz_box_dump(GF_Box *a, FILE * trace)
    4898             : {
    4899             :         u32 i;
    4900             :         GF_SampleAuxiliaryInfoSizeBox *ptr = (GF_SampleAuxiliaryInfoSizeBox*) a;
    4901           9 :         if (!a) return GF_BAD_PARAM;
    4902             : 
    4903           9 :         if (dump_skip_samples)
    4904             :                 return GF_OK;
    4905             : 
    4906           9 :         gf_isom_box_dump_start(a, "SampleAuxiliaryInfoSizeBox", trace);
    4907             : 
    4908           9 :         gf_fprintf(trace, "default_sample_info_size=\"%d\" sample_count=\"%d\"", ptr->default_sample_info_size, ptr->sample_count);
    4909           9 :         if (ptr->flags & 1) {
    4910           2 :                 if (isalnum(ptr->aux_info_type>>24)) {
    4911           1 :                         gf_fprintf(trace, " aux_info_type=\"%s\" aux_info_type_parameter=\"%d\"", gf_4cc_to_str(ptr->aux_info_type), ptr->aux_info_type_parameter);
    4912             :                 } else {
    4913           1 :                         gf_fprintf(trace, " aux_info_type=\"%d\" aux_info_type_parameter=\"%d\"", ptr->aux_info_type, ptr->aux_info_type_parameter);
    4914             :                 }
    4915             :         }
    4916           9 :         gf_fprintf(trace, ">\n");
    4917           9 :         if (ptr->default_sample_info_size==0) {
    4918           0 :                 for (i=0; i<ptr->sample_count; i++) {
    4919           0 :                         gf_fprintf(trace, "<SAISize size=\"%d\" />\n", ptr->sample_info_size[i]);
    4920             :                 }
    4921             :         }
    4922           9 :         if (!ptr->size) {
    4923           3 :                         gf_fprintf(trace, "<SAISize size=\"\" />\n");
    4924             :         }
    4925           9 :         gf_isom_box_dump_done("SampleAuxiliaryInfoSizeBox", a, trace);
    4926           9 :         return GF_OK;
    4927             : }
    4928             : 
    4929          12 : GF_Err saio_box_dump(GF_Box *a, FILE * trace)
    4930             : {
    4931             :         u32 i;
    4932             :         GF_SampleAuxiliaryInfoOffsetBox *ptr = (GF_SampleAuxiliaryInfoOffsetBox*) a;
    4933          12 :         if (!a) return GF_BAD_PARAM;
    4934             : 
    4935          12 :         if (dump_skip_samples)
    4936             :                 return GF_OK;
    4937             : 
    4938          12 :         gf_isom_box_dump_start(a, "SampleAuxiliaryInfoOffsetBox", trace);
    4939             : 
    4940          12 :         gf_fprintf(trace, "entry_count=\"%d\"", ptr->entry_count);
    4941          12 :         if (ptr->flags & 1) {
    4942           3 :                 if (isalnum(ptr->aux_info_type>>24)) {
    4943           1 :                         gf_fprintf(trace, " aux_info_type=\"%s\" aux_info_type_parameter=\"%d\"", gf_4cc_to_str(ptr->aux_info_type), ptr->aux_info_type_parameter);
    4944             :                 } else {
    4945           2 :                         gf_fprintf(trace, " aux_info_type=\"%d\" aux_info_type_parameter=\"%d\"", ptr->aux_info_type, ptr->aux_info_type_parameter);
    4946             :                 }
    4947             :         }
    4948             : 
    4949          12 :         gf_fprintf(trace, ">\n");
    4950             : 
    4951          12 :         if (ptr->version==0) {
    4952           1 :                 for (i=0; i<ptr->entry_count; i++) {
    4953           1 :                         gf_fprintf(trace, "<SAIChunkOffset offset=\"%d\"/>\n", (u32) ptr->offsets[i]);
    4954             :                 }
    4955             :         } else {
    4956           5 :                 for (i=0; i<ptr->entry_count; i++) {
    4957           5 :                         gf_fprintf(trace, "<SAIChunkOffset offset=\""LLD"\"/>\n", ptr->offsets[i]);
    4958             :                 }
    4959             :         }
    4960          12 :         if (!ptr->size) {
    4961           6 :                         gf_fprintf(trace, "<SAIChunkOffset offset=\"\"/>\n");
    4962             :         }
    4963          12 :         gf_isom_box_dump_done("SampleAuxiliaryInfoOffsetBox", a, trace);
    4964          12 :         return GF_OK;
    4965             : }
    4966             : 
    4967          16 : GF_Err pssh_box_dump(GF_Box *a, FILE * trace)
    4968             : {
    4969             :         GF_ProtectionSystemHeaderBox *ptr = (GF_ProtectionSystemHeaderBox*) a;
    4970          16 :         if (!a) return GF_BAD_PARAM;
    4971             : 
    4972          16 :         gf_isom_box_dump_start(a, "ProtectionSystemHeaderBox", trace);
    4973             : 
    4974          16 :         gf_fprintf(trace, "SystemID=\"");
    4975          16 :         dump_data_hex(trace, (char *) ptr->SystemID, 16);
    4976          16 :         gf_fprintf(trace, "\">\n");
    4977             : 
    4978          16 :         if (ptr->KID_count) {
    4979             :                 u32 i;
    4980          11 :                 for (i=0; i<ptr->KID_count; i++) {
    4981          11 :                         gf_fprintf(trace, " <PSSHKey KID=\"");
    4982          11 :                         dump_data_hex(trace, (char *) ptr->KIDs[i], 16);
    4983          11 :                         gf_fprintf(trace, "\"/>\n");
    4984             :                 }
    4985             :         }
    4986          16 :         if (ptr->private_data_size) {
    4987          15 :                 gf_fprintf(trace, " <PSSHData size=\"%d\" value=\"", ptr->private_data_size);
    4988          15 :                 dump_data_hex(trace, (char *) ptr->private_data, ptr->private_data_size);
    4989          15 :                 gf_fprintf(trace, "\"/>\n");
    4990             :         }
    4991          16 :         if (!ptr->size) {
    4992           1 :                 gf_fprintf(trace, " <PSSHKey KID=\"\"/>\n");
    4993           1 :                 gf_fprintf(trace, " <PSSHData size=\"\" value=\"\"/>\n");
    4994             :         }
    4995          16 :         gf_isom_box_dump_done("ProtectionSystemHeaderBox", a, trace);
    4996          16 :         return GF_OK;
    4997             : }
    4998             : 
    4999           2 : GF_Err tenc_box_dump(GF_Box *a, FILE * trace)
    5000             : {
    5001             :         GF_TrackEncryptionBox *ptr = (GF_TrackEncryptionBox*) a;
    5002           2 :         if (!a) return GF_BAD_PARAM;
    5003             : 
    5004           2 :         gf_isom_box_dump_start(a, "TrackEncryptionBox", trace);
    5005             : 
    5006           2 :         gf_fprintf(trace, "isEncrypted=\"%d\"", ptr->isProtected);
    5007             : 
    5008           2 :         if (ptr->key_info[3])
    5009           0 :                 gf_fprintf(trace, " IV_size=\"%d\" KID=\"", ptr->key_info[3]);
    5010             :         else {
    5011           2 :                 gf_fprintf(trace, " constant_IV_size=\"%d\" constant_IV=\"", ptr->key_info[20]);
    5012           2 :                 dump_data_hex(trace, (char *) ptr->key_info+21, ptr->key_info[20]);
    5013           2 :                 gf_fprintf(trace, "\"  KID=\"");
    5014             :         }
    5015           2 :         dump_data_hex(trace, (char *) ptr->key_info+4, 16);
    5016           2 :         if (ptr->version)
    5017           1 :                 gf_fprintf(trace, "\" crypt_byte_block=\"%d\" skip_byte_block=\"%d", ptr->crypt_byte_block, ptr->skip_byte_block);
    5018           2 :         gf_fprintf(trace, "\">\n");
    5019             : 
    5020           2 :         if (!ptr->size) {
    5021           2 :                 gf_fprintf(trace, " IV_size=\"\" KID=\"\" constant_IV_size=\"\" constant_IV=\"\" crypt_byte_block=\"\" skip_byte_block=\"\">\n");
    5022           2 :                 gf_fprintf(trace, "<TENCKey IV_size=\"\" KID=\"\" const_IV_size=\"\" constIV=\"\"/>\n");
    5023             :         }
    5024           2 :         gf_isom_box_dump_done("TrackEncryptionBox", a, trace);
    5025           2 :         return GF_OK;
    5026             : }
    5027             : 
    5028           1 : GF_Err piff_pssh_box_dump(GF_Box *a, FILE * trace)
    5029             : {
    5030             :         GF_PIFFProtectionSystemHeaderBox *ptr = (GF_PIFFProtectionSystemHeaderBox*) a;
    5031           1 :         if (!a) return GF_BAD_PARAM;
    5032             : 
    5033           1 :         gf_isom_box_dump_start(a, "PIFFProtectionSystemHeaderBox", trace);
    5034           1 :         fprintf(trace, "Version=\"%d\" Flags=\"%d\" ", ptr->version, ptr->flags);
    5035             : 
    5036           1 :         gf_fprintf(trace, "SystemID=\"");
    5037           1 :         dump_data_hex(trace, (char *) ptr->SystemID, 16);
    5038           1 :         gf_fprintf(trace, "\" PrivateData=\"");
    5039           1 :         dump_data_hex(trace, (char *) ptr->private_data, ptr->private_data_size);
    5040           1 :         gf_fprintf(trace, "\">\n");
    5041           1 :         gf_isom_box_dump_done("PIFFProtectionSystemHeaderBox", a, trace);
    5042           1 :         return GF_OK;
    5043             : }
    5044             : 
    5045           1 : GF_Err piff_tenc_box_dump(GF_Box *a, FILE * trace)
    5046             : {
    5047             :         GF_PIFFTrackEncryptionBox *ptr = (GF_PIFFTrackEncryptionBox*) a;
    5048           1 :         if (!a) return GF_BAD_PARAM;
    5049             : 
    5050           1 :         gf_isom_box_dump_start(a, "PIFFTrackEncryptionBox", trace);
    5051           1 :         fprintf(trace, "Version=\"%d\" Flags=\"%d\" ", ptr->version, ptr->flags);
    5052             : 
    5053           1 :         gf_fprintf(trace, "AlgorithmID=\"%d\" IV_size=\"%d\" KID=\"", ptr->AlgorithmID, ptr->key_info[3]);
    5054           1 :         dump_data_hex(trace,(char *) ptr->key_info+4, 16);
    5055           1 :         gf_fprintf(trace, "\">\n");
    5056           1 :         gf_isom_box_dump_done("PIFFTrackEncryptionBox", a, trace);
    5057           1 :         return GF_OK;
    5058             : }
    5059             : 
    5060             : u8 key_info_get_iv_size(const u8 *key_info, u32 key_info_size, u32 idx, u8 *const_iv_size, const u8 **const_iv);
    5061             : 
    5062           9 : GF_Err senc_box_dump(GF_Box *a, FILE * trace)
    5063             : {
    5064             :         u32 i, sample_count;
    5065             :         const char *name;
    5066             :         GF_BitStream *bs = NULL;
    5067             :         u32 piff_IV_size = 0;
    5068             :         Bool use_multikey = GF_FALSE;
    5069             :         GF_SampleEncryptionBox *ptr = (GF_SampleEncryptionBox *) a;
    5070           9 :         if (!a) return GF_BAD_PARAM;
    5071             : 
    5072           9 :         if (dump_skip_samples)
    5073             :                 return GF_OK;
    5074             : 
    5075           9 :         if (ptr->internal_4cc == GF_ISOM_BOX_UUID_PSEC)
    5076             :                 name = "PIFFSampleEncryptionBox";
    5077             :         else
    5078             :                 name = "SampleEncryptionBox";
    5079             : 
    5080           9 :         gf_isom_box_dump_start(a, name, trace);
    5081             : 
    5082           9 :         if (ptr->internal_4cc == GF_ISOM_BOX_UUID_PSEC) {
    5083           2 :                 gf_fprintf(trace, "Version=\"%d\" Flags=\"%d\" ", ptr->version, ptr->flags);
    5084           2 :                 if (ptr->flags & 1) {
    5085           0 :                         gf_fprintf(trace, " AlgorithmID=\"%d\" IV_size=\"%d\" KID=\"", ptr->AlgorithmID, ptr->IV_size);
    5086           0 :                         dump_data(trace, (char *) ptr->KID, 16);
    5087           0 :                         gf_fprintf(trace, "\"");
    5088           0 :                         piff_IV_size = ptr->IV_size;
    5089             :                 }
    5090             :         }
    5091             : 
    5092           9 :         sample_count = gf_list_count(ptr->samp_aux_info);
    5093           9 :         gf_fprintf(trace, "sampleCount=\"%d\">\n", sample_count);
    5094           9 :         if (ptr->internal_4cc != GF_ISOM_BOX_UUID_PSEC) {
    5095             :                 //WARNING - PSEC (UUID) IS TYPECASTED TO SENC (FULL BOX) SO WE CANNOT USE USUAL FULL BOX FUNCTIONS
    5096           7 :                 gf_fprintf(trace, "<FullBoxInfo Version=\"%d\" Flags=\"0x%X\"/>\n", ptr->version, ptr->flags);
    5097             : 
    5098           7 :                 if ((ptr->version==1) && !ptr->piff_type)
    5099             :                         use_multikey = GF_TRUE;
    5100             :         }
    5101             : 
    5102             : 
    5103         230 :         for (i=0; i<sample_count; i++) {
    5104             :                 u32 nb_keys=0;
    5105             :                 u32 iv_size=0;
    5106             :                 u32 subs_bits=16;
    5107         221 :                 GF_CENCSampleAuxInfo *sai = (GF_CENCSampleAuxInfo *)gf_list_get(ptr->samp_aux_info, i);
    5108         221 :                 if (!sai) break;
    5109         221 :                 if (sai->isNotProtected) continue;
    5110             : 
    5111         221 :                 gf_fprintf(trace, "<SampleEncryptionEntry sampleNumber=\"%d\"", i+1);
    5112         221 :                 if (sai->key_info) {
    5113         125 :                         if (!use_multikey) {
    5114         125 :                                 iv_size = sai->key_info[3];
    5115             :                         } else {
    5116           0 :                                 nb_keys = sai->key_info[1];
    5117           0 :                                 nb_keys <<= 8;
    5118           0 :                                 nb_keys |= sai->key_info[2];
    5119             :                                 subs_bits = 32;
    5120             :                         }
    5121             :                 }
    5122             :                 //piff
    5123             :                 else {
    5124          96 :                         iv_size = piff_IV_size ? piff_IV_size : sai->key_info_size;
    5125             :                 }
    5126             : 
    5127         221 :                 if (!bs)
    5128           7 :                         bs = gf_bs_new(sai->cenc_data, sai->cenc_data_size, GF_BITSTREAM_READ);
    5129             :                 else
    5130         214 :                         gf_bs_reassign_buffer(bs, sai->cenc_data, sai->cenc_data_size);
    5131             : 
    5132         221 :                 if (!use_multikey) {
    5133         221 :                         gf_fprintf(trace, " IV_size=\"%u\"", iv_size);
    5134         221 :                         if (iv_size) {
    5135         221 :                                 gf_fprintf(trace, " IV=\"");
    5136         221 :                                 dump_data_hex(trace, (char *) sai->cenc_data, iv_size);
    5137         221 :                                 gf_fprintf(trace, "\"");
    5138         221 :                                 gf_bs_skip_bytes(bs, iv_size);
    5139             :                         }
    5140             :                 } else {
    5141           0 :                         u32 k, nb_ivs = gf_bs_read_u16(bs);
    5142           0 :                         if (nb_ivs) {
    5143           0 :                                 gf_fprintf(trace, " multiIV=\"[");
    5144             :                         }
    5145           0 :                         for (k=0; k<nb_ivs; k++) {
    5146             :                                 u32 pos;
    5147           0 :                                 u32 idx = gf_bs_read_u16(bs);
    5148           0 :                                 u8 mk_iv_size = key_info_get_iv_size(sai->key_info, sai->key_info_size, idx, NULL, NULL);
    5149             :                                 assert(mk_iv_size);
    5150           0 :                                 pos = (u32) gf_bs_get_position(bs);
    5151           0 :                                 gf_fprintf(trace, "%sidx:%d,iv_size:%d,IV:", k ? "," : "", idx, mk_iv_size);
    5152           0 :                                 dump_data_hex(trace, (char *) sai->cenc_data+pos, mk_iv_size);
    5153           0 :                                 gf_bs_skip_bytes(bs, mk_iv_size);
    5154             :                         }
    5155           0 :                         if (nb_ivs) {
    5156           0 :                                 gf_fprintf(trace, "]\"");
    5157             :                         }
    5158             :                 }
    5159         221 :                 if (use_multikey || ((ptr->flags & 0x2) && (sai->cenc_data_size>iv_size)) ) {
    5160             :                         u32 j, nb_subs;
    5161             : 
    5162         221 :                         nb_subs = gf_bs_read_int(bs, subs_bits);
    5163         221 :                         gf_fprintf(trace, " SubsampleCount=\"%u\"", nb_subs);
    5164         221 :                         gf_fprintf(trace, ">\n");
    5165             : 
    5166         442 :                         for (j=0; j<nb_subs; j++) {
    5167             :                                 u32 clear, crypt;
    5168         221 :                                 gf_fprintf(trace, "<SubSampleEncryptionEntry");
    5169         221 :                                 if (nb_keys>1) {
    5170           0 :                                         u32 kidx = gf_bs_read_u16(bs);
    5171           0 :                                         gf_fprintf(trace, " MultiKeyIndex=\"%u\"", kidx);
    5172             :                                 }
    5173         221 :                                 clear = gf_bs_read_u16(bs);
    5174         221 :                                 crypt = gf_bs_read_u32(bs);
    5175         221 :                                 gf_fprintf(trace, " NumClearBytes=\"%u\" NumEncryptedBytes=\"%u\"/>\n", clear, crypt);
    5176             :                         }
    5177             :                 } else {
    5178           0 :                         gf_fprintf(trace, ">\n");
    5179             :                 }
    5180         221 :                 gf_fprintf(trace, "</SampleEncryptionEntry>\n");
    5181             :         }
    5182           9 :         if (bs)
    5183           7 :                 gf_bs_del(bs);
    5184             :                 
    5185           9 :         if (!ptr->size) {
    5186           2 :                 gf_fprintf(trace, "<SampleEncryptionEntry sampleCount=\"\" IV=\"\" SubsampleCount=\"\">\n");
    5187           2 :                 gf_fprintf(trace, "<SubSampleEncryptionEntry NumClearBytes=\"\" NumEncryptedBytes=\"\"/>\n");
    5188           2 :                 gf_fprintf(trace, "</SampleEncryptionEntry>\n");
    5189             :         }
    5190           9 :         gf_isom_box_dump_done(name, a, trace);
    5191           9 :         return GF_OK;
    5192             : }
    5193             : 
    5194           2 : GF_Err piff_psec_box_dump(GF_Box *a, FILE * trace)
    5195             : {
    5196           2 :         return senc_box_dump(a, trace);
    5197             : }
    5198             : 
    5199           2 : GF_Err prft_box_dump(GF_Box *a, FILE * trace)
    5200             : {
    5201             :         Double fracs;
    5202             :         GF_ProducerReferenceTimeBox *ptr = (GF_ProducerReferenceTimeBox *) a;
    5203             :         time_t secs;
    5204             :         struct tm t;
    5205           2 :         secs = (ptr->ntp >> 32) - GF_NTP_SEC_1900_TO_1970;
    5206           2 :         if (secs < 0) {
    5207           2 :                 if (ptr->size) {
    5208           0 :                         GF_LOG(GF_LOG_ERROR, GF_LOG_CONTAINER, ("NTP time is not valid, using value 0\n"));
    5209             :                 }
    5210           2 :                 secs = 0;
    5211             :         }
    5212           2 :         t = *gf_gmtime(&secs);
    5213           2 :         fracs = (Double) (ptr->ntp & 0xFFFFFFFFULL);
    5214           2 :         fracs /= 0xFFFFFFFF;
    5215           2 :         fracs *= 1000;
    5216           2 :         gf_isom_box_dump_start(a, "ProducerReferenceTimeBox", trace);
    5217             : 
    5218           2 :         gf_fprintf(trace, "referenceTrackID=\"%d\" timestamp=\""LLU"\" NTP=\""LLU"\" UTC=\"%d-%02d-%02dT%02d:%02d:%02d.%03dZ\">\n", ptr->refTrackID, ptr->timestamp, ptr->ntp, 1900+t.tm_year, t.tm_mon+1, t.tm_mday, t.tm_hour, t.tm_min, (u32) t.tm_sec, (u32) fracs);
    5219           2 :         gf_isom_box_dump_done("ProducerReferenceTimeBox", a, trace);
    5220             : 
    5221           2 :         return GF_OK;
    5222             : }
    5223             : 
    5224           1 : GF_Err adkm_box_dump(GF_Box *a, FILE * trace)
    5225             : {
    5226           1 :         if (!a) return GF_BAD_PARAM;
    5227           1 :         gf_isom_box_dump_start(a, "AdobeDRMKeyManagementSystemBox", trace);
    5228             : 
    5229           1 :         gf_fprintf(trace, ">\n");
    5230           1 :         gf_isom_box_dump_done("AdobeDRMKeyManagementSystemBox", a, trace);
    5231           1 :         return GF_OK;
    5232             : }
    5233             : 
    5234           1 : GF_Err ahdr_box_dump(GF_Box *a, FILE * trace)
    5235             : {
    5236           1 :         if (!a) return GF_BAD_PARAM;
    5237           1 :         gf_isom_box_dump_start(a, "AdobeDRMHeaderBox", trace);
    5238           1 :         gf_fprintf(trace, ">\n");
    5239           1 :         gf_isom_box_dump_done("AdobeDRMHeaderBox", a, trace);
    5240           1 :         return GF_OK;
    5241             : }
    5242             : 
    5243           1 : GF_Err aprm_box_dump(GF_Box *a, FILE * trace)
    5244             : {
    5245           1 :         if (!a) return GF_BAD_PARAM;
    5246           1 :         gf_isom_box_dump_start(a, "AdobeStdEncryptionParamsBox", trace);
    5247           1 :         gf_fprintf(trace, ">\n");
    5248           1 :         gf_isom_box_dump_done("AdobeStdEncryptionParamsBox", a, trace);
    5249           1 :         return GF_OK;
    5250             : }
    5251             : 
    5252           1 : GF_Err aeib_box_dump(GF_Box *a, FILE * trace)
    5253             : {
    5254             :         GF_AdobeEncryptionInfoBox *ptr = (GF_AdobeEncryptionInfoBox *)a;
    5255           1 :         if (!a) return GF_BAD_PARAM;
    5256           1 :         gf_isom_box_dump_start(a, "AdobeEncryptionInfoBox", trace);
    5257           1 :         gf_fprintf(trace, "EncryptionAlgorithm=\"%s\" KeyLength=\"%d\">\n", ptr->enc_algo, ptr->key_length);
    5258           1 :         gf_isom_box_dump_done("AdobeEncryptionInfoBox", a, trace);
    5259           1 :         return GF_OK;
    5260             : }
    5261             : 
    5262           1 : GF_Err akey_box_dump(GF_Box *a, FILE * trace)
    5263             : {
    5264           1 :         if (!a) return GF_BAD_PARAM;
    5265           1 :         gf_isom_box_dump_start(a, "AdobeKeyInfoBox", trace);
    5266           1 :         gf_fprintf(trace, ">\n");
    5267           1 :         gf_isom_box_dump_done("AdobeKeyInfoBox", a, trace);
    5268           1 :         return GF_OK;
    5269             : }
    5270             : 
    5271           1 : GF_Err flxs_box_dump(GF_Box *a, FILE * trace)
    5272             : {
    5273           1 :         if (!a) return GF_BAD_PARAM;
    5274           1 :         gf_isom_box_dump_start(a, "AdobeFlashAccessParamsBox", trace);
    5275           1 :         gf_fprintf(trace, ">\n");
    5276           1 :         gf_isom_box_dump_done("AdobeFlashAccessParamsBox", a, trace);
    5277           1 :         return GF_OK;
    5278             : }
    5279             : 
    5280           1 : GF_Err adaf_box_dump(GF_Box *a, FILE * trace)
    5281             : {
    5282             :         GF_AdobeDRMAUFormatBox *ptr = (GF_AdobeDRMAUFormatBox *)a;
    5283           1 :         if (!a) return GF_BAD_PARAM;
    5284           1 :         gf_isom_box_dump_start(a, "AdobeDRMAUFormatBox ", trace);
    5285           1 :         gf_fprintf(trace, "SelectiveEncryption=\"%d\" IV_length=\"%d\">\n", ptr->selective_enc ? 1 : 0, ptr->IV_length);
    5286           1 :         gf_isom_box_dump_done("AdobeDRMAUFormatBox", a, trace);
    5287           1 :         return GF_OK;
    5288             : }
    5289             : 
    5290             : /* Image File Format dump */
    5291          26 : GF_Err ispe_box_dump(GF_Box *a, FILE * trace)
    5292             : {
    5293             :         GF_ImageSpatialExtentsPropertyBox *ptr = (GF_ImageSpatialExtentsPropertyBox *)a;
    5294          26 :         if (!a) return GF_BAD_PARAM;
    5295          26 :         gf_isom_box_dump_start(a, "ImageSpatialExtentsPropertyBox", trace);
    5296          26 :         gf_fprintf(trace, "image_width=\"%d\" image_height=\"%d\">\n", ptr->image_width, ptr->image_height);
    5297          26 :         gf_isom_box_dump_done("ImageSpatialExtentsPropertyBox", a, trace);
    5298          26 :         return GF_OK;
    5299             : }
    5300             : 
    5301          14 : GF_Err colr_box_dump(GF_Box *a, FILE * trace)
    5302             : {
    5303             :         u8 *prof_data_64=NULL;
    5304             :         u32 size_64;
    5305             :         GF_ColourInformationBox *ptr = (GF_ColourInformationBox *)a;
    5306          14 :         if (!a) return GF_BAD_PARAM;
    5307             : 
    5308          14 :         gf_isom_box_dump_start(a, "ColourInformationBox", trace);
    5309             : 
    5310          14 :         if (ptr->is_jp2) {
    5311           2 :                 gf_fprintf(trace, "method=\"%d\" precedence=\"%d\" approx=\"%d\"", ptr->method, ptr->precedence, ptr->approx);
    5312           2 :                 if (ptr->opaque_size) {
    5313           2 :                         gf_fprintf(trace, " colour=\"");
    5314           2 :                         dump_data_hex(trace, ptr->opaque,ptr->opaque_size);
    5315           2 :                         gf_fprintf(trace, "\"");
    5316             :                 }
    5317           2 :                 gf_fprintf(trace, ">\n");
    5318             :         } else {
    5319          12 :                 switch (ptr->colour_type) {
    5320           0 :                 case GF_ISOM_SUBTYPE_NCLC:
    5321           0 :                         gf_fprintf(trace, "colour_type=\"%s\" colour_primaries=\"%d\" transfer_characteristics=\"%d\" matrix_coefficients=\"%d\">\n", gf_4cc_to_str(ptr->colour_type), ptr->colour_primaries, ptr->transfer_characteristics, ptr->matrix_coefficients);
    5322           0 :                         break;
    5323          10 :                 case GF_ISOM_SUBTYPE_NCLX:
    5324          10 :                         gf_fprintf(trace, "colour_type=\"%s\" colour_primaries=\"%d\" transfer_characteristics=\"%d\" matrix_coefficients=\"%d\" full_range_flag=\"%d\">\n", gf_4cc_to_str(ptr->colour_type), ptr->colour_primaries, ptr->transfer_characteristics, ptr->matrix_coefficients, ptr->full_range_flag);
    5325          10 :                         break;
    5326           0 :                 case GF_ISOM_SUBTYPE_PROF:
    5327             :                 case GF_ISOM_SUBTYPE_RICC:
    5328           0 :                         gf_fprintf(trace, "colour_type=\"%s\">\n", gf_4cc_to_str(ptr->colour_type));
    5329           0 :                         if (ptr->opaque != NULL) {
    5330           0 :                                 gf_fprintf(trace, "<profile><![CDATA[");
    5331           0 :                                 size_64 = 2*ptr->opaque_size;
    5332           0 :                                 prof_data_64 = gf_malloc(size_64);
    5333           0 :                                 size_64 = gf_base64_encode((const char *) ptr->opaque, ptr->opaque_size, (char *)prof_data_64, size_64);
    5334           0 :                                 prof_data_64[size_64] = 0;
    5335           0 :                                 gf_fprintf(trace, "%s", prof_data_64);
    5336           0 :                                 gf_fprintf(trace, "]]></profile>");
    5337             :                         }
    5338             :                         break;
    5339           2 :                 default:
    5340           2 :                         gf_fprintf(trace, "colour_type=\"%s\">\n", gf_4cc_to_str(ptr->colour_type));
    5341           2 :                         break;
    5342             :                 }
    5343             :         }
    5344             : 
    5345          14 :         gf_isom_box_dump_done("ColourInformationBox", a, trace);
    5346          14 :         return GF_OK;
    5347             : }
    5348             : 
    5349          22 : GF_Err pixi_box_dump(GF_Box *a, FILE * trace)
    5350             : {
    5351             :         u32 i;
    5352             :         GF_PixelInformationPropertyBox *ptr = (GF_PixelInformationPropertyBox *)a;
    5353          22 :         if (!a) return GF_BAD_PARAM;
    5354          22 :         gf_isom_box_dump_start(a, "PixelInformationPropertyBox", trace);
    5355          22 :         gf_fprintf(trace, ">\n");
    5356          85 :         for (i = 0; i < ptr->num_channels; i++) {
    5357          63 :                 gf_fprintf(trace, "<BitPerChannel bits_per_channel=\"%d\"/>\n", ptr->bits_per_channel[i]);
    5358             :         }
    5359          22 :         if (!ptr->size)
    5360           1 :                 gf_fprintf(trace, "<BitPerChannel bits_per_channel=\"\"/>\n");
    5361             : 
    5362          22 :         gf_isom_box_dump_done("PixelInformationPropertyBox", a, trace);
    5363          22 :         return GF_OK;
    5364             : }
    5365             : 
    5366           1 : GF_Err rloc_box_dump(GF_Box *a, FILE * trace)
    5367             : {
    5368             :         GF_RelativeLocationPropertyBox *ptr = (GF_RelativeLocationPropertyBox *)a;
    5369           1 :         if (!a) return GF_BAD_PARAM;
    5370           1 :         gf_isom_box_dump_start(a, "RelativeLocationPropertyBox", trace);
    5371           1 :         gf_fprintf(trace, "horizontal_offset=\"%d\" vertical_offset=\"%d\">\n", ptr->horizontal_offset, ptr->vertical_offset);
    5372           1 :         gf_isom_box_dump_done("RelativeLocationPropertyBox", a, trace);
    5373           1 :         return GF_OK;
    5374             : }
    5375             : 
    5376           3 : GF_Err irot_box_dump(GF_Box *a, FILE * trace)
    5377             : {
    5378             :         GF_ImageRotationBox *ptr = (GF_ImageRotationBox *)a;
    5379           3 :         if (!a) return GF_BAD_PARAM;
    5380           3 :         gf_isom_box_dump_start(a, "ImageRotationBox", trace);
    5381           3 :         gf_fprintf(trace, "angle=\"%d\">\n", (ptr->angle*90));
    5382           3 :         gf_isom_box_dump_done("ImageRotationBox", a, trace);
    5383           3 :         return GF_OK;
    5384             : }
    5385             : 
    5386           1 : GF_Err imir_box_dump(GF_Box *a, FILE * trace)
    5387             : {
    5388             :         GF_ImageMirrorBox *ptr = (GF_ImageMirrorBox *)a;
    5389           1 :         if (!a) return GF_BAD_PARAM;
    5390           1 :         gf_isom_box_dump_start(a, "ImageMirrorBox", trace);
    5391           1 :         gf_fprintf(trace, "axis=\"%s\">\n", (ptr->axis ? "horizontal" : "vertical"));
    5392           1 :         gf_isom_box_dump_done("ImageMirrorBox", a, trace);
    5393           1 :         return GF_OK;
    5394             : }
    5395             : 
    5396           1 : GF_Err clli_box_dump(GF_Box *a, FILE * trace)
    5397             : {
    5398             :         GF_ContentLightLevelBox *ptr = (GF_ContentLightLevelBox *)a;
    5399           1 :         if (!a) return GF_BAD_PARAM;
    5400           1 :         gf_isom_box_dump_start(a, "ContentLightLevelBox", trace);
    5401           1 :         gf_fprintf(trace, "max_content_light_level=\"%u\" max_pic_average_light_level=\"%u\">\n", ptr->clli.max_content_light_level, ptr->clli.max_pic_average_light_level);
    5402           1 :         gf_isom_box_dump_done("ContentLightLevelBox", a, trace);
    5403           1 :         return GF_OK;
    5404             : }
    5405             : 
    5406           1 : GF_Err mdcv_box_dump(GF_Box *a, FILE * trace)
    5407             : {
    5408             :         int c = 0;
    5409             :         GF_MasteringDisplayColourVolumeBox *ptr = (GF_MasteringDisplayColourVolumeBox *)a;
    5410           1 :         if (!a) return GF_BAD_PARAM;
    5411           1 :         gf_isom_box_dump_start(a, "MasteringDisplayColourVolumeBox", trace);
    5412           4 :         for (c = 0; c < 3; c++) {
    5413           3 :                 gf_fprintf(trace, "display_primaries_%d_x=\"%u\" display_primaries_%d_y=\"%u\" ", c, ptr->mdcv.display_primaries[c].x, c, ptr->mdcv.display_primaries[c].y);
    5414             :         }
    5415           1 :         gf_fprintf(trace, "white_point_x=\"%u\" white_point_y=\"%u\" max_display_mastering_luminance=\"%u\" min_display_mastering_luminance=\"%u\">\n", ptr->mdcv.white_point_x, ptr->mdcv.white_point_y, ptr->mdcv.max_display_mastering_luminance, ptr->mdcv.min_display_mastering_luminance);
    5416           1 :         gf_isom_box_dump_done("MasteringDisplayColourVolumeBox", a, trace);
    5417           1 :         return GF_OK;
    5418             : }
    5419             : 
    5420          22 : GF_Err ipco_box_dump(GF_Box *a, FILE * trace)
    5421             : {
    5422          22 :         gf_isom_box_dump_start(a, "ItemPropertyContainerBox", trace);
    5423          22 :         gf_fprintf(trace, ">\n");
    5424          22 :         gf_isom_box_dump_done("ItemPropertyContainerBox", a, trace);
    5425          22 :         return GF_OK;
    5426             : }
    5427             : 
    5428          22 : GF_Err iprp_box_dump(GF_Box *a, FILE * trace)
    5429             : {
    5430          22 :         gf_isom_box_dump_start(a, "ItemPropertiesBox", trace);
    5431          22 :         gf_fprintf(trace, ">\n");
    5432          22 :         gf_isom_box_dump_done("ItemPropertiesBox", a, trace);
    5433          22 :         return GF_OK;
    5434             : }
    5435             : 
    5436          25 : GF_Err ipma_box_dump(GF_Box *a, FILE * trace)
    5437             : {
    5438             :         u32 i, j;
    5439             :         GF_ItemPropertyAssociationBox *ptr = (GF_ItemPropertyAssociationBox *)a;
    5440             :         u32 entry_count;
    5441          25 :         if (!a) return GF_BAD_PARAM;
    5442          25 :         entry_count = gf_list_count(ptr->entries);
    5443          25 :         gf_isom_box_dump_start(a, "ItemPropertyAssociationBox", trace);
    5444          25 :         gf_fprintf(trace, "entry_count=\"%d\">\n", entry_count);
    5445          57 :         for (i = 0; i < entry_count; i++) {
    5446          32 :                 GF_ItemPropertyAssociationEntry *entry = (GF_ItemPropertyAssociationEntry *)gf_list_get(ptr->entries, i);
    5447          32 :                 gf_fprintf(trace, "<AssociationEntry item_ID=\"%d\" association_count=\"%d\">\n", entry->item_id, entry->nb_associations);
    5448         172 :                 for (j = 0; j < entry->nb_associations; j++) {
    5449         140 :                         gf_fprintf(trace, "<Property index=\"%d\" essential=\"%d\"/>\n", entry->associations[j].index, entry->associations[j].essential);
    5450             :                 }
    5451          32 :                 gf_fprintf(trace, "</AssociationEntry>\n");
    5452             :         }
    5453          25 :         if (!ptr->size) {
    5454           4 :                 gf_fprintf(trace, "<AssociationEntry item_ID=\"\" association_count=\"\">\n");
    5455           4 :                 gf_fprintf(trace, "<Property index=\"\" essential=\"\"/>\n");
    5456           4 :                 gf_fprintf(trace, "</AssociationEntry>\n");
    5457             :         }
    5458          25 :         gf_isom_box_dump_done("ItemPropertyAssociationBox", a, trace);
    5459          25 :         return GF_OK;
    5460             : }
    5461             : 
    5462           1 : GF_Err auxc_box_dump(GF_Box *a, FILE * trace)
    5463             : {
    5464             :         GF_AuxiliaryTypePropertyBox *ptr = (GF_AuxiliaryTypePropertyBox *)a;
    5465             : 
    5466           1 :         gf_isom_box_dump_start(a, "AuxiliaryTypePropertyBox", trace);
    5467           1 :         gf_fprintf(trace, "aux_type=\"%s\" ", ptr->aux_urn);
    5468           1 :         dump_data_attribute(trace, "aux_subtype", ptr->data, ptr->data_size);
    5469           1 :         gf_fprintf(trace, ">\n");
    5470           1 :         gf_isom_box_dump_done("AuxiliaryTypePropertyBox", a, trace);
    5471           1 :         return GF_OK;
    5472             : }
    5473             : 
    5474           1 : GF_Err auxi_box_dump(GF_Box *a, FILE * trace)
    5475             : {
    5476             :         GF_AuxiliaryTypeInfoBox *ptr = (GF_AuxiliaryTypeInfoBox *)a;
    5477             : 
    5478           1 :         gf_isom_box_dump_start(a, "AuxiliaryTypeInfoBox", trace);
    5479           1 :         gf_fprintf(trace, "aux_track_type=\"%s\" ", ptr->aux_track_type);
    5480           1 :         gf_fprintf(trace, ">\n");
    5481           1 :         gf_isom_box_dump_done("AuxiliaryTypeInfoBox", a, trace);
    5482           1 :         return GF_OK;
    5483             : }
    5484             : 
    5485           1 : GF_Err oinf_box_dump(GF_Box *a, FILE * trace)
    5486             : {
    5487             :         GF_OINFPropertyBox *ptr = (GF_OINFPropertyBox *)a;
    5488           1 :         gf_isom_box_dump_start(a, "OperatingPointsInformationPropertyBox", trace);
    5489           1 :         gf_fprintf(trace, ">\n");
    5490             : 
    5491           1 :         oinf_entry_dump(ptr->oinf, trace);
    5492             : 
    5493           1 :         gf_isom_box_dump_done("OperatingPointsInformationPropertyBox", a, trace);
    5494           1 :         return GF_OK;
    5495             : }
    5496           1 : GF_Err tols_box_dump(GF_Box *a, FILE * trace)
    5497             : {
    5498             :         GF_TargetOLSPropertyBox *ptr = (GF_TargetOLSPropertyBox *)a;
    5499           1 :         gf_isom_box_dump_start(a, "TargetOLSPropertyBox", trace);
    5500           1 :         gf_fprintf(trace, "target_ols_index=\"%d\">\n", ptr->target_ols_index);
    5501             : 
    5502           1 :         gf_isom_box_dump_done("TargetOLSPropertyBox", a, trace);
    5503           1 :         return GF_OK;
    5504             : }
    5505             : 
    5506           1 : GF_Err trgr_box_dump(GF_Box *a, FILE * trace)
    5507             : {
    5508           1 :         gf_isom_box_dump_start(a, "TrackGroupBox", trace);
    5509           1 :         gf_fprintf(trace, ">\n");
    5510           1 :         gf_isom_box_dump_done("TrackGroupBox", a, trace);
    5511           1 :         return GF_OK;
    5512             : }
    5513             : 
    5514           3 : GF_Err trgt_box_dump(GF_Box *a, FILE * trace)
    5515             : {
    5516             :         GF_TrackGroupTypeBox *ptr = (GF_TrackGroupTypeBox *) a;
    5517           3 :         a->type = ptr->group_type;
    5518           3 :         gf_isom_box_dump_start(a, "TrackGroupTypeBox", trace);
    5519           3 :         a->type = GF_ISOM_BOX_TYPE_TRGT;
    5520           3 :         gf_fprintf(trace, "track_group_id=\"%d\">\n", ptr->track_group_id);
    5521           3 :         gf_isom_box_dump_done("TrackGroupTypeBox", a, trace);
    5522           3 :         return GF_OK;
    5523             : }
    5524             : 
    5525           1 : GF_Err grpl_box_dump(GF_Box *a, FILE * trace)
    5526             : {
    5527           1 :         gf_isom_box_dump_start(a, "GroupListBox", trace);
    5528           1 :         gf_fprintf(trace, ">\n");
    5529           1 :         gf_isom_box_dump_done("GroupListBox", a, trace);
    5530           1 :         return GF_OK;
    5531             : }
    5532             : 
    5533           1 : GF_Err grptype_box_dump(GF_Box *a, FILE * trace)
    5534             : {
    5535             :         u32 i;
    5536             :         GF_EntityToGroupTypeBox *ptr = (GF_EntityToGroupTypeBox *) a;
    5537           1 :         a->type = ptr->grouping_type;
    5538           1 :         gf_isom_box_dump_start(a, "EntityToGroupTypeBox", trace);
    5539           1 :         a->type = GF_ISOM_BOX_TYPE_GRPT;
    5540           1 :         gf_fprintf(trace, "group_id=\"%d\">\n", ptr->group_id);
    5541             : 
    5542           1 :         for (i=0; i<ptr->entity_id_count ; i++)
    5543           0 :                 gf_fprintf(trace, "<EntityToGroupTypeBoxEntry EntityID=\"%d\"/>\n", ptr->entity_ids[i]);
    5544             : 
    5545           1 :         if (!ptr->size)
    5546           1 :                 gf_fprintf(trace, "<EntityToGroupTypeBoxEntry EntityID=\"\"/>\n");
    5547             : 
    5548           1 :         gf_isom_box_dump_done("EntityToGroupTypeBox", a, trace);
    5549           1 :         return GF_OK;
    5550             : }
    5551             : 
    5552           1 : GF_Err stvi_box_dump(GF_Box *a, FILE * trace)
    5553             : {
    5554             :         GF_StereoVideoBox *ptr = (GF_StereoVideoBox *) a;
    5555           1 :         gf_isom_box_dump_start(a, "StereoVideoBox", trace);
    5556             : 
    5557           1 :         gf_fprintf(trace, "single_view_allowed=\"%d\" stereo_scheme=\"%d\" ", ptr->single_view_allowed, ptr->stereo_scheme);
    5558           1 :         dump_data_attribute(trace, "stereo_indication_type", ptr->stereo_indication_type, ptr->sit_len);
    5559           1 :         gf_fprintf(trace, ">\n");
    5560           1 :         gf_isom_box_dump_done("StereoVideoBox", a, trace);
    5561           1 :         return GF_OK;
    5562             : }
    5563             : 
    5564           9 : GF_Err def_parent_box_dump(GF_Box *a, FILE *trace)
    5565             : {
    5566             :         char *name = "GenericContainerBox";
    5567             : 
    5568           9 :         switch (a->type) {
    5569           1 :         case GF_QT_BOX_TYPE_WAVE:
    5570             :                 name = "DecompressionParamBox";
    5571           1 :                 break;
    5572           0 :         case GF_QT_BOX_TYPE_TMCD:
    5573             :                 name = "TimeCodeBox";
    5574           0 :                 break;
    5575           0 :         case GF_ISOM_BOX_TYPE_GMHD:
    5576             :                 name = "GenericMediaHeaderBox";
    5577           0 :                 break;
    5578           0 :         case GF_QT_BOX_TYPE_TAPT:
    5579             :                 name = "TrackApertureBox";
    5580           0 :                 break;
    5581           0 :         case GF_ISOM_BOX_TYPE_STRD:
    5582             :                 name = "SubTrackDefinitionBox";
    5583           0 :                 break;
    5584           0 :         case GF_ISOM_BOX_TYPE_SV3D:
    5585             :                 name = "SphericalVideoBox";
    5586           0 :                 break;
    5587           0 :         case GF_ISOM_BOX_TYPE_PROJ:
    5588             :                 name = "ProjectionBox";
    5589           0 :                 break;
    5590           0 :         case GF_ISOM_BOX_TYPE_OTYP:
    5591             :                 name = "OriginalFileTypeBox";
    5592           0 :                 break;
    5593             :         }
    5594             : 
    5595           9 :         gf_isom_box_dump_start(a, name, trace);
    5596           9 :         gf_fprintf(trace, ">\n");
    5597           9 :         gf_isom_box_dump_done(name, a, trace);
    5598           9 :         return GF_OK;
    5599             : }
    5600             : 
    5601           1 : GF_Err def_parent_full_box_dump(GF_Box *a, FILE *trace)
    5602             : {
    5603             :         char *name = "GenericFullBox";
    5604             : 
    5605           1 :         switch (a->type) {
    5606           0 :         case GF_ISOM_BOX_TYPE_MVCI:
    5607             :                 name = "MultiviewInformationBox";
    5608           0 :                 break;
    5609             :         }
    5610             : 
    5611           1 :         gf_isom_box_dump_start(a, name, trace);
    5612           1 :         gf_fprintf(trace, ">\n");
    5613           1 :         gf_isom_box_dump_done(name, a, trace);
    5614           1 :         return GF_OK;
    5615             : }
    5616           1 : GF_Err fiin_box_dump(GF_Box *a, FILE * trace)
    5617             : {
    5618           1 :         gf_isom_box_dump_start(a, "FDItemInformationBox", trace);
    5619           1 :         gf_fprintf(trace, ">\n");
    5620           1 :         gf_isom_box_dump_done("FDItemInformationBox", a, trace);
    5621           1 :         return GF_OK;
    5622             : }
    5623             : 
    5624           4 : GF_Err fecr_box_dump(GF_Box *a, FILE * trace)
    5625             : {
    5626             :         u32 i;
    5627             :         char *box_name;
    5628             :         FECReservoirBox *ptr = (FECReservoirBox *) a;
    5629           4 :         if (a->type==GF_ISOM_BOX_TYPE_FIRE) {
    5630             :                 box_name = "FILEReservoirBox";
    5631             :         } else {
    5632             :                 box_name = "FECReservoirBox";
    5633             :         }
    5634           4 :         gf_isom_box_dump_start(a, box_name, trace);
    5635             : 
    5636           4 :         gf_fprintf(trace, ">\n");
    5637             : 
    5638           4 :         for (i=0; i<ptr->nb_entries; i++) {
    5639           0 :                 gf_fprintf(trace, "<%sEntry itemID=\"%d\" symbol_count=\"%d\"/>\n", box_name, ptr->entries[i].item_id, ptr->entries[i].symbol_count);
    5640             :         }
    5641           4 :         if (!ptr->size) {
    5642           4 :                 gf_fprintf(trace, "<%sEntry itemID=\"\" symbol_count=\"\"/>\n", box_name);
    5643             :         }
    5644           4 :         gf_isom_box_dump_done(box_name, a, trace);
    5645           4 :         return GF_OK;
    5646             : }
    5647             : 
    5648           1 : GF_Err gitn_box_dump(GF_Box *a, FILE * trace)
    5649             : {
    5650             :         u32 i;
    5651             :         GroupIdToNameBox *ptr = (GroupIdToNameBox *) a;
    5652           1 :         gf_isom_box_dump_start(a, "GroupIdToNameBox", trace);
    5653             : 
    5654           1 :         gf_fprintf(trace, ">\n");
    5655             : 
    5656           1 :         for (i=0; i<ptr->nb_entries; i++) {
    5657           0 :                 gf_fprintf(trace, "<GroupIdToNameBoxEntry groupID=\"%d\" name=\"%s\"/>\n", ptr->entries[i].group_id, ptr->entries[i].name);
    5658             :         }
    5659           1 :         if (!ptr->size) {
    5660           1 :                 gf_fprintf(trace, "<GroupIdToNameBoxEntryEntry groupID=\"\" name=\"\"/>\n");
    5661             :         }
    5662             : 
    5663           1 :         gf_isom_box_dump_done("GroupIdToNameBox", a, trace);
    5664           1 :         return GF_OK;
    5665             : }
    5666             : 
    5667           1 : GF_Err paen_box_dump(GF_Box *a, FILE * trace)
    5668             : {
    5669           1 :         gf_isom_box_dump_start(a, "FDPartitionEntryBox", trace);
    5670           1 :         gf_fprintf(trace, ">\n");
    5671           1 :         gf_isom_box_dump_done("FDPartitionEntryBox", a, trace);
    5672           1 :         return GF_OK;
    5673             : }
    5674             : 
    5675           2 : GF_Err fpar_box_dump(GF_Box *a, FILE * trace)
    5676             : {
    5677             :         u32 i;
    5678             :         FilePartitionBox *ptr = (FilePartitionBox *) a;
    5679           2 :         gf_isom_box_dump_start(a, "FilePartitionBox", trace);
    5680             : 
    5681           2 :         gf_fprintf(trace, "itemID=\"%d\" FEC_encoding_ID=\"%d\" FEC_instance_ID=\"%d\" max_source_block_length=\"%d\" encoding_symbol_length=\"%d\" max_number_of_encoding_symbols=\"%d\" ", ptr->itemID, ptr->FEC_encoding_ID, ptr->FEC_instance_ID, ptr->max_source_block_length, ptr->encoding_symbol_length, ptr->max_number_of_encoding_symbols);
    5682             : 
    5683           2 :         if (ptr->scheme_specific_info)
    5684           0 :                 dump_data_attribute(trace, "scheme_specific_info", (char*)ptr->scheme_specific_info, (u32)strlen(ptr->scheme_specific_info) );
    5685             : 
    5686           2 :         gf_fprintf(trace, ">\n");
    5687             : 
    5688           2 :         for (i=0; i<ptr->nb_entries; i++) {
    5689           0 :                 gf_fprintf(trace, "<FilePartitionBoxEntry block_count=\"%d\" block_size=\"%d\"/>\n", ptr->entries[i].block_count, ptr->entries[i].block_size);
    5690             :         }
    5691           2 :         if (!ptr->size) {
    5692           2 :                 gf_fprintf(trace, "<FilePartitionBoxEntry block_count=\"\" block_size=\"\"/>\n");
    5693             :         }
    5694             : 
    5695           2 :         gf_isom_box_dump_done("FilePartitionBox", a, trace);
    5696           2 :         return GF_OK;
    5697             : }
    5698             : 
    5699           1 : GF_Err segr_box_dump(GF_Box *a, FILE * trace)
    5700             : {
    5701             :         u32 i, k;
    5702             :         FDSessionGroupBox *ptr = (FDSessionGroupBox *) a;
    5703           1 :         gf_isom_box_dump_start(a, "FDSessionGroupBox", trace);
    5704           1 :         gf_fprintf(trace, ">\n");
    5705             : 
    5706           1 :         for (i=0; i<ptr->num_session_groups; i++) {
    5707           0 :                 gf_fprintf(trace, "<FDSessionGroupBoxEntry groupIDs=\"");
    5708           0 :                 for (k=0; k<ptr->session_groups[i].nb_groups; k++) {
    5709           0 :                         gf_fprintf(trace, "%d ", ptr->session_groups[i].group_ids[k]);
    5710             :                 }
    5711           0 :                 gf_fprintf(trace, "\" channels=\"");
    5712           0 :                 for (k=0; k<ptr->session_groups[i].nb_channels; k++) {
    5713           0 :                         gf_fprintf(trace, "%d ", ptr->session_groups[i].channels[k]);
    5714             :                 }
    5715           0 :                 gf_fprintf(trace, "\"/>\n");
    5716             :         }
    5717           1 :         if (!ptr->size) {
    5718           1 :                 gf_fprintf(trace, "<FDSessionGroupBoxEntry groupIDs=\"\" channels=\"\"/>\n");
    5719             :         }
    5720             : 
    5721           1 :         gf_isom_box_dump_done("FDSessionGroupBox", a, trace);
    5722           1 :         return GF_OK;
    5723             : }
    5724             : 
    5725           1 : GF_Err srpp_box_dump(GF_Box *a, FILE * trace)
    5726             : {
    5727             :         GF_SRTPProcessBox *ptr = (GF_SRTPProcessBox *) a;
    5728           1 :         gf_isom_box_dump_start(a, "SRTPProcessBox", trace);
    5729             : 
    5730           1 :         gf_fprintf(trace, "encryption_algorithm_rtp=\"%d\" encryption_algorithm_rtcp=\"%d\" integrity_algorithm_rtp=\"%d\" integrity_algorithm_rtcp=\"%d\">\n", ptr->encryption_algorithm_rtp, ptr->encryption_algorithm_rtcp, ptr->integrity_algorithm_rtp, ptr->integrity_algorithm_rtcp);
    5731           1 :         gf_isom_box_dump_done("SRTPProcessBox", a, trace);
    5732           1 :         return GF_OK;
    5733             : }
    5734             : 
    5735             : #ifndef GPAC_DISABLE_ISOM_HINTING
    5736             : 
    5737           1 : GF_Err fdpa_box_dump(GF_Box *a, FILE * trace)
    5738             : {
    5739             :         u32 i;
    5740             :         GF_FDpacketBox *ptr = (GF_FDpacketBox *) a;
    5741           1 :         if (!a) return GF_BAD_PARAM;
    5742             : 
    5743           1 :         gf_isom_box_dump_start(a, "FDpacketBox", trace);
    5744           1 :         gf_fprintf(trace, "sender_current_time_present=\"%d\" expected_residual_time_present=\"%d\" session_close_bit=\"%d\" object_close_bit=\"%d\" transport_object_identifier=\"%d\">\n", ptr->info.sender_current_time_present, ptr->info.expected_residual_time_present, ptr->info.session_close_bit, ptr->info.object_close_bit, ptr->info.transport_object_identifier);
    5745             : 
    5746           1 :         for (i=0; i<ptr->header_ext_count; i++) {
    5747           0 :                 gf_fprintf(trace, "<FDHeaderExt type=\"%d\"", ptr->headers[i].header_extension_type);
    5748           0 :                 if (ptr->headers[i].header_extension_type > 127) {
    5749           0 :                         dump_data_attribute(trace, "content", (char *) ptr->headers[i].content, 3);
    5750           0 :                 } else if (ptr->headers[i].data_length) {
    5751           0 :                         dump_data_attribute(trace, "data", ptr->headers[i].data, ptr->headers[i].data_length);
    5752             :                 }
    5753           0 :                 gf_fprintf(trace, "/>\n");
    5754             :         }
    5755           1 :         if (!ptr->size) {
    5756           1 :                 gf_fprintf(trace, "<FDHeaderExt type=\"\" content=\"\" data=\"\"/>\n");
    5757             :         }
    5758           1 :         gf_isom_box_dump_done("FDpacketBox", a, trace);
    5759           1 :         return GF_OK;
    5760             : }
    5761             : 
    5762           1 : GF_Err extr_box_dump(GF_Box *a, FILE * trace)
    5763             : {
    5764             :         GF_ExtraDataBox *ptr = (GF_ExtraDataBox *) a;
    5765           1 :         if (!a) return GF_BAD_PARAM;
    5766           1 :         gf_isom_box_dump_start(a, "ExtraDataBox", trace);
    5767           1 :         dump_data_attribute(trace, "data", ptr->data, ptr->data_length);
    5768           1 :         gf_fprintf(trace, ">\n");
    5769           1 :         if (ptr->feci)
    5770           0 :                 gf_isom_box_dump(ptr->feci, trace);
    5771           1 :         gf_isom_box_dump_done("ExtraDataBox", a, trace);
    5772           1 :         return GF_OK;
    5773             : }
    5774             : 
    5775           1 : GF_Err fdsa_box_dump(GF_Box *a, FILE * trace)
    5776             : {
    5777             :         GF_Err e;
    5778             :         GF_HintSample *ptr = (GF_HintSample *) a;
    5779           1 :         if (!a) return GF_BAD_PARAM;
    5780             : 
    5781           1 :         gf_isom_box_dump_start(a, "FDSampleBox", trace);
    5782           1 :         gf_fprintf(trace, ">\n");
    5783             : 
    5784           1 :         e = gf_isom_box_array_dump(ptr->packetTable, trace);
    5785           1 :         if (e) return e;
    5786           1 :         gf_isom_box_dump_done("FDSampleBox", a, trace);
    5787           1 :         return GF_OK;
    5788             : }
    5789             : 
    5790             : #endif /*GPAC_DISABLE_ISOM_HINTING*/
    5791             : 
    5792           1 : GF_Err trik_box_dump(GF_Box *a, FILE * trace)
    5793             : {
    5794             :         u32 i;
    5795             :         GF_TrickPlayBox *p = (GF_TrickPlayBox *) a;
    5796             : 
    5797           1 :         gf_isom_box_dump_start(a, "TrickPlayBox", trace);
    5798             : 
    5799           1 :         gf_fprintf(trace, ">\n");
    5800           1 :         for (i=0; i<p->entry_count; i++) {
    5801           0 :                 gf_fprintf(trace, "<TrickPlayBoxEntry pic_type=\"%d\" dependency_level=\"%d\"/>\n", p->entries[i].pic_type, p->entries[i].dependency_level);
    5802             :         }
    5803           1 :         if (!p->size)
    5804           1 :                 gf_fprintf(trace, "<TrickPlayBoxEntry pic_type=\"\" dependency_level=\"\"/>\n");
    5805             : 
    5806           1 :         gf_isom_box_dump_done("TrickPlayBox", a, trace);
    5807           1 :         return GF_OK;
    5808             : }
    5809             : 
    5810           1 : GF_Err bloc_box_dump(GF_Box *a, FILE * trace)
    5811             : {
    5812             :         GF_BaseLocationBox *p = (GF_BaseLocationBox *) a;
    5813             : 
    5814           1 :         gf_isom_box_dump_start(a, "BaseLocationBox", trace);
    5815             : 
    5816           1 :         gf_fprintf(trace, "baseLocation=\"%s\" basePurlLocation=\"%s\">\n", p->baseLocation, p->basePurlLocation);
    5817           1 :         gf_isom_box_dump_done("BaseLocationBox", a, trace);
    5818           1 :         return GF_OK;
    5819             : }
    5820             : 
    5821           2 : GF_Err ainf_box_dump(GF_Box *a, FILE * trace)
    5822             : {
    5823             :         GF_AssetInformationBox *p = (GF_AssetInformationBox *) a;
    5824             : 
    5825           2 :         gf_isom_box_dump_start(a, "AssetInformationBox", trace);
    5826             : 
    5827           2 :         gf_fprintf(trace, "profile_version=\"%d\" APID=\"%s\">\n", p->profile_version, p->APID);
    5828           2 :         gf_isom_box_dump_done("AssetInformationBox", a, trace);
    5829           2 :         return GF_OK;
    5830             : }
    5831             : 
    5832             : 
    5833           1 : GF_Err mhac_box_dump(GF_Box *a, FILE * trace)
    5834             : {
    5835             :         GF_MHAConfigBox *p = (GF_MHAConfigBox *) a;
    5836             : 
    5837           1 :         gf_isom_box_dump_start(a, "MHAConfigurationBox", trace);
    5838             : 
    5839           1 :         gf_fprintf(trace, "configurationVersion=\"%d\" mpegh3daProfileLevelIndication=\"0x%02X\" referenceChannelLayout=\"%d\" data=\"", p->configuration_version, p->mha_pl_indication, p->reference_channel_layout);
    5840           1 :         dump_data(trace, p->mha_config, p->mha_config_size);
    5841           1 :         gf_fprintf(trace, "\">\n");
    5842             : 
    5843           1 :         gf_isom_box_dump_done("MHAConfigurationBox", a, trace);
    5844           1 :         return GF_OK;
    5845             : }
    5846             : 
    5847           1 : GF_Err mhap_box_dump(GF_Box *a, FILE * trace)
    5848             : {
    5849             :         u32 i;
    5850             :         GF_MHACompatibleProfilesBox *p = (GF_MHACompatibleProfilesBox *) a;
    5851             : 
    5852           1 :         gf_isom_box_dump_start(a, "MHACompatibleProfilesBox", trace);
    5853           1 :         gf_fprintf(trace, "compatible_profiles=\"");
    5854           1 :         for (i=0; i<p->num_profiles; i++) {
    5855           0 :                 if (i)
    5856           0 :                         gf_fprintf(trace, " ", p->compat_profiles[i]);
    5857           0 :                 gf_fprintf(trace, "%d", p->compat_profiles[i]);
    5858             :         }
    5859           1 :         gf_fprintf(trace, "\">\n");
    5860           1 :         gf_isom_box_dump_done("MHACompatibleProfilesBox", a, trace);
    5861           1 :         return GF_OK;
    5862             : }
    5863           1 : GF_Err tmcd_box_dump(GF_Box *a, FILE * trace)
    5864             : {
    5865             :         GF_TimeCodeSampleEntryBox *p = (GF_TimeCodeSampleEntryBox *) a;
    5866             : 
    5867           1 :         gf_isom_box_dump_start(a, "TimeCodeSampleEntryBox", trace);
    5868             : 
    5869           1 :         gf_fprintf(trace, "DataReferenceIndex=\"%d\" Flags=\"%08X\" TimeScale=\"%d\" FrameDuration=\"%d\" FramesPerTick=\"%d\">\n", p->dataReferenceIndex, p->flags, p->timescale, p->frame_duration, p->frames_per_counter_tick);
    5870             : 
    5871           1 :         gf_isom_box_dump_done("TimeCodeSampleEntryBox", a, trace);
    5872           1 :         return GF_OK;
    5873             : }
    5874             : 
    5875           1 : GF_Err tcmi_box_dump(GF_Box *a, FILE * trace)
    5876             : {
    5877             :         GF_TimeCodeMediaInformationBox *p = (GF_TimeCodeMediaInformationBox *) a;
    5878             : 
    5879           1 :         gf_isom_box_dump_start(a, "TimeCodeMediaInformationBox", trace);
    5880           9 :         gf_fprintf(trace, "textFont=\"%d\" textFace=\"%d\" textSize=\"%d\" textColorRed=\"%d\" textColorGreen=\"%d\" textColorBlue=\"%d\" backColorRed=\"%d\" backColorGreen=\"%d\" backColorBlue=\"%d\"",
    5881           9 :                         p->text_font, p->text_face, p->text_size, p->text_color_red, p->text_color_green, p->text_color_blue, p->back_color_red, p->back_color_green, p->back_color_blue);
    5882           1 :         if (p->font)
    5883           0 :                 gf_fprintf(trace, " font=\"%s\"", p->font);
    5884             : 
    5885           1 :         gf_fprintf(trace, ">\n");
    5886             : 
    5887           1 :         gf_isom_box_dump_done("TimeCodeMediaInformationBox", a, trace);
    5888           1 :         return GF_OK;
    5889             : }
    5890             : 
    5891           2 : GF_Err fiel_box_dump(GF_Box *a, FILE * trace)
    5892             : {
    5893             :         GF_FieldInfoBox *p = (GF_FieldInfoBox *) a;
    5894             : 
    5895           2 :         gf_isom_box_dump_start(a, "FieldInfoBox", trace);
    5896           2 :         gf_fprintf(trace, "count=\"%d\" order=\"%d\">\n", p->field_count, p->field_order);
    5897           2 :         gf_isom_box_dump_done("FieldInfoBox", a, trace);
    5898           2 :         return GF_OK;
    5899             : }
    5900             : 
    5901           1 : GF_Err gama_box_dump(GF_Box *a, FILE * trace)
    5902             : {
    5903             :         GF_GamaInfoBox *p = (GF_GamaInfoBox *) a;
    5904             : 
    5905           1 :         gf_isom_box_dump_start(a, "GamaInfoBox", trace);
    5906           1 :         gf_fprintf(trace, "gama=\"%d\">\n", p->gama);
    5907           1 :         gf_isom_box_dump_done("GamaInfoBox", a, trace);
    5908           1 :         return GF_OK;
    5909             : }
    5910             : 
    5911           3 : GF_Err chrm_box_dump(GF_Box *a, FILE * trace)
    5912             : {
    5913             :         GF_ChromaInfoBox *p = (GF_ChromaInfoBox *) a;
    5914           3 :         if (a->type==GF_QT_BOX_TYPE_ENDA) {
    5915           1 :                 gf_isom_box_dump_start(a, "AudioEndianBox", trace);
    5916           1 :                 gf_fprintf(trace, "littleEndian=\"%d\">\n", p->chroma);
    5917           1 :                 gf_isom_box_dump_done("AudioEndianBox", a, trace);
    5918             :         } else {
    5919           2 :                 gf_isom_box_dump_start(a, "ChromaInfoBox", trace);
    5920           2 :                 gf_fprintf(trace, "chroma=\"%d\">\n", p->chroma);
    5921           2 :                 gf_isom_box_dump_done("ChromaInfoBox", a, trace);
    5922             :         }
    5923           3 :         return GF_OK;
    5924             : }
    5925             : 
    5926           1 : GF_Err chan_box_dump(GF_Box *a, FILE * trace)
    5927             : {
    5928             :         u32 i;
    5929             :         GF_ChannelLayoutInfoBox *p = (GF_ChannelLayoutInfoBox *) a;
    5930             : 
    5931           1 :         gf_isom_box_dump_start(a, "ChannelLayoutInfoBox", trace);
    5932           1 :         gf_fprintf(trace, "layout=\"%d\" bitmap=\"%d\">\n", p->layout_tag, p->bitmap);
    5933           1 :         for (i=0; i<p->num_audio_description; i++) {
    5934           0 :                 GF_AudioChannelDescription *adesc = &p->audio_descs[i];
    5935           0 :                 gf_fprintf(trace, "<AudioChannelDescription label=\"%d\" flags=\"%08X\" coordinates=\"%f %f %f\"/>\n", adesc->label, adesc->flags, adesc->coordinates[0], adesc->coordinates[1], adesc->coordinates[2]);
    5936             :         }
    5937           1 :         gf_isom_box_dump_done("ChannelLayoutInfoBox", a, trace);
    5938           1 :         return GF_OK;
    5939             : }
    5940             : 
    5941             : 
    5942           3 : GF_Err jp2h_box_dump(GF_Box *a, FILE * trace)
    5943             : {
    5944           3 :         gf_isom_box_dump_start(a, "JP2HeaderBox", trace);
    5945           3 :         gf_fprintf(trace, ">\n");
    5946           3 :         gf_isom_box_dump_done("JP2HeaderBox", a, trace);
    5947           3 :         return GF_OK;
    5948             : }
    5949             : 
    5950           3 : GF_Err ihdr_box_dump(GF_Box *a, FILE * trace)
    5951             : {
    5952             :         GF_J2KImageHeaderBox  *p = (GF_J2KImageHeaderBox *) a;
    5953           3 :         gf_isom_box_dump_start(a, "ImageHeaderBox", trace);
    5954           3 :         gf_fprintf(trace, "width=\"%d\" height=\"%d\" nb_comp=\"%d\" BPC=\"%d\" Compression=\"%d\" UnkC=\"%d\" IPR=\"%d\">\n", p->width, p->height, p->nb_comp, p->bpc, p->Comp, p->UnkC, p->IPR);
    5955           3 :         gf_isom_box_dump_done("ImageHeaderBox", a, trace);
    5956           3 :         return GF_OK;
    5957             : }
    5958             : 
    5959           2 : GF_Err dfla_box_dump(GF_Box *a, FILE * trace)
    5960             : {
    5961             :         GF_FLACConfigBox *ptr = (GF_FLACConfigBox *)a;
    5962           2 :         gf_isom_box_dump_start(a, "FLACSpecificBox", trace);
    5963           2 :         gf_fprintf(trace, " dataSize=\"%d\">\n", ptr->dataSize);
    5964           2 :         gf_isom_box_dump_done("FLACSpecificBox", a, trace);
    5965           2 :         return GF_OK;
    5966             : }
    5967             : 
    5968             : 
    5969           1 : GF_Err mvcg_box_dump(GF_Box *a, FILE * trace)
    5970             : {
    5971             :         u32 i;
    5972             :         GF_MultiviewGroupBox *ptr = (GF_MultiviewGroupBox *)a;
    5973           1 :         gf_isom_box_dump_start(a, "MultiviewGroupBox", trace);
    5974           1 :         gf_fprintf(trace, " multiview_group_id=\"%d\">\n", ptr->multiview_group_id);
    5975           1 :         for (i=0; i<ptr->num_entries; i++) {
    5976           0 :                 gf_fprintf(trace, "<MVCIEntry type=\"%d\"", ptr->entries[i].entry_type);
    5977           0 :                 switch (ptr->entries[i].entry_type) {
    5978           0 :                 case 0:
    5979           0 :                         gf_fprintf(trace, " trackID=\"%d\"", ptr->entries[i].trackID);
    5980           0 :                         break;
    5981           0 :                 case 1:
    5982           0 :                         gf_fprintf(trace, " trackID=\"%d\" tierID=\"%d\"", ptr->entries[i].trackID, ptr->entries[i].tierID);
    5983           0 :                         break;
    5984           0 :                 case 2:
    5985           0 :                         gf_fprintf(trace, " output_view_id=\"%d\"", ptr->entries[i].output_view_id);
    5986           0 :                         break;
    5987           0 :                 case 3:
    5988           0 :                         gf_fprintf(trace, " start_view_id=\"%d\" view_count=\"%d\"", ptr->entries[i].start_view_id, ptr->entries[i].view_count);
    5989           0 :                         break;
    5990             :                 }
    5991           0 :                 gf_fprintf(trace, "/>\n");
    5992             :         }
    5993           1 :         gf_isom_box_dump_done("MultiviewGroupBox", a, trace);
    5994           1 :         return GF_OK;
    5995             : }
    5996             : 
    5997           1 : GF_Err vwid_box_dump(GF_Box *a, FILE * trace)
    5998             : {
    5999             :         u32 i, j;
    6000             :         GF_ViewIdentifierBox *ptr = (GF_ViewIdentifierBox *) a;
    6001           1 :         gf_isom_box_dump_start(a, "ViewIdentifierBox", trace);
    6002           1 :         gf_fprintf(trace, " min_temporal_id=\"%d\" max_temporal_id=\"%d\">\n", ptr->min_temporal_id, ptr->max_temporal_id);
    6003           1 :         for (i=0; i<ptr->num_views; i++) {
    6004           0 :                 gf_fprintf(trace, "<ViewInfo viewid=\"%d\" viewOrderindex=\"%d\" texInStream=\"%d\" texInTrack=\"%d\" depthInStream=\"%d\" depthInTrack=\"%d\" baseViewId=\"%d\">\n",
    6005           0 :                         ptr->views[i].view_id,
    6006           0 :                         ptr->views[i].view_order_index,
    6007           0 :                         ptr->views[i].texture_in_stream,
    6008           0 :                         ptr->views[i].texture_in_track,
    6009           0 :                         ptr->views[i].depth_in_stream,
    6010           0 :                         ptr->views[i].depth_in_track,
    6011           0 :                         ptr->views[i].base_view_type
    6012             :                 );
    6013           0 :                 for (j=0; j<ptr->views[i].num_ref_views; j++) {
    6014           0 :                         gf_fprintf(trace, "<RefViewInfo dependentComponentIDC=\"%d\" referenceViewID=\"%d\"/>\n", ptr->views[i].view_refs[j].dep_comp_idc, ptr->views[i].view_refs[j].ref_view_id);
    6015             :                 }
    6016           0 :                 gf_fprintf(trace, "</ViewInfo>\n");
    6017             :         }
    6018           1 :         gf_isom_box_dump_done("ViewIdentifierBox", a, trace);
    6019           1 :         return GF_OK;
    6020             : }
    6021             : 
    6022           1 : GF_Err pcmC_box_dump(GF_Box *a, FILE * trace)
    6023             : {
    6024             :         GF_PCMConfigBox *p = (GF_PCMConfigBox *) a;
    6025             : 
    6026           1 :         gf_isom_box_dump_start(a, "PCMConfigurationBox", trace);
    6027           1 :         gf_fprintf(trace, " format_flags=\"%d\" PCM_sample_size=\"%d\">\n", p->format_flags, p->PCM_sample_size);
    6028           1 :         gf_isom_box_dump_done("PCMConfigurationBox", a, trace);
    6029           1 :         return GF_OK;
    6030             : }
    6031             : 
    6032           1 : GF_Err chnl_box_dump(GF_Box *a, FILE * trace)
    6033             : {
    6034             :         GF_ChannelLayoutBox *p = (GF_ChannelLayoutBox *) a;
    6035           1 :         gf_isom_box_dump_start(a, "ChannelLayoutBox", trace);
    6036           1 :         gf_fprintf(trace, " stream_structure=\"%d\"", p->layout.stream_structure);
    6037           1 :         if (p->layout.stream_structure & 2)
    6038           0 :                 gf_fprintf(trace, " object_count=\"%d\"", p->layout.object_count);
    6039             : 
    6040           1 :         if (p->layout.stream_structure & 1) {
    6041           0 :                 gf_fprintf(trace, " definedLayout=\"%d\"", p->layout.definedLayout);
    6042           0 :                 if (p->layout.definedLayout!=0) {
    6043           0 :                         gf_fprintf(trace, " omittedChannelsMap=\""LLU"\"", p->layout.omittedChannelsMap);
    6044             :                 }
    6045             :         }
    6046             : 
    6047           1 :         gf_fprintf(trace, ">\n");
    6048           1 :         if ((p->layout.stream_structure & 1) && (p->layout.definedLayout==0)) {
    6049             :                 u32 i;
    6050           0 :                 for (i=0; i<p->layout.channels_count; i++) {
    6051           0 :                         gf_fprintf(trace, "<Speaker position=\"%d\"", p->layout.layouts[i].position);
    6052           0 :                         if (p->layout.layouts[i].position==126) {
    6053           0 :                                 gf_fprintf(trace, " azimuth=\"%d\" elevation=\"%d\"", p->layout.layouts[i].azimuth, p->layout.layouts[i].elevation);
    6054             :                         }
    6055           0 :                         gf_fprintf(trace, "/>\n");
    6056             :                 }
    6057             :         }
    6058             : 
    6059           1 :         gf_isom_box_dump_done("ChannelLayoutBox", a, trace);
    6060           1 :         return GF_OK;
    6061             : }
    6062             : 
    6063           1 : GF_Err load_box_dump(GF_Box *a, FILE * trace)
    6064             : {
    6065             :         GF_TrackLoadBox *p = (GF_TrackLoadBox *) a;
    6066             : 
    6067           1 :         gf_isom_box_dump_start(a, "TrackLoadBox", trace);
    6068           1 :         fprintf(trace, "preload_start_time=\"%d\" preload_duration=\"%d\" preload_flags=\"%d\" default_hints=\"%d\">\n", p->preload_start_time, p->preload_duration, p->preload_flags, p->default_hints);
    6069           1 :         gf_isom_box_dump_done("TrackLoadBox", a, trace);
    6070           1 :         return GF_OK;
    6071             : }
    6072             : 
    6073           2 : GF_Err emsg_box_dump(GF_Box *a, FILE * trace)
    6074             : {
    6075             :         GF_EventMessageBox *p = (GF_EventMessageBox *) a;
    6076             : 
    6077           2 :         gf_isom_box_dump_start(a, "EventMessageBox", trace);
    6078           2 :         fprintf(trace, "timescale=\"%u\" presentation_time_delta=\""LLU"\" event_duration=\"%u\" event_id=\"%u\">\n", p->timescale, p->presentation_time_delta, p->event_duration, p->event_id);
    6079             : 
    6080           2 :         if (p->scheme_id_uri)
    6081             :                 fprintf(trace, " scheme_id_uri=\"%s\"", p->scheme_id_uri);
    6082           2 :         if (p->value)
    6083             :                 fprintf(trace, " value=\"%s\"", p->value);
    6084             : 
    6085           2 :         if (p->message_data)
    6086           0 :                 dump_data_attribute(trace, " message_data", p->message_data, p->message_data_size);
    6087             : 
    6088           2 :         gf_isom_box_dump_done("EventMessageBox", a, trace);
    6089           2 :         return GF_OK;
    6090             : }
    6091             : 
    6092           1 : GF_Err csgp_box_dump(GF_Box *a, FILE * trace)
    6093             : {
    6094             :         u32 i;
    6095             :         GF_CompactSampleGroupBox *ptr = (GF_CompactSampleGroupBox*)a;
    6096           1 :         Bool use_msb_traf = ptr->flags & (1<<7);
    6097           1 :         Bool use_grpt_param = ptr->flags & (1<<6);
    6098             : 
    6099           1 :         gf_isom_box_dump_start(a, "CompactSampleGroupBox", trace);
    6100           5 :         fprintf(trace, "version=\"%u\" index_msb_indicates_fragment_local_description=\"%d\" grouping_type_parameter_present=\"%d\" pattern_size_code=\"%d\" count_size_code=\"%d\" index_size_code=\"%d\" grouping_type=\"%s\" pattern_count=\"%d\"",
    6101           1 :                 ptr->version,
    6102             :                 use_msb_traf,
    6103             :                 use_grpt_param,
    6104           1 :                 ((ptr->flags>>4) & 0x3),
    6105           1 :                 ((ptr->flags>>2) & 0x3),
    6106           1 :                 (ptr->flags & 0x3),
    6107             :                 gf_4cc_to_str(ptr->grouping_type),
    6108             :                 ptr->pattern_count
    6109             :         );
    6110             : 
    6111           1 :         if (use_grpt_param)
    6112           0 :                 fprintf(trace, " grouping_type_paramter=\"%u\"", ptr->grouping_type_parameter);
    6113             :         fprintf(trace, ">\n");
    6114             : 
    6115           1 :         for (i=0; i<ptr->pattern_count; i++) {
    6116             :                 u32 j;
    6117           0 :                 fprintf(trace, "<Pattern length=\"%u\" sample_count=\"%u\" sample_group_indices=\"", ptr->patterns[i].length, ptr->patterns[i].sample_count);
    6118           0 :                 for (j=0; j<ptr->patterns[i].length; j++) {
    6119           0 :                         u32 idx = ptr->patterns[i].sample_group_description_indices[j];
    6120           0 :                         if (j) fprintf(trace, " ");
    6121           0 :                         if (use_msb_traf && (idx>0x10000))
    6122           0 :                                 fprintf(trace, "%d(traf)", idx-0x10000);
    6123             :                         else
    6124             :                                 fprintf(trace, "%d", idx);
    6125             :                 }
    6126             :                 fprintf(trace, "\">\n");
    6127             :         }
    6128             : 
    6129           1 :         gf_isom_box_dump_done("CompactSampleGroupBox", a, trace);
    6130           1 :         return GF_OK;
    6131             : }
    6132             : 
    6133             : 
    6134          11 : GF_Err ienc_box_dump(GF_Box *a, FILE * trace)
    6135             : {
    6136             :         u32 i, nb_keys, kpos;
    6137             :         GF_ItemEncryptionPropertyBox *ptr = (GF_ItemEncryptionPropertyBox *)a;
    6138          11 :         if (!a) return GF_BAD_PARAM;
    6139          11 :         gf_isom_box_dump_start(a, "ItemEncryptionPropertyBox", trace);
    6140          11 :         if (ptr->version)
    6141           4 :                 gf_fprintf(trace, " skip_byte_block=\"%d\" crypt_byte_block=\"%d\"", ptr->skip_byte_block, ptr->crypt_byte_block);
    6142          11 :         gf_fprintf(trace, ">\n");
    6143          11 :         nb_keys = ptr->key_info ? ptr->key_info[2] : 0;
    6144             :         kpos = 3;
    6145          21 :         for (i = 0; i < nb_keys; i++) {
    6146          10 :                 u8 iv_size = ptr->key_info[kpos];
    6147          10 :                 gf_fprintf(trace, "<KeyInfo KID=\"");
    6148          10 :                 dump_data_hex(trace, ptr->key_info + kpos + 1, 16);
    6149          10 :                 gf_fprintf(trace, "\"");
    6150          10 :                 kpos+=17;
    6151          10 :                 if (iv_size) {
    6152           9 :                         gf_fprintf(trace, " IV_size=\"%d\"/>\n", iv_size);
    6153             :                 } else {
    6154           1 :                         iv_size = ptr->key_info[kpos];
    6155           1 :                         gf_fprintf(trace, " constant_IV_size=\"%d\" constant_IV=\"", iv_size);
    6156           1 :                         dump_data_hex(trace, ptr->key_info + kpos + 1, iv_size);
    6157           1 :                         gf_fprintf(trace, "\"/>\n");
    6158           1 :                         kpos += 1 + iv_size;
    6159             :                 }
    6160             :         }
    6161          11 :         if (!ptr->size)
    6162           1 :                 gf_fprintf(trace, "<KeyInfo KID=\"\" IV_size=\"\" constant_IV_size=\"\" constant_IV=\"\" />\n");
    6163             : 
    6164          11 :         gf_isom_box_dump_done("ItemEncryptionPropertyBox", a, trace);
    6165          11 :         return GF_OK;
    6166             : }
    6167             : 
    6168           1 : GF_Err iaux_box_dump(GF_Box *a, FILE * trace)
    6169             : {
    6170             :         GF_AuxiliaryInfoPropertyBox *ptr = (GF_AuxiliaryInfoPropertyBox *)a;
    6171           1 :         if (!a) return GF_BAD_PARAM;
    6172           1 :         gf_isom_box_dump_start(a, "ItemAuxiliaryInformationBox", trace);
    6173           1 :         gf_fprintf(trace, " aux_info_type=\"%d\" aux_info_parameter=\"%d\">\n", ptr->aux_info_type, ptr->aux_info_parameter);
    6174           1 :         gf_isom_box_dump_done("ItemAuxiliaryInformationBox", a, trace);
    6175           1 :         return GF_OK;
    6176             : }
    6177             : 
    6178             : #include <gpac/utf.h>
    6179             : 
    6180           1 : GF_Err xtra_box_dump(GF_Box *a, FILE * trace)
    6181             : {
    6182             :         GF_XtraBox *ptr = (GF_XtraBox *)a;
    6183           1 :         u32 i, count = gf_list_count(ptr->tags);
    6184             : 
    6185           1 :         gf_isom_box_dump_start(a, "XtraBox", trace);
    6186           1 :         gf_fprintf(trace, ">\n");
    6187           1 :         for (i=0; i<count; i++) {
    6188           0 :                 GF_XtraTag *tag = gf_list_get(ptr->tags, i);
    6189             : 
    6190           0 :                 gf_fprintf(trace, "<WMATag name=\"%s\" version=\"%d\" type=\"%d\"", tag->name, tag->flags, tag->prop_type);
    6191           0 :                 if (!tag->prop_type) {
    6192           0 :                         u16 *src_str = (u16 *) tag->prop_value;
    6193           0 :                         u32 len = (u32) ( UTF8_MAX_BYTES_PER_CHAR * gf_utf8_wcslen(src_str) );
    6194           0 :                         char *utf8str = (char *)gf_malloc(len + 1);
    6195           0 :                         u32 res_len = (u32) gf_utf8_wcstombs(utf8str, len, (const unsigned short **) &src_str);
    6196           0 :                         utf8str[res_len] = 0;
    6197             : 
    6198           0 :                         gf_fprintf(trace, " value=\"%s\">\n", utf8str);
    6199           0 :                         gf_free(utf8str);
    6200             :                 } else {
    6201           0 :                         gf_fprintf(trace, " value=\"");
    6202           0 :                         dump_data_hex(trace, tag->prop_value, tag->prop_size);
    6203           0 :                         gf_fprintf(trace, "\">\n");
    6204             :                 }
    6205             :         }
    6206           1 :         gf_isom_box_dump_done("XtraBox", a, trace);
    6207           1 :         return GF_OK;
    6208             : }
    6209             : 
    6210             : 
    6211           1 : GF_Err st3d_box_dump(GF_Box *a, FILE * trace)
    6212             : {
    6213             :         GF_Stereo3DBox  *ptr = (GF_Stereo3DBox *)a;
    6214           1 :         if (!a) return GF_BAD_PARAM;
    6215           1 :         gf_isom_box_dump_start(a, "Stereo3DBox", trace);
    6216           1 :         gf_fprintf(trace, " stereo_type=\"%d\">\n", ptr->stereo_type);
    6217           1 :         gf_isom_box_dump_done("Stereo3DBox", a, trace);
    6218           1 :         return GF_OK;
    6219             : }
    6220             : 
    6221           1 : GF_Err svhd_box_dump(GF_Box *a, FILE * trace)
    6222             : {
    6223             :         GF_SphericalVideoInfoBox *ptr = (GF_SphericalVideoInfoBox *)a;
    6224           1 :         if (!a) return GF_BAD_PARAM;
    6225           1 :         gf_isom_box_dump_start(a, "SphericalVideoInfoBox", trace);
    6226           1 :         gf_fprintf(trace, " info=\"%s\">\n", ptr->string);
    6227           1 :         gf_isom_box_dump_done("SphericalVideoInfoBox", a, trace);
    6228           1 :         return GF_OK;
    6229             : }
    6230             : 
    6231           1 : GF_Err prhd_box_dump(GF_Box *a, FILE * trace)
    6232             : {
    6233             :         GF_ProjectionHeaderBox *ptr = (GF_ProjectionHeaderBox *)a;
    6234           1 :         if (!a) return GF_BAD_PARAM;
    6235           1 :         gf_isom_box_dump_start(a, "ProjectionHeaderBox", trace);
    6236           1 :         gf_fprintf(trace, " yaw=\"%d\" pitch=\"%d\" roll=\"%d\">\n", ptr->yaw, ptr->pitch, ptr->roll);
    6237           1 :         gf_isom_box_dump_done("ProjectionHeaderBox", a, trace);
    6238           1 :         return GF_OK;
    6239             : }
    6240             : 
    6241           3 : GF_Err proj_type_box_dump(GF_Box *a, FILE * trace)
    6242             : {
    6243             :         GF_ProjectionTypeBox *ptr = (GF_ProjectionTypeBox *)a;
    6244           3 :         if (!a) return GF_BAD_PARAM;
    6245           3 :         if (ptr->type == GF_ISOM_BOX_TYPE_CBMP) {
    6246           0 :                 gf_isom_box_dump_start(a, "CubemapProjectionBox", trace);
    6247           0 :                 gf_fprintf(trace, " layout=\"%d\" padding=\"%d\">\n", ptr->layout, ptr->padding);
    6248           0 :                 gf_isom_box_dump_done("CubemapProjectionBox", a, trace);
    6249             :         }
    6250           3 :         else if (ptr->type == GF_ISOM_BOX_TYPE_EQUI) {
    6251           3 :                 gf_isom_box_dump_start(a, "EquirectangularProjectionBox", trace);
    6252           3 :                 gf_fprintf(trace, " top=\"%d\" bottom=\"%d\" left=\"%d\" right=\"%d\">\n", ptr->bounds_top, ptr->bounds_bottom, ptr->bounds_left, ptr->bounds_right);
    6253           3 :                 gf_isom_box_dump_done("EquirectangularProjectionBox", a, trace);
    6254             :         }
    6255           0 :         else if (ptr->type == GF_ISOM_BOX_TYPE_MSHP) {
    6256           0 :                 gf_isom_box_dump_start(a, "MeshProjectionBox", trace);
    6257           0 :                 gf_fprintf(trace, " crc=\"%08X\" encoding=\"%s\" left=\"%d\" right=\"%d\">\n", ptr->crc, gf_4cc_to_str(ptr->encoding_4cc) );
    6258           0 :                 gf_isom_box_dump_done("MeshProjectionBox", a, trace);
    6259             :         }
    6260             :         return GF_OK;
    6261             : }
    6262             : 
    6263             : #endif /*GPAC_DISABLE_ISOM_DUMP*/

Generated by: LCOV version 1.13