Coverage Report

Created: 2026-03-10 07:04

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/gpac/src/isomedia/box_dump.c
Line
Count
Source
1
/*
2
 *      GPAC - Multimedia Framework C SDK
3
 *
4
 *      Authors: Jean Le Feuvre
5
 *      Copyright (c) Telecom ParisTech 2000-2025
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
static void dump_data(FILE *trace, char *data, u32 dataLength)
37
0
{
38
0
  u32 i;
39
0
  gf_fprintf(trace, "data:application/octet-string,");
40
0
  for (i=0; i<dataLength; i++) {
41
0
    gf_fprintf(trace, "%02X", (unsigned char) data[i]);
42
0
  }
43
0
}
44
45
static void dump_data_hex(FILE *trace, char *data, u32 dataLength)
46
0
{
47
0
  u32 i;
48
0
  gf_fprintf(trace, "0x");
49
0
  for (i=0; i<dataLength; i++) {
50
0
    gf_fprintf(trace, "%02X", (unsigned char) data[i]);
51
0
  }
52
0
}
53
54
static void dump_data_attribute(FILE *trace, char *name, u8 *data, u32 data_size)
55
0
{
56
0
  u32 i;
57
0
  if (!data || !data_size) {
58
0
    gf_fprintf(trace, "%s=\"\"", name);
59
0
    return;
60
0
  }
61
0
  gf_fprintf(trace, "%s=\"0x", name);
62
0
  for (i=0; i<data_size; i++) gf_fprintf(trace, "%02X", (unsigned char) data[i]);
63
0
  gf_fprintf(trace, "\" ");
64
0
}
65
66
static void dump_data_string(FILE *trace, char *data, u32 dataLength)
67
0
{
68
0
  u32 i;
69
0
  if (!data) return;
70
0
  for (i=0; i<dataLength; i++) {
71
0
    switch ((unsigned char) data[i]) {
72
0
    case '\'':
73
0
      gf_fprintf(trace, "&apos;");
74
0
      break;
75
0
    case '\"':
76
0
      gf_fprintf(trace, "&quot;");
77
0
      break;
78
0
    case '&':
79
0
      gf_fprintf(trace, "&amp;");
80
0
      break;
81
0
    case '>':
82
0
      gf_fprintf(trace, "&gt;");
83
0
      break;
84
0
    case '<':
85
0
      gf_fprintf(trace, "&lt;");
86
0
      break;
87
0
    case 0:
88
0
      break;
89
0
    default:
90
0
      gf_fprintf(trace, "%c", (u8) data[i]);
91
0
      break;
92
0
    }
93
0
  }
94
0
}
95
96
97
GF_Err gf_isom_box_array_dump(GF_List *list, FILE * trace, u16 parent_internal_flags)
98
0
{
99
0
  u32 i;
100
0
  GF_Box *a;
101
0
  if (!list) return GF_OK;
102
0
  i=0;
103
0
  while ((a = (GF_Box *)gf_list_enum(list, &i))) {
104
0
    if (parent_internal_flags & GF_ISOM_DUMP_SKIP_SIZE) {
105
0
      a->internal_flags |= GF_ISOM_DUMP_SKIP_SIZE;
106
0
      gf_isom_box_dump_ex(a, trace, GF_FALSE);
107
0
      a->internal_flags &= ~GF_ISOM_DUMP_SKIP_SIZE;
108
0
    } else {
109
0
      gf_isom_box_dump_ex(a, trace, GF_FALSE);
110
0
    }
111
0
  }
112
0
  return GF_OK;
113
0
}
114
115
#ifdef GPAC_HAS_QJS
116
static void gf_isom_dump_js_cleanup();
117
#endif
118
119
static Bool dump_skip_samples = GF_FALSE;
120
GF_EXPORT
121
GF_Err gf_isom_dump(GF_ISOFile *mov, FILE * trace, Bool skip_init, Bool skip_samples)
122
0
{
123
0
  u32 i;
124
0
  const char *fname;
125
0
  GF_Box *box;
126
0
  if (!mov || !trace) return GF_BAD_PARAM;
127
128
0
  gf_fprintf(trace, "<!--MP4Box dump trace-->\n");
129
130
0
  fname = mov->fileName ? strrchr(mov->fileName, '/') : "/memory";
131
0
  if (!fname) fname = strrchr(mov->fileName, '\\');
132
0
  if (!fname) fname = mov->fileName;
133
0
  else fname+=1;
134
0
  gf_fprintf(trace, "<IsoMediaFile xmlns=\"urn:mpeg:isobmff:schema:file:2016\" Name=\"%s\">\n", fname);
135
136
0
  dump_skip_samples = skip_samples;
137
0
  i=0;
138
0
  if (skip_init)
139
0
    i = mov->nb_box_init_seg;
140
141
0
  while ((box = (GF_Box *)gf_list_enum(mov->TopBoxes, &i))) {
142
0
    if (box->type==GF_ISOM_BOX_TYPE_UNKNOWN) {
143
0
      switch (((GF_UnknownBox*)box)->original_4cc) {
144
0
      case GF_ISOM_BOX_TYPE_CMOV:
145
0
      case GF_ISOM_BOX_TYPE_CMOF:
146
0
      case GF_ISOM_BOX_TYPE_CSIX:
147
0
      case GF_ISOM_BOX_TYPE_CSSX:
148
0
      case GF_QT_BOX_TYPE_CMOV:
149
0
        break;
150
0
      default:
151
0
        gf_fprintf(trace, "<!--WARNING: Unknown Top-level Box Found -->\n");
152
0
      }
153
0
    } else if (box->type==GF_ISOM_BOX_TYPE_UUID) {
154
0
    } else if (!gf_isom_box_is_file_level(box)) {
155
0
      gf_fprintf(trace, "<!--ERROR: Invalid Top-level Box Found (\"%s\")-->\n", gf_4cc_to_str(box->type));
156
0
    }
157
0
    gf_isom_box_dump_ex(box, trace, GF_TRUE);
158
0
  }
159
0
  gf_fprintf(trace, "</IsoMediaFile>\n");
160
161
0
#ifdef GPAC_HAS_QJS
162
0
  gf_isom_dump_js_cleanup();
163
0
#endif
164
0
  return GF_OK;
165
0
}
166
167
GF_Err reftype_box_dump(GF_Box *a, FILE * trace)
168
0
{
169
0
  u32 i;
170
0
  GF_TrackReferenceTypeBox *p = (GF_TrackReferenceTypeBox *)a;
171
0
  if (!p->reference_type) return GF_OK;
172
0
  p->type = p->reference_type;
173
  //don't allow UNKN or UUID as type (possible buffer overflow when typecasting to GF_UnknownBox)
174
0
  if ((p->type==GF_ISOM_BOX_TYPE_UNKNOWN) || (p->type==GF_ISOM_BOX_TYPE_UUID))
175
0
    p->type = GF_4CC('u','k','n','w');
176
177
0
  gf_isom_box_dump_start(a, "TrackReferenceTypeBox", trace);
178
0
  gf_fprintf(trace, ">\n");
179
0
  for (i=0; i<p->trackIDCount; i++) {
180
0
    gf_fprintf(trace, "<TrackReferenceEntry TrackID=\"%d\"/>\n", p->trackIDs[i]);
181
0
  }
182
0
  if (!p->size)
183
0
    gf_fprintf(trace, "<TrackReferenceEntry TrackID=\"\"/>\n");
184
185
0
  gf_isom_box_dump_done("TrackReferenceTypeBox", a, trace);
186
0
  p->type = GF_ISOM_BOX_TYPE_REFT;
187
0
  return GF_OK;
188
0
}
189
190
GF_Err ireftype_box_dump(GF_Box *a, FILE * trace)
191
0
{
192
0
  u32 i;
193
0
  GF_ItemReferenceTypeBox *p = (GF_ItemReferenceTypeBox *)a;
194
0
  if (!p->reference_type) return GF_OK;
195
196
0
  p->type = p->reference_type;
197
  //don't allow UNKN or UUI as type (possible buffer overflow when typecasting to GF_UnknownBox)
198
0
  if ((p->type==GF_ISOM_BOX_TYPE_UNKNOWN) || (p->type==GF_ISOM_BOX_TYPE_UUID))
199
0
    p->type = GF_4CC('u','k','n','w');
200
0
  gf_isom_box_dump_start(a, "ItemReferenceBox", trace);
201
0
  gf_fprintf(trace, "from_item_id=\"%d\">\n", p->from_item_id);
202
0
  for (i = 0; i < p->reference_count; i++) {
203
0
    gf_fprintf(trace, "<ItemReferenceBoxEntry ItemID=\"%d\"/>\n", p->to_item_IDs[i]);
204
0
  }
205
0
  if (!p->size)
206
0
    gf_fprintf(trace, "<ItemReferenceBoxEntry ItemID=\"\"/>\n");
207
208
0
  gf_isom_box_dump_done("ItemReferenceBox", a, trace);
209
210
0
  p->type = GF_ISOM_BOX_TYPE_REFI;
211
0
  return GF_OK;
212
0
}
213
214
GF_Err free_box_dump(GF_Box *a, FILE * trace)
215
0
{
216
0
  GF_FreeSpaceBox *p = (GF_FreeSpaceBox *)a;
217
0
  gf_isom_box_dump_start(a, (a->type==GF_ISOM_BOX_TYPE_FREE) ? "FreeSpaceBox" : "SkipBox", trace);
218
0
  gf_fprintf(trace, "dataSize=\"%d\">\n", p->dataSize);
219
0
  gf_isom_box_dump_done( (a->type==GF_ISOM_BOX_TYPE_FREE) ? "FreeSpaceBox" : "SkipBox", a, trace);
220
0
  return GF_OK;
221
0
}
222
223
GF_Err wide_box_dump(GF_Box *a, FILE * trace)
224
0
{
225
0
  gf_isom_box_dump_start(a, "WideBox", trace);
226
0
  gf_fprintf(trace, ">\n");
227
0
  gf_isom_box_dump_done("WideBox", a, trace);
228
0
  return GF_OK;
229
0
}
230
231
GF_Err mdat_box_dump(GF_Box *a, FILE * trace)
232
0
{
233
0
  GF_MediaDataBox *p;
234
0
  const char *name = (a->type==GF_ISOM_BOX_TYPE_IDAT ? "ItemDataBox" : "MediaDataBox");
235
0
  p = (GF_MediaDataBox *)a;
236
0
  if (p->is_imda) {
237
0
    name = "IdentifiedMediaDataBox";
238
0
    p->type = GF_ISOM_BOX_TYPE_IMDA;
239
0
    gf_isom_box_dump_start(a, name, trace);
240
0
    gf_fprintf(trace, "imda_identifier=\"%d\" ", p->imda_id);
241
0
    p->type = GF_ISOM_BOX_TYPE_MDAT;
242
0
  } else {
243
0
    gf_isom_box_dump_start(a, name, trace);
244
0
  }
245
0
  gf_fprintf(trace, "dataSize=\""LLD"\">\n", p->dataSize);
246
0
  gf_isom_box_dump_done(name, a, trace);
247
0
  return GF_OK;
248
0
}
249
250
GF_Err moov_box_dump(GF_Box *a, FILE * trace)
251
0
{
252
0
  GF_MovieBox *p = (GF_MovieBox *) a;
253
0
  gf_isom_box_dump_start(a, "MovieBox", trace);
254
0
  if (p->internal_flags & GF_ISOM_BOX_COMPRESSED)
255
0
    gf_fprintf(trace, "compressedSize=\""LLU"\"", p->size - p->compressed_diff);
256
0
  gf_fprintf(trace, ">\n");
257
0
  gf_isom_box_dump_done("MovieBox", a, trace);
258
0
  return GF_OK;
259
0
}
260
261
GF_Err mvhd_box_dump(GF_Box *a, FILE * trace)
262
0
{
263
0
  GF_MovieHeaderBox *p;
264
265
0
  p = (GF_MovieHeaderBox *) a;
266
267
0
  gf_isom_box_dump_start(a, "MovieHeaderBox", trace);
268
0
  gf_fprintf(trace, "CreationTime=\""LLD"\" ", p->creationTime);
269
0
  gf_fprintf(trace, "ModificationTime=\""LLD"\" ", p->modificationTime);
270
0
  gf_fprintf(trace, "TimeScale=\"%d\" ", p->timeScale);
271
0
  gf_fprintf(trace, "Duration=\""LLD"\" ", p->duration);
272
0
  gf_fprintf(trace, "NextTrackID=\"%d\">\n", p->nextTrackID);
273
274
0
  gf_isom_box_dump_done("MovieHeaderBox", a, trace);
275
0
  return GF_OK;
276
0
}
277
278
GF_Err mdhd_box_dump(GF_Box *a, FILE * trace)
279
0
{
280
0
  GF_MediaHeaderBox *p;
281
282
0
  p = (GF_MediaHeaderBox *)a;
283
0
  gf_isom_box_dump_start(a, "MediaHeaderBox", trace);
284
0
  gf_fprintf(trace, "CreationTime=\""LLD"\" ", p->creationTime);
285
0
  gf_fprintf(trace, "ModificationTime=\""LLD"\" ", p->modificationTime);
286
0
  gf_fprintf(trace, "TimeScale=\"%d\" ", p->timeScale);
287
0
  gf_fprintf(trace, "Duration=\""LLD"\" ", p->duration);
288
0
  gf_fprintf(trace, "LanguageCode=\"%c%c%c\">\n", p->packedLanguage[0], p->packedLanguage[1], p->packedLanguage[2]);
289
0
  gf_isom_box_dump_done("MediaHeaderBox", a, trace);
290
0
  return GF_OK;
291
0
}
292
293
GF_Err vmhd_box_dump(GF_Box *a, FILE * trace)
294
0
{
295
0
  gf_isom_box_dump_start(a, "VideoMediaHeaderBox", trace);
296
0
  gf_fprintf(trace, ">\n");
297
0
  gf_isom_box_dump_done("VideoMediaHeaderBox", a, trace);
298
0
  return GF_OK;
299
0
}
300
301
GF_Err gmin_box_dump(GF_Box *a, FILE * trace)
302
0
{
303
0
  GF_GenericMediaHeaderInfoBox *p = (GF_GenericMediaHeaderInfoBox *)a;
304
0
  gf_isom_box_dump_start(a, "GenericMediaHeaderInformationBox", trace);
305
0
  gf_fprintf(trace, " graphicsMode=\"%d\" opcolorRed=\"%d\" opcolorGreen=\"%d\" opcolorBlue=\"%d\" balance=\"%d\">\n",
306
0
    p->graphics_mode, p->op_color_red, p->op_color_green, p->op_color_blue, p->balance);
307
0
  gf_isom_box_dump_done("GenericMediaHeaderInformationBox", a, trace);
308
0
  return GF_OK;
309
0
}
310
311
GF_Err clef_box_dump(GF_Box *a, FILE * trace)
312
0
{
313
0
  Float w, h;
314
0
  const char *name = "TrackCleanApertureDimensionsBox";
315
0
  GF_ApertureBox *p = (GF_ApertureBox *)a;
316
0
  if (p->type==GF_QT_BOX_TYPE_PROF)
317
0
    name = "TrackProductionApertureDimensionsBox";
318
0
  else if (p->type==GF_QT_BOX_TYPE_ENOF)
319
0
    name = "TrackEncodedPixelsDimensionsBox";
320
321
0
  gf_isom_box_dump_start(a, name, trace);
322
0
  w = (Float) (p->width&0xFFFF);
323
0
  w /= 0xFFFF;
324
0
  w += (p->width>>16);
325
326
0
  h = (Float) (p->height&0xFFFF);
327
0
  h /= 0xFFFF;
328
0
  h += (p->height>>16);
329
330
0
  gf_fprintf(trace, " width=\"%g\" height=\"%g\">\n", w, h);
331
0
  gf_isom_box_dump_done(name, a, trace);
332
0
  return GF_OK;
333
0
}
334
335
GF_Err smhd_box_dump(GF_Box *a, FILE * trace)
336
0
{
337
0
  gf_isom_box_dump_start(a, "SoundMediaHeaderBox", trace);
338
0
  gf_fprintf(trace, ">\n");
339
0
  gf_isom_box_dump_done("SoundMediaHeaderBox", a, trace);
340
0
  return GF_OK;
341
0
}
342
343
GF_Err hmhd_box_dump(GF_Box *a, FILE * trace)
344
0
{
345
0
  GF_HintMediaHeaderBox *p;
346
347
0
  p = (GF_HintMediaHeaderBox *)a;
348
349
0
  gf_isom_box_dump_start(a, "HintMediaHeaderBox", trace);
350
0
  gf_fprintf(trace, "MaximumPDUSize=\"%d\" ", p->maxPDUSize);
351
0
  gf_fprintf(trace, "AveragePDUSize=\"%d\" ", p->avgPDUSize);
352
0
  gf_fprintf(trace, "MaxBitRate=\"%d\" ", p->maxBitrate);
353
0
  gf_fprintf(trace, "AverageBitRate=\"%d\">\n", p->avgBitrate);
354
355
0
  gf_isom_box_dump_done("HintMediaHeaderBox", a, trace);
356
0
  return GF_OK;
357
0
}
358
359
GF_Err nmhd_box_dump(GF_Box *a, FILE * trace)
360
0
{
361
0
  gf_isom_box_dump_start(a, "MPEGMediaHeaderBox", trace);
362
0
  gf_fprintf(trace, ">\n");
363
0
  gf_isom_box_dump_done("MPEGMediaHeaderBox", a, trace);
364
0
  return GF_OK;
365
0
}
366
367
GF_Err stbl_box_dump(GF_Box *a, FILE * trace)
368
0
{
369
0
  gf_isom_box_dump_start(a, "SampleTableBox", trace);
370
0
  gf_fprintf(trace, ">\n");
371
0
  gf_isom_box_dump_done("SampleTableBox", a, trace);
372
0
  return GF_OK;
373
0
}
374
375
GF_Err dinf_box_dump(GF_Box *a, FILE * trace)
376
0
{
377
0
  gf_isom_box_dump_start(a, "DataInformationBox", trace);
378
0
  gf_fprintf(trace, ">\n");
379
0
  gf_isom_box_dump_done("DataInformationBox", a, trace);
380
0
  return GF_OK;
381
0
}
382
383
GF_Err url_box_dump(GF_Box *a, FILE * trace)
384
0
{
385
0
  GF_DataEntryURLBox *p = (GF_DataEntryURLBox *)a;
386
0
  const char *name = (p->type==GF_ISOM_BOX_TYPE_IMDT) ? "DataEntryImdaBox" : "URLDataEntryBox";
387
0
  gf_isom_box_dump_start(a, name, trace);
388
0
  if (p->type==GF_ISOM_BOX_TYPE_IMDT) {
389
0
    gf_fprintf(trace, " imda_ID=\"%u\">\n", p->imda_ref_id);
390
0
  } else if (p->location) {
391
0
    gf_fprintf(trace, " URL=\"%s\">\n", p->location);
392
0
  } else {
393
0
    gf_fprintf(trace, ">\n");
394
0
    if (p->size) {
395
0
      if (! (p->flags & 1) ) {
396
0
        gf_fprintf(trace, "<!--ERROR: No location indicated-->\n");
397
0
      } else {
398
0
        gf_fprintf(trace, "<!--Data is contained in the movie file-->\n");
399
0
      }
400
0
    }
401
0
  }
402
0
  gf_isom_box_dump_done(name, a, trace);
403
0
  return GF_OK;
404
0
}
405
406
GF_Err urn_box_dump(GF_Box *a, FILE * trace)
407
0
{
408
0
  GF_DataEntryURNBox *p;
409
410
0
  p = (GF_DataEntryURNBox *)a;
411
0
  gf_isom_box_dump_start(a, "URNDataEntryBox", trace);
412
0
  if (p->nameURN) gf_fprintf(trace, " URN=\"%s\"", p->nameURN);
413
0
  if (p->location) gf_fprintf(trace, " URL=\"%s\"", p->location);
414
0
  gf_fprintf(trace, ">\n");
415
416
0
  gf_isom_box_dump_done("URNDataEntryBox", a, trace);
417
0
  return GF_OK;
418
0
}
419
420
GF_Err alis_box_dump(GF_Box *a, FILE * trace)
421
0
{
422
//  GF_DataEntryAliasBox *p = (GF_DataEntryAliasBox *)a;
423
0
  gf_isom_box_dump_start(a, "AliasDataEntryBox", trace);
424
0
  gf_fprintf(trace, ">\n");
425
426
0
  gf_isom_box_dump_done("AliasDataEntryBox", a, trace);
427
0
  return GF_OK;
428
0
}
429
430
GF_Err cprt_box_dump(GF_Box *a, FILE * trace)
431
0
{
432
0
  GF_CopyrightBox *p;
433
434
0
  p = (GF_CopyrightBox *)a;
435
0
  gf_isom_box_dump_start(a, "CopyrightBox", trace);
436
0
  gf_fprintf(trace, "LanguageCode=\"%s\" CopyrightNotice=\"%s\">\n", p->packedLanguageCode, p->notice);
437
0
  gf_isom_box_dump_done("CopyrightBox", a, trace);
438
0
  return GF_OK;
439
0
}
440
441
GF_Err kind_box_dump(GF_Box *a, FILE * trace)
442
0
{
443
0
  GF_KindBox *p;
444
445
0
  p = (GF_KindBox *)a;
446
0
  gf_isom_box_dump_start(a, "KindBox", trace);
447
0
  gf_fprintf(trace, "schemeURI=\"%s\" value=\"%s\">\n", p->schemeURI, (p->value ? p->value : ""));
448
0
  gf_isom_box_dump_done("KindBox", a, trace);
449
0
  return GF_OK;
450
0
}
451
452
453
static void dump_escape_string(FILE * trace, char *name)
454
0
{
455
0
  u32 i, len = name ? (u32) strlen(name) : 0;
456
0
  for (i=0; i<len; i++) {
457
0
    if (name[i]=='"') gf_fprintf(trace, "&quot;");
458
0
    else gf_fputc(name[i], trace);
459
0
  }
460
0
}
461
462
GF_Err chpl_box_dump(GF_Box *a, FILE * trace)
463
0
{
464
0
  u32 i, count;
465
0
  GF_ChapterListBox *p = (GF_ChapterListBox *)a;
466
0
  gf_isom_box_dump_start(a, "ChapterListBox", trace);
467
0
  gf_fprintf(trace, ">\n");
468
469
0
  if (p->size) {
470
0
    count = gf_list_count(p->list);
471
0
    for (i=0; i<count; i++) {
472
0
      char szDur[100];
473
0
      GF_ChapterEntry *ce = (GF_ChapterEntry *)gf_list_get(p->list, i);
474
0
      gf_fprintf(trace, "<Chapter name=\"");
475
0
      dump_escape_string(trace, ce->name);
476
0
      gf_fprintf(trace, "\" startTime=\"%s\" />\n", gf_format_duration(ce->start_time, 1000*10000, szDur));
477
0
    }
478
0
  } else {
479
0
    gf_fprintf(trace, "<Chapter name=\"\" startTime=\"\"/>\n");
480
0
  }
481
#ifdef GPAC_ENABLE_COVERAGE
482
  if (gf_sys_is_cov_mode()) {
483
    dump_escape_string(NULL, NULL);
484
  }
485
#endif
486
0
  gf_isom_box_dump_done("ChapterListBox", a, trace);
487
0
  return GF_OK;
488
0
}
489
490
GF_Err pdin_box_dump(GF_Box *a, FILE * trace)
491
0
{
492
0
  u32 i;
493
0
  GF_ProgressiveDownloadBox *p = (GF_ProgressiveDownloadBox *)a;
494
0
  gf_isom_box_dump_start(a, "ProgressiveDownloadBox", trace);
495
0
  gf_fprintf(trace, ">\n");
496
497
0
  if (p->size) {
498
0
    for (i=0; i<p->count; i++) {
499
0
      gf_fprintf(trace, "<DownloadInfo rate=\"%d\" estimatedTime=\"%d\" />\n", p->rates[i], p->times[i]);
500
0
    }
501
0
  } else {
502
0
    gf_fprintf(trace, "<DownloadInfo rate=\"\" estimatedTime=\"\" />\n");
503
0
  }
504
0
  gf_isom_box_dump_done("ProgressiveDownloadBox", a, trace);
505
0
  return GF_OK;
506
0
}
507
508
GF_Err hdlr_box_dump(GF_Box *a, FILE * trace)
509
0
{
510
0
  GF_HandlerBox *p = (GF_HandlerBox *)a;
511
0
  gf_isom_box_dump_start(a, "HandlerBox", trace);
512
0
  if (p->nameUTF8 && (u32) p->nameUTF8[0] == strlen(p->nameUTF8)-1) {
513
0
    gf_fprintf(trace, "hdlrType=\"%s\" Name=\"%s\" ", gf_4cc_to_str(p->handlerType), p->nameUTF8+1);
514
0
  } else {
515
0
    gf_fprintf(trace, "hdlrType=\"%s\" Name=\"%s\" ", gf_4cc_to_str(p->handlerType), p->nameUTF8);
516
0
  }
517
0
  gf_fprintf(trace, "reserved1=\"%d\" reserved2=\"", p->reserved1);
518
0
  dump_data(trace, (char *) p->reserved2, 12);
519
0
  gf_fprintf(trace, "\"");
520
521
0
  gf_fprintf(trace, ">\n");
522
0
  gf_isom_box_dump_done("HandlerBox", a, trace);
523
0
  return GF_OK;
524
0
}
525
526
GF_Err iods_box_dump(GF_Box *a, FILE * trace)
527
0
{
528
0
  GF_ObjectDescriptorBox *p;
529
530
0
  p = (GF_ObjectDescriptorBox *)a;
531
0
  gf_isom_box_dump_start(a, "ObjectDescriptorBox", trace);
532
0
  gf_fprintf(trace, ">\n");
533
534
0
  if (p->descriptor) {
535
0
#ifndef GPAC_DISABLE_OD_DUMP
536
0
    gf_odf_dump_desc(p->descriptor, trace, 1, GF_TRUE);
537
#else
538
    gf_fprintf(trace, "<!-- Object Descriptor Dumping disabled in this build of GPAC -->\n");
539
#endif
540
0
  } else if (p->size) {
541
0
    gf_fprintf(trace, "<!--WARNING: Object Descriptor not present-->\n");
542
0
  }
543
0
  gf_isom_box_dump_done("ObjectDescriptorBox", a, trace);
544
0
  return GF_OK;
545
0
}
546
547
GF_Err trak_box_dump(GF_Box *a, FILE * trace)
548
0
{
549
0
  GF_TrackBox *p;
550
0
  p = (GF_TrackBox *)a;
551
0
  const char *name = p->extl ? "ExternalTrackBox" : "TrackBox";
552
0
  gf_isom_box_dump_start(a, name, trace);
553
0
  gf_fprintf(trace, ">\n");
554
0
  if (p->size && !p->Header) {
555
0
    gf_fprintf(trace, "<!--INVALID FILE: Missing Track Header-->\n");
556
0
  }
557
0
  gf_isom_box_dump_done(name, a, trace);
558
0
  return GF_OK;
559
0
}
560
561
GF_Err mp4s_box_dump(GF_Box *a, FILE * trace)
562
0
{
563
0
  GF_MPEGSampleEntryBox *p;
564
565
0
  p = (GF_MPEGSampleEntryBox *)a;
566
0
  gf_isom_box_dump_start(a, "MPEGSystemsSampleDescriptionBox", trace);
567
0
  gf_fprintf(trace, "DataReferenceIndex=\"%d\">\n", p->dataReferenceIndex);
568
0
  if (!p->esd && p->size) {
569
0
    gf_fprintf(trace, "<!--INVALID MP4 FILE: ESDBox not present in MPEG Sample Description -->\n");
570
0
  }
571
0
  gf_isom_box_dump_done("MPEGSystemsSampleDescriptionBox", a, trace);
572
0
  return GF_OK;
573
0
}
574
575
576
GF_Err video_sample_entry_box_dump(GF_Box *a, FILE * trace)
577
0
{
578
0
  Bool full_dump=GF_FALSE;
579
0
  GF_MPEGVisualSampleEntryBox *p = (GF_MPEGVisualSampleEntryBox *)a;
580
0
  const char *name;
581
582
0
  switch (p->type) {
583
0
  case GF_ISOM_SUBTYPE_AVC_H264:
584
0
  case GF_ISOM_SUBTYPE_AVC2_H264:
585
0
  case GF_ISOM_SUBTYPE_AVC3_H264:
586
0
  case GF_ISOM_SUBTYPE_AVC4_H264:
587
0
    name = "AVCSampleEntryBox";
588
0
    break;
589
0
  case GF_ISOM_SUBTYPE_MVC_H264:
590
0
    name = "MVCSampleEntryBox";
591
0
    break;
592
0
  case GF_ISOM_SUBTYPE_SVC_H264:
593
0
    name = "SVCSampleEntryBox";
594
0
    break;
595
0
  case GF_ISOM_SUBTYPE_HVC1:
596
0
  case GF_ISOM_SUBTYPE_HEV1:
597
0
  case GF_ISOM_SUBTYPE_HVC2:
598
0
  case GF_ISOM_SUBTYPE_HEV2:
599
0
    name = "HEVCSampleEntryBox";
600
0
    break;
601
0
  case GF_ISOM_SUBTYPE_VVC1:
602
0
  case GF_ISOM_SUBTYPE_VVI1:
603
0
    name = "VVCSampleEntryBox";
604
0
    break;
605
0
  case GF_ISOM_SUBTYPE_LHV1:
606
0
  case GF_ISOM_SUBTYPE_LHE1:
607
0
    name = "LHEVCSampleEntryBox";
608
0
    break;
609
0
  case GF_ISOM_SUBTYPE_AV01:
610
0
    name = "AV1SampleEntryBox";
611
0
    break;
612
0
  case GF_ISOM_SUBTYPE_3GP_H263:
613
0
    name = "H263SampleDescriptionBox";
614
0
    break;
615
0
  case GF_ISOM_SUBTYPE_MJP2:
616
0
    name = "MJ2KSampleDescriptionBox";
617
0
    break;
618
0
  case GF_QT_SUBTYPE_APCH:
619
0
  case GF_QT_SUBTYPE_APCO:
620
0
  case GF_QT_SUBTYPE_APCN:
621
0
  case GF_QT_SUBTYPE_APCS:
622
0
  case GF_QT_SUBTYPE_AP4X:
623
0
  case GF_QT_SUBTYPE_AP4H:
624
0
    name = "ProResSampleEntryBox";
625
0
    full_dump=GF_TRUE;
626
0
    break;
627
0
  case GF_QT_SUBTYPE_RAW:
628
0
    name = "RGBSampleEntryBox";
629
0
    full_dump=GF_TRUE;
630
0
    break;
631
0
  case GF_QT_SUBTYPE_YUYV:
632
0
    name = "YUV422SampleEntryBox";
633
0
    full_dump=GF_TRUE;
634
0
    break;
635
0
  case GF_QT_SUBTYPE_UYVY:
636
0
    name = "YUV422SampleEntryBox";
637
0
    full_dump=GF_TRUE;
638
0
    break;
639
0
  case GF_QT_SUBTYPE_YUV420:
640
0
    name = "YUV420SampleEntryBox";
641
0
    full_dump=GF_TRUE;
642
0
    break;
643
0
  case GF_QT_SUBTYPE_YUV422_10:
644
0
    name = "YUV422_10_SampleEntryBox";
645
0
    full_dump=GF_TRUE;
646
0
    break;
647
0
  case GF_QT_SUBTYPE_YUV444:
648
0
    name = "YUV444SampleEntryBox";
649
0
    full_dump=GF_TRUE;
650
0
    break;
651
0
  case GF_QT_SUBTYPE_YUV444_10:
652
0
    name = "YUV444_10_SampleEntryBox";
653
0
    full_dump=GF_TRUE;
654
0
    break;
655
0
  case GF_QT_SUBTYPE_RAW_VID:
656
0
    name = "RGB_SampleEntryBox";
657
0
    full_dump=GF_TRUE;
658
0
    break;
659
0
  case GF_QT_SUBTYPE_YUVA444:
660
0
    name = "YUVA_SampleEntryBox";
661
0
    full_dump=GF_TRUE;
662
0
    break;
663
0
  case GF_QT_SUBTYPE_YUV422_16:
664
0
    name = "YUV420_16_SampleEntryBox";
665
0
    full_dump=GF_TRUE;
666
0
    break;
667
0
  case GF_QT_SUBTYPE_I420:
668
0
    name = "I420_SampleEntryBox";
669
0
    full_dump=GF_TRUE;
670
0
    break;
671
0
  case GF_QT_SUBTYPE_IYUV:
672
0
    name = "IUYV_SampleEntryBox";
673
0
    full_dump=GF_TRUE;
674
0
    break;
675
0
  case GF_QT_SUBTYPE_YV12:
676
0
    name = "YV12_SampleEntryBox";
677
0
    full_dump=GF_TRUE;
678
0
    break;
679
0
  case GF_QT_SUBTYPE_YVYU:
680
0
    name = "YVYU_SampleEntryBox";
681
0
    full_dump=GF_TRUE;
682
0
    break;
683
0
  case GF_QT_SUBTYPE_RGBA:
684
0
    name = "RGBA_SampleEntryBox";
685
0
    full_dump=GF_TRUE;
686
0
    break;
687
0
  case GF_QT_SUBTYPE_ABGR:
688
0
    name = "ABGR_SampleEntryBox";
689
0
    full_dump=GF_TRUE;
690
0
    break;
691
692
0
  default:
693
    //DO NOT TOUCH FOR NOW, this breaks all hashes
694
0
    name = "MPEGVisualSampleDescriptionBox";
695
0
    break;
696
0
  }
697
698
699
0
  gf_isom_box_dump_start(a, name, trace);
700
701
0
  gf_fprintf(trace, " DataReferenceIndex=\"%d\" Width=\"%d\" Height=\"%d\"", p->dataReferenceIndex, p->Width, p->Height);
702
703
0
  if (full_dump) {
704
0
    gf_fprintf(trace, " Version=\"%d\" Revision=\"%d\" Vendor=\"%s\" TemporalQuality=\"%d\" SpatialQuality=\"%d\" FramesPerSample=\"%d\" ColorTableIndex=\"%d\"",
705
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);
706
0
  }
707
708
0
  Float dpih, dpiv;
709
0
  dpih = (Float) (p->horiz_res&0xFFFF);
710
0
  dpih /= 0xFFFF;
711
0
  dpih += (p->vert_res>>16);
712
0
  dpiv = (Float) (p->vert_res&0xFFFF);
713
0
  dpiv /= 0xFFFF;
714
0
  dpiv += (p->vert_res>>16);
715
0
  if (gf_sys_is_test_mode()) {
716
0
    gf_fprintf(trace, " XDPI=\"%d\" YDPI=\"%d\" BitDepth=\"%d\"", p->horiz_res, p->vert_res, p->bit_depth);
717
0
  } else {
718
0
    gf_fprintf(trace, " XDPI=\"%g\" YDPI=\"%g\" BitDepth=\"%d\"", dpih, dpiv, p->bit_depth);
719
0
  }
720
721
0
  if (strlen((const char*)p->compressor_name) ) {
722
0
    if (isalnum(p->compressor_name[0])) {
723
0
      gf_fprintf(trace, " CompressorName=\"%s\"\n", p->compressor_name);
724
0
    } else {
725
0
      gf_fprintf(trace, " CompressorName=\"%s\"\n", p->compressor_name+1);
726
0
    }
727
0
  }
728
729
0
  gf_fprintf(trace, ">\n");
730
0
  gf_isom_box_dump_done(name, a, trace);
731
0
  return GF_OK;
732
0
}
733
734
735
void base_audio_entry_dump(GF_AudioSampleEntryBox *p, FILE * trace)
736
0
{
737
0
  gf_fprintf(trace, " DataReferenceIndex=\"%d\"", p->dataReferenceIndex);
738
0
  if (p->version)
739
0
    gf_fprintf(trace, " Version=\"%d\"", p->version);
740
741
0
  if (p->version != 2) {
742
0
    if (p->samplerate_lo) {
743
0
      if (p->type==GF_ISOM_SUBTYPE_MLPA) {
744
0
        u32 sr = p->samplerate_hi;
745
0
        sr <<= 16;
746
0
        sr |= p->samplerate_lo;
747
0
        gf_fprintf(trace, " SampleRate=\"%d\"", sr);
748
0
      } else {
749
0
        gf_fprintf(trace, " SampleRate=\"%d.%d\"", p->samplerate_hi, p->samplerate_lo);
750
0
      }
751
0
    } else {
752
0
      gf_fprintf(trace, " SampleRate=\"%d\"", p->samplerate_hi);
753
0
    }
754
0
    gf_fprintf(trace, " Channels=\"%d\" BitsPerSample=\"%d\"", p->channel_count, p->bitspersample);
755
0
  }
756
0
  if (p->qtff_mode) {
757
0
    gf_fprintf(trace, " isQTFF=\"%d\"", p->qtff_mode);
758
0
    gf_fprintf(trace, " qtRevisionLevel=\"%d\"", p->revision);
759
0
    gf_fprintf(trace, " qtVendor=\"%d\"", p->vendor);
760
0
    gf_fprintf(trace, " qtCompressionId=\"%d\"", p->compression_id);
761
0
    gf_fprintf(trace, " qtPacketSize=\"%d\"", p->packet_size);
762
0
    if (p->version == 1) {
763
0
      gf_fprintf(trace, " qtSamplesPerPacket=\"%d\"", p->extensions[0]<<24 | p->extensions[1]<<16 | p->extensions[2]<<8 | p->extensions[3]);
764
0
      gf_fprintf(trace, " qtBytesPerPacket=\"%d\"", p->extensions[4]<<24 | p->extensions[5]<<16 | p->extensions[6]<<8 | p->extensions[7]);
765
0
      gf_fprintf(trace, " qtBytesPerFrame=\"%d\"", p->extensions[8]<<24 | p->extensions[9]<<16 | p->extensions[10]<<8 | p->extensions[11]);
766
0
      gf_fprintf(trace, " qtBytesPerSample=\"%d\"", p->extensions[12]<<24 | p->extensions[13]<<16 | p->extensions[14]<<8 | p->extensions[15]);
767
0
    }
768
0
    else if (p->version == 2) {
769
0
      GF_BitStream *bs = gf_bs_new(p->extensions, 36, GF_BITSTREAM_READ);
770
0
      gf_fprintf(trace, " resSampleRate=\"%d\" resChannels=\"%d\" resBitsPerSample=\"%d\"", p->samplerate_hi, p->channel_count, p->bitspersample);
771
0
      gf_fprintf(trace, " sizeOfStructOnly=\"%u\"", gf_bs_read_u32(bs));
772
0
      gf_fprintf(trace, " audioSampleRate=\"%f\"", gf_bs_read_double(bs));
773
0
      gf_fprintf(trace, " numAudioChannels=\"%x\"", gf_bs_read_u32(bs));
774
0
      gf_fprintf(trace, " res1=\"%x\"", gf_bs_read_u32(bs));
775
0
      gf_fprintf(trace, " constBitsPerChannel=\"%u\"", gf_bs_read_u32(bs));
776
0
      gf_fprintf(trace, " formatSpecificFlags=\"%u\"", gf_bs_read_u32(bs));
777
0
      gf_fprintf(trace, " constBytesPerAudioPacket=\"%u\"", gf_bs_read_u32(bs));
778
0
      gf_fprintf(trace, " constLPCMFramesPerAudioPacket=\"%u\"", gf_bs_read_u32(bs));
779
0
      gf_bs_del(bs);
780
0
    }
781
0
  }
782
0
}
783
784
GF_Err audio_sample_entry_box_dump(GF_Box *a, FILE * trace)
785
0
{
786
0
  char *szName;
787
0
  const char *error=NULL;
788
0
  GF_MPEGAudioSampleEntryBox *p = (GF_MPEGAudioSampleEntryBox *)a;
789
790
0
  switch (p->type) {
791
0
  case GF_ISOM_SUBTYPE_3GP_AMR:
792
0
    szName = "AMRSampleDescriptionBox";
793
0
    if (!p->cfg_3gpp)
794
0
      error = "<!-- INVALID 3GPP FILE: Config not present in Sample Description-->";
795
0
    break;
796
0
  case GF_ISOM_SUBTYPE_3GP_AMR_WB:
797
0
    szName = "AMR_WB_SampleDescriptionBox";
798
0
    if (!p->cfg_3gpp)
799
0
      error = "<!-- INVALID 3GPP FILE: Config not present in Sample Description-->";
800
0
    break;
801
0
  case GF_ISOM_SUBTYPE_3GP_EVRC:
802
0
    szName = "EVRCSampleDescriptionBox";
803
0
    if (!p->cfg_3gpp)
804
0
      error = "<!-- INVALID 3GPP FILE: Config not present in Sample Description-->";
805
0
    break;
806
0
  case GF_ISOM_SUBTYPE_3GP_QCELP:
807
0
    szName = "QCELPSampleDescriptionBox";
808
0
    if (!p->cfg_3gpp)
809
0
      error = "<!-- INVALID 3GPP Entry: Config not present in Audio Sample Description-->";
810
0
    break;
811
0
  case GF_ISOM_SUBTYPE_3GP_SMV:
812
0
    szName = "SMVSampleDescriptionBox";
813
0
    if (!p->cfg_3gpp)
814
0
      error = "<!-- INVALID 3GPP Entry: Config not present in Audio Sample Description-->";
815
0
    break;
816
0
  case GF_ISOM_BOX_TYPE_MP4A:
817
0
    szName = "MPEGAudioSampleDescriptionBox";
818
0
    if (!p->esd)
819
0
      error = "<!--INVALID MP4 Entry: ESDBox not present in Audio Sample Description -->";
820
0
    break;
821
0
  case GF_ISOM_BOX_TYPE_AC3:
822
0
    szName = "AC3SampleEntryBox";
823
0
    if (!p->cfg_ac3)
824
0
      error = "<!--INVALID AC3 Entry: AC3Config not present in Audio Sample Description -->";
825
0
    break;
826
0
  case GF_ISOM_BOX_TYPE_EC3:
827
0
    szName = "EC3SampleEntryBox";
828
0
    if (!p->cfg_ac3)
829
0
      error = "<!--INVALID EC3 Entry: AC3Config not present in Audio Sample Description -->";
830
0
    break;
831
0
  case GF_ISOM_BOX_TYPE_AC4:
832
0
    szName = "AC4SampleEntryBox";
833
0
    if (!p->cfg_ac4)
834
0
      error = "<!--INVALID AC4 Entry: AC4Config not present in Audio Sample Description -->";
835
0
    break;
836
0
  case GF_ISOM_BOX_TYPE_MHA1:
837
0
  case GF_ISOM_BOX_TYPE_MHA2:
838
0
    if (!p->cfg_mha)
839
0
      error = "<!--INVALID MPEG-H 3D Audio Entry: MHA config not present in Audio Sample Description -->";
840
0
  case GF_ISOM_BOX_TYPE_MHM1:
841
0
  case GF_ISOM_BOX_TYPE_MHM2:
842
0
    szName = "MHASampleEntry";
843
0
    break;
844
0
  case GF_ISOM_BOX_TYPE_MLPA:
845
0
    if (!p->cfg_mlp)
846
0
      error = "<!--INVALID TrueHD Audio Entry: DMLP config not present in Audio Sample Description -->";
847
0
    szName = "TrueHDSampleEntry";
848
0
    break;
849
0
  default:
850
0
    szName = "AudioSampleDescriptionBox";
851
0
    break;
852
0
  }
853
854
0
  gf_isom_box_dump_start(a, szName, trace);
855
0
  base_audio_entry_dump((GF_AudioSampleEntryBox *)p, trace);
856
0
  gf_fprintf(trace, ">\n");
857
858
0
  if (error) {
859
0
    gf_fprintf(trace, "%s\n", error);
860
0
  }
861
0
  gf_isom_box_dump_done(szName, a, trace);
862
0
  return GF_OK;
863
0
}
864
865
GF_Err gen_sample_entry_box_dump(GF_Box *a, FILE * trace)
866
0
{
867
0
  char *szName;
868
0
  GF_SampleEntryBox *p = (GF_SampleEntryBox *)a;
869
870
0
  switch (p->type) {
871
0
  case GF_QT_SUBTYPE_C608:
872
0
    szName = "ClosedCaption";
873
0
    break;
874
0
  default:
875
0
    szName = "GenericSampleDescriptionBox";
876
0
    break;
877
0
  }
878
879
0
  gf_isom_box_dump_start(a, szName, trace);
880
0
  gf_fprintf(trace, ">\n");
881
0
  gf_isom_box_dump_done(szName, a, trace);
882
0
  return GF_OK;
883
0
}
884
885
static void gnr_dump_exts(u8 *data, u32 data_size, FILE *trace)
886
0
{
887
0
  GF_List *list = NULL;
888
0
  GF_Err e = GF_OK;
889
0
  if (!data) {
890
0
    gf_fprintf(trace, ">\n");
891
0
    return;
892
0
  }
893
894
0
  GF_BitStream *bs = gf_bs_new(data, data_size, GF_BITSTREAM_READ);
895
0
  gf_bs_set_cookie(bs, GF_ISOM_BS_COOKIE_NO_LOGS);
896
0
  while (gf_bs_available(bs)) {
897
0
    GF_Box *abox=NULL;
898
0
    e = gf_isom_box_parse(&abox, bs);
899
0
    if (!abox) break;
900
0
    if (!list) list = gf_list_new();
901
0
    gf_list_add(list, abox);
902
0
  }
903
0
  gf_bs_del(bs);
904
905
0
  if (!e && gf_list_count(list)) {
906
0
    gf_fprintf(trace, ">\n");
907
0
    while (gf_list_count(list)) {
908
0
      GF_Box *a = gf_list_pop_front(list);
909
0
      gf_isom_box_dump_ex(a, trace, GF_FALSE);
910
0
      gf_isom_box_del(a);
911
0
    }
912
0
  } else {
913
0
    dump_data_attribute(trace, " data", data, data_size);
914
0
    gf_fprintf(trace, ">\n");
915
0
  }
916
0
  if (list)
917
0
    gf_isom_box_array_del(list);
918
0
}
919
920
GF_Err gnrm_box_dump(GF_Box *a, FILE * trace)
921
0
{
922
0
  GF_GenericSampleEntryBox *p = (GF_GenericSampleEntryBox *)a;
923
0
  if (p->EntryType) {
924
0
    a->type = p->EntryType;
925
    //don't allow UNKN or UUID as type (possible buffer overflow when typecasting to GF_UnknownBox)
926
0
    if ((a->type==GF_ISOM_BOX_TYPE_UNKNOWN) || (a->type==GF_ISOM_BOX_TYPE_UUID))
927
0
      a->type = GF_4CC('u','k','n','w');
928
0
  }
929
0
  gf_isom_box_dump_start(a, "SampleDescriptionEntryBox", trace);
930
0
  gf_fprintf(trace, "DataReferenceIndex=\"%d\" ExtensionDataSize=\"%d\"", p->dataReferenceIndex, p->data_size);
931
0
  a->type = GF_ISOM_BOX_TYPE_GNRM;
932
0
  gnr_dump_exts(p->data, p->data_size, trace);
933
934
0
  gf_isom_box_dump_done("SampleDescriptionEntryBox", a, trace);
935
0
  return GF_OK;
936
0
}
937
938
GF_Err gnrv_box_dump(GF_Box *a, FILE * trace)
939
0
{
940
0
  GF_GenericVisualSampleEntryBox *p = (GF_GenericVisualSampleEntryBox *)a;
941
0
  if (p->EntryType) {
942
0
    a->type = p->EntryType;
943
    //don't allow UNKN or UUID as type (possible buffer overflow when typecasting to GF_UnknownBox)
944
0
    if ((a->type==GF_ISOM_BOX_TYPE_UNKNOWN) || (a->type==GF_ISOM_BOX_TYPE_UUID))
945
0
      a->type = GF_4CC('u','k','n','w');
946
0
  }
947
0
  gf_isom_box_dump_start(a, "VisualSampleDescriptionBox", trace);
948
0
  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\"",
949
0
          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);
950
951
0
  a->type = GF_ISOM_BOX_TYPE_GNRV;
952
0
  gnr_dump_exts(p->data, p->data_size, trace);
953
954
0
  gf_isom_box_dump_done("VisualSampleDescriptionBox", a, trace);
955
0
  return GF_OK;
956
0
}
957
958
GF_Err gnra_box_dump(GF_Box *a, FILE * trace)
959
0
{
960
0
  GF_GenericAudioSampleEntryBox *p = (GF_GenericAudioSampleEntryBox *)a;
961
0
  if (p->EntryType) {
962
0
    a->type = p->EntryType;
963
    //don't allow UNKN or UUID as type (possible buffer overflow when typecasting to GF_UnknownBox)
964
0
    if ((a->type==GF_ISOM_BOX_TYPE_UNKNOWN) || (a->type==GF_ISOM_BOX_TYPE_UUID))
965
0
      a->type = GF_4CC('u','k','n','w');
966
0
  }
967
0
  gf_isom_box_dump_start(a, "AudioSampleDescriptionBox", trace);
968
0
  gf_fprintf(trace, "DataReferenceIndex=\"%d\" Version=\"%d\" Revision=\"%d\" Vendor=\"%d\" ChannelCount=\"%d\" BitsPerSample=\"%d\" Samplerate=\"%d\"",
969
0
          p->dataReferenceIndex, p->version, p->revision, p->vendor, p->channel_count, p->bitspersample, p->samplerate_hi);
970
971
0
  a->type = GF_ISOM_BOX_TYPE_GNRA;
972
0
  gnr_dump_exts(p->data, p->data_size, trace);
973
974
0
  gf_isom_box_dump_done("AudioSampleDescriptionBox", a, trace);
975
0
  return GF_OK;
976
0
}
977
978
GF_Err edts_box_dump(GF_Box *a, FILE * trace)
979
0
{
980
0
  gf_isom_box_dump_start(a, "EditBox", trace);
981
0
  gf_fprintf(trace, ">\n");
982
0
  gf_isom_box_dump_done("EditBox", a, trace);
983
0
  return GF_OK;
984
0
}
985
986
GF_Err udta_box_dump(GF_Box *a, FILE * trace)
987
0
{
988
0
  GF_UserDataBox *p;
989
0
  GF_UserDataMap *map;
990
0
  u32 i;
991
992
0
  p = (GF_UserDataBox *)a;
993
0
  gf_isom_box_dump_start(a, "UserDataBox", trace);
994
0
  gf_fprintf(trace, ">\n");
995
996
0
  i=0;
997
0
  while ((map = (GF_UserDataMap *)gf_list_enum(p->recordList, &i))) {
998
0
    gf_isom_box_array_dump(map->boxes, trace, a->internal_flags);
999
0
  }
1000
0
  gf_isom_box_dump_done("UserDataBox", a, trace);
1001
0
  return GF_OK;
1002
0
}
1003
1004
GF_Err dref_box_dump(GF_Box *a, FILE * trace)
1005
0
{
1006
//  GF_DataReferenceBox *p = (GF_DataReferenceBox *)a;
1007
0
  gf_isom_box_dump_start(a, "DataReferenceBox", trace);
1008
0
  gf_fprintf(trace, ">\n");
1009
0
  gf_isom_box_dump_done("DataReferenceBox", a, trace);
1010
0
  return GF_OK;
1011
0
}
1012
1013
GF_Err stsd_box_dump(GF_Box *a, FILE * trace)
1014
0
{
1015
0
  GF_SampleDescriptionBox *p = (GF_SampleDescriptionBox *)a;
1016
0
  gf_isom_box_dump_start(a, "SampleDescriptionBox", trace);
1017
0
  if (p->version)
1018
0
    gf_fprintf(trace, " version=\"%d\"", p->version);
1019
0
  gf_fprintf(trace, ">\n");
1020
0
  gf_isom_box_dump_done("SampleDescriptionBox", a, trace);
1021
0
  return GF_OK;
1022
0
}
1023
1024
GF_Err stts_box_dump(GF_Box *a, FILE * trace)
1025
0
{
1026
0
  GF_TimeToSampleBox *p;
1027
0
  u32 i, nb_samples;
1028
1029
0
  if (dump_skip_samples)
1030
0
    return GF_OK;
1031
1032
0
  p = (GF_TimeToSampleBox *)a;
1033
0
  gf_isom_box_dump_start(a, "TimeToSampleBox", trace);
1034
0
  gf_fprintf(trace, "EntryCount=\"%d\">\n", p->nb_entries);
1035
1036
0
  nb_samples = 0;
1037
0
  for (i=0; i<p->nb_entries; i++) {
1038
0
    gf_fprintf(trace, "<TimeToSampleEntry SampleDelta=\"%d\" SampleCount=\"%d\"/>\n", p->entries[i].sampleDelta, p->entries[i].sampleCount);
1039
0
    nb_samples += p->entries[i].sampleCount;
1040
0
  }
1041
0
  if (p->size)
1042
0
    gf_fprintf(trace, "<!-- counted %d samples in STTS entries -->\n", nb_samples);
1043
0
  else
1044
0
    gf_fprintf(trace, "<TimeToSampleEntry SampleDelta=\"\" SampleCount=\"\"/>\n");
1045
1046
0
  gf_isom_box_dump_done("TimeToSampleBox", a, trace);
1047
0
  return GF_OK;
1048
0
}
1049
1050
GF_Err ctts_box_dump(GF_Box *a, FILE * trace)
1051
0
{
1052
0
  GF_CompositionOffsetBox *p;
1053
0
  u32 i, nb_samples;
1054
0
  p = (GF_CompositionOffsetBox *)a;
1055
1056
0
  if (dump_skip_samples)
1057
0
    return GF_OK;
1058
1059
0
  gf_isom_box_dump_start(a, "CompositionOffsetBox", trace);
1060
0
  gf_fprintf(trace, "EntryCount=\"%d\">\n", p->nb_entries);
1061
1062
0
  nb_samples = 0;
1063
0
  for (i=0; i<p->nb_entries; i++) {
1064
0
    gf_fprintf(trace, "<CompositionOffsetEntry CompositionOffset=\"%d\" SampleCount=\"%d\"/>\n", p->entries[i].decodingOffset, p->entries[i].sampleCount);
1065
0
    nb_samples += p->entries[i].sampleCount;
1066
0
  }
1067
0
  if (p->size)
1068
0
    gf_fprintf(trace, "<!-- counted %d samples in CTTS entries -->\n", nb_samples);
1069
0
  else
1070
0
    gf_fprintf(trace, "<CompositionOffsetEntry CompositionOffset=\"\" SampleCount=\"\"/>\n");
1071
1072
0
  gf_isom_box_dump_done("CompositionOffsetBox", a, trace);
1073
0
  return GF_OK;
1074
0
}
1075
1076
GF_Err cslg_box_dump(GF_Box *a, FILE * trace)
1077
0
{
1078
0
  GF_CompositionToDecodeBox *p;
1079
1080
0
  p = (GF_CompositionToDecodeBox *)a;
1081
0
  gf_isom_box_dump_start(a, "CompositionToDecodeBox", trace);
1082
0
  gf_fprintf(trace, "compositionToDTSShift=\"%d\" leastDecodeToDisplayDelta=\"%d\" greatestDecodeToDisplayDelta=\"%d\" compositionStartTime=\"%d\" compositionEndTime=\"%d\">\n", p->compositionToDTSShift, p->leastDecodeToDisplayDelta, p->greatestDecodeToDisplayDelta, p->compositionStartTime, p->compositionEndTime);
1083
0
  gf_isom_box_dump_done("CompositionToDecodeBox", a, trace);
1084
0
  return GF_OK;
1085
0
}
1086
1087
GF_Err ccst_box_dump(GF_Box *a, FILE * trace)
1088
0
{
1089
0
  GF_CodingConstraintsBox *p = (GF_CodingConstraintsBox *)a;
1090
0
  gf_isom_box_dump_start(a, "CodingConstraintsBox", trace);
1091
0
  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);
1092
0
  gf_isom_box_dump_done("CodingConstraintsBox", a, trace);
1093
0
  return GF_OK;
1094
0
}
1095
1096
GF_Err stsh_box_dump(GF_Box *a, FILE * trace)
1097
0
{
1098
0
  GF_ShadowSyncBox *p;
1099
0
  u32 i;
1100
0
  GF_StshEntry *t;
1101
1102
0
  p = (GF_ShadowSyncBox *)a;
1103
0
  gf_isom_box_dump_start(a, "SyncShadowBox", trace);
1104
0
  gf_fprintf(trace, "EntryCount=\"%d\">\n", gf_list_count(p->entries));
1105
0
  i=0;
1106
0
  while ((t = (GF_StshEntry *)gf_list_enum(p->entries, &i))) {
1107
0
    gf_fprintf(trace, "<SyncShadowEntry ShadowedSample=\"%d\" SyncSample=\"%d\"/>\n", t->shadowedSampleNumber, t->syncSampleNumber);
1108
0
  }
1109
0
  if (!p->size) {
1110
0
    gf_fprintf(trace, "<SyncShadowEntry ShadowedSample=\"\" SyncSample=\"\"/>\n");
1111
0
  }
1112
0
  gf_isom_box_dump_done("SyncShadowBox", a, trace);
1113
0
  return GF_OK;
1114
0
}
1115
1116
GF_Err elst_box_dump(GF_Box *a, FILE * trace)
1117
0
{
1118
0
  GF_EditListBox *p;
1119
0
  u32 i;
1120
0
  GF_EdtsEntry *t;
1121
1122
0
  p = (GF_EditListBox *)a;
1123
0
  gf_isom_box_dump_start(a, "EditListBox", trace);
1124
0
  gf_fprintf(trace, "EntryCount=\"%d\">\n", gf_list_count(p->entryList));
1125
1126
0
  i=0;
1127
0
  while ((t = (GF_EdtsEntry *)gf_list_enum(p->entryList, &i))) {
1128
0
    u32 rate_int = t->mediaRate>>16;
1129
0
    u32 rate_frac = t->mediaRate&0xFFFF;
1130
0
    if (rate_frac)
1131
0
      gf_fprintf(trace, "<EditListEntry Duration=\""LLD"\" MediaTime=\""LLD"\" MediaRate=\"%u.%u\"/>\n", t->segmentDuration, t->mediaTime, rate_int, rate_frac*100/0xFFFF);
1132
0
    else
1133
0
      gf_fprintf(trace, "<EditListEntry Duration=\""LLD"\" MediaTime=\""LLD"\" MediaRate=\"%u\"/>\n", t->segmentDuration, t->mediaTime, rate_int);
1134
0
  }
1135
0
  if (!p->size) {
1136
0
    gf_fprintf(trace, "<EditListEntry Duration=\"\" MediaTime=\"\" MediaRate=\"\"/>\n");
1137
0
  }
1138
0
  gf_isom_box_dump_done("EditListBox", a, trace);
1139
0
  return GF_OK;
1140
0
}
1141
1142
GF_Err stsc_box_dump(GF_Box *a, FILE * trace)
1143
0
{
1144
0
  GF_SampleToChunkBox *p;
1145
0
  u32 i, nb_samples;
1146
1147
0
  if (dump_skip_samples)
1148
0
    return GF_OK;
1149
1150
0
  p = (GF_SampleToChunkBox *)a;
1151
0
  gf_isom_box_dump_start(a, "SampleToChunkBox", trace);
1152
0
  gf_fprintf(trace, "EntryCount=\"%d\">\n", p->nb_entries);
1153
1154
0
  nb_samples = 0;
1155
0
  for (i=0; i<p->nb_entries; i++) {
1156
0
    gf_fprintf(trace, "<SampleToChunkEntry FirstChunk=\"%d\" SamplesPerChunk=\"%d\" SampleDescriptionIndex=\"%d\"/>\n", p->entries[i].firstChunk, p->entries[i].samplesPerChunk, p->entries[i].sampleDescriptionIndex);
1157
0
    if (i+1<p->nb_entries) {
1158
0
      nb_samples += (p->entries[i+1].firstChunk - p->entries[i].firstChunk) * p->entries[i].samplesPerChunk;
1159
0
    } else {
1160
0
      nb_samples += p->entries[i].samplesPerChunk;
1161
0
    }
1162
0
  }
1163
0
  if (p->size)
1164
0
    gf_fprintf(trace, "<!-- counted %d samples in STSC entries (could be less than sample count) -->\n", nb_samples);
1165
0
  else
1166
0
    gf_fprintf(trace, "<SampleToChunkEntry FirstChunk=\"\" SamplesPerChunk=\"\" SampleDescriptionIndex=\"\"/>\n");
1167
1168
0
  gf_isom_box_dump_done("SampleToChunkBox", a, trace);
1169
0
  return GF_OK;
1170
0
}
1171
1172
GF_Err stsz_box_dump(GF_Box *a, FILE * trace)
1173
0
{
1174
0
  GF_SampleSizeBox *p;
1175
0
  u32 i;
1176
0
  p = (GF_SampleSizeBox *)a;
1177
0
  if (dump_skip_samples)
1178
0
    return GF_OK;
1179
1180
0
  if (a->type == GF_ISOM_BOX_TYPE_STSZ) {
1181
0
    gf_isom_box_dump_start(a, "SampleSizeBox", trace);
1182
0
  }
1183
0
  else {
1184
0
    gf_isom_box_dump_start(a, "CompactSampleSizeBox", trace);
1185
0
  }
1186
1187
0
  gf_fprintf(trace, "SampleCount=\"%d\"",  p->sampleCount);
1188
0
  if (a->type == GF_ISOM_BOX_TYPE_STSZ) {
1189
0
    if (p->sampleSize) {
1190
0
      gf_fprintf(trace, " ConstantSampleSize=\"%d\"", p->sampleSize);
1191
0
    }
1192
0
  } else {
1193
0
    gf_fprintf(trace, " SampleSizeBits=\"%d\"", p->sampleSize);
1194
0
  }
1195
0
  gf_fprintf(trace, ">\n");
1196
1197
0
  if ((a->type != GF_ISOM_BOX_TYPE_STSZ) || !p->sampleSize) {
1198
0
    if (!p->sizes && p->size) {
1199
0
      gf_fprintf(trace, "<!--WARNING: No Sample Size indications-->\n");
1200
0
    } else if (p->sizes) {
1201
0
      for (i=0; i<p->sampleCount; i++) {
1202
0
        gf_fprintf(trace, "<SampleSizeEntry Size=\"%d\"/>\n", p->sizes[i]);
1203
0
      }
1204
0
    }
1205
0
  }
1206
0
  if (!p->size) {
1207
0
    gf_fprintf(trace, "<SampleSizeEntry Size=\"\"/>\n");
1208
0
  }
1209
0
  gf_isom_box_dump_done((a->type == GF_ISOM_BOX_TYPE_STSZ) ? "SampleSizeBox" : "CompactSampleSizeBox", a, trace);
1210
0
  return GF_OK;
1211
0
}
1212
1213
GF_Err stco_box_dump(GF_Box *a, FILE * trace)
1214
0
{
1215
0
  GF_ChunkOffsetBox *p;
1216
0
  u32 i;
1217
1218
0
  if (dump_skip_samples)
1219
0
    return GF_OK;
1220
1221
0
  p = (GF_ChunkOffsetBox *)a;
1222
0
  gf_isom_box_dump_start(a, "ChunkOffsetBox", trace);
1223
0
  gf_fprintf(trace, "EntryCount=\"%d\">\n", p->nb_entries);
1224
1225
0
  if (!p->offsets && p->size) {
1226
0
    gf_fprintf(trace, "<!--Warning: No Chunk Offsets indications-->\n");
1227
0
  } else if (p->offsets) {
1228
0
    for (i=0; i<p->nb_entries; i++) {
1229
0
      gf_fprintf(trace, "<ChunkEntry offset=\"%u\"/>\n", p->offsets[i]);
1230
0
    }
1231
0
  }
1232
0
  if (!p->size) {
1233
0
    gf_fprintf(trace, "<ChunkEntry offset=\"\"/>\n");
1234
0
  }
1235
0
  gf_isom_box_dump_done("ChunkOffsetBox", a, trace);
1236
0
  return GF_OK;
1237
0
}
1238
1239
GF_Err stss_box_dump(GF_Box *a, FILE * trace)
1240
0
{
1241
0
  GF_SyncSampleBox *p;
1242
0
  u32 i;
1243
0
  const char *name, *entname;
1244
1245
0
  if (dump_skip_samples)
1246
0
    return GF_OK;
1247
1248
0
  p = (GF_SyncSampleBox *)a;
1249
0
  if (a->type==GF_ISOM_BOX_TYPE_STSS) {
1250
0
    name = "SyncSampleBox";
1251
0
    entname = "SyncSampleEntry";
1252
0
  } else {
1253
0
    name = "PartialSyncSampleBox";
1254
0
    entname = "PartialSyncSampleEntry";
1255
0
  }
1256
0
  gf_isom_box_dump_start(a, name, trace);
1257
0
  gf_fprintf(trace, "EntryCount=\"%d\">\n", p->nb_entries);
1258
1259
0
  if (!p->sampleNumbers && p->size) {
1260
0
    if (a->type==GF_ISOM_BOX_TYPE_STSS)
1261
0
      gf_fprintf(trace, "<!--Warning: No Key Frames indications-->\n");
1262
0
  } else if (p->sampleNumbers) {
1263
0
    for (i=0; i<p->nb_entries; i++) {
1264
0
      gf_fprintf(trace, "<%s sampleNumber=\"%u\"/>\n", entname, p->sampleNumbers[i]);
1265
0
    }
1266
0
  }
1267
0
  if (!p->size) {
1268
0
      gf_fprintf(trace, "<%s sampleNumber=\"\"/>\n", entname);
1269
0
  }
1270
0
  gf_isom_box_dump_done(name, a, trace);
1271
0
  return GF_OK;
1272
0
}
1273
1274
GF_Err stdp_box_dump(GF_Box *a, FILE * trace)
1275
0
{
1276
0
  GF_DegradationPriorityBox *p;
1277
0
  u32 i;
1278
1279
0
  if (dump_skip_samples)
1280
0
    return GF_OK;
1281
1282
0
  p = (GF_DegradationPriorityBox *)a;
1283
0
  gf_isom_box_dump_start(a, "DegradationPriorityBox", trace);
1284
0
  gf_fprintf(trace, "EntryCount=\"%d\">\n", p->nb_entries);
1285
1286
0
  if (!p->priorities && p->size) {
1287
0
    gf_fprintf(trace, "<!--Warning: No Degradation Priority indications-->\n");
1288
0
  } else if (p->priorities) {
1289
0
    for (i=0; i<p->nb_entries; i++) {
1290
0
      gf_fprintf(trace, "<DegradationPriorityEntry DegradationPriority=\"%d\"/>\n", p->priorities[i]);
1291
0
    }
1292
0
  }
1293
0
  if (!p->size) {
1294
0
    gf_fprintf(trace, "<DegradationPriorityEntry DegradationPriority=\"\"/>\n");
1295
0
  }
1296
0
  gf_isom_box_dump_done("DegradationPriorityBox", a, trace);
1297
0
  return GF_OK;
1298
0
}
1299
1300
GF_Err sdtp_box_dump(GF_Box *a, FILE * trace)
1301
0
{
1302
0
  GF_SampleDependencyTypeBox *p;
1303
0
  u32 i;
1304
1305
0
  if (dump_skip_samples)
1306
0
    return GF_OK;
1307
1308
0
  p = (GF_SampleDependencyTypeBox*)a;
1309
0
  gf_isom_box_dump_start(a, "SampleDependencyTypeBox", trace);
1310
0
  gf_fprintf(trace, "SampleCount=\"%d\">\n", p->sampleCount);
1311
1312
0
  if (!p->sample_info) {
1313
0
    gf_fprintf(trace, "<!--Warning: No sample dependencies indications-->\n");
1314
0
  } else {
1315
0
    for (i=0; i<p->sampleCount; i++) {
1316
0
      const char *type;
1317
0
      u8 flag = p->sample_info[i];
1318
0
      gf_fprintf(trace, "<SampleDependencyEntry ");
1319
0
      switch ( (flag >> 6) & 3) {
1320
0
      case 1: type="openGOP"; break;
1321
0
      case 2: type="no"; break;
1322
0
      case 3: type="SAP2"; break;
1323
0
      default:
1324
0
      case 0: type="unknown"; break;
1325
0
      }
1326
0
      gf_fprintf(trace, "isLeading=\"%s\" ", type);
1327
1328
0
      switch ( (flag >> 4) & 3) {
1329
0
      case 1: type="yes"; break;
1330
0
      case 2: type="no"; break;
1331
0
      case 3: type="RESERVED"; break;
1332
0
      default:
1333
0
      case 0: type="unknown"; break;
1334
0
      }
1335
0
      gf_fprintf(trace, "dependsOnOther=\"%s\" ", type);
1336
1337
0
      switch ( (flag >> 2) & 3) {
1338
0
      case 1: type="yes"; break;
1339
0
      case 2: type="no"; break;
1340
0
      case 3: type="RESERVED"; break;
1341
0
      default:
1342
0
      case 0: type="unknown"; break;
1343
0
      }
1344
0
      gf_fprintf(trace, "dependedOn=\"%s\" ", type);
1345
1346
0
      switch ( flag & 3) {
1347
0
      case 1: type="yes"; break;
1348
0
      case 2: type="no"; break;
1349
0
      case 3: type="RESERVED"; break;
1350
0
      default:
1351
0
      case 0: type="unknown"; break;
1352
0
      }
1353
0
      gf_fprintf(trace, "hasRedundancy=\"%s\"/>\n", type);
1354
0
    }
1355
0
  }
1356
0
  if (!p->size) {
1357
0
    gf_fprintf(trace, "<SampleDependencyEntry dependsOnOther=\"unknown|yes|no|RESERVED\" dependedOn=\"unknown|yes|no|RESERVED\" hasRedundancy=\"unknown|yes|no|RESERVED\"/>\n");
1358
0
  }
1359
0
  gf_isom_box_dump_done("SampleDependencyTypeBox", a, trace);
1360
0
  return GF_OK;
1361
0
}
1362
1363
GF_Err co64_box_dump(GF_Box *a, FILE * trace)
1364
0
{
1365
0
  GF_ChunkLargeOffsetBox *p;
1366
0
  u32 i;
1367
1368
0
  if (dump_skip_samples)
1369
0
    return GF_OK;
1370
1371
0
  p = (GF_ChunkLargeOffsetBox *)a;
1372
0
  gf_isom_box_dump_start(a, "ChunkLargeOffsetBox", trace);
1373
0
  gf_fprintf(trace, "EntryCount=\"%d\">\n", p->nb_entries);
1374
1375
0
  if (!p->offsets && p->size) {
1376
0
    gf_fprintf(trace, "<!-- Warning: No Chunk Offsets indications/>\n");
1377
0
  } else if (p->offsets) {
1378
0
    for (i=0; i<p->nb_entries; i++)
1379
0
      gf_fprintf(trace, "<ChunkOffsetEntry offset=\""LLU"\"/>\n", p->offsets[i]);
1380
0
  }
1381
0
  if (!p->size) {
1382
0
    gf_fprintf(trace, "<ChunkOffsetEntry offset=\"\"/>\n");
1383
0
  }
1384
0
  gf_isom_box_dump_done("ChunkLargeOffsetBox", a, trace);
1385
0
  return GF_OK;
1386
0
}
1387
1388
GF_Err esds_box_dump(GF_Box *a, FILE * trace)
1389
0
{
1390
0
  GF_ESDBox *p;
1391
1392
0
  p = (GF_ESDBox *)a;
1393
0
  gf_isom_box_dump_start(a, "MPEG4ESDescriptorBox", trace);
1394
0
  gf_fprintf(trace, ">\n");
1395
1396
0
  if (p->desc) {
1397
0
#ifndef GPAC_DISABLE_OD_DUMP
1398
0
    gf_odf_dump_desc((GF_Descriptor *) p->desc, trace, 1, GF_TRUE);
1399
#else
1400
    gf_fprintf(trace, "<!-- Object Descriptor Dumping disabled in this build of GPAC -->\n");
1401
#endif
1402
0
  } else if (p->size) {
1403
0
    gf_fprintf(trace, "<!--INVALID MP4 FILE: ESD not present in MPEG Sample Description or corrupted-->\n");
1404
0
  }
1405
0
  gf_isom_box_dump_done("MPEG4ESDescriptorBox", a, trace);
1406
0
  return GF_OK;
1407
0
}
1408
1409
GF_Err minf_box_dump(GF_Box *a, FILE * trace)
1410
0
{
1411
0
  gf_isom_box_dump_start(a, "MediaInformationBox", trace);
1412
0
  gf_fprintf(trace, ">\n");
1413
0
  gf_isom_box_dump_done("MediaInformationBox", a, trace);
1414
0
  return GF_OK;
1415
0
}
1416
1417
GF_Err tkhd_box_dump(GF_Box *a, FILE * trace)
1418
0
{
1419
0
  GF_TrackHeaderBox *p;
1420
0
  p = (GF_TrackHeaderBox *)a;
1421
0
  gf_isom_box_dump_start(a, "TrackHeaderBox", trace);
1422
1423
0
  gf_fprintf(trace, "CreationTime=\""LLD"\" ModificationTime=\""LLD"\" TrackID=\"%u\" Duration=\""LLD"\"",
1424
0
      p->creationTime, p->modificationTime, p->trackID, p->duration);
1425
1426
0
  if (p->alternate_group) gf_fprintf(trace, " AlternateGroupID=\"%d\"", p->alternate_group);
1427
0
  if (p->volume) {
1428
0
    gf_fprintf(trace, " Volume=\"%.2f\"", (Float)p->volume / 256);
1429
0
  } else if (p->width || p->height) {
1430
0
    gf_fprintf(trace, " Width=\"%.2f\" Height=\"%.2f\"", (Float)p->width / 65536, (Float)p->height / 65536);
1431
0
    if (p->layer) gf_fprintf(trace, " Layer=\"%d\"", p->layer);
1432
0
  }
1433
0
  gf_fprintf(trace, ">\n");
1434
0
  if (p->width || p->height) {
1435
0
    gf_fprintf(trace, "<Matrix m11=\"0x%.8x\" m12=\"0x%.8x\" m13=\"0x%.8x\" ", p->matrix[0], p->matrix[1], p->matrix[2]);
1436
0
    gf_fprintf(trace, "m21=\"0x%.8x\" m22=\"0x%.8x\" m23=\"0x%.8x\" ", p->matrix[3], p->matrix[4], p->matrix[5]);
1437
0
    gf_fprintf(trace, "m31=\"0x%.8x\" m32=\"0x%.8x\" m33=\"0x%.8x\"/>\n", p->matrix[6], p->matrix[7], p->matrix[8]);
1438
0
  }
1439
1440
0
  gf_isom_box_dump_done("TrackHeaderBox", a, trace);
1441
0
  return GF_OK;
1442
0
}
1443
1444
GF_Err tref_box_dump(GF_Box *a, FILE * trace)
1445
0
{
1446
0
  gf_isom_box_dump_start(a, "TrackReferenceBox", trace);
1447
0
  gf_fprintf(trace, ">\n");
1448
0
  gf_isom_box_dump_done("TrackReferenceBox", a, trace);
1449
0
  return GF_OK;
1450
0
}
1451
1452
GF_Err mdia_box_dump(GF_Box *a, FILE * trace)
1453
0
{
1454
0
  gf_isom_box_dump_start(a, "MediaBox", trace);
1455
0
  gf_fprintf(trace, ">\n");
1456
0
  gf_isom_box_dump_done("MediaBox", a, trace);
1457
0
  return GF_OK;
1458
0
}
1459
1460
GF_Err mfra_box_dump(GF_Box *a, FILE * trace)
1461
0
{
1462
0
  gf_isom_box_dump_start(a, "MovieFragmentRandomAccessBox", trace);
1463
0
  gf_fprintf(trace, ">\n");
1464
0
  gf_isom_box_dump_done("MovieFragmentRandomAccessBox", a, trace);
1465
0
  return GF_OK;
1466
0
}
1467
1468
GF_Err tfra_box_dump(GF_Box *a, FILE * trace)
1469
0
{
1470
0
  u32 i;
1471
0
  GF_TrackFragmentRandomAccessBox *p = (GF_TrackFragmentRandomAccessBox *)a;
1472
0
  gf_isom_box_dump_start(a, "TrackFragmentRandomAccessBox", trace);
1473
0
  gf_fprintf(trace, "TrackId=\"%u\" number_of_entries=\"%u\">\n", p->track_id, p->nb_entries);
1474
0
  for (i=0; i<p->nb_entries; i++) {
1475
0
    gf_fprintf(trace, "<RandomAccessEntry time=\""LLU"\" moof_offset=\""LLU"\" traf=\"%u\" trun=\"%u\" sample=\"%u\"/>\n",
1476
0
      p->entries[i].time, p->entries[i].moof_offset,
1477
0
      p->entries[i].traf_number, p->entries[i].trun_number, p->entries[i].sample_number);
1478
0
  }
1479
0
  if (!p->size) {
1480
0
    gf_fprintf(trace, "<RandomAccessEntry time=\"\" moof_offset=\"\" traf=\"\" trun=\"\" sample=\"\"/>\n");
1481
0
  }
1482
0
  gf_isom_box_dump_done("TrackFragmentRandomAccessBox", a, trace);
1483
0
  return GF_OK;
1484
0
}
1485
1486
GF_Err mfro_box_dump(GF_Box *a, FILE * trace)
1487
0
{
1488
0
  GF_MovieFragmentRandomAccessOffsetBox *p = (GF_MovieFragmentRandomAccessOffsetBox *)a;
1489
1490
0
  gf_isom_box_dump_start(a, "MovieFragmentRandomAccessOffsetBox", trace);
1491
1492
0
  gf_fprintf(trace, "container_size=\"%d\" >\n", p->container_size);
1493
0
  gf_isom_box_dump_done("MovieFragmentRandomAccessOffsetBox", a, trace);
1494
0
  return GF_OK;
1495
0
}
1496
1497
1498
GF_Err elng_box_dump(GF_Box *a, FILE * trace)
1499
0
{
1500
0
  GF_ExtendedLanguageBox *p = (GF_ExtendedLanguageBox *)a;
1501
0
  gf_isom_box_dump_start(a, "ExtendedLanguageBox", trace);
1502
0
  gf_fprintf(trace, "LanguageCode=\"%s\">\n", p->extended_language);
1503
0
  gf_isom_box_dump_done("ExtendedLanguageBox", a, trace);
1504
0
  return GF_OK;
1505
0
}
1506
1507
#define get_and_print(name, bits) \
1508
0
  val = gf_bs_read_int(bs, bits); \
1509
0
  gf_fprintf(trace, " "name"=\"%u\"", val);\
1510
1511
#define get_4cc_and_print(name, bits) \
1512
0
  val = gf_bs_read_int(bs, bits); \
1513
0
  gf_fprintf(trace, " "name"=\"%s\"", gf_4cc_to_str(val) );\
1514
1515
static GF_Err dump_alac(GF_UnknownBox *u, FILE * trace)
1516
0
{
1517
0
  u32 val;
1518
0
  GF_BitStream *bs = gf_bs_new(u->data, u->dataSize, GF_BITSTREAM_READ);
1519
0
  gf_isom_box_dump_start((GF_Box *)u, "ALACConfigurationBox", trace);
1520
1521
0
  get_and_print("version", 32)
1522
0
  get_and_print("frameLength", 32)
1523
0
  get_and_print("compatibleVersion", 8)
1524
0
  get_and_print("bitDepth", 8)
1525
0
  get_and_print("pb", 8)
1526
0
  get_and_print("mb", 8)
1527
0
  get_and_print("kb", 8)
1528
0
  get_and_print("numChannels", 8)
1529
0
  get_and_print("maxRun", 16)
1530
0
  get_and_print("maxFrameBytes", 32)
1531
0
  get_and_print("avgBitRate", 32)
1532
0
  get_and_print("sampleRate", 32)
1533
1534
0
  gf_bs_del(bs);
1535
0
  gf_fprintf(trace, ">\n");
1536
0
  gf_isom_box_dump_done("ALACConfigurationBox", (GF_Box *)u, trace);
1537
0
  return GF_OK;
1538
0
}
1539
1540
1541
static GF_Err dump_uncc(GF_UnknownBox *u, FILE * trace)
1542
0
{
1543
0
  u32 val, nb_comps, i;
1544
0
  GF_BitStream *bs = gf_bs_new(u->data, u->dataSize, GF_BITSTREAM_READ);
1545
0
  gf_isom_box_dump_start((GF_Box *)u, "UncompressedFrameConfigBox", trace);
1546
  //full box
1547
0
  get_and_print("version", 8)
1548
0
  get_and_print("flags", 24)
1549
0
  get_4cc_and_print("profile", 32)
1550
1551
0
  nb_comps = gf_bs_read_u32(bs);
1552
0
  gf_bs_skip_bytes(bs, 5*nb_comps);
1553
1554
0
  get_and_print("sampling_type", 8)
1555
0
  get_and_print("interleave_type", 8)
1556
0
  get_and_print("block_size", 8)
1557
0
  get_and_print("components_little_endian", 1)
1558
0
  get_and_print("block_pad_lsb", 1)
1559
0
  get_and_print("block_little_endian", 1)
1560
0
  get_and_print("block_reversed", 1)
1561
0
  get_and_print("pad_unknown", 1)
1562
0
  get_and_print("reserved", 3)
1563
0
  get_and_print("pixel_size", 32)
1564
0
  get_and_print("row_align_size", 32)
1565
0
  get_and_print("tile_align_size", 32)
1566
0
  get_and_print("num_tile_cols_minus_one", 32)
1567
0
  get_and_print("num_tile_rows_minus_one", 32)
1568
1569
0
  gf_fprintf(trace, ">\n");
1570
0
  gf_bs_seek(bs, 12);
1571
0
  for (i=0; i<nb_comps; i++) {
1572
0
    gf_fprintf(trace, "<ComponentInfo");
1573
0
    get_and_print("index", 16)
1574
0
    get_and_print("bit_depth_minus_one", 8)
1575
0
    get_and_print("format", 8)
1576
0
    get_and_print("align_size", 8)
1577
0
    gf_fprintf(trace, "/>\n");
1578
0
  }
1579
1580
0
  gf_bs_del(bs);
1581
0
  gf_isom_box_dump_done("UncompressedFrameConfigBox", (GF_Box *)u, trace);
1582
0
  return GF_OK;
1583
0
}
1584
1585
static char *ctyp_names[] = {"Monochrome", "Y", "U/Cb", "V/Cr", "Red", "Green", "Blue", "Alpha", "Depth", "Disparity", "Palette", "FilterArray",
1586
  "padded", "Cyan", "Magenta", "Yellow", "KeyBlack"};
1587
1588
static const char *get_comp_type_name(u32 ctype)
1589
0
{
1590
0
  u32 nb_cnames = GF_ARRAY_LENGTH(ctyp_names);
1591
0
  if (ctype<nb_cnames) return ctyp_names[ctype];
1592
0
  return "unknown";
1593
0
}
1594
1595
static GF_Err dump_cmpd(GF_UnknownBox *u, FILE * trace)
1596
0
{
1597
0
  u32 nb_comps, i;
1598
0
  GF_BitStream *bs = gf_bs_new(u->data, u->dataSize, GF_BITSTREAM_READ);
1599
0
  gf_isom_box_dump_start((GF_Box *)u, "ComponentDefinitionBox", trace);
1600
1601
0
  nb_comps = gf_bs_read_u32(bs);
1602
0
  gf_fprintf(trace, ">\n");
1603
0
  for (i=0; i<nb_comps; i++) {
1604
0
    gf_fprintf(trace, "<Component");
1605
0
    u32 ctype = gf_bs_read_u16(bs);
1606
0
    if (ctype<0x8000) {
1607
0
      gf_fprintf(trace, " type=\"%u\" name=\"%s\"", ctype, get_comp_type_name(ctype));
1608
0
    } else {
1609
0
      char *comp_uri = gf_bs_read_utf8(bs);
1610
0
      if (comp_uri) {
1611
0
        gf_fprintf(trace, " URI=\"%s\"", comp_uri);
1612
0
        gf_free(comp_uri);
1613
0
      }
1614
0
    }
1615
0
    gf_fprintf(trace, "/>\n");
1616
0
  }
1617
0
  gf_bs_del(bs);
1618
0
  gf_isom_box_dump_done("ComponentDefinitionBox", (GF_Box *)u, trace);
1619
0
  return GF_OK;
1620
0
}
1621
1622
typedef struct {
1623
  u32 type;
1624
  u32 bits;
1625
} CompInfo;
1626
1627
static GF_Err dump_cpal(GF_UnknownBox *u, FILE * trace)
1628
0
{
1629
0
  u32 val, nb_comps, nb_vals, j, i;
1630
0
  CompInfo *types=NULL;
1631
0
  GF_BitStream *bs = gf_bs_new(u->data, u->dataSize, GF_BITSTREAM_READ);
1632
0
  gf_isom_box_dump_start((GF_Box *)u, "ComponentPaletteBox", trace);
1633
1634
  //full box
1635
0
  get_and_print("version", 8)
1636
0
  get_and_print("flags", 24)
1637
0
  gf_fprintf(trace, ">\n");
1638
1639
0
  nb_comps = gf_bs_read_u16(bs);
1640
0
  if (16*nb_comps > gf_bs_available(bs)) {
1641
0
    gf_bs_del(bs);
1642
0
    gf_isom_box_dump_done("ComponentPaletteBox", (GF_Box *)u, trace);
1643
0
    return GF_ISOM_INVALID_MEDIA;
1644
0
  }
1645
0
  types = gf_malloc(sizeof(CompInfo) * nb_comps);
1646
0
  if (!types) {
1647
0
    gf_bs_del(bs);
1648
0
    gf_isom_box_dump_done("ComponentPaletteBox", (GF_Box *)u, trace);
1649
0
    return GF_OUT_OF_MEM;
1650
0
  }
1651
0
  for (i=0; i<nb_comps; i++) {
1652
0
    gf_fprintf(trace, "<Component");
1653
0
    get_and_print("index", 32)
1654
0
    types[i].bits = 1 + gf_bs_read_int(bs, 8);
1655
0
    types[i].type = gf_bs_read_int(bs, 8);
1656
0
    gf_fprintf(trace, " bit_depth=\"%u\" type=\"%u\" name=\"%s\"/>\n", types[i].bits, types[i].type, get_comp_type_name(types[i].type) );
1657
0
  }
1658
0
  nb_vals = gf_bs_read_u32(bs);
1659
0
  if (nb_vals/8 > gf_bs_available(bs)) {
1660
0
    gf_free(types);
1661
0
    gf_bs_del(bs);
1662
0
    gf_isom_box_dump_done("ComponentPaletteBox", (GF_Box *)u, trace);
1663
0
    return GF_ISOM_INVALID_MEDIA;
1664
0
  }
1665
0
  for (j=0; j<nb_vals; j++) {
1666
0
    gf_fprintf(trace, "<ComponentValue");
1667
0
    for (i=0; i<nb_comps; i++) {
1668
0
      char szTmp[100];
1669
0
      szTmp[0] = 0;
1670
0
      switch (types[i].type) {
1671
0
      case 0:
1672
0
        snprintf(szTmp, GF_ARRAY_LENGTH(szTmp), " C%d=\"%u\"", i+1, gf_bs_read_int(bs, types[i].bits));
1673
0
        break;
1674
0
      case 1:
1675
0
        if (types[i].bits==32)
1676
0
          snprintf(szTmp, GF_ARRAY_LENGTH(szTmp), " C%d=\"%g\"", i+1, gf_bs_read_float(bs));
1677
0
        else if (types[i].bits==64)
1678
0
          snprintf(szTmp, GF_ARRAY_LENGTH(szTmp), " C%d=\"%g\"", i+1, gf_bs_read_double(bs));
1679
0
        else
1680
0
          snprintf(szTmp, GF_ARRAY_LENGTH(szTmp), " C%d=\"0x%X\"", i+1, gf_bs_read_int(bs, types[i].bits));
1681
0
        break;
1682
0
      case 2:
1683
0
        if (types[i].bits==64)
1684
0
          snprintf(szTmp, GF_ARRAY_LENGTH(szTmp), " C%d=\"%g + %gi\"", i+1, gf_bs_read_float(bs), gf_bs_read_float(bs));
1685
0
        else if (types[i].bits==128) {
1686
0
          snprintf(szTmp, GF_ARRAY_LENGTH(szTmp), " C%d=\"%g + %gi\"", i+1, gf_bs_read_double(bs), gf_bs_read_double(bs));
1687
0
        }
1688
0
        else
1689
0
          snprintf(szTmp, GF_ARRAY_LENGTH(szTmp), " C%d=\"0x%X + 0x%Xi\"", i+1, gf_bs_read_int(bs, types[i].bits/2), gf_bs_read_int(bs, types[i].bits/2) );
1690
0
        break;
1691
0
      default:
1692
0
        snprintf(szTmp, GF_ARRAY_LENGTH(szTmp), " C%d=\"invalid", i+1);
1693
0
        break;
1694
0
      }
1695
0
      gf_fprintf(trace, "%s", szTmp);
1696
0
    }
1697
0
    gf_fprintf(trace, "/>\n");
1698
0
  }
1699
1700
0
  gf_bs_del(bs);
1701
0
  gf_free(types);
1702
0
  gf_isom_box_dump_done("ComponentPaletteBox", (GF_Box *)u, trace);
1703
0
  return GF_OK;
1704
1705
0
}
1706
1707
static GF_Err dump_cpat(GF_UnknownBox *u, FILE * trace)
1708
0
{
1709
0
  u32 val, pw, ph, j, i;
1710
0
  GF_BitStream *bs = gf_bs_new(u->data, u->dataSize, GF_BITSTREAM_READ);
1711
0
  gf_isom_box_dump_start((GF_Box *)u, "ComponentPatternBox", trace);
1712
1713
  //full box
1714
0
  get_and_print("version", 8)
1715
0
  get_and_print("flags", 24)
1716
0
  get_and_print("pattern_width", 16)
1717
0
  pw = val;
1718
0
  get_and_print("pattern_height", 16)
1719
0
  ph = val;
1720
0
  gf_fprintf(trace, ">\n");
1721
0
  for (i=0; i<pw; i++) {
1722
0
    for (j=0; j<ph; j++) {
1723
0
      gf_fprintf(trace, "<Component x=\"%d\" y=\"%d\"", i, j);
1724
0
      get_and_print("index", 32)
1725
0
      gf_fprintf(trace, " gain=\"%g\"/>\n", gf_bs_read_float(bs) );
1726
0
    }
1727
0
  }
1728
0
  gf_bs_del(bs);
1729
0
  gf_isom_box_dump_done("ComponentPatternBox", (GF_Box *)u, trace);
1730
0
  return GF_OK;
1731
0
}
1732
1733
static GF_Err dump_sbpm(GF_UnknownBox *u, FILE * trace)
1734
0
{
1735
0
  u32 val, i, nb_comp, nb_r, nb_c, nb_p;
1736
0
  GF_BitStream *bs = gf_bs_new(u->data, u->dataSize, GF_BITSTREAM_READ);
1737
0
  gf_isom_box_dump_start((GF_Box *)u, "SensorBadPixelsMap", trace);
1738
1739
  //full box
1740
0
  get_and_print("version", 8)
1741
0
  get_and_print("flags", 24)
1742
0
  get_and_print("component_count", 32)
1743
0
  nb_comp = val;
1744
0
  if (nb_comp) {
1745
0
    gf_fprintf(trace, " components_indices=\"");
1746
0
    for (i=0; i<nb_comp; i++) {
1747
0
      gf_fprintf(trace, "%u ", gf_bs_read_u32(bs));
1748
0
    }
1749
0
    gf_fprintf(trace, "\"");
1750
0
  }
1751
0
  get_and_print("correction_applied", 1)
1752
0
  gf_bs_read_int(bs, 7);
1753
0
  nb_r = gf_bs_read_u32(bs);
1754
0
  nb_c = gf_bs_read_u32(bs);
1755
0
  nb_p = gf_bs_read_u32(bs);
1756
1757
0
  if (nb_r) {
1758
0
    gf_fprintf(trace, " bad_rows=\"");
1759
0
    for (i=0; i<nb_r; i++) {
1760
0
      gf_fprintf(trace, "%u ", gf_bs_read_u32(bs));
1761
0
    }
1762
0
    gf_fprintf(trace, "\"");
1763
0
  }
1764
0
  if (nb_c) {
1765
0
    gf_fprintf(trace, " bad_cols=\"");
1766
0
    for (i=0; i<nb_c; i++) {
1767
0
      gf_fprintf(trace, "%u ", gf_bs_read_u32(bs));
1768
0
    }
1769
0
    gf_fprintf(trace, "\"");
1770
0
  }
1771
0
  if (nb_p) {
1772
0
    gf_fprintf(trace, " bad_pixels=\"");
1773
0
    for (i=0; i<nb_c; i++) {
1774
0
      u32 x=gf_bs_read_u32(bs);
1775
0
      u32 y=gf_bs_read_u32(bs);
1776
0
      gf_fprintf(trace, "%ux%u ", x, y);
1777
0
    }
1778
0
    gf_fprintf(trace, "\"");
1779
0
  }
1780
0
  gf_fprintf(trace, ">\n");
1781
0
  gf_bs_del(bs);
1782
0
  gf_isom_box_dump_done("SensorBadPixelsMap", (GF_Box *)u, trace);
1783
0
  return GF_OK;
1784
0
}
1785
1786
static GF_Err dump_cloc(GF_UnknownBox *u, FILE * trace)
1787
0
{
1788
0
  u32 val;
1789
0
  GF_BitStream *bs = gf_bs_new(u->data, u->dataSize, GF_BITSTREAM_READ);
1790
0
  gf_isom_box_dump_start((GF_Box *)u, "ChromaLocationBox", trace);
1791
1792
  //full box
1793
0
  get_and_print("version", 8)
1794
0
  get_and_print("flags", 24)
1795
0
  get_and_print("chroma_location", 8)
1796
0
  gf_fprintf(trace, ">\n");
1797
0
  gf_bs_del(bs);
1798
0
  gf_isom_box_dump_done("ChromaLocationBox", (GF_Box *)u, trace);
1799
0
  return GF_OK;
1800
0
}
1801
1802
static GF_Err dump_taic(GF_UnknownBox *u, FILE * trace)
1803
0
{
1804
0
  u32 val;
1805
0
  GF_BitStream *bs = gf_bs_new(u->data, u->dataSize, GF_BITSTREAM_READ);
1806
0
  gf_isom_box_dump_start((GF_Box *)u, "TAIClockInfoBox", trace);
1807
1808
  //full box
1809
0
  get_and_print("version", 8)
1810
0
  get_and_print("flags", 24)
1811
0
  get_and_print("time_uncertainty", 64)
1812
0
  get_and_print("clock_resolution", 32)
1813
0
  s32 clock_drift_rate = (s32)(gf_bs_read_int(bs, 32));
1814
0
  gf_fprintf(trace, " \"clock_drift_rate\"%d\"", clock_drift_rate);
1815
0
  get_and_print("clock_type", 2)
1816
0
  gf_fprintf(trace, ">\n");
1817
0
  gf_bs_del(bs);
1818
0
  gf_isom_box_dump_done("TAIClockInfoBox", (GF_Box *)u, trace);
1819
0
  return GF_OK;
1820
0
}
1821
1822
static GF_Err dump_itai(GF_UnknownBox *u, FILE * trace)
1823
0
{
1824
0
  u32 val;
1825
0
  GF_BitStream *bs = gf_bs_new(u->data, u->dataSize, GF_BITSTREAM_READ);
1826
0
  gf_isom_box_dump_start((GF_Box *)u, "TAITimestampBox", trace);
1827
1828
  //full box
1829
0
  get_and_print("version", 8)
1830
0
  get_and_print("flags", 24)
1831
0
  get_and_print("TAI_timestamp", 64)
1832
0
  get_and_print("synchronization_state", 1)
1833
0
  get_and_print("timestamp_generation_failure", 1)
1834
0
  get_and_print("timestamp_is_modified", 1)
1835
0
  gf_fprintf(trace, ">\n");
1836
0
  gf_bs_del(bs);
1837
0
  gf_isom_box_dump_done("TAITimestampBox", (GF_Box *)u, trace);
1838
0
  return GF_OK;
1839
0
}
1840
1841
static GF_Err dump_cmpc(GF_UnknownBox *u, FILE * trace)
1842
0
{
1843
0
  u32 val;
1844
0
  GF_BitStream *bs = gf_bs_new(u->data, u->dataSize, GF_BITSTREAM_READ);
1845
0
  gf_isom_box_dump_start((GF_Box *)u, "CompressionConfigurationBox", trace);
1846
1847
  //full box
1848
0
  get_and_print("version", 8)
1849
0
  get_and_print("flags", 24)
1850
0
  get_4cc_and_print("compression_type", 32)
1851
  // Check if this is in the final must_decompress_individual_units
1852
0
  get_and_print("must_decompress_individual_units", 1);
1853
0
  get_and_print("compressed_unit_type", 7)
1854
0
  gf_fprintf(trace, ">\n");
1855
0
  gf_bs_del(bs);
1856
0
  gf_isom_box_dump_done("CompressionConfigurationBox", (GF_Box *)u, trace);
1857
0
  return GF_OK;
1858
0
}
1859
1860
static GF_Err dump_fpac(GF_UnknownBox *u, FILE * trace)
1861
0
{
1862
0
  u32 val;
1863
0
  GF_BitStream *bs = gf_bs_new(u->data, u->dataSize, GF_BITSTREAM_READ);
1864
0
  gf_isom_box_dump_start((GF_Box *)u, "FramePackingInfoBox", trace);
1865
1866
  //full box
1867
0
  get_and_print("version", 8)
1868
0
  get_and_print("flags", 24)
1869
0
  get_and_print("video_frame_packing", 4)
1870
0
  get_and_print("PackedContentInterpretationType", 4)
1871
0
  get_and_print("QuincunxSamplingFlag", 1)
1872
0
  gf_fprintf(trace, ">\n");
1873
0
  gf_bs_del(bs);
1874
0
  gf_isom_box_dump_done("FramePackingInfoBox", (GF_Box *)u, trace);
1875
0
  return GF_OK;
1876
0
}
1877
1878
1879
static GF_Err dump_gmcc(GF_UnknownBox *u, FILE * trace)
1880
0
{
1881
0
  u32 val, pos;
1882
0
  GF_BitStream *bs = gf_bs_new(u->data, u->dataSize, GF_BITSTREAM_READ);
1883
0
  gf_isom_box_dump_start((GF_Box *)u, "GPACMetaCodecWrapperConfigBox", trace);
1884
1885
0
  get_4cc_and_print("gpac_codec_id", 32)
1886
0
  get_4cc_and_print("meta_codec_id", 32)
1887
0
  u8 *cname = gf_bs_read_utf8(bs);
1888
0
  if (cname) {
1889
0
    gf_fprintf(trace, " codec_name=\"%s\"", cname);
1890
0
    gf_free(cname);
1891
0
  }
1892
0
  get_and_print("meta_opaque", 32)
1893
0
  pos = (u32) gf_bs_get_position(bs);
1894
0
  dump_data_attribute(trace, "decoderSpecificInfo", u->data+pos, u->dataSize-pos);
1895
0
  gf_bs_del(bs);
1896
0
  gf_fprintf(trace, ">\n");
1897
0
  gf_isom_box_dump_done("GPACMetaCodecWrapperConfigBox", (GF_Box *)u, trace);
1898
0
  return GF_OK;
1899
0
}
1900
1901
static GF_Err dump_icef(GF_UnknownBox *u, FILE * trace)
1902
0
{
1903
0
  u32 val, num_compressed_units, unit_offset_code, unit_size_code, i;
1904
0
  GF_BitStream *bs = gf_bs_new(u->data, u->dataSize, GF_BITSTREAM_READ);
1905
0
  gf_isom_box_dump_start((GF_Box *)u, "GenericallyCompressedUnitsItemInfoBox", trace);
1906
1907
  //full box
1908
0
  get_and_print("version", 8)
1909
0
  get_and_print("flags", 24)
1910
0
  unit_offset_code = gf_bs_read_int(bs, 3);
1911
0
  unit_size_code = gf_bs_read_int(bs, 3);
1912
0
  gf_bs_read_int(bs, 2);
1913
0
  num_compressed_units = gf_bs_read_u32(bs);
1914
0
  gf_fprintf(trace, ">\n");
1915
0
  for (i=0; i<num_compressed_units; i++) {
1916
0
    u64 extent_offset = 0;
1917
0
    u64 extent_size = 0;
1918
0
    if (unit_offset_code == 1) {
1919
0
      extent_offset = gf_bs_read_u16(bs);
1920
0
    } else if (unit_offset_code == 2) {
1921
0
      extent_offset = gf_bs_read_u24(bs);
1922
0
    } else if (unit_offset_code == 3) {
1923
0
      extent_offset = gf_bs_read_u32(bs);
1924
0
    } else if (unit_offset_code == 4) {
1925
0
      extent_offset = gf_bs_read_u64(bs);
1926
0
    }
1927
0
    if (unit_size_code == 0) {
1928
0
      extent_size = gf_bs_read_u8(bs);
1929
0
    } else if (unit_size_code == 1) {
1930
0
      extent_size = gf_bs_read_u16(bs);
1931
0
    } else if (unit_size_code == 2) {
1932
0
      extent_size = gf_bs_read_u24(bs);
1933
0
    } else if (unit_size_code == 3) {
1934
0
      extent_size = gf_bs_read_u32(bs);
1935
0
    } else if (unit_size_code == 4) {
1936
0
      extent_size = gf_bs_read_u64(bs);
1937
0
    }
1938
0
    if (unit_offset_code == 0) {
1939
0
      gf_fprintf(trace, "<compressed_unit_info extent_size=\"%u\"/>\n", extent_size);
1940
0
    } else {
1941
0
      gf_fprintf(trace, "<compressed_unit_info extent_offset=\"%u\" extent_size=\"%u\"/>\n", extent_offset, extent_size);
1942
0
    }
1943
0
  }
1944
0
  gf_bs_del(bs);
1945
0
  gf_isom_box_dump_done("GenericallyCompressedUnitsItemInfoBox", (GF_Box *)u, trace);
1946
0
  return GF_OK;
1947
0
}
1948
1949
static GF_Err dump_dvc1(GF_UnknownBox *u, FILE * trace)
1950
0
{
1951
0
  u32 val, pos;
1952
0
  if (!u || !u->data || !u->dataSize) return GF_BAD_PARAM;
1953
0
  GF_BitStream *bs = gf_bs_new(u->data, u->dataSize, GF_BITSTREAM_READ);
1954
0
  gf_isom_box_dump_start((GF_Box *)u, "VC1ConfigurationBox", trace);
1955
1956
0
  get_and_print("profile", 4)
1957
0
  get_and_print("level", 3)
1958
0
  gf_bs_read_int(bs, 1);
1959
0
  get_and_print("level", 3)
1960
0
  get_and_print("cbr", 1)
1961
0
  gf_bs_read_int(bs, 6);
1962
0
  get_and_print("no_interlace", 1)
1963
0
  get_and_print("no_multiple_seq", 1)
1964
0
  get_and_print("no_multiple_entry", 1)
1965
0
  get_and_print("no_slice_code", 1)
1966
0
  get_and_print("no_b_frames", 1)
1967
0
  gf_bs_read_int(bs, 1);
1968
0
  get_and_print("framerate", 32)
1969
1970
0
  pos = (u32) gf_bs_get_position(bs);
1971
0
  gf_bs_del(bs);
1972
1973
0
  gf_fprintf(trace, " VOS=\"");
1974
0
  dump_data_hex(trace, u->data+pos, u->dataSize-pos);
1975
0
  gf_fprintf(trace, "\">\n");
1976
0
  gf_isom_box_dump_done("VC1ConfigurationBox", (GF_Box *)u, trace);
1977
0
  return GF_OK;
1978
0
}
1979
#undef get_and_print
1980
1981
#ifdef GPAC_HAS_QJS
1982
GF_Err dump_js_data(u8 *data, u32 size, u32 b4cc, u32 par_type, GF_Box *box, FILE *trace, char *szPath);
1983
#endif
1984
1985
GF_Err unkn_box_dump(GF_Box *a, FILE * trace)
1986
0
{
1987
0
  Bool str_dump = GF_FALSE;
1988
0
  const char *name = "UnknownBox";
1989
0
  GF_UnknownBox *u = (GF_UnknownBox *)a;
1990
0
  if (!a->type && (a->size==8)) {
1991
0
    name = "TerminatorBox";
1992
0
  } 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]) {
1993
0
    name = "iTunesName";
1994
0
    str_dump = GF_TRUE;
1995
0
  } 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]) {
1996
0
    name = "iTunesMean";
1997
0
    str_dump = GF_TRUE;
1998
0
  } else if (u->original_4cc==GF_QT_SUBTYPE_ALAC) {
1999
0
    return dump_alac(u, trace);
2000
0
  } else if (u->original_4cc==GF_4CC('u','n','c','C')) {
2001
0
    return dump_uncc(u, trace);
2002
0
  } else if (u->original_4cc==GF_4CC('c','m','p','d')) {
2003
0
    return dump_cmpd(u, trace);
2004
0
  } else if (u->original_4cc==GF_4CC('c','p','a','l')) {
2005
0
    return dump_cpal(u, trace);
2006
0
  } else if (u->original_4cc==GF_4CC('c','p','a','t')) {
2007
0
    return dump_cpat(u, trace);
2008
0
  } else if (u->original_4cc==GF_4CC('c','l','o','c')) {
2009
0
    return dump_cloc(u, trace);
2010
0
  } else if (u->original_4cc==GF_4CC('s','b','p','m')) {
2011
0
    return dump_sbpm(u, trace);
2012
0
  } else if (u->original_4cc==GF_4CC('t','a','i','c')) {
2013
0
    return dump_taic(u, trace);
2014
0
  } else if (u->original_4cc==GF_4CC('i','t','a','i')) {
2015
0
    return dump_itai(u, trace);
2016
0
  } else if (u->original_4cc==GF_4CC('f','p','a','c')) {
2017
0
    return dump_fpac(u, trace);
2018
0
  } else if (u->original_4cc==GF_4CC('G','M','C','C')) {
2019
0
    return dump_gmcc(u, trace);
2020
0
  } else if (u->original_4cc==GF_4CC('d','v','c','1')) {
2021
0
    return dump_dvc1(u, trace);
2022
0
  } else if (u->original_4cc==GF_4CC('c','m','p','C')) {
2023
0
    return dump_cmpc(u, trace);
2024
0
  } else if (u->original_4cc==GF_4CC('i','c','e','f')) {
2025
0
    return dump_icef(u, trace);
2026
0
  } else if ((u->original_4cc==GF_ISOM_BOX_TYPE_CMOV)
2027
0
    || (u->original_4cc==GF_ISOM_BOX_TYPE_CMOF)
2028
0
    || (u->original_4cc==GF_ISOM_BOX_TYPE_CSIX)
2029
0
    || (u->original_4cc==GF_ISOM_BOX_TYPE_CSSX)
2030
0
    || (u->original_4cc==GF_QT_BOX_TYPE_CMOV)
2031
0
  ) {
2032
0
    char *bname = "CompressedMovieBox";
2033
0
    char *spec = "p12";
2034
0
    if (u->original_4cc==GF_ISOM_BOX_TYPE_CMOF) bname = "CompressedMovieFragmentBox";
2035
0
    else if (u->original_4cc==GF_ISOM_BOX_TYPE_CSIX) bname = "CompressedSegmentIndexBox";
2036
0
    else if (u->original_4cc==GF_ISOM_BOX_TYPE_CSSX) bname = "CompressedSubSegmentIndexBox";
2037
0
    else if (u->original_4cc==GF_QT_BOX_TYPE_CMOV)  spec = "apple";
2038
2039
0
    gf_isom_box_dump_start_ex(a, bname, trace, GF_FALSE, spec, "file");
2040
0
    gf_fprintf(trace, ">\n");
2041
0
    gf_isom_box_dump_done(bname, a, trace);
2042
0
    return GF_OK;
2043
0
  } else {
2044
0
#ifdef GPAC_HAS_QJS
2045
0
    const char *opt = gf_opts_get_key("core", "boxdir");
2046
0
    if (opt) {
2047
0
      char szPath[GF_MAX_PATH];
2048
0
      snprintf(szPath, GF_MAX_PATH-1, "%s/%s.js", opt, gf_4cc_to_str(u->original_4cc) );
2049
0
      if (gf_file_exists(szPath)) {
2050
0
        GF_Err e = dump_js_data(u->data, u->dataSize, u->original_4cc, u->parent_4cc, (GF_Box*)u, trace, szPath);
2051
0
        if (!e) return GF_OK;
2052
0
      }
2053
0
    }
2054
0
#endif
2055
0
  }
2056
2057
0
  gf_isom_box_dump_start(a, name, trace);
2058
2059
0
  if (str_dump) {
2060
0
    u32 i;
2061
0
    gf_fprintf(trace, " value=\"");
2062
0
    for (i=4; i<u->dataSize; i++)
2063
0
      gf_fprintf(trace, "%c", (char) u->data[i]);
2064
0
    gf_fprintf(trace, "\"");
2065
0
  } else if (u->dataSize && u->dataSize<100) {
2066
0
    dump_data_attribute(trace, "data", u->data, u->dataSize);
2067
0
  }
2068
2069
0
  gf_fprintf(trace, ">\n");
2070
0
  gf_isom_box_dump_done(name, a, trace);
2071
0
  return GF_OK;
2072
0
}
2073
2074
GF_Err uuid_box_dump(GF_Box *a, FILE * trace)
2075
0
{
2076
0
  gf_isom_box_dump_start(a, "UUIDBox", trace);
2077
0
  gf_fprintf(trace, ">\n");
2078
0
  gf_isom_box_dump_done("UUIDBox", a, trace);
2079
0
  return GF_OK;
2080
0
}
2081
2082
GF_Err void_box_dump(GF_Box *a, FILE * trace)
2083
0
{
2084
0
  gf_isom_box_dump_start(a, "VoidBox", trace);
2085
0
  gf_fprintf(trace, ">\n");
2086
0
  gf_isom_box_dump_done("VoidBox", a, trace);
2087
0
  return GF_OK;
2088
0
}
2089
2090
GF_Err ftyp_box_dump(GF_Box *a, FILE * trace)
2091
0
{
2092
0
  GF_FileTypeBox *p;
2093
0
  u32 i;
2094
2095
0
  p = (GF_FileTypeBox *)a;
2096
0
  gf_isom_box_dump_start(a, (a->type == GF_ISOM_BOX_TYPE_FTYP ? "FileTypeBox" : "SegmentTypeBox"), trace);
2097
0
  gf_fprintf(trace, "MajorBrand=\"%s\" MinorVersion=\"%d\">\n", gf_4cc_to_str(p->majorBrand), p->minorVersion);
2098
2099
0
  for (i=0; i<p->altCount; i++) {
2100
0
    gf_fprintf(trace, "<BrandEntry AlternateBrand=\"%s\"/>\n", gf_4cc_to_str(p->altBrand[i]));
2101
0
  }
2102
0
  if (!p->type) {
2103
0
    gf_fprintf(trace, "<BrandEntry AlternateBrand=\"4CC\"/>\n");
2104
0
  }
2105
0
  gf_isom_box_dump_done((a->type == GF_ISOM_BOX_TYPE_FTYP ? "FileTypeBox" : "SegmentTypeBox"), a, trace);
2106
0
  return GF_OK;
2107
0
}
2108
2109
GF_Err padb_box_dump(GF_Box *a, FILE * trace)
2110
0
{
2111
0
  GF_PaddingBitsBox *p;
2112
0
  u32 i;
2113
2114
0
  p = (GF_PaddingBitsBox *)a;
2115
0
  gf_isom_box_dump_start(a, "PaddingBitsBox", trace);
2116
0
  gf_fprintf(trace, "EntryCount=\"%d\">\n", p->SampleCount);
2117
0
  for (i=0; i<p->SampleCount; i+=1) {
2118
0
    gf_fprintf(trace, "<PaddingBitsEntry PaddingBits=\"%d\"/>\n", p->padbits[i]);
2119
0
  }
2120
0
  if (!p->size) {
2121
0
    gf_fprintf(trace, "<PaddingBitsEntry PaddingBits=\"\"/>\n");
2122
0
  }
2123
0
  gf_isom_box_dump_done("PaddingBitsBox", a, trace);
2124
0
  return GF_OK;
2125
0
}
2126
2127
GF_Err gppc_box_dump(GF_Box *a, FILE * trace)
2128
0
{
2129
0
  GF_3GPPConfigBox *p = (GF_3GPPConfigBox *)a;
2130
0
  switch (p->cfg.type) {
2131
0
  case GF_ISOM_SUBTYPE_3GP_AMR:
2132
0
  case GF_ISOM_SUBTYPE_3GP_AMR_WB:
2133
0
    gf_isom_box_dump_start(a, "AMRConfigurationBox", trace);
2134
0
    gf_fprintf(trace, "Vendor=\"%s\" Version=\"%d\"", gf_4cc_to_str(p->cfg.vendor), p->cfg.decoder_version);
2135
0
    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);
2136
0
    gf_fprintf(trace, ">\n");
2137
0
    gf_isom_box_dump_done("AMRConfigurationBox", a, trace);
2138
0
    break;
2139
0
  case GF_ISOM_SUBTYPE_3GP_EVRC:
2140
0
    gf_isom_box_dump_start(a, "EVRCConfigurationBox", trace);
2141
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);
2142
0
    gf_isom_box_dump_done("EVRCConfigurationBox", a, trace);
2143
0
    break;
2144
0
  case GF_ISOM_SUBTYPE_3GP_QCELP:
2145
0
    gf_isom_box_dump_start(a, "QCELPConfigurationBox", trace);
2146
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);
2147
0
    gf_isom_box_dump_done("QCELPConfigurationBox", a, trace);
2148
0
    break;
2149
0
  case GF_ISOM_SUBTYPE_3GP_SMV:
2150
0
    gf_isom_box_dump_start(a, "SMVConfigurationBox", trace);
2151
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);
2152
0
    gf_isom_box_dump_done("SMVConfigurationBox", a, trace);
2153
0
    break;
2154
0
  case GF_ISOM_SUBTYPE_3GP_H263:
2155
0
    gf_isom_box_dump_start(a, "H263ConfigurationBox", trace);
2156
0
    gf_fprintf(trace, "Vendor=\"%s\" Version=\"%d\"", gf_4cc_to_str(p->cfg.vendor), p->cfg.decoder_version);
2157
0
    gf_fprintf(trace, " Profile=\"%d\" Level=\"%d\"", p->cfg.H263_profile, p->cfg.H263_level);
2158
0
    gf_fprintf(trace, ">\n");
2159
0
    gf_isom_box_dump_done("H263ConfigurationBox", a, trace);
2160
0
    break;
2161
0
  default:
2162
0
    break;
2163
0
  }
2164
0
  return GF_OK;
2165
0
}
2166
2167
2168
GF_Err avcc_box_dump(GF_Box *a, FILE * trace)
2169
0
{
2170
0
  u32 i, count;
2171
0
  GF_AVCConfigurationBox *p = (GF_AVCConfigurationBox *) a;
2172
0
  const char *name;
2173
0
  switch (p->type) {
2174
0
  case GF_ISOM_BOX_TYPE_MVCC:
2175
0
    name = "MVC";
2176
0
    break;
2177
0
  case GF_ISOM_BOX_TYPE_SVCC:
2178
0
    name = "SVC";
2179
0
    break;
2180
0
  case GF_ISOM_BOX_TYPE_AVCE:
2181
0
    name = "DV-AVC";
2182
0
    break;
2183
0
  default:
2184
0
    name = "AVC";
2185
0
    break;
2186
0
  }
2187
2188
0
  char boxname[256];
2189
0
  sprintf(boxname, "%sConfigurationBox", name);
2190
0
  gf_isom_box_dump_start(a, boxname, trace);
2191
0
  gf_fprintf(trace, ">\n");
2192
2193
0
  gf_fprintf(trace, "<%sDecoderConfigurationRecord", name);
2194
2195
0
  if (! p->config) {
2196
0
    if (p->size) {
2197
0
      gf_fprintf(trace, ">\n");
2198
0
      gf_fprintf(trace, "<!-- INVALID AVC ENTRY : no AVC/SVC config record -->\n");
2199
0
    } else {
2200
2201
0
      gf_fprintf(trace, " configurationVersion=\"\" AVCProfileIndication=\"\" profile_compatibility=\"\" AVCLevelIndication=\"\" nal_unit_size=\"\" complete_representation=\"\"");
2202
2203
0
      gf_fprintf(trace, " chroma_format=\"\" luma_bit_depth=\"\" chroma_bit_depth=\"\"");
2204
0
      gf_fprintf(trace, ">\n");
2205
2206
0
      gf_fprintf(trace, "<SequenceParameterSet size=\"\" content=\"\"/>\n");
2207
0
      gf_fprintf(trace, "<PictureParameterSet size=\"\" content=\"\"/>\n");
2208
0
      gf_fprintf(trace, "<SequenceParameterSetExtensions size=\"\" content=\"\"/>\n");
2209
0
    }
2210
0
    gf_fprintf(trace, "</%sDecoderConfigurationRecord>\n", name);
2211
0
    gf_isom_box_dump_done(boxname, a, trace);
2212
0
    return GF_OK;
2213
0
  }
2214
2215
0
  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);
2216
2217
2218
0
  if ((p->type==GF_ISOM_BOX_TYPE_SVCC) || (p->type==GF_ISOM_BOX_TYPE_MVCC) )
2219
0
    gf_fprintf(trace, " complete_representation=\"%d\"", p->config->complete_representation);
2220
2221
0
  if (p->type==GF_ISOM_BOX_TYPE_AVCC) {
2222
0
    if (gf_avcc_use_extensions(p->config->AVCProfileIndication)) {
2223
0
      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);
2224
0
    }
2225
0
  }
2226
2227
0
  gf_fprintf(trace, ">\n");
2228
2229
0
  count = gf_list_count(p->config->sequenceParameterSets);
2230
0
  for (i=0; i<count; i++) {
2231
0
    GF_NALUFFParam *c = (GF_NALUFFParam *)gf_list_get(p->config->sequenceParameterSets, i);
2232
0
    gf_fprintf(trace, "<SequenceParameterSet size=\"%d\" content=\"", c->size);
2233
0
    dump_data(trace, c->data, c->size);
2234
0
    gf_fprintf(trace, "\"/>\n");
2235
0
  }
2236
0
  count = gf_list_count(p->config->pictureParameterSets);
2237
0
  for (i=0; i<count; i++) {
2238
0
    GF_NALUFFParam *c = (GF_NALUFFParam *)gf_list_get(p->config->pictureParameterSets, i);
2239
0
    gf_fprintf(trace, "<PictureParameterSet size=\"%d\" content=\"", c->size);
2240
0
    dump_data(trace, c->data, c->size);
2241
0
    gf_fprintf(trace, "\"/>\n");
2242
0
  }
2243
2244
0
  if (p->config->sequenceParameterSetExtensions) {
2245
0
    count = gf_list_count(p->config->sequenceParameterSetExtensions);
2246
0
    for (i=0; i<count; i++) {
2247
0
      GF_NALUFFParam *c = (GF_NALUFFParam *)gf_list_get(p->config->sequenceParameterSetExtensions, i);
2248
0
      gf_fprintf(trace, "<SequenceParameterSetExtensions size=\"%d\" content=\"", c->size);
2249
0
      dump_data(trace, c->data, c->size);
2250
0
      gf_fprintf(trace, "\"/>\n");
2251
0
    }
2252
0
  }
2253
2254
0
  gf_fprintf(trace, "</%sDecoderConfigurationRecord>\n", name);
2255
2256
0
  gf_isom_box_dump_done(boxname, a, trace);
2257
0
  return GF_OK;
2258
0
}
2259
2260
GF_Err hvcc_box_dump(GF_Box *a, FILE * trace)
2261
0
{
2262
0
  u32 i, count;
2263
0
  const char *name;
2264
0
  switch (a->type) {
2265
0
  case GF_ISOM_BOX_TYPE_HVCC:
2266
0
    name = "HEVC";
2267
0
    break;
2268
0
  case GF_ISOM_BOX_TYPE_HVCE:
2269
0
    name = "DV-HEVC";
2270
0
    break;
2271
0
  default:
2272
0
    name = "L-HEVC";
2273
0
    break;
2274
0
  }
2275
0
  char boxname[256];
2276
0
  GF_HEVCConfigurationBox *p = (GF_HEVCConfigurationBox *) a;
2277
2278
0
  sprintf(boxname, "%sConfigurationBox", name);
2279
0
  gf_isom_box_dump_start(a, boxname, trace);
2280
0
  gf_fprintf(trace, ">\n");
2281
2282
0
  if (! p->config) {
2283
0
    if (p->size) {
2284
0
      gf_fprintf(trace, "<!-- INVALID HEVC ENTRY: no HEVC/SHVC config record -->\n");
2285
0
    } else {
2286
0
      gf_fprintf(trace, "<%sDecoderConfigurationRecord nal_unit_size=\"\" configurationVersion=\"\" ", name);
2287
0
      if (a->type==GF_ISOM_BOX_TYPE_HVCC) {
2288
0
        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=\"\" ");
2289
0
      }
2290
0
      gf_fprintf(trace, "min_spatial_segmentation_idc=\"\" parallelismType=\"\" ");
2291
2292
0
      if (a->type==GF_ISOM_BOX_TYPE_HVCC)
2293
0
        gf_fprintf(trace, "chroma_format=\"\" luma_bit_depth=\"\" chroma_bit_depth=\"\" avgFrameRate=\"\" constantFrameRate=\"\" numTemporalLayers=\"\" temporalIdNested=\"\"");
2294
2295
0
      gf_fprintf(trace, ">\n");
2296
0
      gf_fprintf(trace, "<ParameterSetArray nalu_type=\"\" complete_set=\"\">\n");
2297
0
      gf_fprintf(trace, "<ParameterSet size=\"\" content=\"\"/>\n");
2298
0
      gf_fprintf(trace, "</ParameterSetArray>\n");
2299
0
      gf_fprintf(trace, "</%sDecoderConfigurationRecord>\n", name);
2300
0
    }
2301
0
    gf_fprintf(trace, "</%sConfigurationBox>\n", name);
2302
0
    return GF_OK;
2303
0
  }
2304
2305
0
  gf_fprintf(trace, "<%sDecoderConfigurationRecord nal_unit_size=\"%d\" ", name, p->config->nal_unit_size);
2306
0
  gf_fprintf(trace, "configurationVersion=\"%u\" ", p->config->configurationVersion);
2307
0
  if (a->type==GF_ISOM_BOX_TYPE_HVCC) {
2308
0
    gf_fprintf(trace, "profile_space=\"%u\" ", p->config->profile_space);
2309
0
    gf_fprintf(trace, "tier_flag=\"%u\" ", p->config->tier_flag);
2310
0
    gf_fprintf(trace, "profile_idc=\"%u\" ", p->config->profile_idc);
2311
0
    gf_fprintf(trace, "general_profile_compatibility_flags=\"%X\" ", p->config->general_profile_compatibility_flags);
2312
0
    gf_fprintf(trace, "progressive_source_flag=\"%u\" ", p->config->progressive_source_flag);
2313
0
    gf_fprintf(trace, "interlaced_source_flag=\"%u\" ", p->config->interlaced_source_flag);
2314
0
    gf_fprintf(trace, "non_packed_constraint_flag=\"%u\" ", p->config->non_packed_constraint_flag);
2315
0
    gf_fprintf(trace, "frame_only_constraint_flag=\"%u\" ", p->config->frame_only_constraint_flag);
2316
0
    gf_fprintf(trace, "constraint_indicator_flags=\""LLX"\" ", p->config->constraint_indicator_flags);
2317
0
    gf_fprintf(trace, "level_idc=\"%d\" ", p->config->level_idc);
2318
0
  }
2319
0
  gf_fprintf(trace, "min_spatial_segmentation_idc=\"%u\" ", p->config->min_spatial_segmentation_idc);
2320
0
  gf_fprintf(trace, "parallelismType=\"%u\" ", p->config->parallelismType);
2321
2322
0
  if (a->type==GF_ISOM_BOX_TYPE_HVCC)
2323
0
    gf_fprintf(trace, "chroma_format=\"%s\" luma_bit_depth=\"%u\" chroma_bit_depth=\"%u\" avgFrameRate=\"%u\" constantFrameRate=\"%u\" numTemporalLayers=\"%u\" temporalIdNested=\"%u\"",
2324
0
          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);
2325
2326
0
  gf_fprintf(trace, ">\n");
2327
2328
0
  count = gf_list_count(p->config->param_array);
2329
0
  for (i=0; i<count; i++) {
2330
0
    u32 nalucount, j;
2331
0
    GF_NALUFFParamArray *ar = (GF_NALUFFParamArray*)gf_list_get(p->config->param_array, i);
2332
0
    gf_fprintf(trace, "<ParameterSetArray nalu_type=\"%d\" complete_set=\"%d\">\n", ar->type, ar->array_completeness);
2333
0
    nalucount = gf_list_count(ar->nalus);
2334
0
    for (j=0; j<nalucount; j++) {
2335
0
      GF_NALUFFParam *c = (GF_NALUFFParam *)gf_list_get(ar->nalus, j);
2336
0
      gf_fprintf(trace, "<ParameterSet size=\"%d\" content=\"", c->size);
2337
0
      dump_data(trace, c->data, c->size);
2338
0
      gf_fprintf(trace, "\"/>\n");
2339
0
    }
2340
0
    gf_fprintf(trace, "</ParameterSetArray>\n");
2341
0
  }
2342
2343
0
  gf_fprintf(trace, "</%sDecoderConfigurationRecord>\n", name);
2344
2345
0
  gf_isom_box_dump_done(boxname, a, trace);
2346
0
  return GF_OK;
2347
0
}
2348
2349
GF_Err vvcc_box_dump(GF_Box *a, FILE * trace)
2350
0
{
2351
0
  u32 i, count;
2352
0
  char boxname[256];
2353
0
  GF_VVCConfigurationBox *p = (GF_VVCConfigurationBox *) a;
2354
2355
0
  sprintf(boxname, "VVCConfigurationBox");
2356
0
  gf_isom_box_dump_start(a, boxname, trace);
2357
0
  gf_fprintf(trace, ">\n");
2358
2359
0
  if (! p->config) {
2360
0
    if (p->size) {
2361
0
      gf_fprintf(trace, "<!-- INVALID VVC ENTRY: no VVC config record -->\n");
2362
0
    } else {
2363
0
      gf_fprintf(trace, "<VVCDecoderConfigurationRecord nal_unit_size=\"\" configurationVersion=\"\" ");
2364
0
      gf_fprintf(trace, "general_profile_idc=\"\" general_tier_flag=\"\" general_sub_profile_idc=\"\" general_constraint_info=\"\" general_level_idc=\"\" ");
2365
0
      gf_fprintf(trace, "chroma_format=\"\" luma_bit_depth=\"\" chroma_bit_depth=\"\" avgFrameRate=\"\" constantFrameRate=\"\" numTemporalLayers=\"\" maxWidth=\"\" maxHeight=\"\"");
2366
2367
0
      gf_fprintf(trace, ">\n");
2368
0
      gf_fprintf(trace, "<ParameterSetArray nalu_type=\"\" complete_set=\"\">\n");
2369
0
      gf_fprintf(trace, "<ParameterSet size=\"\" content=\"\"/>\n");
2370
0
      gf_fprintf(trace, "</ParameterSetArray>\n");
2371
0
      gf_fprintf(trace, "</VVCDecoderConfigurationRecord>\n");
2372
0
    }
2373
0
    gf_fprintf(trace, "</VVCConfigurationBox>\n");
2374
0
    return GF_OK;
2375
0
  }
2376
2377
0
  gf_fprintf(trace, "<VVCDecoderConfigurationRecord nal_unit_size=\"%d\" ", p->config->nal_unit_size);
2378
0
  if (p->config->ptl_present) {
2379
2380
0
    gf_fprintf(trace, "chroma_format=\"%s\" chroma_bit_depth=\"%u\" avgFrameRate=\"%u\" constantFrameRate=\"%u\" numTemporalLayers=\"%u\" maxWidth=\"%u\" maxHeight=\"%u\" ",
2381
0
      gf_avc_hevc_get_chroma_format_name(p->config->chroma_format),
2382
0
      p->config->bit_depth, p->config->avgFrameRate, p->config->constantFrameRate, p->config->numTemporalLayers, p->config->maxPictureWidth, p->config->maxPictureHeight);
2383
2384
0
    gf_fprintf(trace, "general_profile_idc=\"%u\" ", p->config->general_profile_idc);
2385
0
    gf_fprintf(trace, "general_tier_flag=\"%u\" ", p->config->general_tier_flag);
2386
0
    gf_fprintf(trace, "general_sub_profile_idc=\"%u\" ", p->config->general_sub_profile_idc);
2387
0
    if (p->config->general_constraint_info) {
2388
0
      gf_fprintf(trace, "general_constraint_info=\"");
2389
0
      dump_data_hex(trace, p->config->general_constraint_info, p->config->num_constraint_info);
2390
0
      gf_fprintf(trace, "\" ");
2391
0
    }
2392
0
    gf_fprintf(trace, "general_level_idc=\"%u\" ", p->config->general_level_idc);
2393
0
  }
2394
0
  gf_fprintf(trace, ">\n");
2395
2396
0
  count = gf_list_count(p->config->param_array);
2397
0
  for (i=0; i<count; i++) {
2398
0
    u32 nalucount, j;
2399
0
    GF_NALUFFParamArray *ar = (GF_NALUFFParamArray*)gf_list_get(p->config->param_array, i);
2400
0
    gf_fprintf(trace, "<ParameterSetArray nalu_type=\"%d\" complete_set=\"%d\">\n", ar->type, ar->array_completeness);
2401
0
    nalucount = gf_list_count(ar->nalus);
2402
0
    for (j=0; j<nalucount; j++) {
2403
0
      GF_NALUFFParam *c = (GF_NALUFFParam *)gf_list_get(ar->nalus, j);
2404
0
      gf_fprintf(trace, "<ParameterSet size=\"%d\" content=\"", c->size);
2405
0
      dump_data(trace, c->data, c->size);
2406
0
      gf_fprintf(trace, "\"/>\n");
2407
0
    }
2408
0
    gf_fprintf(trace, "</ParameterSetArray>\n");
2409
0
  }
2410
2411
0
  gf_fprintf(trace, "</VVCDecoderConfigurationRecord>\n");
2412
2413
0
  gf_isom_box_dump_done(boxname, a, trace);
2414
0
  return GF_OK;
2415
0
}
2416
2417
2418
GF_Err vvnc_box_dump(GF_Box *a, FILE * trace)
2419
0
{
2420
0
  GF_VVCNaluConfigurationBox *p = (GF_VVCNaluConfigurationBox *) a;
2421
2422
0
  gf_isom_box_dump_start(a, "VVCNaluConfigurationBox", trace);
2423
0
  gf_fprintf(trace, " nal_unit_size=\"%d\">\n", p->nal_unit_size);
2424
0
  gf_isom_box_dump_done("VVCNaluConfigurationBox", a, trace);
2425
0
  return GF_OK;
2426
0
}
2427
2428
2429
0
GF_Err av1c_box_dump(GF_Box *a, FILE *trace) {
2430
0
  GF_AV1ConfigurationBox *ptr = (GF_AV1ConfigurationBox*)a;
2431
0
  gf_fprintf(trace, "<AV1ConfigurationBox>\n");
2432
0
  if (ptr->config) {
2433
0
    u32 i, obu_count = gf_list_count(ptr->config->obu_array);
2434
2435
0
    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);
2436
0
    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);
2437
0
    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);
2438
0
    gf_fprintf(trace, "initial_presentation_delay=\"%u\" OBUs_count=\"%u\">\n", ptr->config->initial_presentation_delay_minus_one+1, obu_count);
2439
2440
0
    for (i=0; i<obu_count; i++) {
2441
0
      GF_AV1_OBUArrayEntry *obu_a = gf_list_get(ptr->config->obu_array, i);
2442
0
      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);
2443
0
      dump_data(trace, (char *)obu_a->obu, (u32) obu_a->obu_length);
2444
0
      gf_fprintf(trace, "\"/>\n");
2445
0
    }
2446
0
    gf_fprintf(trace, "</AV1Config>\n");
2447
0
  }
2448
0
  gf_fprintf(trace, "</AV1ConfigurationBox>\n");
2449
0
  return GF_OK;
2450
0
}
2451
2452
2453
0
GF_Err vpcc_box_dump(GF_Box *a, FILE *trace) {
2454
0
  GF_VPConfigurationBox *ptr = (GF_VPConfigurationBox*)a;
2455
0
  gf_fprintf(trace, "<VPConfigurationBox>\n");
2456
0
  if (ptr->config) {
2457
0
    gf_fprintf(trace, "<VPConfig");
2458
2459
0
    gf_fprintf(trace, " profile=\"%u\"", ptr->config->profile);
2460
0
    gf_fprintf(trace, " level=\"%u\"", ptr->config->level);
2461
0
    gf_fprintf(trace, " bit_depth=\"%u\"", ptr->config->bit_depth);
2462
0
    gf_fprintf(trace, " chroma_subsampling=\"%u\"", ptr->config->chroma_subsampling);
2463
0
    gf_fprintf(trace, " video_fullRange_flag=\"%u\"", ptr->config->video_fullRange_flag);
2464
0
    gf_fprintf(trace, " colour_primaries=\"%u\"", ptr->config->colour_primaries);
2465
0
    gf_fprintf(trace, " transfer_characteristics=\"%u\"", ptr->config->transfer_characteristics);
2466
0
    gf_fprintf(trace, " matrix_coefficients=\"%u\"", ptr->config->matrix_coefficients);
2467
0
    gf_fprintf(trace, " codec_initdata_size=\"%u\"", ptr->config->codec_initdata_size);
2468
2469
0
    gf_fprintf(trace, ">\n</VPConfig>\n");
2470
0
  }
2471
0
  gf_fprintf(trace, "</VPConfigurationBox>\n");
2472
0
  return GF_OK;
2473
0
}
2474
2475
2476
0
GF_Err av3c_box_dump(GF_Box *a, FILE *trace) {
2477
0
  GF_AVS3VConfigurationBox *ptr = (GF_AVS3VConfigurationBox*)a;
2478
0
  gf_fprintf(trace, "<AVS3ConfigurationBox>\n");
2479
0
  if (ptr->config) {
2480
0
    gf_fprintf(trace, "<AVS3Config version=\"%u\" library_dependency_idc=\"%u\" sequence_header_length=\"%u\" sequence_header=\"", (u32)ptr->config->configurationVersion, (u32)ptr->config->library_dependency_idc, (u32)ptr->config->sequence_header_length);
2481
0
    dump_data(trace, (char *)ptr->config->sequence_header, (u32)ptr->config->sequence_header_length);
2482
0
    gf_fprintf(trace, "\"/>\n");
2483
0
  }
2484
0
  gf_fprintf(trace, "</AVS3ConfigurationBox>\n");
2485
0
  return GF_OK;
2486
0
}
2487
2488
2489
0
GF_Err SmDm_box_dump(GF_Box *a, FILE *trace) {
2490
0
  GF_SMPTE2086MasteringDisplayMetadataBox * ptr = (GF_SMPTE2086MasteringDisplayMetadataBox *)a;
2491
0
  if (!a) return GF_BAD_PARAM;
2492
0
  gf_isom_box_dump_start(a, "SMPTE2086MasteringDisplayMetadataBox", trace);
2493
0
  gf_fprintf(trace, "primaryRChromaticity_x=\"%u\" ", ptr->primaryRChromaticity_x);
2494
0
  gf_fprintf(trace, "primaryRChromaticity_y=\"%u\" ", ptr->primaryRChromaticity_y);
2495
0
  gf_fprintf(trace, "primaryGChromaticity_x=\"%u\" ", ptr->primaryGChromaticity_x);
2496
0
  gf_fprintf(trace, "primaryGChromaticity_y=\"%u\" ", ptr->primaryGChromaticity_y);
2497
0
  gf_fprintf(trace, "primaryBChromaticity_x=\"%u\" ", ptr->primaryBChromaticity_x);
2498
0
  gf_fprintf(trace, "primaryBChromaticity_y=\"%u\" ", ptr->primaryBChromaticity_y);
2499
0
  gf_fprintf(trace, "whitePointChromaticity_x=\"%u\" ", ptr->whitePointChromaticity_x);
2500
0
  gf_fprintf(trace, "whitePointChromaticity_y=\"%u\" ", ptr->whitePointChromaticity_y);
2501
0
  gf_fprintf(trace, "luminanceMax=\"%u\" ", ptr->luminanceMax);
2502
0
  gf_fprintf(trace, "luminanceMin=\"%u\">\n", ptr->luminanceMin);
2503
0
  gf_isom_box_dump_done("SMPTE2086MasteringDisplayMetadataBox", a, trace);
2504
0
  return GF_OK;
2505
0
}
2506
2507
0
GF_Err CoLL_box_dump(GF_Box *a, FILE *trace) {
2508
0
  GF_VPContentLightLevelBox * ptr = (GF_VPContentLightLevelBox *)a;
2509
0
  if (!a) return GF_BAD_PARAM;
2510
0
  gf_isom_box_dump_start(a, "VPContentLightLevelBox", trace);
2511
0
  gf_fprintf(trace, "maxCLL=\"%u\" maxFALL=\"%u\">\n", ptr->maxCLL, ptr->maxFALL);
2512
0
  gf_isom_box_dump_done("VPContentLightLevelBox", a, trace);
2513
0
  return GF_OK;
2514
0
}
2515
2516
GF_Err m4ds_box_dump(GF_Box *a, FILE * trace)
2517
0
{
2518
0
  u32 i;
2519
0
  GF_Descriptor *desc;
2520
0
  GF_MPEG4ExtensionDescriptorsBox *p = (GF_MPEG4ExtensionDescriptorsBox *) a;
2521
0
  gf_isom_box_dump_start(a, "MPEG4ExtensionDescriptorsBox", trace);
2522
0
  gf_fprintf(trace, ">\n");
2523
2524
0
  i=0;
2525
0
  while ((desc = (GF_Descriptor *)gf_list_enum(p->descriptors, &i))) {
2526
0
#ifndef GPAC_DISABLE_OD_DUMP
2527
0
    gf_odf_dump_desc(desc, trace, 1, GF_TRUE);
2528
#else
2529
    gf_fprintf(trace, "<!-- Object Descriptor Dumping disabled in this build of GPAC -->\n");
2530
#endif
2531
0
  }
2532
0
  gf_isom_box_dump_done("MPEG4ExtensionDescriptorsBox", a, trace);
2533
0
  return GF_OK;
2534
0
}
2535
2536
GF_Err btrt_box_dump(GF_Box *a, FILE * trace)
2537
0
{
2538
0
  GF_BitRateBox *p = (GF_BitRateBox*)a;
2539
0
  gf_isom_box_dump_start(a, "BitRateBox", trace);
2540
0
  gf_fprintf(trace, "BufferSizeDB=\"%d\" avgBitRate=\"%d\" maxBitRate=\"%d\">\n", p->bufferSizeDB, p->avgBitrate, p->maxBitrate);
2541
0
  gf_isom_box_dump_done("BitRateBox", a, trace);
2542
0
  return GF_OK;
2543
0
}
2544
2545
GF_Err ftab_box_dump(GF_Box *a, FILE * trace)
2546
0
{
2547
0
  u32 i;
2548
0
  GF_FontTableBox *p = (GF_FontTableBox *)a;
2549
0
  gf_isom_box_dump_start(a, "FontTableBox", trace);
2550
0
  gf_fprintf(trace, ">\n");
2551
0
  for (i=0; i<p->entry_count; i++) {
2552
0
    gf_fprintf(trace, "<FontRecord ID=\"%d\" name=\"%s\"/>\n", p->fonts[i].fontID, p->fonts[i].fontName ? p->fonts[i].fontName : "NULL");
2553
0
  }
2554
0
  if (!p->size) {
2555
0
    gf_fprintf(trace, "<FontRecord ID=\"\" name=\"\"/>\n");
2556
0
  }
2557
0
  gf_isom_box_dump_done("FontTableBox", a, trace);
2558
0
  return GF_OK;
2559
0
}
2560
2561
static void tx3g_dump_rgba8(FILE * trace, char *name, u32 col)
2562
0
{
2563
0
  gf_fprintf(trace, "%s=\"%x %x %x %x\"", name, (col>>16)&0xFF, (col>>8)&0xFF, (col)&0xFF, (col>>24)&0xFF);
2564
0
}
2565
static void tx3g_dump_rgb16(FILE * trace, char *name, char col[6])
2566
0
{
2567
0
  gf_fprintf(trace, "%s=\"%x %x %x\"", name, *((u16*)col), *((u16*)(col+2)), *((u16*)(col+4)));
2568
0
}
2569
static void tx3g_dump_box(FILE * trace, GF_BoxRecord *rec)
2570
0
{
2571
0
  gf_fprintf(trace, "<BoxRecord top=\"%d\" left=\"%d\" bottom=\"%d\" right=\"%d\"/>\n", rec->top, rec->left, rec->bottom, rec->right);
2572
0
}
2573
static void tx3g_dump_style(FILE * trace, GF_StyleRecord *rec)
2574
0
{
2575
0
  gf_fprintf(trace, "<StyleRecord startChar=\"%d\" endChar=\"%d\" fontID=\"%d\" styles=\"", rec->startCharOffset, rec->endCharOffset, rec->fontID);
2576
0
  if (!rec->style_flags) {
2577
0
    gf_fprintf(trace, "Normal");
2578
0
  } else {
2579
0
    if (rec->style_flags & 1) gf_fprintf(trace, "Bold ");
2580
0
    if (rec->style_flags & 2) gf_fprintf(trace, "Italic ");
2581
0
    if (rec->style_flags & 4) gf_fprintf(trace, "Underlined ");
2582
0
  }
2583
0
  gf_fprintf(trace, "\" fontSize=\"%d\" ", rec->font_size);
2584
0
  tx3g_dump_rgba8(trace, "textColor", rec->text_color);
2585
0
  gf_fprintf(trace, "/>\n");
2586
0
}
2587
2588
GF_Err tx3g_box_dump(GF_Box *a, FILE * trace)
2589
0
{
2590
0
  GF_Tx3gSampleEntryBox *p = (GF_Tx3gSampleEntryBox *)a;
2591
0
  gf_isom_box_dump_start(a, "Tx3gSampleEntryBox", trace);
2592
0
  gf_fprintf(trace, "dataReferenceIndex=\"%d\" displayFlags=\"%x\" horizontal-justification=\"%d\" vertical-justification=\"%d\" ",
2593
0
          p->dataReferenceIndex, p->displayFlags, p->horizontal_justification, p->vertical_justification);
2594
2595
0
  tx3g_dump_rgba8(trace, "backgroundColor", p->back_color);
2596
0
  gf_fprintf(trace, ">\n");
2597
0
  gf_fprintf(trace, "<DefaultBox>\n");
2598
0
  tx3g_dump_box(trace, &p->default_box);
2599
0
  gf_isom_box_dump_done("DefaultBox", a, trace);
2600
2601
0
  gf_fprintf(trace, "<DefaultStyle>\n");
2602
0
  tx3g_dump_style(trace, &p->default_style);
2603
0
  gf_fprintf(trace, "</DefaultStyle>\n");
2604
0
  gf_isom_box_dump_done("Tx3gSampleEntryBox", a, trace);
2605
0
  return GF_OK;
2606
0
}
2607
2608
GF_Err text_box_dump(GF_Box *a, FILE * trace)
2609
0
{
2610
0
  GF_TextSampleEntryBox *p = (GF_TextSampleEntryBox *)a;
2611
0
  gf_isom_box_dump_start(a, "TextSampleEntryBox", trace);
2612
0
  gf_fprintf(trace, "dataReferenceIndex=\"%d\" displayFlags=\"%x\" textJustification=\"%d\"  ",
2613
0
          p->dataReferenceIndex, p->displayFlags, p->textJustification);
2614
0
  if (p->textName)
2615
0
    gf_fprintf(trace, "textName=\"%s\" ", p->textName);
2616
0
  tx3g_dump_rgb16(trace, "background-color", p->background_color);
2617
0
  tx3g_dump_rgb16(trace, " foreground-color", p->foreground_color);
2618
0
  gf_fprintf(trace, ">\n");
2619
2620
0
  gf_fprintf(trace, "<DefaultBox>\n");
2621
0
  tx3g_dump_box(trace, &p->default_box);
2622
0
  gf_isom_box_dump_done("DefaultBox", a, trace);
2623
0
  gf_isom_box_dump_done("TextSampleEntryBox", a, trace);
2624
0
  return GF_OK;
2625
0
}
2626
2627
GF_Err styl_box_dump(GF_Box *a, FILE * trace)
2628
0
{
2629
0
  u32 i;
2630
0
  GF_TextStyleBox*p = (GF_TextStyleBox*)a;
2631
0
  gf_isom_box_dump_start(a, "TextStyleBox", trace);
2632
0
  gf_fprintf(trace, ">\n");
2633
0
  for (i=0; i<p->entry_count; i++) tx3g_dump_style(trace, &p->styles[i]);
2634
0
  if (!p->size) {
2635
0
    gf_fprintf(trace, "<StyleRecord startChar=\"\" endChar=\"\" fontID=\"\" styles=\"Normal|Bold|Italic|Underlined\" fontSize=\"\" textColor=\"\" />\n");
2636
0
  }
2637
0
  gf_isom_box_dump_done("TextStyleBox", a, trace);
2638
0
  return GF_OK;
2639
0
}
2640
GF_Err hlit_box_dump(GF_Box *a, FILE * trace)
2641
0
{
2642
0
  GF_TextHighlightBox*p = (GF_TextHighlightBox*)a;
2643
0
  gf_isom_box_dump_start(a, "TextHighlightBox", trace);
2644
0
  gf_fprintf(trace, "startcharoffset=\"%d\" endcharoffset=\"%d\">\n", p->startcharoffset, p->endcharoffset);
2645
0
  gf_isom_box_dump_done("TextHighlightBox", a, trace);
2646
0
  return GF_OK;
2647
0
}
2648
GF_Err hclr_box_dump(GF_Box *a, FILE * trace)
2649
0
{
2650
0
  GF_TextHighlightColorBox*p = (GF_TextHighlightColorBox*)a;
2651
0
  gf_isom_box_dump_start(a, "TextHighlightColorBox", trace);
2652
0
  tx3g_dump_rgba8(trace, "highlight_color", p->hil_color);
2653
0
  gf_fprintf(trace, ">\n");
2654
0
  gf_isom_box_dump_done("TextHighlightColorBox", a, trace);
2655
0
  return GF_OK;
2656
0
}
2657
2658
GF_Err krok_box_dump(GF_Box *a, FILE * trace)
2659
0
{
2660
0
  u32 i;
2661
0
  GF_TextKaraokeBox*p = (GF_TextKaraokeBox*)a;
2662
0
  gf_isom_box_dump_start(a, "TextKaraokeBox", trace);
2663
0
  gf_fprintf(trace, "highlight_starttime=\"%d\">\n", p->highlight_starttime);
2664
0
  for (i=0; i<p->nb_entries; i++) {
2665
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);
2666
0
  }
2667
0
  if (!p->size) {
2668
0
    gf_fprintf(trace, "<KaraokeRecord highlight_endtime=\"\" start_charoffset=\"\" end_charoffset=\"\"/>\n");
2669
0
  }
2670
0
  gf_isom_box_dump_done("TextKaraokeBox", a, trace);
2671
0
  return GF_OK;
2672
0
}
2673
GF_Err dlay_box_dump(GF_Box *a, FILE * trace)
2674
0
{
2675
0
  GF_TextScrollDelayBox*p = (GF_TextScrollDelayBox*)a;
2676
0
  gf_isom_box_dump_start(a, "TextScrollDelayBox", trace);
2677
0
  gf_fprintf(trace, "scroll_delay=\"%d\">\n", p->scroll_delay);
2678
0
  gf_isom_box_dump_done("TextScrollDelayBox", a, trace);
2679
0
  return GF_OK;
2680
0
}
2681
GF_Err href_box_dump(GF_Box *a, FILE * trace)
2682
0
{
2683
0
  GF_TextHyperTextBox*p = (GF_TextHyperTextBox*)a;
2684
0
  gf_isom_box_dump_start(a, "TextHyperTextBox", trace);
2685
0
  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");
2686
0
  gf_isom_box_dump_done("TextHyperTextBox", a, trace);
2687
0
  return GF_OK;
2688
0
}
2689
GF_Err tbox_box_dump(GF_Box *a, FILE * trace)
2690
0
{
2691
0
  GF_TextBoxBox*p = (GF_TextBoxBox*)a;
2692
0
  gf_isom_box_dump_start(a, "TextBoxBox", trace);
2693
0
  gf_fprintf(trace, ">\n");
2694
0
  tx3g_dump_box(trace, &p->box);
2695
0
  gf_isom_box_dump_done("TextBoxBox", a, trace);
2696
0
  return GF_OK;
2697
0
}
2698
GF_Err blnk_box_dump(GF_Box *a, FILE * trace)
2699
0
{
2700
0
  GF_TextBlinkBox*p = (GF_TextBlinkBox*)a;
2701
0
  gf_isom_box_dump_start(a, "TextBlinkBox", trace);
2702
0
  gf_fprintf(trace, "start_charoffset=\"%d\" end_charoffset=\"%d\">\n", p->startcharoffset, p->endcharoffset);
2703
0
  gf_isom_box_dump_done("TextBlinkBox", a, trace);
2704
0
  return GF_OK;
2705
0
}
2706
GF_Err twrp_box_dump(GF_Box *a, FILE * trace)
2707
0
{
2708
0
  GF_TextWrapBox*p = (GF_TextWrapBox*)a;
2709
0
  gf_isom_box_dump_start(a, "TextWrapBox", trace);
2710
0
  gf_fprintf(trace, "wrap_flag=\"%s\">\n", p->wrap_flag ? ( (p->wrap_flag>1) ? "Reserved" : "Automatic" ) : "No Wrap");
2711
0
  gf_isom_box_dump_done("TextWrapBox", a, trace);
2712
0
  return GF_OK;
2713
0
}
2714
2715
2716
GF_Err meta_box_dump(GF_Box *a, FILE * trace)
2717
0
{
2718
0
  GF_MetaBox *ptr = (GF_MetaBox *)a;
2719
0
  gf_isom_box_dump_start_ex(a, "MetaBox", trace, ptr->is_qt ? GF_FALSE : GF_TRUE, NULL, NULL);
2720
0
  gf_fprintf(trace, ">\n");
2721
0
  gf_isom_box_dump_done("MetaBox", a, trace);
2722
0
  return GF_OK;
2723
0
}
2724
2725
2726
GF_Err xml_box_dump(GF_Box *a, FILE * trace)
2727
0
{
2728
0
  GF_Err e=GF_OK;
2729
0
  GF_XMLBox *p = (GF_XMLBox *)a;
2730
0
  gf_isom_box_dump_start(a, "XMLBox", trace);
2731
0
  gf_fprintf(trace, ">\n");
2732
0
  gf_fprintf(trace, "<![CDATA[\n");
2733
0
  if (p->xml) {
2734
0
    u32 len = (u32) strlen(p->xml);
2735
0
    if (gf_fwrite(p->xml, len, trace)!=len) e = GF_IO_ERR;
2736
0
  }
2737
0
  gf_fprintf(trace, "]]>\n");
2738
0
  gf_isom_box_dump_done("XMLBox", a, trace);
2739
0
  return e;
2740
0
}
2741
2742
2743
GF_Err bxml_box_dump(GF_Box *a, FILE * trace)
2744
0
{
2745
0
  GF_BinaryXMLBox *p = (GF_BinaryXMLBox *)a;
2746
0
  gf_isom_box_dump_start(a, "BinaryXMLBox", trace);
2747
0
  gf_fprintf(trace, "binarySize=\"%d\">\n", p->data_length);
2748
0
  gf_isom_box_dump_done("BinaryXMLBox", a, trace);
2749
0
  return GF_OK;
2750
0
}
2751
2752
2753
GF_Err pitm_box_dump(GF_Box *a, FILE * trace)
2754
0
{
2755
0
  GF_PrimaryItemBox *p = (GF_PrimaryItemBox *)a;
2756
0
  gf_isom_box_dump_start(a, "PrimaryItemBox", trace);
2757
0
  gf_fprintf(trace, "item_ID=\"%d\">\n", p->item_ID);
2758
0
  gf_isom_box_dump_done("PrimaryItemBox", a, trace);
2759
0
  return GF_OK;
2760
0
}
2761
2762
GF_Err ipro_box_dump(GF_Box *a, FILE * trace)
2763
0
{
2764
0
  gf_isom_box_dump_start(a, "ItemProtectionBox", trace);
2765
0
  gf_fprintf(trace, ">\n");
2766
0
  gf_isom_box_dump_done("ItemProtectionBox", a, trace);
2767
0
  return GF_OK;
2768
0
}
2769
2770
GF_Err infe_box_dump(GF_Box *a, FILE * trace)
2771
0
{
2772
0
  GF_ItemInfoEntryBox *p = (GF_ItemInfoEntryBox *)a;
2773
0
  gf_isom_box_dump_start(a, "ItemInfoEntryBox", trace);
2774
0
  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));
2775
0
  gf_isom_box_dump_done("ItemInfoEntryBox", a, trace);
2776
0
  return GF_OK;
2777
0
}
2778
2779
GF_Err iinf_box_dump(GF_Box *a, FILE * trace)
2780
0
{
2781
0
  gf_isom_box_dump_start(a, "ItemInfoBox", trace);
2782
0
  gf_fprintf(trace, ">\n");
2783
0
  gf_isom_box_dump_done("ItemInfoBox", a, trace);
2784
0
  return GF_OK;
2785
0
}
2786
2787
GF_Err iloc_box_dump(GF_Box *a, FILE * trace)
2788
0
{
2789
0
  u32 i, j, count, count2;
2790
0
  GF_ItemLocationBox *p = (GF_ItemLocationBox*)a;
2791
0
  gf_isom_box_dump_start(a, "ItemLocationBox", trace);
2792
0
  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);
2793
0
  count = gf_list_count(p->location_entries);
2794
0
  for (i=0; i<count; i++) {
2795
0
    GF_ItemLocationEntry *ie = (GF_ItemLocationEntry *)gf_list_get(p->location_entries, i);
2796
0
    count2 = gf_list_count(ie->extent_entries);
2797
0
    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);
2798
0
    for (j=0; j<count2; j++) {
2799
0
      GF_ItemExtentEntry *iee = (GF_ItemExtentEntry *)gf_list_get(ie->extent_entries, j);
2800
0
      gf_fprintf(trace, "<ItemExtentEntry extent_offset=\""LLD"\" extent_length=\""LLD"\" extent_index=\""LLD"\" />\n", iee->extent_offset, iee->extent_length, iee->extent_index);
2801
0
    }
2802
0
    gf_fprintf(trace, "</ItemLocationEntry>\n");
2803
0
  }
2804
0
  if (!p->size) {
2805
0
    gf_fprintf(trace, "<ItemLocationEntry item_ID=\"\" data_reference_index=\"\" base_offset=\"\" construction_method=\"\">\n");
2806
0
    gf_fprintf(trace, "<ItemExtentEntry extent_offset=\"\" extent_length=\"\" extent_index=\"\" />\n");
2807
0
    gf_fprintf(trace, "</ItemLocationEntry>\n");
2808
0
  }
2809
0
  gf_isom_box_dump_done("ItemLocationBox", a, trace);
2810
0
  return GF_OK;
2811
0
}
2812
2813
GF_Err iref_box_dump(GF_Box *a, FILE * trace)
2814
0
{
2815
0
  gf_isom_box_dump_start(a, "ItemReferenceBox", trace);
2816
0
  gf_fprintf(trace, ">\n");
2817
0
  gf_isom_box_dump_done("ItemReferenceBox", a, trace);
2818
0
  return GF_OK;
2819
0
}
2820
2821
GF_Err hinf_box_dump(GF_Box *a, FILE * trace)
2822
0
{
2823
//  GF_HintInfoBox *p  = (GF_HintInfoBox *)a;
2824
0
  gf_isom_box_dump_start(a, "HintInfoBox", trace);
2825
0
  gf_fprintf(trace, ">\n");
2826
0
  gf_isom_box_dump_done("HintInfoBox", a, trace);
2827
0
  return GF_OK;
2828
0
}
2829
2830
GF_Err trpy_box_dump(GF_Box *a, FILE * trace)
2831
0
{
2832
0
  GF_TRPYBox *p = (GF_TRPYBox *)a;
2833
0
  gf_isom_box_dump_start(a, "LargeTotalRTPBytesBox", trace);
2834
0
  gf_fprintf(trace, "RTPBytesSent=\""LLD"\">\n", p->nbBytes);
2835
0
  gf_isom_box_dump_done("LargeTotalRTPBytesBox", a, trace);
2836
0
  return GF_OK;
2837
0
}
2838
2839
GF_Err totl_box_dump(GF_Box *a, FILE * trace)
2840
0
{
2841
0
  GF_TOTLBox *p;
2842
2843
0
  p = (GF_TOTLBox *)a;
2844
0
  gf_isom_box_dump_start(a, "TotalRTPBytesBox", trace);
2845
0
  gf_fprintf(trace, "RTPBytesSent=\"%d\">\n", p->nbBytes);
2846
0
  gf_isom_box_dump_done("TotalRTPBytesBox", a, trace);
2847
0
  return GF_OK;
2848
0
}
2849
2850
GF_Err nump_box_dump(GF_Box *a, FILE * trace)
2851
0
{
2852
0
  GF_NUMPBox *p;
2853
2854
0
  p = (GF_NUMPBox *)a;
2855
0
  gf_isom_box_dump_start(a, "LargeTotalPacketBox", trace);
2856
0
  gf_fprintf(trace, "PacketsSent=\""LLD"\">\n", p->nbPackets);
2857
0
  gf_isom_box_dump_done("LargeTotalPacketBox", a, trace);
2858
0
  return GF_OK;
2859
0
}
2860
2861
GF_Err npck_box_dump(GF_Box *a, FILE * trace)
2862
0
{
2863
0
  GF_NPCKBox *p;
2864
0
  p = (GF_NPCKBox *)a;
2865
0
  gf_isom_box_dump_start(a, "TotalPacketBox", trace);
2866
0
  gf_fprintf(trace, "packetsSent=\"%d\">\n", p->nbPackets);
2867
0
  gf_isom_box_dump_done("TotalPacketBox", a, trace);
2868
0
  return GF_OK;
2869
0
}
2870
2871
GF_Err tpyl_box_dump(GF_Box *a, FILE * trace)
2872
0
{
2873
0
  GF_NTYLBox *p;
2874
0
  p = (GF_NTYLBox *)a;
2875
0
  gf_isom_box_dump_start(a, "LargeTotalMediaBytesBox", trace);
2876
0
  gf_fprintf(trace, "BytesSent=\""LLD"\">\n", p->nbBytes);
2877
0
  gf_isom_box_dump_done("LargeTotalMediaBytesBox", a, trace);
2878
0
  return GF_OK;
2879
0
}
2880
2881
GF_Err tpay_box_dump(GF_Box *a, FILE * trace)
2882
0
{
2883
0
  GF_TPAYBox *p;
2884
0
  p = (GF_TPAYBox *)a;
2885
0
  gf_isom_box_dump_start(a, "TotalMediaBytesBox", trace);
2886
0
  gf_fprintf(trace, "BytesSent=\"%d\">\n", p->nbBytes);
2887
0
  gf_isom_box_dump_done("TotalMediaBytesBox", a, trace);
2888
0
  return GF_OK;
2889
0
}
2890
2891
GF_Err maxr_box_dump(GF_Box *a, FILE * trace)
2892
0
{
2893
0
  GF_MAXRBox *p;
2894
0
  p = (GF_MAXRBox *)a;
2895
0
  gf_isom_box_dump_start(a, "MaxDataRateBox", trace);
2896
0
  gf_fprintf(trace, "MaxDataRate=\"%d\" Granularity=\"%d\">\n", p->maxDataRate, p->granularity);
2897
0
  gf_isom_box_dump_done("MaxDataRateBox", a, trace);
2898
0
  return GF_OK;
2899
0
}
2900
2901
GF_Err dmed_box_dump(GF_Box *a, FILE * trace)
2902
0
{
2903
0
  GF_DMEDBox *p;
2904
2905
0
  p = (GF_DMEDBox *)a;
2906
0
  gf_isom_box_dump_start(a, "BytesFromMediaTrackBox", trace);
2907
0
  gf_fprintf(trace, "BytesSent=\""LLD"\">\n", p->nbBytes);
2908
0
  gf_isom_box_dump_done("BytesFromMediaTrackBox", a, trace);
2909
0
  return GF_OK;
2910
0
}
2911
2912
GF_Err dimm_box_dump(GF_Box *a, FILE * trace)
2913
0
{
2914
0
  GF_DIMMBox *p;
2915
0
  p = (GF_DIMMBox *)a;
2916
0
  gf_isom_box_dump_start(a, "ImmediateDataBytesBox", trace);
2917
0
  gf_fprintf(trace, "BytesSent=\""LLD"\">\n", p->nbBytes);
2918
0
  gf_isom_box_dump_done("ImmediateDataBytesBox", a, trace);
2919
0
  return GF_OK;
2920
0
}
2921
2922
GF_Err drep_box_dump(GF_Box *a, FILE * trace)
2923
0
{
2924
0
  GF_DREPBox *p;
2925
0
  p = (GF_DREPBox *)a;
2926
0
  gf_isom_box_dump_start(a, "RepeatedDataBytesBox", trace);
2927
0
  gf_fprintf(trace, "RepeatedBytes=\""LLD"\">\n", p->nbBytes);
2928
0
  gf_isom_box_dump_done("RepeatedDataBytesBox", a, trace);
2929
0
  return GF_OK;
2930
0
}
2931
2932
GF_Err tssy_box_dump(GF_Box *a, FILE * trace)
2933
0
{
2934
0
  GF_TimeStampSynchronyBox *p = (GF_TimeStampSynchronyBox *)a;
2935
0
  gf_isom_box_dump_start(a, "TimeStampSynchronyBox", trace);
2936
0
  gf_fprintf(trace, "timestamp_sync=\"%d\">\n", p->timestamp_sync);
2937
0
  gf_isom_box_dump_done("TimeStampSynchronyBox", a, trace);
2938
0
  return GF_OK;
2939
0
}
2940
2941
GF_Err rssr_box_dump(GF_Box *a, FILE * trace)
2942
0
{
2943
0
  GF_ReceivedSsrcBox *p = (GF_ReceivedSsrcBox *)a;
2944
0
  gf_isom_box_dump_start(a, "ReceivedSsrcBox", trace);
2945
0
  gf_fprintf(trace, "SSRC=\"%d\">\n", p->ssrc);
2946
0
  gf_isom_box_dump_done("ReceivedSsrcBox", a, trace);
2947
0
  return GF_OK;
2948
0
}
2949
2950
GF_Err tmin_box_dump(GF_Box *a, FILE * trace)
2951
0
{
2952
0
  GF_TMINBox *p;
2953
0
  p = (GF_TMINBox *)a;
2954
0
  gf_isom_box_dump_start(a, "MinTransmissionTimeBox", trace);
2955
0
  gf_fprintf(trace, "MinimumTransmitTime=\"%d\">\n", p->minTime);
2956
0
  gf_isom_box_dump_done("MinTransmissionTimeBox", a, trace);
2957
0
  return GF_OK;
2958
0
}
2959
2960
GF_Err tmax_box_dump(GF_Box *a, FILE * trace)
2961
0
{
2962
0
  GF_TMAXBox *p;
2963
0
  p = (GF_TMAXBox *)a;
2964
0
  gf_isom_box_dump_start(a, "MaxTransmissionTimeBox", trace);
2965
0
  gf_fprintf(trace, "MaximumTransmitTime=\"%d\">\n", p->maxTime);
2966
0
  gf_isom_box_dump_done("MaxTransmissionTimeBox", a, trace);
2967
0
  return GF_OK;
2968
0
}
2969
2970
GF_Err pmax_box_dump(GF_Box *a, FILE * trace)
2971
0
{
2972
0
  GF_PMAXBox *p;
2973
0
  p = (GF_PMAXBox *)a;
2974
0
  gf_isom_box_dump_start(a, "MaxPacketSizeBox", trace);
2975
0
  gf_fprintf(trace, "MaximumSize=\"%d\">\n", p->maxSize);
2976
0
  gf_isom_box_dump_done("MaxPacketSizeBox", a, trace);
2977
0
  return GF_OK;
2978
0
}
2979
2980
GF_Err dmax_box_dump(GF_Box *a, FILE * trace)
2981
0
{
2982
0
  GF_DMAXBox *p;
2983
0
  p = (GF_DMAXBox *)a;
2984
0
  gf_isom_box_dump_start(a, "MaxPacketDurationBox", trace);
2985
0
  gf_fprintf(trace, "MaximumDuration=\"%d\">\n", p->maxDur);
2986
0
  gf_isom_box_dump_done("MaxPacketDurationBox", a, trace);
2987
0
  return GF_OK;
2988
0
}
2989
2990
GF_Err payt_box_dump(GF_Box *a, FILE * trace)
2991
0
{
2992
0
  GF_PAYTBox *p;
2993
0
  p = (GF_PAYTBox *)a;
2994
0
  gf_isom_box_dump_start(a, "PayloadTypeBox", trace);
2995
0
  gf_fprintf(trace, "PayloadID=\"%d\" PayloadString=\"%s\">\n", p->payloadCode, p->payloadString);
2996
0
  gf_isom_box_dump_done("PayloadTypeBox", a, trace);
2997
0
  return GF_OK;
2998
0
}
2999
3000
GF_Err name_box_dump(GF_Box *a, FILE * trace)
3001
0
{
3002
0
  GF_NameBox *p;
3003
0
  p = (GF_NameBox *)a;
3004
0
  gf_isom_box_dump_start(a, "NameBox", trace);
3005
0
  gf_fprintf(trace, "Name=\"%s\">\n", p->string);
3006
0
  gf_isom_box_dump_done("NameBox", a, trace);
3007
0
  return GF_OK;
3008
0
}
3009
3010
GF_Err rely_box_dump(GF_Box *a, FILE * trace)
3011
0
{
3012
0
  GF_RelyHintBox *p;
3013
0
  p = (GF_RelyHintBox *)a;
3014
0
  gf_isom_box_dump_start(a, "RelyTransmissionBox", trace);
3015
0
  gf_fprintf(trace, "preferred=\"%d\" required=\"%d\">\n", p->preferred, p->required);
3016
0
  gf_isom_box_dump_done("RelyTransmissionBox", a, trace);
3017
0
  return GF_OK;
3018
0
}
3019
3020
GF_Err snro_box_dump(GF_Box *a, FILE * trace)
3021
0
{
3022
0
  GF_SeqOffHintEntryBox *p;
3023
0
  p = (GF_SeqOffHintEntryBox *)a;
3024
0
  gf_isom_box_dump_start(a, "PacketSequenceOffsetBox", trace);
3025
0
  gf_fprintf(trace, "SeqNumOffset=\"%d\">\n", p->SeqOffset);
3026
0
  gf_isom_box_dump_done("PacketSequenceOffsetBox", a, trace);
3027
0
  return GF_OK;
3028
0
}
3029
3030
GF_Err tims_box_dump(GF_Box *a, FILE * trace)
3031
0
{
3032
0
  GF_TSHintEntryBox *p;
3033
0
  p = (GF_TSHintEntryBox *)a;
3034
0
  gf_isom_box_dump_start(a, "RTPTimeScaleBox", trace);
3035
0
  gf_fprintf(trace, "TimeScale=\"%d\">\n", p->timeScale);
3036
0
  gf_isom_box_dump_done("RTPTimeScaleBox", a, trace);
3037
0
  return GF_OK;
3038
0
}
3039
3040
GF_Err tsro_box_dump(GF_Box *a, FILE * trace)
3041
0
{
3042
0
  GF_TimeOffHintEntryBox *p;
3043
0
  p = (GF_TimeOffHintEntryBox *)a;
3044
0
  gf_isom_box_dump_start(a, "TimeStampOffsetBox", trace);
3045
0
  gf_fprintf(trace, "TimeStampOffset=\"%d\">\n", p->TimeOffset);
3046
0
  gf_isom_box_dump_done("TimeStampOffsetBox", a, trace);
3047
0
  return GF_OK;
3048
0
}
3049
3050
3051
GF_Err ghnt_box_dump(GF_Box *a, FILE * trace)
3052
0
{
3053
0
  char *name;
3054
0
  GF_HintSampleEntryBox *p;
3055
0
  p = (GF_HintSampleEntryBox *)a;
3056
3057
0
  if (a->type == GF_ISOM_BOX_TYPE_RTP_STSD) {
3058
0
    name = "RTPHintSampleEntryBox";
3059
0
  } else if (a->type == GF_ISOM_BOX_TYPE_SRTP_STSD) {
3060
0
    name = "SRTPHintSampleEntryBox";
3061
0
  } else if (a->type == GF_ISOM_BOX_TYPE_FDP_STSD) {
3062
0
    name = "FDPHintSampleEntryBox";
3063
0
  } else if (a->type == GF_ISOM_BOX_TYPE_RRTP_STSD) {
3064
0
    name = "RTPReceptionHintSampleEntryBox";
3065
0
  } else if (a->type == GF_ISOM_BOX_TYPE_RTCP_STSD) {
3066
0
    name = "RTCPReceptionHintSampleEntryBox";
3067
0
  } else {
3068
0
    name = "GenericHintSampleEntryBox";
3069
0
  }
3070
0
  gf_isom_box_dump_start(a, name, trace);
3071
0
  gf_fprintf(trace, "DataReferenceIndex=\"%d\" HintTrackVersion=\"%d\" LastCompatibleVersion=\"%d\"", p->dataReferenceIndex, p->HintTrackVersion, p->LastCompatibleVersion);
3072
0
  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)) {
3073
0
    gf_fprintf(trace, " MaxPacketSize=\"%d\"", p->MaxPacketSize);
3074
0
  } else if (a->type == GF_ISOM_BOX_TYPE_FDP_STSD) {
3075
0
    gf_fprintf(trace, " partition_entry_ID=\"%d\" FEC_overhead=\"%d\"", p->partition_entry_ID, p->FEC_overhead);
3076
0
  }
3077
0
  gf_fprintf(trace, ">\n");
3078
3079
0
  gf_isom_box_dump_done(name, a, trace);
3080
0
  return GF_OK;
3081
0
}
3082
3083
GF_Err hnti_box_dump(GF_Box *a, FILE * trace)
3084
0
{
3085
0
  gf_isom_box_dump_start(a, "HintTrackInfoBox", trace);
3086
0
  gf_fprintf(trace, ">\n");
3087
0
  gf_isom_box_dump_done("HintTrackInfoBox", a, trace);
3088
0
  return GF_OK;
3089
0
}
3090
3091
GF_Err sdp_box_dump(GF_Box *a, FILE * trace)
3092
0
{
3093
0
  GF_SDPBox *p = (GF_SDPBox *)a;
3094
0
  gf_isom_box_dump_start(a, "SDPBox", trace);
3095
0
  gf_fprintf(trace, ">\n");
3096
0
  if (p->sdpText)
3097
0
    gf_fprintf(trace, "<!-- sdp text: %s -->\n", p->sdpText);
3098
0
  gf_isom_box_dump_done("SDPBox", a, trace);
3099
0
  return GF_OK;
3100
0
}
3101
3102
GF_Err rtp_hnti_box_dump(GF_Box *a, FILE * trace)
3103
0
{
3104
0
  GF_RTPBox *p = (GF_RTPBox *)a;
3105
0
  gf_isom_box_dump_start(a, "RTPMovieHintInformationBox", trace);
3106
0
  gf_fprintf(trace, "descriptionformat=\"%s\">\n", gf_4cc_to_str(p->subType));
3107
0
  if (p->sdpText)
3108
0
    gf_fprintf(trace, "<!-- sdp text: %s -->\n", p->sdpText);
3109
0
  gf_isom_box_dump_done("RTPMovieHintInformationBox", a, trace);
3110
0
  return GF_OK;
3111
0
}
3112
3113
GF_Err rtpo_box_dump(GF_Box *a, FILE * trace)
3114
0
{
3115
0
  GF_RTPOBox *p;
3116
0
  p = (GF_RTPOBox *)a;
3117
0
  gf_isom_box_dump_start(a, "RTPTimeOffsetBox", trace);
3118
0
  gf_fprintf(trace, "PacketTimeOffset=\"%d\">\n", p->timeOffset);
3119
0
  gf_isom_box_dump_done("RTPTimeOffsetBox", a, trace);
3120
0
  return GF_OK;
3121
0
}
3122
3123
#ifndef GPAC_DISABLE_ISOM_FRAGMENTS
3124
3125
GF_Err mvex_box_dump(GF_Box *a, FILE * trace)
3126
0
{
3127
0
  gf_isom_box_dump_start(a, "MovieExtendsBox", trace);
3128
0
  gf_fprintf(trace, ">\n");
3129
0
  gf_isom_box_dump_done("MovieExtendsBox", a, trace);
3130
0
  return GF_OK;
3131
0
}
3132
3133
GF_Err mehd_box_dump(GF_Box *a, FILE * trace)
3134
0
{
3135
0
  GF_MovieExtendsHeaderBox *p = (GF_MovieExtendsHeaderBox*)a;
3136
0
  gf_isom_box_dump_start(a, "MovieExtendsHeaderBox", trace);
3137
0
  gf_fprintf(trace, "fragmentDuration=\""LLD"\" >\n", p->fragment_duration);
3138
0
  gf_isom_box_dump_done("MovieExtendsHeaderBox", a, trace);
3139
0
  return GF_OK;
3140
0
}
3141
3142
void sample_flags_dump(const char *name, u32 sample_flags, FILE * trace)
3143
0
{
3144
0
  gf_fprintf(trace, "<%s", name);
3145
0
  gf_fprintf(trace, " IsLeading=\"%d\"", GF_ISOM_GET_FRAG_LEAD(sample_flags) );
3146
0
  gf_fprintf(trace, " SampleDependsOn=\"%d\"", GF_ISOM_GET_FRAG_DEPENDS(sample_flags) );
3147
0
  gf_fprintf(trace, " SampleIsDependedOn=\"%d\"", GF_ISOM_GET_FRAG_DEPENDED(sample_flags) );
3148
0
  gf_fprintf(trace, " SampleHasRedundancy=\"%d\"", GF_ISOM_GET_FRAG_REDUNDANT(sample_flags) );
3149
0
  gf_fprintf(trace, " SamplePadding=\"%d\"", GF_ISOM_GET_FRAG_PAD(sample_flags) );
3150
0
  gf_fprintf(trace, " SampleSync=\"%d\"", GF_ISOM_GET_FRAG_SYNC(sample_flags));
3151
0
  gf_fprintf(trace, " SampleDegradationPriority=\"%d\"", GF_ISOM_GET_FRAG_DEG(sample_flags));
3152
0
  gf_fprintf(trace, "/>\n");
3153
0
}
3154
3155
GF_Err trex_box_dump(GF_Box *a, FILE * trace)
3156
0
{
3157
0
  GF_TrackExtendsBox *p;
3158
0
  p = (GF_TrackExtendsBox *)a;
3159
0
  gf_isom_box_dump_start(a, "TrackExtendsBox", trace);
3160
0
  gf_fprintf(trace, "TrackID=\"%d\"", p->trackID);
3161
0
  gf_fprintf(trace, " SampleDescriptionIndex=\"%d\" SampleDuration=\"%d\" SampleSize=\"%d\"", p->def_sample_desc_index, p->def_sample_duration, p->def_sample_size);
3162
0
  gf_fprintf(trace, ">\n");
3163
0
  sample_flags_dump("DefaultSampleFlags", p->def_sample_flags, trace);
3164
0
  gf_isom_box_dump_done("TrackExtendsBox", a, trace);
3165
0
  return GF_OK;
3166
0
}
3167
3168
GF_Err trep_box_dump(GF_Box *a, FILE * trace)
3169
0
{
3170
0
  GF_TrackExtensionPropertiesBox *p = (GF_TrackExtensionPropertiesBox*)a;
3171
0
  gf_isom_box_dump_start(a, "TrackExtensionPropertiesBox", trace);
3172
0
  gf_fprintf(trace, "TrackID=\"%d\">\n", p->trackID);
3173
0
  gf_isom_box_dump_done("TrackExtensionPropertiesBox", a, trace);
3174
0
  return GF_OK;
3175
0
}
3176
3177
GF_Err moof_box_dump(GF_Box *a, FILE * trace)
3178
0
{
3179
0
  GF_MovieFragmentBox *p;
3180
0
  p = (GF_MovieFragmentBox *)a;
3181
0
  gf_isom_box_dump_start(a, "MovieFragmentBox", trace);
3182
0
  gf_fprintf(trace, "TrackFragments=\"%d\"", gf_list_count(p->TrackList));
3183
0
  if (p->internal_flags & GF_ISOM_BOX_COMPRESSED)
3184
0
    gf_fprintf(trace, " compressedSize=\""LLU"\"", p->size - p->compressed_diff);
3185
0
  gf_fprintf(trace, ">\n");
3186
0
  gf_isom_box_dump_done("MovieFragmentBox", a, trace);
3187
0
  return GF_OK;
3188
0
}
3189
3190
GF_Err mfhd_box_dump(GF_Box *a, FILE * trace)
3191
0
{
3192
0
  GF_MovieFragmentHeaderBox *p;
3193
0
  p = (GF_MovieFragmentHeaderBox *)a;
3194
0
  gf_isom_box_dump_start(a, "MovieFragmentHeaderBox", trace);
3195
0
  gf_fprintf(trace, "FragmentSequenceNumber=\"%d\">\n", p->sequence_number);
3196
0
  gf_isom_box_dump_done("MovieFragmentHeaderBox", a, trace);
3197
0
  return GF_OK;
3198
0
}
3199
3200
GF_Err traf_box_dump(GF_Box *a, FILE * trace)
3201
0
{
3202
0
  gf_isom_box_dump_start(a, "TrackFragmentBox", trace);
3203
0
  gf_fprintf(trace, ">\n");
3204
0
  gf_isom_box_dump_done("TrackFragmentBox", a, trace);
3205
0
  return GF_OK;
3206
0
}
3207
3208
static void frag_dump_sample_flags(FILE * trace, u32 flags, u32 field_idx)
3209
0
{
3210
0
  if (!field_idx) return;
3211
0
  if (field_idx==1) {
3212
0
    gf_fprintf(trace, " IsLeading=\"%d\" DependsOn=\"%d\"", GF_ISOM_GET_FRAG_LEAD(flags), GF_ISOM_GET_FRAG_DEPENDS(flags));
3213
0
  } else if (field_idx==2) {
3214
0
    gf_fprintf(trace, " IsLeading=\"%d\" DependsOn=\"%d\" IsDependedOn=\"%d\" HasRedundancy=\"%d\" SamplePadding=\"%d\" Sync=\"%d\"",
3215
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));
3216
0
  } else {
3217
0
    gf_fprintf(trace, " SamplePadding=\"%d\" Sync=\"%d\" DegradationPriority=\"%d\" IsLeading=\"%d\" DependsOn=\"%d\" IsDependedOn=\"%d\" HasRedundancy=\"%d\"",
3218
0
    GF_ISOM_GET_FRAG_PAD(flags), GF_ISOM_GET_FRAG_SYNC(flags), GF_ISOM_GET_FRAG_DEG(flags),
3219
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));
3220
0
  }
3221
0
}
3222
3223
GF_Err tfhd_box_dump(GF_Box *a, FILE * trace)
3224
0
{
3225
0
  GF_TrackFragmentHeaderBox *p;
3226
0
  p = (GF_TrackFragmentHeaderBox *)a;
3227
0
  gf_isom_box_dump_start(a, "TrackFragmentHeaderBox", trace);
3228
0
  gf_fprintf(trace, "TrackID=\"%u\"", p->trackID);
3229
3230
0
  if (p->flags & GF_ISOM_TRAF_BASE_OFFSET) {
3231
0
    gf_fprintf(trace, " BaseDataOffset=\""LLU"\"", p->base_data_offset);
3232
0
  } else {
3233
0
    gf_fprintf(trace, " BaseDataOffset=\"%s\"", (p->flags & GF_ISOM_MOOF_BASE_OFFSET) ? "moof" : "moof-or-previous-traf");
3234
0
  }
3235
3236
0
  if (p->flags & GF_ISOM_TRAF_SAMPLE_DESC)
3237
0
    gf_fprintf(trace, " SampleDescriptionIndex=\"%u\"", p->sample_desc_index);
3238
0
  if (p->flags & GF_ISOM_TRAF_SAMPLE_DUR)
3239
0
    gf_fprintf(trace, " SampleDuration=\"%u\"", p->def_sample_duration);
3240
0
  if (p->flags & GF_ISOM_TRAF_SAMPLE_SIZE)
3241
0
    gf_fprintf(trace, " SampleSize=\"%u\"", p->def_sample_size);
3242
3243
0
  if (p->flags & GF_ISOM_TRAF_SAMPLE_FLAGS) {
3244
0
    frag_dump_sample_flags(trace, p->def_sample_flags, 3);
3245
0
  }
3246
3247
0
  gf_fprintf(trace, ">\n");
3248
3249
0
  gf_isom_box_dump_done("TrackFragmentHeaderBox", a, trace);
3250
0
  return GF_OK;
3251
0
}
3252
3253
GF_Err tfxd_box_dump(GF_Box *a, FILE * trace)
3254
0
{
3255
0
  GF_MSSTimeExtBox *ptr = (GF_MSSTimeExtBox*)a;
3256
0
  if (!a) return GF_BAD_PARAM;
3257
0
  gf_isom_box_dump_start(a, "MSSTimeExtensionBox", trace);
3258
0
  gf_fprintf(trace, "AbsoluteTime=\""LLU"\" FragmentDuration=\""LLU"\">\n", ptr->absolute_time_in_track_timescale, ptr->fragment_duration_in_track_timescale);
3259
0
  gf_fprintf(trace, "<FullBoxInfo Version=\"%d\" Flags=\"%d\"/>\n", ptr->version, ptr->flags);
3260
0
  gf_isom_box_dump_done("MSSTimeExtensionBox", a, trace);
3261
0
  return GF_OK;
3262
0
}
3263
3264
GF_Err tfrf_box_dump(GF_Box *a, FILE * trace)
3265
0
{
3266
0
  u32 i;
3267
0
  GF_MSSTimeRefBox *ptr = (GF_MSSTimeRefBox*)a;
3268
0
  if (!a) return GF_BAD_PARAM;
3269
0
  gf_isom_box_dump_start(a, "MSSTimeReferenceBox", trace);
3270
0
  gf_fprintf(trace, "FragmentsCount=\"%d\">\n", ptr->frags_count);
3271
0
  gf_fprintf(trace, "<FullBoxInfo Version=\"%d\" Flags=\"%d\"/>\n", ptr->version, ptr->flags);
3272
0
  for (i=0; i<ptr->frags_count; i++) {
3273
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);
3274
0
  }
3275
0
  gf_isom_box_dump_done("MSSTimeReferenceBox", a, trace);
3276
0
  return GF_OK;
3277
0
}
3278
GF_Err trun_box_dump(GF_Box *a, FILE * trace)
3279
0
{
3280
0
  u32 i, flags;
3281
0
  Bool full_dump = GF_FALSE;
3282
0
  GF_TrackFragmentRunBox *p;
3283
3284
0
  p = (GF_TrackFragmentRunBox *)a;
3285
0
  flags = p->flags;
3286
#ifdef GF_ENABLE_CTRN
3287
  if (p->use_ctrn) {
3288
    p->flags = p->ctrn_flags;
3289
    p->type = GF_ISOM_BOX_TYPE_CTRN;
3290
  }
3291
  gf_isom_box_dump_start(a, p->use_ctrn ? "CompactTrackRunBox" : "TrackRunBox", trace);
3292
#else
3293
0
  gf_isom_box_dump_start(a, "TrackRunBox", trace);
3294
0
#endif
3295
0
  p->flags = flags;
3296
0
  p->type = GF_ISOM_BOX_TYPE_TRUN;
3297
0
  gf_fprintf(trace, "SampleCount=\"%d\"", p->sample_count);
3298
3299
0
  if (p->flags & GF_ISOM_TRUN_DATA_OFFSET)
3300
0
    gf_fprintf(trace, " DataOffset=\"%d\"", p->data_offset);
3301
3302
#ifdef GF_ENABLE_CTRN
3303
  if (p->use_ctrn) {
3304
    if (p->ctrn_flags & GF_ISOM_CTRN_DATAOFFSET_16)
3305
      gf_fprintf(trace, " dataOffset16Bits=\"yes\"");
3306
3307
    if (p->ctso_multiplier)
3308
      gf_fprintf(trace, " ctsoMultiplier=\"%d\"", p->ctso_multiplier);
3309
3310
    if (p->ctrn_flags & GF_ISOM_CTRN_INHERIT_DUR)
3311
      gf_fprintf(trace, " inheritDuration=\"yes\"");
3312
    if (p->ctrn_flags & GF_ISOM_CTRN_INHERIT_SIZE)
3313
      gf_fprintf(trace, " inheritSize=\"yes\"");
3314
    if (p->ctrn_flags & GF_ISOM_CTRN_INHERIT_FLAGS)
3315
      gf_fprintf(trace, " inheritFlags=\"yes\"");
3316
    if (p->ctrn_flags & GF_ISOM_CTRN_INHERIT_CTSO)
3317
      gf_fprintf(trace, " inheritCTSOffset=\"yes\"");
3318
3319
    gf_fprintf(trace, " firstSampleDurationBits=\"%d\"", gf_isom_ctrn_field_size_bits(p->ctrn_first_dur));
3320
    gf_fprintf(trace, " firstSampleSizeBits=\"%d\"", gf_isom_ctrn_field_size_bits(p->ctrn_first_size));
3321
    gf_fprintf(trace, " firstSampleFlagsBits=\"%d\"", gf_isom_ctrn_field_size_bits(p->ctrn_first_sample_flags));
3322
    gf_fprintf(trace, " firstSampleCTSOBits=\"%d\"", gf_isom_ctrn_field_size_bits(p->ctrn_first_ctts));
3323
    gf_fprintf(trace, " sampleDurationBits=\"%d\"", gf_isom_ctrn_field_size_bits(p->ctrn_dur));
3324
    gf_fprintf(trace, " sampleSizeBits=\"%d\"", gf_isom_ctrn_field_size_bits(p->ctrn_size));
3325
    gf_fprintf(trace, " sampleFlagsBits=\"%d\"", gf_isom_ctrn_field_size_bits(p->ctrn_sample_flags));
3326
    gf_fprintf(trace, " sampleCTSOBits=\"%d\"", gf_isom_ctrn_field_size_bits(p->ctrn_ctts));
3327
    if (p->ctrn_flags & 0x00FFFF00)
3328
      full_dump = GF_TRUE;
3329
3330
    gf_fprintf(trace, ">\n");
3331
  } else
3332
#endif
3333
0
  {
3334
0
    gf_fprintf(trace, ">\n");
3335
3336
0
    if (p->flags & GF_ISOM_TRUN_FIRST_FLAG) {
3337
0
      sample_flags_dump("FirstSampleFlags", p->first_sample_flags, trace);
3338
0
    }
3339
0
    if (p->flags & (GF_ISOM_TRUN_DURATION|GF_ISOM_TRUN_SIZE|GF_ISOM_TRUN_CTS_OFFSET|GF_ISOM_TRUN_FLAGS)) {
3340
0
      full_dump = GF_TRUE;
3341
0
    }
3342
0
  }
3343
3344
0
  if (full_dump) {
3345
0
    for (i=0; i<p->nb_samples; i++) {
3346
0
      GF_TrunEntry *ent = &p->samples[i];
3347
3348
0
      gf_fprintf(trace, "<TrackRunEntry");
3349
3350
#ifdef GF_ENABLE_CTRN
3351
      if (p->use_ctrn) {
3352
        if ((i==1) && (p->ctrn_flags&GF_ISOM_CTRN_FIRST_SAMPLE) ) {
3353
          if (p->ctrn_first_dur)
3354
            gf_fprintf(trace, " Duration=\"%u\"", ent->Duration);
3355
          if (p->ctrn_first_size)
3356
            gf_fprintf(trace, " Size=\"%u\"", ent->size);
3357
          if (p->ctrn_first_ctts) {
3358
            if (p->version == 0)
3359
              gf_fprintf(trace, " CTSOffset=\"%u\"", (u32) ent->CTS_Offset);
3360
            else
3361
              gf_fprintf(trace, " CTSOffset=\"%d\"", ent->CTS_Offset);
3362
          }
3363
          if (p->ctrn_first_sample_flags)
3364
            frag_dump_sample_flags(trace, ent->flags, p->ctrn_first_sample_flags);
3365
        } else {
3366
          if (p->ctrn_dur)
3367
            gf_fprintf(trace, " Duration=\"%u\"", ent->Duration);
3368
          if (p->ctrn_size)
3369
            gf_fprintf(trace, " Size=\"%u\"", ent->size);
3370
          if (p->ctrn_ctts) {
3371
            if (p->version == 0)
3372
              gf_fprintf(trace, " CTSOffset=\"%u\"", (u32) ent->CTS_Offset);
3373
            else
3374
              gf_fprintf(trace, " CTSOffset=\"%d\"", ent->CTS_Offset);
3375
          }
3376
          if (p->ctrn_sample_flags)
3377
            frag_dump_sample_flags(trace, ent->flags, p->ctrn_sample_flags);
3378
        }
3379
      } else
3380
#endif
3381
0
      {
3382
3383
0
        if (p->flags & GF_ISOM_TRUN_DURATION)
3384
0
          gf_fprintf(trace, " Duration=\"%u\"", ent->Duration);
3385
0
        if (p->flags & GF_ISOM_TRUN_SIZE)
3386
0
          gf_fprintf(trace, " Size=\"%u\"", ent->size);
3387
0
        if (p->flags & GF_ISOM_TRUN_CTS_OFFSET)
3388
0
        {
3389
0
          if (p->version == 0)
3390
0
            gf_fprintf(trace, " CTSOffset=\"%u\"", (u32) ent->CTS_Offset);
3391
0
          else
3392
0
            gf_fprintf(trace, " CTSOffset=\"%d\"", ent->CTS_Offset);
3393
0
        }
3394
3395
0
        if (p->flags & GF_ISOM_TRUN_FLAGS) {
3396
0
          frag_dump_sample_flags(trace, ent->flags, 3);
3397
0
        }
3398
0
      }
3399
0
      gf_fprintf(trace, "/>\n");
3400
0
    }
3401
0
  } else if (p->size) {
3402
0
    gf_fprintf(trace, "<!-- all default values used -->\n");
3403
0
  } else {
3404
0
    gf_fprintf(trace, "<TrackRunEntry Duration=\"\" Size=\"\" CTSOffset=\"\"");
3405
0
    frag_dump_sample_flags(trace, 0, 3);
3406
0
    gf_fprintf(trace, "/>\n");
3407
0
  }
3408
3409
#ifdef GF_ENABLE_CTRN
3410
  gf_isom_box_dump_done(p->use_ctrn ? "CompactTrackRunBox" : "TrackRunBox", a, trace);
3411
#else
3412
0
  gf_isom_box_dump_done("TrackRunBox", a, trace);
3413
0
#endif
3414
0
  return GF_OK;
3415
0
}
3416
3417
#endif
3418
3419
#ifndef GPAC_DISABLE_ISOM_HINTING
3420
3421
GF_Err DTE_Dump(GF_List *dte, FILE * trace)
3422
0
{
3423
0
  u32 i, count;
3424
3425
0
  count = gf_list_count(dte);
3426
0
  for (i=0; i<count; i++) {
3427
0
    GF_GenericDTE *p;
3428
0
    GF_ImmediateDTE *i_p;
3429
0
    GF_SampleDTE *s_p;
3430
0
    GF_StreamDescDTE *sd_p;
3431
0
    p = (GF_GenericDTE *)gf_list_get(dte, i);
3432
0
    switch (p->source) {
3433
0
    case 0:
3434
0
      gf_fprintf(trace, "<EmptyDataEntry/>\n");
3435
0
      break;
3436
0
    case 1:
3437
0
      i_p = (GF_ImmediateDTE *) p;
3438
0
      gf_fprintf(trace, "<ImmediateDataEntry DataSize=\"%d\"/>\n", i_p->dataLength);
3439
0
      break;
3440
0
    case 2:
3441
0
      s_p = (GF_SampleDTE *) p;
3442
0
      gf_fprintf(trace, "<SampleDataEntry DataSize=\"%d\" SampleOffset=\"%d\" SampleNumber=\"%d\" TrackReference=\"%d\"/>\n",
3443
0
              s_p->dataLength, s_p->byteOffset, s_p->sampleNumber, s_p->trackRefIndex);
3444
0
      break;
3445
0
    case 3:
3446
0
      sd_p = (GF_StreamDescDTE *) p;
3447
0
      gf_fprintf(trace, "<SampleDescriptionEntry DataSize=\"%d\" DescriptionOffset=\"%d\" StreamDescriptionindex=\"%d\" TrackReference=\"%d\"/>\n",
3448
0
              sd_p->dataLength, sd_p->byteOffset, sd_p->streamDescIndex, sd_p->trackRefIndex);
3449
0
      break;
3450
0
    default:
3451
0
      gf_fprintf(trace, "<UnknownTableEntry/>\n");
3452
0
      break;
3453
0
    }
3454
0
  }
3455
0
  return GF_OK;
3456
0
}
3457
3458
3459
GF_EXPORT
3460
GF_Err gf_isom_dump_hint_sample(GF_ISOFile *the_file, u32 trackNumber, u32 SampleNum, FILE * trace)
3461
0
{
3462
0
  GF_ISOSample *tmp;
3463
0
  GF_HintSampleEntryBox *entry;
3464
0
  u32 descIndex, count, count2, i;
3465
0
  GF_Err e=GF_OK;
3466
0
  GF_BitStream *bs;
3467
0
  GF_HintSample *s;
3468
0
  GF_TrackBox *trak;
3469
0
  GF_RTPPacket *pck;
3470
0
  char *szName;
3471
3472
0
  trak = gf_isom_get_track_box(the_file, trackNumber);
3473
0
  if (!trak || !IsHintTrack(trak)) return GF_BAD_PARAM;
3474
3475
0
  tmp = gf_isom_get_sample(the_file, trackNumber, SampleNum, &descIndex);
3476
0
  if (!tmp) return GF_BAD_PARAM;
3477
3478
0
  e = Media_GetSampleDesc(trak->Media, descIndex, (GF_SampleEntryBox **) &entry, &count);
3479
0
  if (e) {
3480
0
    gf_isom_sample_del(&tmp);
3481
0
    return e;
3482
0
  }
3483
3484
  //check we can read the sample
3485
0
  switch (entry->type) {
3486
0
  case GF_ISOM_BOX_TYPE_RTP_STSD:
3487
0
  case GF_ISOM_BOX_TYPE_SRTP_STSD:
3488
0
  case GF_ISOM_BOX_TYPE_RRTP_STSD:
3489
0
    szName = "RTP";
3490
0
    break;
3491
0
  case GF_ISOM_BOX_TYPE_RTCP_STSD:
3492
0
    szName = "RCTP";
3493
0
    break;
3494
0
  case GF_ISOM_BOX_TYPE_FDP_STSD:
3495
0
    szName = "FDP";
3496
0
    break;
3497
0
  default:
3498
0
    gf_isom_sample_del(&tmp);
3499
0
    return GF_NOT_SUPPORTED;
3500
0
  }
3501
3502
0
  bs = gf_bs_new(tmp->data, tmp->dataLength, GF_BITSTREAM_READ);
3503
0
  s = gf_isom_hint_sample_new(entry->type);
3504
0
  s->trackID = trak->Header->trackID;
3505
0
  s->sampleNumber = SampleNum;
3506
3507
0
  gf_isom_hint_sample_read(s, bs, tmp->dataLength);
3508
0
  gf_bs_del(bs);
3509
3510
0
  count = gf_list_count(s->packetTable);
3511
3512
0
  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);
3513
3514
0
  if (s->hint_subtype==GF_ISOM_BOX_TYPE_FDP_STSD) {
3515
0
    e = gf_isom_box_dump((GF_Box*) s, trace);
3516
0
    goto err_exit;
3517
0
  }
3518
3519
0
  if (s->packetCount != count) {
3520
0
    gf_fprintf(trace, "<!-- WARNING: Broken %s hint sample, %d entries indicated but only %d parsed -->\n", szName, s->packetCount, count);
3521
0
  }
3522
3523
3524
0
  for (i=0; i<count; i++) {
3525
0
    pck = (GF_RTPPacket *)gf_list_get(s->packetTable, i);
3526
3527
0
    if (pck->hint_subtype==GF_ISOM_BOX_TYPE_RTCP_STSD) {
3528
0
      GF_RTCPPacket *rtcp_pck = (GF_RTCPPacket *) pck;
3529
0
      gf_fprintf(trace, "<RTCPHintPacket PacketNumber=\"%d\" V=\"%d\" P=\"%d\" Count=\"%d\" PayloadType=\"%d\" ",
3530
0
            i+1,  rtcp_pck->Version, rtcp_pck->Padding, rtcp_pck->Count, rtcp_pck->PayloadType);
3531
3532
0
      if (rtcp_pck->data) dump_data_attribute(trace, "payload", (char*)rtcp_pck->data, rtcp_pck->length);
3533
0
      gf_fprintf(trace, ">\n");
3534
0
      gf_fprintf(trace, "</RTCPHintPacket>\n");
3535
3536
0
    } else {
3537
0
      gf_fprintf(trace, "<RTPHintPacket PacketNumber=\"%d\" P=\"%d\" X=\"%d\" M=\"%d\" PayloadType=\"%d\"",
3538
0
            i+1,  pck->P_bit, pck->X_bit, pck->M_bit, pck->payloadType);
3539
3540
0
      gf_fprintf(trace, " SequenceNumber=\"%d\" RepeatedPacket=\"%d\" DropablePacket=\"%d\" RelativeTransmissionTime=\"%d\" FullPacketSize=\"%d\">\n",
3541
0
            pck->SequenceNumber, pck->R_bit, pck->B_bit, pck->relativeTransTime, gf_isom_hint_rtp_length(pck));
3542
3543
3544
      //TLV is made of Boxes
3545
0
      count2 = gf_list_count(pck->TLV);
3546
0
      if (count2) {
3547
0
        gf_fprintf(trace, "<PrivateExtensionTable EntryCount=\"%d\">\n", count2);
3548
0
        gf_fprintf(trace, "</PrivateExtensionTable>\n");
3549
0
      }
3550
      //DTE is made of NON boxes
3551
0
      count2 = gf_list_count(pck->DataTable);
3552
0
      if (count2) {
3553
0
        gf_fprintf(trace, "<PacketDataTable EntryCount=\"%d\">\n", count2);
3554
0
        DTE_Dump(pck->DataTable, trace);
3555
0
        gf_fprintf(trace, "</PacketDataTable>\n");
3556
0
      }
3557
0
      gf_fprintf(trace, "</RTPHintPacket>\n");
3558
0
    }
3559
0
  }
3560
3561
0
err_exit:
3562
0
  gf_fprintf(trace, "</%sHintSample>\n", szName);
3563
0
  gf_isom_sample_del(&tmp);
3564
0
  gf_isom_hint_sample_del(s);
3565
0
  return e;
3566
0
}
3567
3568
#endif /*GPAC_DISABLE_ISOM_HINTING*/
3569
3570
static void tx3g_dump_box_nobox(FILE * trace, GF_BoxRecord *rec)
3571
0
{
3572
0
  gf_fprintf(trace, "<TextBox top=\"%d\" left=\"%d\" bottom=\"%d\" right=\"%d\"/>\n", rec->top, rec->left, rec->bottom, rec->right);
3573
0
}
3574
3575
static void tx3g_print_char_offsets(FILE * trace, u32 start, u32 end, u32 *shift_offset, u32 so_count)
3576
0
{
3577
0
  u32 i;
3578
0
  if (shift_offset) {
3579
0
    for (i=0; i<so_count; i++) {
3580
0
      if (start>shift_offset[i]) {
3581
0
        start --;
3582
0
        break;
3583
0
      }
3584
0
    }
3585
0
    for (i=0; i<so_count; i++) {
3586
0
      if (end>shift_offset[i]) {
3587
0
        end --;
3588
0
        break;
3589
0
      }
3590
0
    }
3591
0
  }
3592
0
  if (start || end) gf_fprintf(trace, "fromChar=\"%d\" toChar=\"%d\" ", start, end);
3593
0
}
3594
3595
static void tx3g_dump_style_nobox(FILE * trace, GF_StyleRecord *rec, u32 *shift_offset, u32 so_count)
3596
0
{
3597
0
  gf_fprintf(trace, "<Style ");
3598
0
  if (rec->startCharOffset || rec->endCharOffset)
3599
0
    tx3g_print_char_offsets(trace, rec->startCharOffset, rec->endCharOffset, shift_offset, so_count);
3600
3601
0
  gf_fprintf(trace, "styles=\"");
3602
0
  if (!rec->style_flags) {
3603
0
    gf_fprintf(trace, "Normal");
3604
0
  } else {
3605
0
    if (rec->style_flags & 1) gf_fprintf(trace, "Bold ");
3606
0
    if (rec->style_flags & 2) gf_fprintf(trace, "Italic ");
3607
0
    if (rec->style_flags & 4) gf_fprintf(trace, "Underlined ");
3608
0
  }
3609
0
  gf_fprintf(trace, "\" fontID=\"%d\" fontSize=\"%d\" ", rec->fontID, rec->font_size);
3610
0
  tx3g_dump_rgba8(trace, "color", rec->text_color);
3611
0
  gf_fprintf(trace, "/>\n");
3612
0
}
3613
3614
char *tx3g_format_time(u64 ts, u32 timescale, char *szDur, Bool is_srt)
3615
0
{
3616
0
  u32 h, m, s, ms;
3617
0
  ts = (u32) (ts*1000 / timescale);
3618
0
  h = (u32) (ts / 3600000);
3619
0
  m = (u32) (ts/ 60000) - h*60;
3620
0
  s = (u32) (ts/1000) - h*3600 - m*60;
3621
0
  ms = (u32) (ts) - h*3600000 - m*60000 - s*1000;
3622
0
  if (is_srt) {
3623
0
    sprintf(szDur, "%02d:%02d:%02d,%03d", h, m, s, ms);
3624
0
  } else {
3625
0
    sprintf(szDur, "%02d:%02d:%02d.%03d", h, m, s, ms);
3626
0
  }
3627
0
  return szDur;
3628
0
}
3629
3630
void dump_ttxt_header(FILE *dump, GF_Tx3gSampleEntryBox *txt_e, u32 def_width, u32 def_height)
3631
0
{
3632
0
  gf_fprintf(dump, "<TextSampleDescription horizontalJustification=\"");
3633
0
  switch (txt_e->horizontal_justification) {
3634
0
  case 1:
3635
0
    gf_fprintf(dump, "center");
3636
0
    break;
3637
0
  case -1:
3638
0
    gf_fprintf(dump, "right");
3639
0
    break;
3640
0
  default:
3641
0
    gf_fprintf(dump, "left");
3642
0
    break;
3643
0
  }
3644
0
  gf_fprintf(dump, "\" verticalJustification=\"");
3645
0
  switch (txt_e->vertical_justification) {
3646
0
  case 1:
3647
0
    gf_fprintf(dump, "center");
3648
0
    break;
3649
0
  case -1:
3650
0
    gf_fprintf(dump, "bottom");
3651
0
    break;
3652
0
  default:
3653
0
    gf_fprintf(dump, "top");
3654
0
    break;
3655
0
  }
3656
0
  gf_fprintf(dump, "\" ");
3657
0
  tx3g_dump_rgba8(dump, "backColor", txt_e->back_color);
3658
0
  gf_fprintf(dump, " verticalText=\"%s\"", (txt_e->displayFlags & GF_TXT_VERTICAL) ? "yes" : "no");
3659
0
  gf_fprintf(dump, " fillTextRegion=\"%s\"", (txt_e->displayFlags & GF_TXT_FILL_REGION) ? "yes" : "no");
3660
0
  gf_fprintf(dump, " continuousKaraoke=\"%s\"", (txt_e->displayFlags & GF_TXT_KARAOKE) ? "yes" : "no");
3661
0
  Bool has_scroll = GF_FALSE;
3662
0
  if (txt_e->displayFlags & GF_TXT_SCROLL_IN) {
3663
0
    has_scroll = GF_TRUE;
3664
0
    if (txt_e->displayFlags & GF_TXT_SCROLL_OUT) gf_fprintf(dump, " scroll=\"InOut\"");
3665
0
    else gf_fprintf(dump, " scroll=\"In\"");
3666
0
  } else if (txt_e->displayFlags & GF_TXT_SCROLL_OUT) {
3667
0
    has_scroll = GF_TRUE;
3668
0
    gf_fprintf(dump, " scroll=\"Out\"");
3669
0
  } else {
3670
0
    gf_fprintf(dump, " scroll=\"None\"");
3671
0
  }
3672
0
  if (has_scroll) {
3673
0
    u32 mode = (txt_e->displayFlags & GF_TXT_SCROLL_DIRECTION)>>7;
3674
0
    switch (mode) {
3675
0
    case GF_TXT_SCROLL_CREDITS:
3676
0
      gf_fprintf(dump, " scrollMode=\"Credits\"");
3677
0
      break;
3678
0
    case GF_TXT_SCROLL_MARQUEE:
3679
0
      gf_fprintf(dump, " scrollMode=\"Marquee\"");
3680
0
      break;
3681
0
    case GF_TXT_SCROLL_DOWN:
3682
0
      gf_fprintf(dump, " scrollMode=\"Down\"");
3683
0
      break;
3684
0
    case GF_TXT_SCROLL_RIGHT:
3685
0
      gf_fprintf(dump, " scrollMode=\"Right\"");
3686
0
      break;
3687
0
    default:
3688
0
      gf_fprintf(dump, " scrollMode=\"Unknown\"");
3689
0
      break;
3690
0
    }
3691
0
  }
3692
3693
0
  if (txt_e->displayFlags & GF_TXT_ALL_SAMPLES_FORCED)
3694
0
    gf_fprintf(dump, " forced=\"all\"");
3695
0
  else if (txt_e->displayFlags & GF_TXT_SOME_SAMPLES_FORCED)
3696
0
    gf_fprintf(dump, " forced=\"yes\"");
3697
3698
0
  gf_fprintf(dump, ">\n");
3699
0
  gf_fprintf(dump, "<FontTable>\n");
3700
0
  if (txt_e->font_table) {
3701
0
    u32 j;
3702
0
    for (j=0; j<txt_e->font_table->entry_count; j++) {
3703
0
      gf_fprintf(dump, "<FontTableEntry fontName=\"%s\" fontID=\"%d\"/>\n", txt_e->font_table->fonts[j].fontName, txt_e->font_table->fonts[j].fontID);
3704
3705
0
    }
3706
0
  }
3707
0
  gf_fprintf(dump, "</FontTable>\n");
3708
0
  if ((txt_e->default_box.bottom == txt_e->default_box.top) || (txt_e->default_box.right == txt_e->default_box.left)) {
3709
0
    txt_e->default_box.top = txt_e->default_box.left = 0;
3710
0
    txt_e->default_box.right = def_width / 65536;
3711
0
    txt_e->default_box.bottom = def_height / 65536;
3712
0
  }
3713
0
  tx3g_dump_box_nobox(dump, &txt_e->default_box);
3714
0
  tx3g_dump_style_nobox(dump, &txt_e->default_style, NULL, 0);
3715
0
  gf_fprintf(dump, "</TextSampleDescription>\n");
3716
0
}
3717
3718
void dump_ttxt_sample(FILE *dump, GF_TextSample *s_txt, u64 ts, u32 timescale, u32 di, Bool box_dump)
3719
0
{
3720
0
  GF_Box *a;
3721
0
  u32 len, j;
3722
0
  u32 shift_offset[20];
3723
0
  u32 so_count;
3724
0
  char szDur[100];
3725
0
  gf_fprintf(dump, "<TextSample sampleTime=\"%s\" sampleDescriptionIndex=\"%d\"", tx3g_format_time(ts, timescale, szDur, GF_FALSE), di);
3726
3727
0
  if (!box_dump) {
3728
0
    if (s_txt->highlight_color) {
3729
0
      gf_fprintf(dump, " ");
3730
0
      tx3g_dump_rgba8(dump, "highlightColor", s_txt->highlight_color->hil_color);
3731
0
    }
3732
0
    if (s_txt->scroll_delay) {
3733
0
      Double delay = s_txt->scroll_delay->scroll_delay;
3734
0
      delay /= timescale;
3735
0
      gf_fprintf(dump, " scrollDelay=\"%g\"", delay);
3736
0
    }
3737
0
    if (s_txt->wrap) gf_fprintf(dump, " wrap=\"%s\"", (s_txt->wrap->wrap_flag==0x01) ? "Automatic" : "None");
3738
3739
0
    if (s_txt->is_forced) gf_fprintf(dump, " forced=\"yes\"");
3740
0
  }
3741
3742
0
  so_count = 0;
3743
3744
0
  gf_fprintf(dump, " xml:space=\"preserve\">");
3745
0
  if (s_txt->len) {
3746
0
    unsigned short *utf16Line = gf_malloc( sizeof(u16) * (s_txt->len/2)*2 + 4 );
3747
0
    if (!utf16Line) return;
3748
    /*UTF16*/
3749
0
    if ((s_txt->len>2) && ((unsigned char) s_txt->text[0] == (unsigned char) 0xFE) && ((unsigned char) s_txt->text[1] == (unsigned char) 0xFF)) {
3750
      /*copy 2 more chars because the lib always add 2 '0' at the end for UTF16 end of string*/
3751
0
      memcpy((char *) utf16Line, s_txt->text+2, sizeof(char) * (s_txt->len));
3752
0
      len = gf_utf8_wcslen((const u16*)utf16Line);
3753
0
    } else {
3754
0
      char *str;
3755
0
      str = s_txt->text;
3756
0
      len = gf_utf8_mbstowcs((u16*)utf16Line, s_txt->len+1, (const char **) &str);
3757
0
    }
3758
0
    if (len != GF_UTF8_FAIL) {
3759
0
      utf16Line[len] = 0;
3760
0
      for (j=0; j<len; j++) {
3761
0
        if ((utf16Line[j]=='\n') || (utf16Line[j]=='\r') || (utf16Line[j]==0x85) || (utf16Line[j]==0x2028) || (utf16Line[j]==0x2029) ) {
3762
0
          gf_fprintf(dump, "\n");
3763
0
          if ((utf16Line[j]=='\r') && (utf16Line[j+1]=='\n')) {
3764
0
            shift_offset[so_count] = j;
3765
0
            so_count++;
3766
0
            j++;
3767
0
          }
3768
0
        }
3769
0
        else {
3770
0
          switch (utf16Line[j]) {
3771
0
          case '\'':
3772
0
            gf_fprintf(dump, "&apos;");
3773
0
            break;
3774
0
          case '\"':
3775
0
            gf_fprintf(dump, "&quot;");
3776
0
            break;
3777
0
          case '&':
3778
0
            gf_fprintf(dump, "&amp;");
3779
0
            break;
3780
0
          case '>':
3781
0
            gf_fprintf(dump, "&gt;");
3782
0
            break;
3783
0
          case '<':
3784
0
            gf_fprintf(dump, "&lt;");
3785
0
            break;
3786
0
          default:
3787
0
            if (utf16Line[j] < 128) {
3788
0
              gf_fprintf(dump, "%c", (u8) utf16Line[j]);
3789
0
            } else {
3790
0
              gf_fprintf(dump, "&#%d;", utf16Line[j]);
3791
0
            }
3792
0
            break;
3793
0
          }
3794
0
        }
3795
0
      }
3796
0
    }
3797
0
    if (utf16Line) gf_free(utf16Line);
3798
0
  }
3799
3800
0
  if (box_dump) {
3801
3802
0
    if (s_txt->highlight_color)
3803
0
      gf_isom_box_dump((GF_Box*) s_txt->highlight_color, dump);
3804
0
    if (s_txt->scroll_delay)
3805
0
      gf_isom_box_dump((GF_Box*) s_txt->scroll_delay, dump);
3806
0
    if (s_txt->wrap)
3807
0
      gf_isom_box_dump((GF_Box*) s_txt->wrap, dump);
3808
0
    if (s_txt->box)
3809
0
      gf_isom_box_dump((GF_Box*) s_txt->box, dump);
3810
0
    if (s_txt->styles)
3811
0
      gf_isom_box_dump((GF_Box*) s_txt->styles, dump);
3812
0
  } else {
3813
3814
0
    if (s_txt->box) tx3g_dump_box_nobox(dump, &s_txt->box->box);
3815
0
    if (s_txt->styles) {
3816
0
      for (j=0; j<s_txt->styles->entry_count; j++) {
3817
0
        tx3g_dump_style_nobox(dump, &s_txt->styles->styles[j], shift_offset, so_count);
3818
0
      }
3819
0
    }
3820
0
  }
3821
0
  j=0;
3822
0
  while ((a = (GF_Box *)gf_list_enum(s_txt->others, &j))) {
3823
0
    if (box_dump) {
3824
0
      gf_isom_box_dump((GF_Box*) a, dump);
3825
0
      continue;
3826
0
    }
3827
3828
0
    switch (a->type) {
3829
0
    case GF_ISOM_BOX_TYPE_HLIT:
3830
0
      gf_fprintf(dump, "<Highlight ");
3831
0
      tx3g_print_char_offsets(dump, ((GF_TextHighlightBox *)a)->startcharoffset, ((GF_TextHighlightBox *)a)->endcharoffset, shift_offset, so_count);
3832
0
      gf_fprintf(dump, "/>\n");
3833
0
      break;
3834
0
    case GF_ISOM_BOX_TYPE_HREF:
3835
0
    {
3836
0
      GF_TextHyperTextBox *ht = (GF_TextHyperTextBox *)a;
3837
0
      gf_fprintf(dump, "<HyperLink ");
3838
0
      tx3g_print_char_offsets(dump, ht->startcharoffset, ht->endcharoffset, shift_offset, so_count);
3839
0
      gf_fprintf(dump, "URL=\"%s\" URLToolTip=\"%s\"/>\n", ht->URL ? ht->URL : "", ht->URL_hint ? ht->URL_hint : "");
3840
0
    }
3841
0
    break;
3842
0
    case GF_ISOM_BOX_TYPE_BLNK:
3843
0
      gf_fprintf(dump, "<Blinking ");
3844
0
      tx3g_print_char_offsets(dump, ((GF_TextBlinkBox *)a)->startcharoffset, ((GF_TextBlinkBox *)a)->endcharoffset, shift_offset, so_count);
3845
0
      gf_fprintf(dump, "/>\n");
3846
0
      break;
3847
0
    case GF_ISOM_BOX_TYPE_KROK:
3848
0
    {
3849
0
      u32 k;
3850
0
      Double t;
3851
0
      GF_TextKaraokeBox *krok = (GF_TextKaraokeBox *)a;
3852
0
      t = krok->highlight_starttime;
3853
0
      t /= timescale;
3854
0
      gf_fprintf(dump, "<Karaoke startTime=\"%g\">\n", t);
3855
0
      for (k=0; k<krok->nb_entries; k++) {
3856
0
        t = krok->records[k].highlight_endtime;
3857
0
        t /= timescale;
3858
0
        gf_fprintf(dump, "<KaraokeRange ");
3859
0
        tx3g_print_char_offsets(dump, krok->records[k].start_charoffset, krok->records[k].end_charoffset, shift_offset, so_count);
3860
0
        gf_fprintf(dump, "endTime=\"%g\"/>\n", t);
3861
0
      }
3862
0
      gf_fprintf(dump, "</Karaoke>\n");
3863
0
    }
3864
0
      break;
3865
0
    }
3866
0
  }
3867
3868
0
  gf_fprintf(dump, "</TextSample>\n");
3869
3870
0
}
3871
static GF_Err gf_isom_dump_ttxt_track(GF_ISOFile *the_file, u32 track, FILE *dump, GF_TextDumpType dump_type)
3872
0
{
3873
0
  u32 i, count, di, nb_descs;
3874
0
  u64 last_DTS;
3875
0
  char szDur[100];
3876
0
  GF_Tx3gSampleEntryBox *txt_e;
3877
0
  Bool box_dump = (dump_type==GF_TEXTDUMPTYPE_TTXT_BOXES) ? GF_TRUE : GF_FALSE;
3878
0
  Bool skip_empty = (dump_type==GF_TEXTDUMPTYPE_TTXT_CHAP) ? GF_TRUE : GF_FALSE;
3879
3880
0
  GF_TrackBox *trak = gf_isom_get_track_box(the_file, track);
3881
0
  if (!trak) return GF_BAD_PARAM;
3882
0
  switch (trak->Media->handler->handlerType) {
3883
0
  case GF_ISOM_MEDIA_TEXT:
3884
0
  case GF_ISOM_MEDIA_SUBT:
3885
0
    break;
3886
0
  default:
3887
0
    return GF_BAD_PARAM;
3888
0
  }
3889
3890
0
  txt_e = (GF_Tx3gSampleEntryBox *)gf_list_get(trak->Media->information->sampleTable->SampleDescription->child_boxes, 0);
3891
0
  switch (txt_e->type) {
3892
0
  case GF_ISOM_BOX_TYPE_TX3G:
3893
0
  case GF_ISOM_BOX_TYPE_TEXT:
3894
0
    break;
3895
0
  case GF_ISOM_BOX_TYPE_STPP:
3896
0
  case GF_ISOM_BOX_TYPE_SBTT:
3897
0
  default:
3898
0
    return GF_BAD_PARAM;
3899
0
  }
3900
3901
0
  if (box_dump) {
3902
0
    gf_fprintf(dump, "<TextTrack trackID=\"%d\" version=\"1.1\">\n", gf_isom_get_track_id(the_file, track) );
3903
0
  } else {
3904
0
    gf_fprintf(dump, "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
3905
0
    gf_fprintf(dump, "<!-- GPAC 3GPP Text Stream -->\n");
3906
3907
0
    gf_fprintf(dump, "<TextStream version=\"1.1\">\n");
3908
0
  }
3909
0
  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);
3910
3911
0
  nb_descs = gf_list_count(trak->Media->information->sampleTable->SampleDescription->child_boxes);
3912
0
  for (i=0; i<nb_descs; i++) {
3913
0
    txt_e = (GF_Tx3gSampleEntryBox *)gf_list_get(trak->Media->information->sampleTable->SampleDescription->child_boxes, i);
3914
0
    if (!txt_e) break;
3915
3916
0
    if (box_dump) {
3917
0
      gf_isom_box_dump((GF_Box*) txt_e, dump);
3918
0
    } else if  (txt_e->type==GF_ISOM_BOX_TYPE_TX3G) {
3919
0
      dump_ttxt_header(dump, txt_e, trak->Header->width, trak->Header->height);
3920
0
    } else {
3921
0
      GF_TextSampleEntryBox *text = (GF_TextSampleEntryBox *)gf_list_get(trak->Media->information->sampleTable->SampleDescription->child_boxes, i);
3922
0
      gf_fprintf(dump, "<TextSampleDescription horizontalJustification=\"");
3923
0
      switch (text->textJustification) {
3924
0
      case 1:
3925
0
        gf_fprintf(dump, "center");
3926
0
        break;
3927
0
      case -1:
3928
0
        gf_fprintf(dump, "right");
3929
0
        break;
3930
0
      default:
3931
0
        gf_fprintf(dump, "left");
3932
0
        break;
3933
0
      }
3934
0
      gf_fprintf(dump, "\"");
3935
3936
0
      tx3g_dump_rgb16(dump, " backColor", text->background_color);
3937
3938
0
      if ((text->default_box.bottom == text->default_box.top) || (text->default_box.right == text->default_box.left)) {
3939
0
        text->default_box.top = text->default_box.left = 0;
3940
0
        text->default_box.right = trak->Header->width / 65536;
3941
0
        text->default_box.bottom = trak->Header->height / 65536;
3942
0
      }
3943
3944
0
      if (text->displayFlags & GF_TXT_SCROLL_IN) {
3945
0
        if (text->displayFlags & GF_TXT_SCROLL_OUT) gf_fprintf(dump, " scroll=\"InOut\"");
3946
0
        else gf_fprintf(dump, " scroll=\"In\"");
3947
0
      } else if (text->displayFlags & GF_TXT_SCROLL_OUT) {
3948
0
        gf_fprintf(dump, " scroll=\"Out\"");
3949
0
      } else {
3950
0
        gf_fprintf(dump, " scroll=\"None\"");
3951
0
      }
3952
0
      gf_fprintf(dump, ">\n");
3953
3954
0
      tx3g_dump_box_nobox(dump, &text->default_box);
3955
0
      gf_fprintf(dump, "</TextSampleDescription>\n");
3956
0
    }
3957
0
  }
3958
0
  gf_fprintf(dump, "</TextStreamHeader>\n");
3959
3960
0
  last_DTS = 0;
3961
0
  count = gf_isom_get_sample_count(the_file, track);
3962
0
  for (i=0; i<count; i++) {
3963
0
    GF_BitStream *bs;
3964
0
    GF_TextSample *s_txt;
3965
0
    GF_ISOSample *s = gf_isom_get_sample(the_file, track, i+1, &di);
3966
0
    if (!s) continue;
3967
3968
0
    bs = gf_bs_new(s->data, s->dataLength, GF_BITSTREAM_READ);
3969
0
    s_txt = gf_isom_parse_text_sample(bs);
3970
0
    gf_bs_del(bs);
3971
3972
0
    if (skip_empty && (s_txt->len<1)) {
3973
0
      gf_isom_sample_del(&s);
3974
0
      gf_isom_delete_text_sample(s_txt);
3975
0
      gf_set_progress("TTXT Extract", i, count);
3976
0
      continue;
3977
0
    }
3978
3979
0
    dump_ttxt_sample(dump, s_txt, s->DTS, trak->Media->mediaHeader->timeScale, di, box_dump);
3980
0
    if (!s_txt->len) {
3981
0
      last_DTS = (u32) trak->Media->mediaHeader->duration;
3982
0
    } else {
3983
0
      last_DTS = s->DTS;
3984
0
    }
3985
3986
0
    gf_isom_sample_del(&s);
3987
0
    gf_isom_delete_text_sample(s_txt);
3988
0
    gf_set_progress("TTXT Extract", i, count);
3989
0
  }
3990
0
  if (!skip_empty && (last_DTS < trak->Media->mediaHeader->duration)) {
3991
0
    gf_fprintf(dump, "<TextSample sampleTime=\"%s\" text=\"\" />\n", tx3g_format_time(trak->Media->mediaHeader->duration, trak->Media->mediaHeader->timeScale, szDur, GF_FALSE));
3992
0
  }
3993
3994
0
  if (box_dump) {
3995
0
    gf_fprintf(dump, "</TextTrack>\n");
3996
0
  } else {
3997
0
    gf_fprintf(dump, "</TextStream>\n");
3998
0
  }
3999
0
  if (count) gf_set_progress("TTXT Extract", count, count);
4000
0
  return GF_OK;
4001
0
}
4002
4003
#include <gpac/webvtt.h>
4004
4005
GF_Err dump_ttxt_sample_srt(FILE *dump, GF_TextSample *txt, GF_Tx3gSampleEntryBox *txtd, Bool vtt_dump)
4006
0
{
4007
0
  u32 len, j, k;
4008
0
  if (!txt || !txt->len) {
4009
0
    gf_fprintf(dump, "\n");
4010
0
    return GF_OK;
4011
0
  }
4012
4013
0
  u32 styles, char_num, new_styles, color, new_color;
4014
0
  u16 *utf16_buf = gf_malloc(sizeof(u16)*((txt->len/2)*2 + 4));
4015
0
  if (!utf16_buf) return GF_OUT_OF_MEM;
4016
4017
  /*UTF16*/
4018
0
  if ((txt->len>2) && ((unsigned char) txt->text[0] == (unsigned char) 0xFE) && ((unsigned char) txt->text[1] == (unsigned char) 0xFF)
4019
0
  ) {
4020
0
    memcpy(utf16_buf, txt->text+2, txt->len);
4021
0
    ( ((char *)utf16_buf)[txt->len] ) = 0;
4022
0
    len = txt->len;
4023
0
  } else {
4024
0
    u8 *str = (u8 *) (txt->text);
4025
0
    len = gf_utf8_mbstowcs(utf16_buf, txt->len+1, (const char **) &str);
4026
0
    if (len == GF_UTF8_FAIL) return GF_NON_COMPLIANT_BITSTREAM;
4027
0
    utf16_buf[len] = 0;
4028
0
  }
4029
0
  char_num = 0;
4030
0
  styles = 0;
4031
0
  new_styles = txtd->default_style.style_flags;
4032
0
  color = new_color = txtd->default_style.text_color;
4033
4034
0
  for (j=0; j<len; j++) {
4035
0
    Bool is_new_line;
4036
4037
0
    if (txt->styles) {
4038
0
      new_styles = txtd->default_style.style_flags;
4039
0
      new_color = txtd->default_style.text_color;
4040
0
      for (k=0; k<txt->styles->entry_count; k++) {
4041
0
        if (txt->styles->styles[k].startCharOffset>char_num) continue;
4042
0
        if (txt->styles->styles[k].endCharOffset<char_num+1) continue;
4043
4044
0
        if (txt->styles->styles[k].style_flags & (GF_TXT_STYLE_ITALIC | GF_TXT_STYLE_BOLD | GF_TXT_STYLE_UNDERLINED | GF_TXT_STYLE_STRIKETHROUGH))
4045
0
          new_styles = txt->styles->styles[k].style_flags;
4046
0
        if (txt->styles->styles[k].text_color)
4047
0
          new_color = txt->styles->styles[k].text_color;
4048
4049
0
        break;
4050
0
      }
4051
0
    }
4052
0
    if (new_styles != styles) {
4053
0
      if ((new_styles & GF_TXT_STYLE_BOLD) && !(styles & GF_TXT_STYLE_BOLD)) gf_fprintf(dump, "<b>");
4054
0
      if ((new_styles & GF_TXT_STYLE_ITALIC) && !(styles & GF_TXT_STYLE_ITALIC)) gf_fprintf(dump, "<i>");
4055
0
      if ((new_styles & GF_TXT_STYLE_UNDERLINED) && !(styles & GF_TXT_STYLE_UNDERLINED)) gf_fprintf(dump, "<u>");
4056
0
      if ((new_styles & GF_TXT_STYLE_STRIKETHROUGH) && !(styles & GF_TXT_STYLE_STRIKETHROUGH)) gf_fprintf(dump, "<strike>");
4057
4058
0
      if ((styles & GF_TXT_STYLE_STRIKETHROUGH) && !(new_styles & GF_TXT_STYLE_STRIKETHROUGH)) gf_fprintf(dump, "</strike>");
4059
0
      if ((styles & GF_TXT_STYLE_UNDERLINED) && !(new_styles & GF_TXT_STYLE_UNDERLINED)) gf_fprintf(dump, "</u>");
4060
0
      if ((styles & GF_TXT_STYLE_ITALIC) && !(new_styles & GF_TXT_STYLE_ITALIC)) gf_fprintf(dump, "</i>");
4061
0
      if ((styles & GF_TXT_STYLE_BOLD) && !(new_styles & GF_TXT_STYLE_BOLD)) gf_fprintf(dump, "</b>");
4062
4063
0
      styles = new_styles;
4064
0
    }
4065
0
    if (!vtt_dump && (new_color != color)) {
4066
0
      if (new_color ==txtd->default_style.text_color) {
4067
0
        gf_fprintf(dump, "</font>");
4068
0
      } else {
4069
0
        const char *cname = gf_color_get_name(new_color);
4070
0
        if (cname) {
4071
0
          gf_fprintf(dump, "<font color=\"%s\">", cname);
4072
0
        } else {
4073
0
          if (new_color >> 24 < 0xFF)
4074
0
            gf_fprintf(dump, "<font color=\"#%X\">", new_color);
4075
0
          else
4076
0
            gf_fprintf(dump, "<font color=\"#%06X\">", new_color&0x00FFFFFF);
4077
0
        }
4078
0
      }
4079
0
      color = new_color;
4080
0
    }
4081
4082
    /*not sure if styles must be reseted at line breaks in srt...*/
4083
0
    is_new_line = GF_FALSE;
4084
0
    if ((utf16_buf[j]=='\n') || (utf16_buf[j]=='\r') ) {
4085
0
      if ((utf16_buf[j]=='\r') && (utf16_buf[j+1]=='\n')) j++;
4086
0
      gf_fprintf(dump, "\n");
4087
0
      is_new_line = GF_TRUE;
4088
0
    }
4089
4090
0
    if (!is_new_line) {
4091
0
      u32 sl;
4092
0
      char szChar[30];
4093
0
      s16 swT[2], *swz;
4094
0
      swT[0] = utf16_buf[j];
4095
0
      swT[1] = 0;
4096
0
      swz= (s16 *)swT;
4097
0
      sl = gf_utf8_wcstombs(szChar, 30, (const unsigned short **) &swz);
4098
0
      if (sl == GF_UTF8_FAIL) sl=0;
4099
0
      szChar[sl]=0;
4100
0
      gf_fprintf(dump, "%s", szChar);
4101
0
    }
4102
0
    char_num++;
4103
0
  }
4104
0
  new_styles = 0;
4105
0
  if (new_styles != styles) {
4106
0
    if (styles & GF_TXT_STYLE_STRIKETHROUGH) gf_fprintf(dump, "</strike>");
4107
0
    if (styles & GF_TXT_STYLE_UNDERLINED) gf_fprintf(dump, "</u>");
4108
0
    if (styles & GF_TXT_STYLE_ITALIC) gf_fprintf(dump, "</i>");
4109
0
    if (styles & GF_TXT_STYLE_BOLD) gf_fprintf(dump, "</b>");
4110
0
  }
4111
4112
0
  if (color != txtd->default_style.text_color) {
4113
0
    gf_fprintf(dump, "</font>");
4114
0
  }
4115
0
  gf_fprintf(dump, "\n");
4116
0
  gf_free(utf16_buf);
4117
4118
0
  return GF_OK;
4119
0
}
4120
#else
4121
#include <gpac/webvtt.h>
4122
#endif
4123
4124
//webvtt_write_cue_bs is needed event when box dump disabled
4125
4126
static void vttmx_timestamp_dump(GF_BitStream *bs, GF_WebVTTTimestamp *ts, Bool dump_hour, Bool write_srt)
4127
0
{
4128
0
  char szTS[200];
4129
0
  szTS[0] = 0;
4130
0
  if (dump_hour) {
4131
0
    sprintf(szTS, "%02u:", ts->hour);
4132
0
    gf_bs_write_data(bs, szTS, (u32) strlen(szTS) );
4133
0
  }
4134
0
  sprintf(szTS, "%02u:%02u%c%03u", ts->min, ts->sec, write_srt ? ',' : '.', ts->ms);
4135
0
  gf_bs_write_data(bs, szTS, (u32) strlen(szTS) );
4136
0
}
4137
4138
void webvtt_write_cue_bs(GF_BitStream *bs, GF_WebVTTCue *cue, Bool write_srt)
4139
0
{
4140
0
  Bool write_hour = GF_FALSE;
4141
0
  if (!cue) return;
4142
0
  if (!write_srt && cue->pre_text) {
4143
0
    gf_bs_write_data(bs, cue->pre_text, (u32) strlen(cue->pre_text));
4144
0
    gf_bs_write_data(bs, "\n\n", 2);
4145
0
  }
4146
0
  if (!write_srt && cue->id) {
4147
0
    u32 len = (u32) strlen(cue->id) ;
4148
0
    gf_bs_write_data(bs, cue->id, len);
4149
0
    if (len && (cue->id[len-1]!='\n'))
4150
0
      gf_bs_write_data(bs, "\n", 1);
4151
0
  }
4152
4153
0
  if (gf_opts_get_bool("core", "webvtt-hours")) write_hour = GF_TRUE;
4154
0
  else if (cue->start.hour || cue->end.hour) write_hour = GF_TRUE;
4155
0
  else if (write_srt) write_hour = GF_TRUE;
4156
4157
0
  vttmx_timestamp_dump(bs, &cue->start, write_hour, write_srt);
4158
0
  gf_bs_write_data(bs, " --> ", 5);
4159
0
  vttmx_timestamp_dump(bs, &cue->end, write_hour, write_srt);
4160
4161
0
  if (!write_srt && cue->settings) {
4162
0
    gf_bs_write_data(bs, " ", 1);
4163
0
    gf_bs_write_data(bs, cue->settings, (u32) strlen(cue->settings));
4164
0
  }
4165
0
  gf_bs_write_data(bs, "\n", 1);
4166
0
  if (cue->text)
4167
0
    gf_bs_write_data(bs, cue->text, (u32) strlen(cue->text));
4168
4169
0
  if (!write_srt)
4170
0
    gf_bs_write_data(bs, "\n\n", 2);
4171
0
  else
4172
0
    gf_bs_write_data(bs, "\n", 1);
4173
4174
0
  if (!write_srt && cue->post_text) {
4175
0
    gf_bs_write_data(bs, cue->post_text, (u32) strlen(cue->post_text));
4176
0
    gf_bs_write_data(bs, "\n\n", 2);
4177
0
  }
4178
0
}
4179
4180
#ifndef GPAC_DISABLE_ISOM_DUMP
4181
4182
static GF_Err gf_isom_dump_srt_track(GF_ISOFile *the_file, u32 track, FILE *dump)
4183
0
{
4184
0
  u32 i, j, count, di, ts, cur_frame;
4185
0
  u64 start, end;
4186
0
  GF_Tx3gSampleEntryBox *txtd;
4187
0
  char szDur[100];
4188
0
  Bool is_wvtt = GF_FALSE;
4189
0
  Bool srt_forced_subs = gf_opts_get_bool("core", "srt-forced");
4190
0
  GF_TrackBox *trak = gf_isom_get_track_box(the_file, track);
4191
0
  u32 subtype = gf_isom_get_media_subtype(the_file, track, 1);
4192
0
  if (!trak) return GF_BAD_PARAM;
4193
0
  switch (trak->Media->handler->handlerType) {
4194
0
  case GF_ISOM_MEDIA_TEXT:
4195
0
  case GF_ISOM_MEDIA_SUBT:
4196
0
    break;
4197
0
  default:
4198
0
    return GF_BAD_PARAM;
4199
0
  }
4200
4201
0
  ts = trak->Media->mediaHeader->timeScale;
4202
0
  cur_frame = 0;
4203
0
  end = 0;
4204
4205
0
  switch (subtype) {
4206
0
  case GF_ISOM_SUBTYPE_TX3G:
4207
0
  case GF_ISOM_SUBTYPE_TEXT:
4208
0
  case GF_ISOM_SUBTYPE_STXT:
4209
0
    break;
4210
0
  case GF_ISOM_SUBTYPE_WVTT:
4211
0
    is_wvtt = GF_TRUE;
4212
0
    break;
4213
0
  default:
4214
0
    return GF_NOT_SUPPORTED;
4215
0
  }
4216
0
  s64 ts_offset=0;
4217
0
  gf_isom_get_edit_list_type(the_file, track, &ts_offset);
4218
4219
0
  count = gf_isom_get_sample_count(the_file, track);
4220
0
  for (i=0; i<count; i++) {
4221
0
    GF_BitStream *bs;
4222
0
    GF_TextSample *txt;
4223
0
    GF_ISOSample *s = gf_isom_get_sample(the_file, track, i+1, &di);
4224
0
    if (!s) continue;
4225
4226
0
    start = s->DTS+ts_offset;
4227
0
    if (s->dataLength==2) {
4228
0
      gf_isom_sample_del(&s);
4229
0
      continue;
4230
0
    }
4231
0
    if (i+1<count) {
4232
0
      GF_ISOSample *next = gf_isom_get_sample_info(the_file, track, i+2, NULL, NULL);
4233
0
      if (next) {
4234
0
        end = next->DTS+ts_offset;
4235
0
        gf_isom_sample_del(&next);
4236
0
      }
4237
0
    } else {
4238
0
      end = gf_isom_get_media_duration(the_file, track) ;
4239
0
    }
4240
0
    if (!is_wvtt) {
4241
0
      cur_frame++;
4242
0
      gf_fprintf(dump, "%d\n", cur_frame);
4243
0
      tx3g_format_time(start, ts, szDur, GF_TRUE);
4244
0
      gf_fprintf(dump, "%s --> ", szDur);
4245
0
      tx3g_format_time(end, ts, szDur, GF_TRUE);
4246
0
      gf_fprintf(dump, "%s", szDur);
4247
0
    }
4248
4249
0
    if (is_wvtt) {
4250
0
#ifndef GPAC_DISABLE_VTT
4251
0
      u64 start_ts, end_ts;
4252
0
      GF_List *cues;
4253
0
      u32 nb_cues;
4254
0
      u8 *data=NULL;
4255
0
      u32 data_len=0;
4256
4257
0
      start_ts = s->DTS * 1000;
4258
0
      start_ts /= trak->Media->mediaHeader->timeScale;
4259
0
      end_ts = end * 1000;
4260
0
      end_ts /= trak->Media->mediaHeader->timeScale;
4261
0
      cues = gf_webvtt_parse_cues_from_data(s->data, s->dataLength, start_ts, end_ts);
4262
0
      gf_isom_sample_del(&s);
4263
0
      nb_cues = gf_list_count(cues);
4264
4265
0
      if (!nb_cues) {
4266
0
        gf_list_del(cues);
4267
0
        continue;
4268
0
      }
4269
4270
0
      cur_frame++;
4271
0
      gf_fprintf(dump, "%d\n", cur_frame);
4272
4273
0
      bs = gf_bs_new(NULL, 0, GF_BITSTREAM_WRITE);
4274
0
      for (j = 0; j < gf_list_count(cues); j++) {
4275
0
        GF_WebVTTCue *cue = (GF_WebVTTCue *)gf_list_get(cues, j);
4276
0
        webvtt_write_cue_bs(bs, cue, GF_TRUE);
4277
0
        gf_webvtt_cue_del(cue);
4278
0
      }
4279
0
      gf_list_del(cues);
4280
0
      gf_bs_write_u16(bs, 0);
4281
0
      gf_bs_get_content(bs, &data, &data_len);
4282
0
      gf_bs_del(bs);
4283
0
      if (data) {
4284
0
        gf_fprintf(dump, "%s\n", data);
4285
0
        gf_free(data);
4286
0
      } else {
4287
0
        gf_fprintf(dump, "\n");
4288
0
      }
4289
0
#endif
4290
0
      continue;
4291
0
    } else if (subtype == GF_ISOM_SUBTYPE_STXT) {
4292
0
      gf_fprintf(dump, "\n");
4293
0
      if (s->dataLength)
4294
0
        gf_fprintf(dump, "%s\n", s->data);
4295
0
      gf_isom_sample_del(&s);
4296
0
      continue;
4297
0
    }
4298
0
    else if ((subtype!=GF_ISOM_SUBTYPE_TX3G) && (subtype!=GF_ISOM_SUBTYPE_TEXT)) {
4299
0
      gf_fprintf(dump, "\n");
4300
0
      gf_fprintf(dump, "unknown\n");
4301
0
      gf_isom_sample_del(&s);
4302
0
      continue;
4303
0
    }
4304
0
    bs = gf_bs_new(s->data, s->dataLength, GF_BITSTREAM_READ);
4305
0
    txt = gf_isom_parse_text_sample(bs);
4306
0
    gf_bs_del(bs);
4307
4308
0
    txtd = (GF_Tx3gSampleEntryBox *)gf_list_get(trak->Media->information->sampleTable->SampleDescription->child_boxes, di-1);
4309
4310
0
    if (srt_forced_subs) {
4311
0
      if (txt->is_forced) gf_fprintf(dump, " !!!");
4312
0
      else if (txtd->displayFlags & GF_TXT_ALL_SAMPLES_FORCED) gf_fprintf(dump, " !!!");
4313
0
    }
4314
4315
0
    gf_fprintf(dump, "\n");
4316
4317
0
    GF_Err e = dump_ttxt_sample_srt(dump, txt, txtd, GF_FALSE);
4318
4319
0
    gf_isom_sample_del(&s);
4320
0
    gf_isom_delete_text_sample(txt);
4321
0
    gf_fprintf(dump, "\n");
4322
0
    gf_set_progress("SRT Extract", i, count);
4323
0
    if (e) return e;
4324
0
  }
4325
0
  if (count) gf_set_progress("SRT Extract", i, count);
4326
0
  return GF_OK;
4327
0
}
4328
4329
static GF_Err gf_isom_dump_svg_track(GF_ISOFile *the_file, u32 track, FILE *dump)
4330
0
{
4331
0
  char nhmlFileName[1024];
4332
0
  FILE *nhmlFile;
4333
0
  u32 i, count, di, ts, cur_frame;
4334
0
  u64 start, end;
4335
0
  GF_BitStream *bs;
4336
4337
0
  GF_TrackBox *trak = gf_isom_get_track_box(the_file, track);
4338
0
  if (!trak) return GF_BAD_PARAM;
4339
0
  switch (trak->Media->handler->handlerType) {
4340
0
  case GF_ISOM_MEDIA_TEXT:
4341
0
  case GF_ISOM_MEDIA_SUBT:
4342
0
    break;
4343
0
  default:
4344
0
    return GF_BAD_PARAM;
4345
0
  }
4346
4347
0
  strcpy(nhmlFileName, the_file->fileName);
4348
0
  strcat(nhmlFileName, ".nhml");
4349
0
  nhmlFile = gf_fopen(nhmlFileName, "wt");
4350
0
  gf_fprintf(nhmlFile, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
4351
0
  gf_fprintf(nhmlFile, "<NHNTStream streamType=\"3\" objectTypeIndication=\"10\" timeScale=\"%d\" baseMediaFile=\"file.svg\" inRootOD=\"yes\">\n", trak->Media->mediaHeader->timeScale);
4352
0
  gf_fprintf(nhmlFile, "<NHNTSample isRAP=\"yes\" DTS=\"0\" xmlFrom=\"doc.start\" xmlTo=\"text_1.start\"/>\n");
4353
4354
0
  ts = trak->Media->mediaHeader->timeScale;
4355
0
  cur_frame = 0;
4356
0
  end = 0;
4357
4358
0
  gf_fprintf(dump, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
4359
0
  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);
4360
0
  gf_fprintf(dump, "<g transform=\"translate(%d, %d)\" text-anchor=\"middle\">\n", (trak->Header->width >> 16)/2 , (trak->Header->height >> 16)/2);
4361
4362
0
  count = gf_isom_get_sample_count(the_file, track);
4363
0
  for (i=0; i<count; i++) {
4364
0
    GF_TextSample *txt;
4365
0
    GF_ISOSample *s = gf_isom_get_sample(the_file, track, i+1, &di);
4366
0
    if (!s) continue;
4367
4368
0
    start = s->DTS;
4369
0
    if (s->dataLength==2) {
4370
0
      gf_isom_sample_del(&s);
4371
0
      continue;
4372
0
    }
4373
0
    if (i+1<count) {
4374
0
      GF_ISOSample *next = gf_isom_get_sample_info(the_file, track, i+2, NULL, NULL);
4375
0
      if (next) {
4376
0
        end = next->DTS;
4377
0
        gf_isom_sample_del(&next);
4378
0
      }
4379
0
    }
4380
4381
0
    cur_frame++;
4382
0
    bs = gf_bs_new(s->data, s->dataLength, GF_BITSTREAM_READ);
4383
0
    txt = gf_isom_parse_text_sample(bs);
4384
0
    gf_bs_del(bs);
4385
4386
0
    if (!txt->len) continue;
4387
4388
0
    gf_fprintf(dump, " <text id=\"text_%d\" display=\"none\">%s\n", cur_frame, txt->text);
4389
0
    gf_fprintf(dump, "  <set attributeName=\"display\" to=\"inline\" begin=\"%g\" end=\"%g\"/>\n", ((s64)start*1.0)/ts, ((s64)end*1.0)/ts);
4390
0
    gf_fprintf(dump, "  <discard begin=\"%g\"/>\n", ((s64)end*1.0)/ts);
4391
0
    gf_fprintf(dump, " </text>\n");
4392
0
    gf_isom_sample_del(&s);
4393
0
    gf_isom_delete_text_sample(txt);
4394
0
    gf_fprintf(dump, "\n");
4395
0
    gf_set_progress("SRT Extract", i, count);
4396
4397
0
    if (i == count - 2) {
4398
0
      gf_fprintf(nhmlFile, "<NHNTSample isRAP=\"no\" DTS=\"%f\" xmlFrom=\"text_%d.start\" xmlTo=\"doc.end\"/>\n", ((s64)start*1.0), cur_frame);
4399
0
    } else {
4400
0
      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);
4401
0
    }
4402
4403
0
  }
4404
0
  gf_fprintf(dump, "</g>\n");
4405
0
  gf_fprintf(dump, "</svg>\n");
4406
4407
0
  gf_fprintf(nhmlFile, "</NHNTStream>\n");
4408
0
  gf_fclose(nhmlFile);
4409
0
  gf_file_delete(nhmlFileName);
4410
0
  if (count) gf_set_progress("SRT Extract", i, count);
4411
0
  return GF_OK;
4412
0
}
4413
4414
static GF_Err gf_isom_dump_ogg_chap(GF_ISOFile *the_file, u32 track, FILE *dump, GF_TextDumpType dump_type)
4415
0
{
4416
0
  u32 i, count, di, ts;
4417
0
  u64 start;
4418
0
  GF_BitStream *bs;
4419
4420
0
  GF_TrackBox *trak = gf_isom_get_track_box(the_file, track);
4421
0
  if (!trak) return GF_BAD_PARAM;
4422
0
  switch (trak->Media->handler->handlerType) {
4423
0
  case GF_ISOM_MEDIA_TEXT:
4424
0
  case GF_ISOM_MEDIA_SUBT:
4425
0
    break;
4426
0
  default:
4427
0
    return GF_BAD_PARAM;
4428
0
  }
4429
4430
0
  ts = trak->Media->mediaHeader->timeScale;
4431
4432
0
  count = gf_isom_get_sample_count(the_file, track);
4433
0
  for (i=0; i<count; i++) {
4434
0
    GF_TextSample *txt;
4435
0
    GF_ISOSample *s = gf_isom_get_sample(the_file, track, i+1, &di);
4436
0
    if (!s) continue;
4437
4438
0
    start = s->DTS;
4439
0
    if (s->dataLength==2) {
4440
0
      gf_isom_sample_del(&s);
4441
0
      continue;
4442
0
    }
4443
0
    if (i+1<count) {
4444
0
      GF_ISOSample *next = gf_isom_get_sample_info(the_file, track, i+2, NULL, NULL);
4445
0
      if (next) {
4446
0
        gf_isom_sample_del(&next);
4447
0
      }
4448
0
    }
4449
4450
0
    bs = gf_bs_new(s->data, s->dataLength, GF_BITSTREAM_READ);
4451
0
    txt = gf_isom_parse_text_sample(bs);
4452
0
    gf_bs_del(bs);
4453
4454
0
    if (!txt->len) continue;
4455
4456
0
    if (dump_type==GF_TEXTDUMPTYPE_OGG_CHAP) {
4457
0
      char szDur[100];
4458
0
      fprintf(dump, "CHAPTER%02d=%s\n", i+1, gf_format_duration(start, ts, szDur));
4459
0
      fprintf(dump, "CHAPTER%02dNAME=%s\n", i+1, txt->text);
4460
0
    } else {
4461
0
      fprintf(dump, "AddChapterBySecond("LLD",%s)\n", start / ts, txt->text);
4462
0
    }
4463
4464
0
    gf_isom_sample_del(&s);
4465
0
    gf_isom_delete_text_sample(txt);
4466
0
  }
4467
0
  return GF_OK;
4468
0
}
4469
GF_EXPORT
4470
GF_Err gf_isom_text_dump(GF_ISOFile *the_file, u32 track, FILE *dump, GF_TextDumpType dump_type)
4471
0
{
4472
0
  switch (dump_type) {
4473
0
  case GF_TEXTDUMPTYPE_SVG:
4474
0
    return gf_isom_dump_svg_track(the_file, track, dump);
4475
0
  case GF_TEXTDUMPTYPE_SRT:
4476
0
    return gf_isom_dump_srt_track(the_file, track, dump);
4477
0
  case GF_TEXTDUMPTYPE_TTXT:
4478
0
  case GF_TEXTDUMPTYPE_TTXT_BOXES:
4479
0
  case GF_TEXTDUMPTYPE_TTXT_CHAP:
4480
0
    return gf_isom_dump_ttxt_track(the_file, track, dump, dump_type);
4481
0
  case GF_TEXTDUMPTYPE_OGG_CHAP:
4482
0
  case GF_TEXTDUMPTYPE_ZOOM_CHAP:
4483
0
    return gf_isom_dump_ogg_chap(the_file, track, dump, dump_type);
4484
0
  default:
4485
0
    return GF_BAD_PARAM;
4486
0
  }
4487
0
}
4488
4489
4490
/* ISMA 1.0 Encryption and Authentication V 1.0  dump */
4491
GF_Err sinf_box_dump(GF_Box *a, FILE * trace)
4492
0
{
4493
0
  const char *name = (a->type==GF_ISOM_BOX_TYPE_SINF) ? "ProtectionSchemeInfoBox" : "RestrictedSchemeInfoBox";
4494
0
  gf_isom_box_dump_start(a, name, trace);
4495
0
  gf_fprintf(trace, ">\n");
4496
0
  gf_isom_box_dump_done(name, a, trace);
4497
0
  return GF_OK;
4498
0
}
4499
4500
GF_Err frma_box_dump(GF_Box *a, FILE * trace)
4501
0
{
4502
0
  GF_OriginalFormatBox *p;
4503
0
  p = (GF_OriginalFormatBox *)a;
4504
0
  gf_isom_box_dump_start(a, "OriginalFormatBox", trace);
4505
0
  gf_fprintf(trace, "data_format=\"%s\">\n", gf_4cc_to_str(p->data_format));
4506
0
  gf_isom_box_dump_done("OriginalFormatBox", a, trace);
4507
0
  return GF_OK;
4508
0
}
4509
4510
GF_Err schm_box_dump(GF_Box *a, FILE * trace)
4511
0
{
4512
0
  GF_SchemeTypeBox *p;
4513
0
  p = (GF_SchemeTypeBox *)a;
4514
0
  gf_isom_box_dump_start(a, "SchemeTypeBox", trace);
4515
0
  gf_fprintf(trace, "scheme_type=\"%s\" scheme_version=\"%d\" ", gf_4cc_to_str(p->scheme_type), p->scheme_version);
4516
0
  if (p->URI) gf_fprintf(trace, "scheme_uri=\"%s\"", p->URI);
4517
0
  gf_fprintf(trace, ">\n");
4518
4519
0
  gf_isom_box_dump_done("SchemeTypeBox", a, trace);
4520
0
  return GF_OK;
4521
0
}
4522
4523
GF_Err schi_box_dump(GF_Box *a, FILE * trace)
4524
0
{
4525
0
  gf_isom_box_dump_start(a, "SchemeInformationBox", trace);
4526
0
  gf_fprintf(trace, ">\n");
4527
0
  gf_isom_box_dump_done("SchemeInformationBox", a, trace);
4528
0
  return GF_OK;
4529
0
}
4530
4531
GF_Err iKMS_box_dump(GF_Box *a, FILE * trace)
4532
0
{
4533
0
  GF_ISMAKMSBox *p;
4534
0
  p = (GF_ISMAKMSBox *)a;
4535
0
  gf_isom_box_dump_start(a, "KMSBox", trace);
4536
0
  gf_fprintf(trace, "kms_URI=\"%s\">\n", p->URI);
4537
0
  gf_isom_box_dump_done("KMSBox", a, trace);
4538
0
  return GF_OK;
4539
4540
0
}
4541
4542
GF_Err iSFM_box_dump(GF_Box *a, FILE * trace)
4543
0
{
4544
0
  GF_ISMASampleFormatBox *p;
4545
0
  const char *name = (a->type==GF_ISOM_BOX_TYPE_ISFM) ? "ISMASampleFormat" : "OMADRMAUFormatBox";
4546
0
  p = (GF_ISMASampleFormatBox *)a;
4547
0
  gf_isom_box_dump_start(a, name, trace);
4548
0
  gf_fprintf(trace, "selective_encryption=\"%d\" key_indicator_length=\"%d\" IV_length=\"%d\">\n", p->selective_encryption, p->key_indicator_length, p->IV_length);
4549
0
  gf_isom_box_dump_done(name, a, trace);
4550
0
  return GF_OK;
4551
0
}
4552
4553
GF_Err iSLT_box_dump(GF_Box *a, FILE * trace)
4554
0
{
4555
0
  GF_ISMACrypSaltBox *p = (GF_ISMACrypSaltBox *)a;
4556
0
  gf_isom_box_dump_start(a, "ISMACrypSaltBox", trace);
4557
0
  gf_fprintf(trace, "salt=\""LLU"\">\n", p->salt);
4558
0
  gf_isom_box_dump_done("ISMACrypSaltBox", a, trace);
4559
0
  return GF_OK;
4560
0
}
4561
4562
GF_EXPORT
4563
GF_Err gf_isom_dump_ismacryp_protection(GF_ISOFile *the_file, u32 trackNumber, FILE * trace)
4564
0
{
4565
0
  u32 i, count;
4566
0
  GF_SampleEntryBox *entry;
4567
0
  GF_Err e;
4568
0
  GF_TrackBox *trak;
4569
4570
0
  trak = gf_isom_get_track_box(the_file, trackNumber);
4571
0
  if (!trak) return GF_BAD_PARAM;
4572
4573
4574
0
  gf_fprintf(trace, "<ISMACrypSampleDescriptions>\n");
4575
0
  count = gf_isom_get_sample_description_count(the_file, trackNumber);
4576
0
  for (i=0; i<count; i++) {
4577
0
    e = Media_GetSampleDesc(trak->Media, i+1, (GF_SampleEntryBox **) &entry, NULL);
4578
0
    if (e) return e;
4579
4580
0
    switch (entry->type) {
4581
0
    case GF_ISOM_BOX_TYPE_ENCA:
4582
0
    case GF_ISOM_BOX_TYPE_ENCV:
4583
0
    case GF_ISOM_BOX_TYPE_ENCS:
4584
0
    case GF_ISOM_BOX_TYPE_ENCT:
4585
0
    case GF_ISOM_BOX_TYPE_ENCF:
4586
0
    case GF_ISOM_BOX_TYPE_ENCM:
4587
0
      break;
4588
0
    default:
4589
0
      continue;
4590
0
    }
4591
0
    gf_isom_box_dump(entry, trace);
4592
0
  }
4593
0
  gf_fprintf(trace, "</ISMACrypSampleDescriptions>\n");
4594
0
  return GF_OK;
4595
0
}
4596
4597
GF_EXPORT
4598
GF_Err gf_isom_dump_ismacryp_sample(GF_ISOFile *the_file, u32 trackNumber, u32 SampleNum, FILE * trace)
4599
0
{
4600
0
  GF_ISOSample *samp;
4601
0
  GF_ISMASample  *isma_samp;
4602
0
  u32 descIndex;
4603
4604
0
  samp = gf_isom_get_sample(the_file, trackNumber, SampleNum, &descIndex);
4605
0
  if (!samp) return GF_BAD_PARAM;
4606
4607
0
  isma_samp = gf_isom_get_ismacryp_sample(the_file, trackNumber, samp, descIndex);
4608
0
  if (!isma_samp) {
4609
0
    gf_isom_sample_del(&samp);
4610
0
    return GF_NOT_SUPPORTED;
4611
0
  }
4612
4613
0
  gf_fprintf(trace, "<ISMACrypSample SampleNumber=\"%d\" DataSize=\"%d\" CompositionTime=\""LLD"\" ", SampleNum, isma_samp->dataLength, (samp->DTS+samp->CTS_Offset) );
4614
0
  if (samp->CTS_Offset) gf_fprintf(trace, "DecodingTime=\""LLD"\" ", samp->DTS);
4615
0
  if (gf_isom_has_sync_points(the_file, trackNumber)) gf_fprintf(trace, "RandomAccessPoint=\"%s\" ", samp->IsRAP ? "Yes" : "No");
4616
0
  gf_fprintf(trace, "IsEncrypted=\"%s\" ", (isma_samp->flags & GF_ISOM_ISMA_IS_ENCRYPTED) ? "Yes" : "No");
4617
0
  if (isma_samp->flags & GF_ISOM_ISMA_IS_ENCRYPTED) {
4618
0
    gf_fprintf(trace, "IV=\""LLD"\" ", isma_samp->IV);
4619
0
    if (isma_samp->key_indicator) dump_data_attribute(trace, "KeyIndicator", (char*)isma_samp->key_indicator, isma_samp->KI_length);
4620
0
  }
4621
0
  gf_fprintf(trace, "/>\n");
4622
4623
0
  gf_isom_sample_del(&samp);
4624
0
  gf_isom_ismacryp_delete_sample(isma_samp);
4625
0
  return GF_OK;
4626
0
}
4627
4628
/* end of ISMA 1.0 Encryption and Authentication V 1.0 */
4629
4630
4631
/* Apple extensions */
4632
4633
GF_Err ilst_item_box_dump(GF_Box *a, FILE * trace)
4634
0
{
4635
0
  u32 val, itype=0;
4636
0
  Bool no_dump = GF_FALSE;
4637
0
  Bool unknown = GF_FALSE;
4638
0
  GF_DataBox *dbox = NULL;
4639
0
  const char *name = "UnknownBox";
4640
0
  GF_ListItemBox *itune = (GF_ListItemBox *)a;
4641
4642
4643
0
  if (itune->type==GF_ISOM_BOX_TYPE_iTunesSpecificInfo) {
4644
0
    name = "iTunesSpecificBox";
4645
0
    no_dump = GF_TRUE;
4646
0
    dbox = itune->data;
4647
0
  } else if (itune->type==GF_ISOM_BOX_TYPE_UNKNOWN) {
4648
0
    dbox = (GF_DataBox *) gf_isom_box_find_child(itune->child_boxes, GF_ISOM_BOX_TYPE_DATA);
4649
0
    unknown = GF_TRUE;
4650
0
  } else {
4651
0
    s32 idx = gf_itags_find_by_itag(itune->type);
4652
0
    if (idx>=0) {
4653
0
      name = gf_itags_get_name((u32) idx);
4654
0
      itype = gf_itags_get_type((u32) idx);
4655
0
      dbox = itune->data;
4656
0
    }
4657
0
  }
4658
0
  gf_isom_box_dump_start(a, name, trace);
4659
4660
0
  if (!no_dump && dbox) {
4661
0
    GF_BitStream *bs;
4662
0
    switch (itune->type) {
4663
0
    case GF_ISOM_ITUNE_DISK:
4664
0
    case GF_ISOM_ITUNE_TRACKNUMBER:
4665
0
      bs = gf_bs_new(dbox->data, dbox->dataSize, GF_BITSTREAM_READ);
4666
0
      gf_bs_read_int(bs, 16);
4667
0
      val = gf_bs_read_int(bs, 16);
4668
0
      if (itune->type==GF_ISOM_ITUNE_DISK) {
4669
0
        gf_fprintf(trace, " DiskNumber=\"%d\" NbDisks=\"%d\" ", val, gf_bs_read_int(bs, 16) );
4670
0
      } else {
4671
0
        gf_fprintf(trace, " TrackNumber=\"%d\" NbTracks=\"%d\" ", val, gf_bs_read_int(bs, 16) );
4672
0
      }
4673
0
      gf_bs_del(bs);
4674
0
      break;
4675
0
    case GF_ISOM_ITUNE_TEMPO:
4676
0
      bs = gf_bs_new(dbox->data, dbox->dataSize, GF_BITSTREAM_READ);
4677
0
      gf_fprintf(trace, " BPM=\"%d\" ", gf_bs_read_int(bs, 16) );
4678
0
      gf_bs_del(bs);
4679
0
      break;
4680
0
    case GF_ISOM_ITUNE_COMPILATION:
4681
0
      gf_fprintf(trace, " IsCompilation=\"%s\" ", (dbox && dbox->data && dbox->data[0]) ? "yes" : "no");
4682
0
      break;
4683
0
    case GF_ISOM_ITUNE_GAPLESS:
4684
0
      gf_fprintf(trace, " IsGapeless=\"%s\" ", (dbox && dbox->data && itune->data->data[0]) ? "yes" : "no");
4685
0
      break;
4686
0
    case GF_ISOM_ITUNE_GENRE:
4687
0
      if (dbox && dbox->data && itune->data->dataSize>=2) {
4688
0
        u32 genre = itune->data->data[0];
4689
0
        genre<<=8;
4690
0
        genre |= itune->data->data[1];
4691
0
        gf_fprintf(trace, " value=\"%s\" ", gf_id3_get_genre((u32) genre));
4692
0
      }
4693
0
      break;
4694
0
    default:
4695
0
      if (dbox && dbox->data) {
4696
0
        gf_fprintf(trace, " value=\"");
4697
0
        switch (itype) {
4698
0
        case GF_ITAG_STR:
4699
0
          dump_data_string(trace, dbox->data, dbox->dataSize);
4700
0
          break;
4701
0
        case GF_ITAG_INT8:
4702
0
          if (dbox->dataSize)
4703
0
            gf_fprintf(trace, "%d", dbox->data[0]);
4704
0
          break;
4705
0
        case GF_ITAG_INT16:
4706
0
          if (dbox->dataSize>1) {
4707
0
            u16 v = dbox->data[0];
4708
0
            v<<=8;
4709
0
            v |= dbox->data[1];
4710
0
            gf_fprintf(trace, "%d", v);
4711
0
          }
4712
0
          break;
4713
0
        case GF_ITAG_INT32:
4714
0
          if (dbox->dataSize>3) {
4715
0
            u32 v = dbox->data[0]; v<<=8;
4716
0
            v |= dbox->data[1]; v<<=8;
4717
0
            v |= dbox->data[2]; v<<=8;
4718
0
            v |= dbox->data[3];
4719
0
            gf_fprintf(trace, "%d", v);
4720
0
          }
4721
0
          break;
4722
0
        default:
4723
0
          if (!unknown && gf_utf8_is_legal(dbox->data, dbox->dataSize) ) {
4724
0
            dump_data_string(trace, dbox->data, dbox->dataSize);
4725
0
          } else {
4726
0
            dump_data(trace, dbox->data, dbox->dataSize);
4727
0
          }
4728
0
        break;
4729
0
        }
4730
0
        gf_fprintf(trace, "\" ");
4731
0
      }
4732
0
      break;
4733
0
    }
4734
0
  }
4735
0
  gf_fprintf(trace, ">\n");
4736
0
  gf_isom_box_dump_done(name, a, trace);
4737
0
  return GF_OK;
4738
0
}
4739
4740
#ifndef GPAC_DISABLE_ISOM_ADOBE
4741
4742
GF_Err abst_box_dump(GF_Box *a, FILE * trace)
4743
0
{
4744
0
  u32 i;
4745
0
  GF_AdobeBootstrapInfoBox *p = (GF_AdobeBootstrapInfoBox*)a;
4746
0
  gf_isom_box_dump_start(a, "AdobeBootstrapBox", trace);
4747
4748
0
  gf_fprintf(trace, "BootstrapinfoVersion=\"%u\" Profile=\"%u\" Live=\"%u\" Update=\"%u\" TimeScale=\"%u\" CurrentMediaTime=\""LLU"\" SmpteTimeCodeOffset=\""LLU"\" ",
4749
0
          p->bootstrapinfo_version, p->profile, p->live, p->update, p->time_scale, p->current_media_time, p->smpte_time_code_offset);
4750
0
  if (p->movie_identifier)
4751
0
    gf_fprintf(trace, "MovieIdentifier=\"%s\" ", p->movie_identifier);
4752
0
  if (p->drm_data)
4753
0
    gf_fprintf(trace, "DrmData=\"%s\" ", p->drm_data);
4754
0
  if (p->meta_data)
4755
0
    gf_fprintf(trace, "MetaData=\"%s\" ", p->meta_data);
4756
0
  gf_fprintf(trace, ">\n");
4757
4758
0
  for (i=0; i<p->server_entry_count; i++) {
4759
0
    char *str = (char*)gf_list_get(p->server_entry_table, i);
4760
0
    gf_fprintf(trace, "<ServerEntry>%s</ServerEntry>\n", str);
4761
0
  }
4762
4763
0
  for (i=0; i<p->quality_entry_count; i++) {
4764
0
    char *str = (char*)gf_list_get(p->quality_entry_table, i);
4765
0
    gf_fprintf(trace, "<QualityEntry>%s</QualityEntry>\n", str);
4766
0
  }
4767
4768
0
  for (i=0; i<p->segment_run_table_count; i++)
4769
0
    gf_isom_box_dump(gf_list_get(p->segment_run_table_entries, i), trace);
4770
4771
0
  for (i=0; i<p->fragment_run_table_count; i++)
4772
0
    gf_isom_box_dump(gf_list_get(p->fragment_run_table_entries, i), trace);
4773
4774
0
  gf_isom_box_dump_done("AdobeBootstrapBox", a, trace);
4775
0
  return GF_OK;
4776
0
}
4777
4778
GF_Err afra_box_dump(GF_Box *a, FILE * trace)
4779
0
{
4780
0
  u32 i;
4781
0
  GF_AdobeFragRandomAccessBox *p = (GF_AdobeFragRandomAccessBox*)a;
4782
0
  gf_isom_box_dump_start(a, "AdobeFragmentRandomAccessBox", trace);
4783
4784
0
  gf_fprintf(trace, "LongIDs=\"%u\" LongOffsets=\"%u\" TimeScale=\"%u\">\n", p->long_ids, p->long_offsets, p->time_scale);
4785
4786
0
  for (i=0; i<p->entry_count; i++) {
4787
0
    GF_AfraEntry *ae = (GF_AfraEntry *)gf_list_get(p->local_access_entries, i);
4788
0
    gf_fprintf(trace, "<LocalAccessEntry Time=\""LLU"\" Offset=\""LLU"\"/>\n", ae->time, ae->offset);
4789
0
  }
4790
4791
0
  for (i=0; i<p->global_entry_count; i++) {
4792
0
    GF_GlobalAfraEntry *gae = (GF_GlobalAfraEntry *)gf_list_get(p->global_access_entries, i);
4793
0
    gf_fprintf(trace, "<GlobalAccessEntry Time=\""LLU"\" Segment=\"%u\" Fragment=\"%u\" AfraOffset=\""LLU"\" OffsetFromAfra=\""LLU"\"/>\n",
4794
0
            gae->time, gae->segment, gae->fragment, gae->afra_offset, gae->offset_from_afra);
4795
0
  }
4796
4797
0
  gf_isom_box_dump_done("AdobeFragmentRandomAccessBox", a, trace);
4798
0
  return GF_OK;
4799
0
}
4800
4801
GF_Err afrt_box_dump(GF_Box *a, FILE * trace)
4802
0
{
4803
0
  u32 i;
4804
0
  GF_AdobeFragmentRunTableBox *p = (GF_AdobeFragmentRunTableBox*)a;
4805
0
  gf_isom_box_dump_start(a, "AdobeFragmentRunTableBox", trace);
4806
4807
0
  gf_fprintf(trace, "TimeScale=\"%u\">\n", p->timescale);
4808
4809
0
  for (i=0; i<p->quality_entry_count; i++) {
4810
0
    char *str = (char*)gf_list_get(p->quality_segment_url_modifiers, i);
4811
0
    gf_fprintf(trace, "<QualityEntry>%s</QualityEntry>\n", str);
4812
0
  }
4813
4814
0
  for (i=0; i<p->fragment_run_entry_count; i++) {
4815
0
    GF_AdobeFragmentRunEntry *fre = (GF_AdobeFragmentRunEntry *)gf_list_get(p->fragment_run_entry_table, i);
4816
0
    gf_fprintf(trace, "<FragmentRunEntry FirstFragment=\"%u\" FirstFragmentTimestamp=\""LLU"\" FirstFragmentDuration=\"%u\"", fre->first_fragment, fre->first_fragment_timestamp, fre->fragment_duration);
4817
0
    if (!fre->fragment_duration)
4818
0
      gf_fprintf(trace, " DiscontinuityIndicator=\"%u\"", fre->discontinuity_indicator);
4819
0
    gf_fprintf(trace, "/>\n");
4820
0
  }
4821
4822
0
  gf_isom_box_dump_done("AdobeFragmentRunTableBox", a, trace);
4823
0
  return GF_OK;
4824
0
}
4825
4826
GF_Err asrt_box_dump(GF_Box *a, FILE * trace)
4827
0
{
4828
0
  u32 i;
4829
0
  GF_AdobeSegmentRunTableBox *p = (GF_AdobeSegmentRunTableBox*)a;
4830
0
  gf_isom_box_dump_start(a, "AdobeSegmentRunTableBox", trace);
4831
4832
0
  gf_fprintf(trace, ">\n");
4833
4834
0
  for (i=0; i<p->quality_entry_count; i++) {
4835
0
    char *str = (char*)gf_list_get(p->quality_segment_url_modifiers, i);
4836
0
    gf_fprintf(trace, "<QualityEntry>%s</QualityEntry>\n", str);
4837
0
  }
4838
4839
0
  for (i=0; i<p->segment_run_entry_count; i++) {
4840
0
    GF_AdobeSegmentRunEntry *sre = (GF_AdobeSegmentRunEntry *)gf_list_get(p->segment_run_entry_table, i);
4841
0
    gf_fprintf(trace, "<SegmentRunEntry FirstSegment=\"%u\" FragmentsPerSegment=\"%u\"/>\n", sre->first_segment, sre->fragment_per_segment);
4842
0
  }
4843
4844
0
  gf_isom_box_dump_done("AdobeSegmentRunTableBox", a, trace);
4845
0
  return GF_OK;
4846
0
}
4847
4848
#endif /*GPAC_DISABLE_ISOM_ADOBE*/
4849
4850
GF_Err ilst_box_dump(GF_Box *a, FILE * trace)
4851
0
{
4852
0
  u32 i;
4853
0
  GF_Box *tag;
4854
0
  GF_Err e;
4855
0
  GF_ItemListBox *ptr;
4856
0
  ptr = (GF_ItemListBox *)a;
4857
0
  gf_isom_box_dump_start(a, "ItemListBox", trace);
4858
0
  gf_fprintf(trace, ">\n");
4859
4860
0
  i=0;
4861
0
  while ( (tag = (GF_Box*)gf_list_enum(ptr->child_boxes, &i))) {
4862
0
    e = ilst_item_box_dump(tag, trace);
4863
0
    if(e) return e;
4864
0
  }
4865
0
  gf_isom_box_dump_done("ItemListBox", NULL, trace);
4866
0
  return GF_OK;
4867
0
}
4868
4869
GF_Err databox_box_dump(GF_Box *a, FILE * trace)
4870
0
{
4871
0
  gf_isom_box_dump_start(a, "data", trace);
4872
4873
0
  gf_fprintf(trace, ">\n");
4874
0
  gf_isom_box_dump_done("data", a, trace);
4875
0
  return GF_OK;
4876
0
}
4877
4878
GF_Err vexu_box_dump(GF_Box *a, FILE * trace)
4879
0
{
4880
0
  gf_isom_box_dump_start(a, "VexuBox", trace);
4881
0
  gf_fprintf(trace, ">\n");
4882
0
  gf_isom_box_dump_done("VexuBox", a, trace);
4883
0
  return GF_OK;
4884
0
}
4885
4886
GF_Err eyes_box_dump(GF_Box *a, FILE * trace)
4887
0
{
4888
0
  GF_StereoViewBox *ptr = (GF_StereoViewBox *)a;
4889
4890
0
  gf_isom_box_dump_start(a, "EyesBox", trace);
4891
0
  gf_fprintf(trace, ">\n");
4892
4893
  // mandatory Stereo view information 'stri' box
4894
0
  gf_isom_box_dump_start(a, "StriBox", trace);
4895
0
  gf_fprintf(trace, "eye_views_reversed=\"%u\" has_additional_views=\"%u\" has_right_eye_view=\"%u\" has_left_eye_view=\"%u\">\n", ptr->stri.eye_views_reversed, ptr->stri.has_additional_views, ptr->stri.has_right_eye_view, ptr->stri.has_left_eye_view);
4896
0
  gf_isom_box_dump_done("StriBox", a, trace);
4897
4898
0
  gf_isom_box_dump_done("EyesBox", a, trace);
4899
0
  return GF_OK;
4900
0
}
4901
4902
GF_Err hero_box_dump(GF_Box *a, FILE * trace)
4903
0
{
4904
0
  GF_HeroStereoEyeDescriptionBox *ptr = (GF_HeroStereoEyeDescriptionBox *)a;
4905
4906
0
  gf_isom_box_dump_start(a, "HeroBox", trace);
4907
0
  gf_fprintf(trace, "hero_eye_indicator=\"%u\">\n", ptr->hero_eye_indicator);
4908
0
  gf_isom_box_dump_done("HeroBox", a, trace);
4909
0
  return GF_OK;
4910
0
}
4911
4912
GF_Err amve_box_dump(GF_Box *a, FILE * trace)
4913
0
{
4914
0
  GF_AmbientViewingEnvBox *ptr = (GF_AmbientViewingEnvBox *)a;
4915
4916
0
  gf_isom_box_dump_start(a, "AmveBox", trace);
4917
0
  gf_fprintf(trace, "ambient_illuminance=\"%u\">\n", ptr->ambient_illuminance);
4918
0
  gf_fprintf(trace, "ambient_light_x=\"%u\">\n", ptr->ambient_light_x);
4919
0
  gf_fprintf(trace, "ambient_light_y=\"%u\">\n", ptr->ambient_light_y);
4920
0
  gf_isom_box_dump_done("AmveBox", a, trace);
4921
0
  return GF_OK;
4922
0
}
4923
4924
GF_Err ohdr_box_dump(GF_Box *a, FILE * trace)
4925
0
{
4926
0
  GF_OMADRMCommonHeaderBox *ptr = (GF_OMADRMCommonHeaderBox *)a;
4927
0
  gf_isom_box_dump_start(a, "OMADRMCommonHeaderBox", trace);
4928
4929
0
  gf_fprintf(trace, "EncryptionMethod=\"%d\" PaddingScheme=\"%d\" PlaintextLength=\""LLD"\" ",
4930
0
          ptr->EncryptionMethod, ptr->PaddingScheme, ptr->PlaintextLength);
4931
0
  if (ptr->RightsIssuerURL) gf_fprintf(trace, "RightsIssuerURL=\"%s\" ", ptr->RightsIssuerURL);
4932
0
  if (ptr->ContentID) gf_fprintf(trace, "ContentID=\"%s\" ", ptr->ContentID);
4933
0
  if (ptr->TextualHeaders) {
4934
0
    u32 i, offset;
4935
0
    char *start = ptr->TextualHeaders;
4936
0
    gf_fprintf(trace, "TextualHeaders=\"");
4937
0
    i=offset=0;
4938
0
    while (i<ptr->TextualHeadersLen) {
4939
0
      if (start[i]==0) {
4940
0
        gf_fprintf(trace, "%s ", start+offset);
4941
0
        offset=i+1;
4942
0
      }
4943
0
      i++;
4944
0
    }
4945
0
    gf_fprintf(trace, "%s\"  ", start+offset);
4946
0
  }
4947
4948
0
  gf_fprintf(trace, ">\n");
4949
0
  gf_isom_box_dump_done("OMADRMCommonHeaderBox", a, trace);
4950
0
  return GF_OK;
4951
0
}
4952
GF_Err grpi_box_dump(GF_Box *a, FILE * trace)
4953
0
{
4954
0
  GF_OMADRMGroupIDBox *ptr = (GF_OMADRMGroupIDBox *)a;
4955
0
  gf_isom_box_dump_start(a, "OMADRMGroupIDBox", trace);
4956
4957
0
  gf_fprintf(trace, "GroupID=\"%s\" EncryptionMethod=\"%d\" GroupKey=\" ", ptr->GroupID, ptr->GKEncryptionMethod);
4958
0
  if (ptr->GroupKey)
4959
0
    dump_data(trace, ptr->GroupKey, ptr->GKLength);
4960
0
  gf_fprintf(trace, "\">\n");
4961
0
  gf_isom_box_dump_done("OMADRMGroupIDBox", a, trace);
4962
0
  return GF_OK;
4963
0
}
4964
GF_Err mdri_box_dump(GF_Box *a, FILE * trace)
4965
0
{
4966
  //GF_OMADRMMutableInformationBox *ptr = (GF_OMADRMMutableInformationBox*)a;
4967
0
  gf_isom_box_dump_start(a, "OMADRMMutableInformationBox", trace);
4968
0
  gf_fprintf(trace, ">\n");
4969
0
  gf_isom_box_dump_done("OMADRMMutableInformationBox", a, trace);
4970
0
  return GF_OK;
4971
0
}
4972
GF_Err odtt_box_dump(GF_Box *a, FILE * trace)
4973
0
{
4974
0
  GF_OMADRMTransactionTrackingBox *ptr = (GF_OMADRMTransactionTrackingBox *)a;
4975
0
  gf_isom_box_dump_start(a, "OMADRMTransactionTrackingBox", trace);
4976
4977
0
  gf_fprintf(trace, "TransactionID=\"");
4978
0
  dump_data(trace, ptr->TransactionID, 16);
4979
0
  gf_fprintf(trace, "\">\n");
4980
0
  gf_isom_box_dump_done("OMADRMTransactionTrackingBox", a, trace);
4981
0
  return GF_OK;
4982
0
}
4983
GF_Err odrb_box_dump(GF_Box *a, FILE * trace)
4984
0
{
4985
0
  GF_OMADRMRightsObjectBox*ptr = (GF_OMADRMRightsObjectBox*)a;
4986
0
  gf_isom_box_dump_start(a, "OMADRMRightsObjectBox", trace);
4987
4988
0
  gf_fprintf(trace, "OMARightsObject=\"");
4989
0
  dump_data(trace, ptr->oma_ro, ptr->oma_ro_size);
4990
0
  gf_fprintf(trace, "\">\n");
4991
0
  gf_isom_box_dump_done("OMADRMRightsObjectBox", a, trace);
4992
0
  return GF_OK;
4993
0
}
4994
GF_Err odkm_box_dump(GF_Box *a, FILE * trace)
4995
0
{
4996
0
  gf_isom_box_dump_start(a, "OMADRMKMSBox", trace);
4997
0
  gf_fprintf(trace, ">\n");
4998
0
  gf_isom_box_dump_done("OMADRMKMSBox", a, trace);
4999
0
  return GF_OK;
5000
0
}
5001
5002
5003
GF_Err pasp_box_dump(GF_Box *a, FILE * trace)
5004
0
{
5005
0
  GF_PixelAspectRatioBox *ptr = (GF_PixelAspectRatioBox*)a;
5006
0
  gf_isom_box_dump_start(a, "PixelAspectRatioBox", trace);
5007
0
  gf_fprintf(trace, "hSpacing=\"%d\" vSpacing=\"%d\" >\n", ptr->hSpacing, ptr->vSpacing);
5008
0
  gf_isom_box_dump_done("PixelAspectRatioBox", a, trace);
5009
0
  return GF_OK;
5010
0
}
5011
5012
GF_Err clap_box_dump(GF_Box *a, FILE * trace)
5013
0
{
5014
0
  GF_CleanApertureBox *ptr = (GF_CleanApertureBox*)a;
5015
0
  gf_isom_box_dump_start(a, "CleanApertureBox", trace);
5016
0
  gf_fprintf(trace, "cleanApertureWidthN=\"%d\" cleanApertureWidthD=\"%d\" ", ptr->cleanApertureWidthN, ptr->cleanApertureWidthD);
5017
0
  gf_fprintf(trace, "cleanApertureHeightN=\"%d\" cleanApertureHeightD=\"%d\" ", ptr->cleanApertureHeightN, ptr->cleanApertureHeightD);
5018
0
  gf_fprintf(trace, "horizOffN=\"%d\" horizOffD=\"%d\" ", ptr->horizOffN, ptr->horizOffD);
5019
0
  gf_fprintf(trace, "vertOffN=\"%d\" vertOffD=\"%d\"", ptr->vertOffN, ptr->vertOffD);
5020
0
  gf_fprintf(trace, ">\n");
5021
0
  gf_isom_box_dump_done("CleanApertureBox", a, trace);
5022
0
  return GF_OK;
5023
0
}
5024
5025
5026
GF_Err tsel_box_dump(GF_Box *a, FILE * trace)
5027
0
{
5028
0
  u32 i;
5029
0
  GF_TrackSelectionBox *ptr = (GF_TrackSelectionBox *)a;
5030
0
  gf_isom_box_dump_start(a, "TrackSelectionBox", trace);
5031
5032
0
  gf_fprintf(trace, "switchGroup=\"%d\" >\n", ptr->switchGroup);
5033
0
  for (i=0; i<ptr->attributeListCount; i++) {
5034
0
    gf_fprintf(trace, "<TrackSelectionCriteria value=\"%s\"/>\n", gf_4cc_to_str(ptr->attributeList[i]) );
5035
0
  }
5036
0
  if (!ptr->size)
5037
0
    gf_fprintf(trace, "<TrackSelectionCriteria value=\"\"/>\n");
5038
5039
0
  gf_isom_box_dump_done("TrackSelectionBox", a, trace);
5040
0
  return GF_OK;
5041
0
}
5042
5043
GF_Err metx_box_dump(GF_Box *a, FILE * trace)
5044
0
{
5045
0
  GF_MetaDataSampleEntryBox *ptr = (GF_MetaDataSampleEntryBox*)a;
5046
0
  const char *name;
5047
0
  switch (ptr->type) {
5048
0
  case GF_ISOM_BOX_TYPE_METX:
5049
0
    name = "XMLMetaDataSampleEntryBox";
5050
0
    break;
5051
0
  case GF_ISOM_BOX_TYPE_METT:
5052
0
    name = "TextMetaDataSampleEntryBox";
5053
0
    break;
5054
0
  case GF_ISOM_BOX_TYPE_SBTT:
5055
0
    name = "SubtitleSampleEntryBox";
5056
0
    break;
5057
0
  case GF_ISOM_BOX_TYPE_STXT:
5058
0
    name = "SimpleTextSampleEntryBox";
5059
0
    break;
5060
0
  case GF_ISOM_BOX_TYPE_STPP:
5061
0
    name = "XMLSubtitleSampleEntryBox";
5062
0
    break;
5063
0
  default:
5064
0
    name = "UnknownTextSampleEntryBox";
5065
0
    break;
5066
0
  }
5067
0
  gf_isom_box_dump_start(a, name, trace);
5068
5069
0
  if (ptr->type==GF_ISOM_BOX_TYPE_METX) {
5070
0
    gf_fprintf(trace, "namespace=\"%s\" ", ptr->xml_namespace);
5071
0
    if (ptr->xml_schema_loc) gf_fprintf(trace, "schema_location=\"%s\" ", ptr->xml_schema_loc);
5072
0
    if (ptr->content_encoding) gf_fprintf(trace, "content_encoding=\"%s\" ", ptr->content_encoding);
5073
5074
0
  } else if (ptr->type==GF_ISOM_BOX_TYPE_STPP) {
5075
0
    gf_fprintf(trace, "namespace=\"%s\" ", ptr->xml_namespace);
5076
0
    if (ptr->xml_schema_loc) gf_fprintf(trace, "schema_location=\"%s\" ", ptr->xml_schema_loc);
5077
0
    if (ptr->mime_type) gf_fprintf(trace, "auxiliary_mime_types=\"%s\" ", ptr->mime_type);
5078
0
  }
5079
  //mett, sbtt, stxt
5080
0
  else {
5081
0
    gf_fprintf(trace, "mime_type=\"%s\" ", ptr->mime_type);
5082
0
    if (ptr->content_encoding) gf_fprintf(trace, "content_encoding=\"%s\" ", ptr->content_encoding);
5083
0
  }
5084
0
  gf_fprintf(trace, ">\n");
5085
0
  gf_isom_box_dump_done(name, a, trace);
5086
0
  return GF_OK;
5087
0
}
5088
5089
GF_Err txtc_box_dump(GF_Box *a, FILE * trace)
5090
0
{
5091
0
  GF_TextConfigBox *ptr = (GF_TextConfigBox*)a;
5092
0
  const char *name = (ptr->type==GF_ISOM_BOX_TYPE_TXTC) ?  "TextConfigBox" : "MIMEBox";
5093
5094
0
  gf_isom_box_dump_start(a, name, trace);
5095
0
  gf_fprintf(trace, ">\n");
5096
5097
0
  if (ptr->config) gf_fprintf(trace, "<![CDATA[%s]]>", ptr->config);
5098
5099
0
  gf_isom_box_dump_done(name, a, trace);
5100
0
  return GF_OK;
5101
0
}
5102
5103
GF_Err dims_box_dump(GF_Box *a, FILE * trace)
5104
0
{
5105
0
  GF_DIMSSampleEntryBox *p = (GF_DIMSSampleEntryBox*)a;
5106
0
  gf_isom_box_dump_start(a, "DIMSSampleEntryBox", trace);
5107
0
  gf_fprintf(trace, "dataReferenceIndex=\"%d\">\n", p->dataReferenceIndex);
5108
0
  gf_isom_box_dump_done("DIMSSampleEntryBox", a, trace);
5109
0
  return GF_OK;
5110
0
}
5111
5112
GF_Err diST_box_dump(GF_Box *a, FILE * trace)
5113
0
{
5114
0
  GF_DIMSScriptTypesBox *p = (GF_DIMSScriptTypesBox*)a;
5115
0
  gf_isom_box_dump_start(a, "DIMSScriptTypesBox", trace);
5116
0
  gf_fprintf(trace, "types=\"%s\">\n", p->content_script_types);
5117
0
  gf_isom_box_dump_done("DIMSScriptTypesBox", a, trace);
5118
0
  return GF_OK;
5119
0
}
5120
5121
GF_Err dimC_box_dump(GF_Box *a, FILE * trace)
5122
0
{
5123
0
  GF_DIMSSceneConfigBox *p = (GF_DIMSSceneConfigBox *)a;
5124
0
  gf_isom_box_dump_start(a, "DIMSSceneConfigBox", trace);
5125
0
  gf_fprintf(trace, "profile=\"%d\" level=\"%d\" pathComponents=\"%d\" useFullRequestHosts=\"%d\" streamType=\"%d\" containsRedundant=\"%d\" textEncoding=\"%s\" contentEncoding=\"%s\" >\n",
5126
0
          p->profile, p->level, p->pathComponents, p->fullRequestHost, p->streamType, p->containsRedundant, p->textEncoding, p->contentEncoding);
5127
0
  gf_isom_box_dump_done("DIMSSceneConfigBox", a, trace);
5128
0
  return GF_OK;
5129
0
}
5130
5131
GF_Err dOps_box_dump(GF_Box *a, FILE * trace)
5132
0
{
5133
0
  GF_OpusSpecificBox *p = (GF_OpusSpecificBox *)a;
5134
5135
0
  gf_isom_box_dump_start(a, "OpusSpecificBox", trace);
5136
0
  gf_fprintf(trace, "version=\"%d\" OutputChannelCount=\"%d\" PreSkip=\"%d\" InputSampleRate=\"%d\" OutputGain=\"%d\" ChannelMappingFamily=\"%d\"",
5137
0
    p->version, p->opcfg.OutputChannelCount, p->opcfg.PreSkip, p->opcfg.InputSampleRate, p->opcfg.OutputGain, p->opcfg.ChannelMappingFamily);
5138
5139
0
  if (p->opcfg.ChannelMappingFamily) {
5140
0
    u32 i;
5141
0
    gf_fprintf(trace, " StreamCount=\"%d\" CoupledStreamCount=\"%d\" channelMapping=\"", p->opcfg.StreamCount, p->opcfg.CoupledCount);
5142
0
    for (i=0; i<p->opcfg.OutputChannelCount; i++) {
5143
0
      gf_fprintf(trace, "%s%d", i ? " " : "", p->opcfg.ChannelMapping[i]);
5144
0
    }
5145
0
    gf_fprintf(trace, "\"");
5146
0
  }
5147
0
  gf_fprintf(trace, ">\n");
5148
0
  gf_isom_box_dump_done("OpusSpecificBox", a, trace);
5149
5150
0
  return GF_OK;
5151
0
}
5152
5153
GF_Err iacb_box_dump(GF_Box *a, FILE * trace)
5154
0
{
5155
0
  GF_IAConfigurationBox *p = (GF_IAConfigurationBox *)a;
5156
0
  gf_isom_box_dump_start(a, "IAConfigurationBox", trace);
5157
5158
0
  if (p->cfg) {
5159
0
    u32 i;
5160
0
    u32 obu_count = gf_list_count(p->cfg->configOBUs);
5161
0
    gf_fprintf(trace, "configurationVersion=\"%u\" configOBUs_size=\"%u\">\n",
5162
0
         (u32)p->cfg->configurationVersion, (u32)p->cfg->configOBUs_size);
5163
0
    for (i = 0; i < obu_count; ++i) {
5164
0
      GF_IamfObu *config_obu = gf_list_get(p->cfg->configOBUs, i);
5165
0
      gf_fprintf(trace, "<IAConfig obu_type=\"%u\" name=\"%s\" size=\"%d\" />\n",
5166
0
           config_obu->obu_type, gf_iamf_get_obu_name(config_obu->obu_type), (u32)config_obu->obu_length);
5167
0
    }
5168
0
  }
5169
5170
0
  gf_isom_box_dump_done("IAConfigurationBox", a, trace);
5171
0
  return GF_OK;
5172
0
}
5173
5174
GF_Err dac3_box_dump(GF_Box *a, FILE * trace)
5175
0
{
5176
0
  GF_AC3ConfigBox *p = (GF_AC3ConfigBox *)a;
5177
5178
0
  if (p->cfg.is_ec3) {
5179
0
    u32 i;
5180
0
    a->type = GF_ISOM_BOX_TYPE_DEC3;
5181
0
    gf_isom_box_dump_start(a, "EC3SpecificBox", trace);
5182
0
    a->type = GF_ISOM_BOX_TYPE_DAC3;
5183
0
    gf_fprintf(trace, "nb_streams=\"%d\" data_rate=\"%d\">\n", p->cfg.nb_streams, p->cfg.brcode*1000);
5184
0
    for (i=0; i<p->cfg.nb_streams; i++) {
5185
0
      gf_fprintf(trace, "<EC3StreamConfig fscod=\"%d\" bsid=\"%d\" bsmod=\"%d\" acmod=\"%d\" lfon=\"%d\" asvc=\"%d\" num_sub_dep=\"%d\" chan_loc=\"%d\"/>\n",
5186
0
              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);
5187
0
    }
5188
0
    if (p->cfg.atmos_ec3_ext || p->cfg.complexity_index_type) {
5189
0
      gf_fprintf(trace, "<ExtendedConfig flag_ec3_extension_type_a=\"%d\" complexity_index_type_a=\"%d\"/>\n",
5190
0
        p->cfg.atmos_ec3_ext, p->cfg.complexity_index_type);
5191
0
    }
5192
0
    gf_isom_box_dump_done("EC3SpecificBox", a, trace);
5193
0
  } else {
5194
0
    gf_isom_box_dump_start(a, "AC3SpecificBox", trace);
5195
0
    gf_fprintf(trace, "fscod=\"%d\" bsid=\"%d\" bsmod=\"%d\" acmod=\"%d\" lfon=\"%d\" bit_rate_code=\"%d\">\n",
5196
0
            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);
5197
0
    gf_isom_box_dump_done("AC3SpecificBox", a, trace);
5198
0
  }
5199
0
  return GF_OK;
5200
0
}
5201
5202
GF_Err dac4_box_dump(GF_Box *a, FILE * trace)
5203
0
{
5204
0
  GF_AC4ConfigBox *p = (GF_AC4ConfigBox *)a;
5205
0
  gf_isom_box_dump_start(a, "AC4SpecificBox", trace);
5206
0
  gf_fprintf(trace, "ac4_dsi_version=\"%d\" bitstream_version=\"%d\" fs_index=\"%d\" frame_rate_index=\"%d\" n_presentations=\"%d\">\n",
5207
0
            p->cfg.stream.ac4_dsi_version, p->cfg.stream.bitstream_version, p->cfg.stream.fs_index, p->cfg.stream.frame_rate_index, p->cfg.stream.n_presentations);
5208
0
  gf_isom_box_dump_done("AC4SpecificBox", a, trace);
5209
0
  return GF_OK;
5210
0
}
5211
5212
GF_Err dmlp_box_dump(GF_Box *a, FILE * trace)
5213
0
{
5214
0
  GF_TrueHDConfigBox *p = (GF_TrueHDConfigBox *)a;
5215
5216
0
  gf_isom_box_dump_start(a, "TrueHDConfigBox", trace);
5217
0
  gf_fprintf(trace, "format_info=\"%u\" peak_data_rate=\"%u\">\n",
5218
0
      p->format_info, p->peak_data_rate);
5219
0
  gf_isom_box_dump_done("TrueHDConfigBox", a, trace);
5220
0
  return GF_OK;
5221
0
}
5222
5223
GF_Err dvcC_box_dump(GF_Box *a, FILE * trace)
5224
0
{
5225
0
  GF_DOVIConfigurationBox *p = (GF_DOVIConfigurationBox *)a;
5226
0
  gf_isom_box_dump_start(a, "DOVIConfigurationBox", trace);
5227
0
  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\" compatibility_id=\"%u\" md_compression=\"%u\">\n",
5228
0
    p->DOVIConfig.dv_version_major, p->DOVIConfig.dv_version_minor, p->DOVIConfig.dv_profile, p->DOVIConfig.dv_level,
5229
0
    p->DOVIConfig.rpu_present_flag, p->DOVIConfig.el_present_flag, p->DOVIConfig.bl_present_flag, p->DOVIConfig.dv_bl_signal_compatibility_id, p->DOVIConfig.dv_md_compression);
5230
0
  gf_isom_box_dump_done("DOVIConfigurationBox", a, trace);
5231
0
  return GF_OK;
5232
0
}
5233
5234
GF_Err dvvC_box_dump(GF_Box *a, FILE * trace)
5235
0
{
5236
0
  return dvcC_box_dump(a, trace);
5237
0
}
5238
5239
GF_Err lsrc_box_dump(GF_Box *a, FILE * trace)
5240
0
{
5241
0
  GF_LASERConfigurationBox *p = (GF_LASERConfigurationBox *)a;
5242
0
  gf_isom_box_dump_start(a, "LASeRConfigurationBox", trace);
5243
0
  dump_data_attribute(trace, "LASeRHeader", p->hdr, p->hdr_size);
5244
0
  gf_fprintf(trace, ">");
5245
0
  gf_isom_box_dump_done("LASeRConfigurationBox", a, trace);
5246
0
  return GF_OK;
5247
0
}
5248
5249
GF_Err lsr1_box_dump(GF_Box *a, FILE * trace)
5250
0
{
5251
0
  GF_LASeRSampleEntryBox *p = (GF_LASeRSampleEntryBox*)a;
5252
0
  gf_isom_box_dump_start(a, "LASeRSampleEntryBox", trace);
5253
0
  gf_fprintf(trace, "DataReferenceIndex=\"%d\">\n", p->dataReferenceIndex);
5254
0
  gf_isom_box_dump_done("LASeRSampleEntryBox", a, trace);
5255
0
  return GF_OK;
5256
0
}
5257
5258
5259
GF_Err sidx_box_dump(GF_Box *a, FILE * trace)
5260
0
{
5261
0
  u32 i;
5262
0
  GF_SegmentIndexBox *p = (GF_SegmentIndexBox *)a;
5263
0
  gf_isom_box_dump_start(a, "SegmentIndexBox", trace);
5264
5265
0
  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);
5266
0
  if (p->internal_flags & GF_ISOM_BOX_COMPRESSED)
5267
0
    gf_fprintf(trace, " compressedSize=\""LLU"\"", p->size - p->compressed_diff);
5268
0
  gf_fprintf(trace, ">\n");
5269
5270
0
  for (i=0; i<p->nb_refs; i++) {
5271
0
    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);
5272
0
  }
5273
0
  if (!p->size) {
5274
0
    gf_fprintf(trace, "<Reference type=\"\" size=\"\" duration=\"\" startsWithSAP=\"\" SAP_type=\"\" SAPDeltaTime=\"\"/>\n");
5275
0
  }
5276
0
  gf_isom_box_dump_done("SegmentIndexBox", a, trace);
5277
0
  return GF_OK;
5278
0
}
5279
5280
GF_Err ssix_box_dump(GF_Box *a, FILE * trace)
5281
0
{
5282
0
  u32 i, j;
5283
0
  GF_SubsegmentIndexBox *p = (GF_SubsegmentIndexBox *)a;
5284
0
  gf_isom_box_dump_start(a, "SubsegmentIndexBox", trace);
5285
5286
0
  gf_fprintf(trace, "subsegment_count=\"%d\"", p->subsegment_count);
5287
0
  if (p->internal_flags & GF_ISOM_BOX_COMPRESSED)
5288
0
    gf_fprintf(trace, " compressedSize=\""LLU"\"", p->size - p->compressed_diff);
5289
0
  gf_fprintf(trace, ">\n");
5290
5291
0
  for (i = 0; i < p->subsegment_count; i++) {
5292
0
    gf_fprintf(trace, "<Subsegment range_count=\"%d\">\n", p->subsegments[i].range_count);
5293
0
    for (j = 0; j < p->subsegments[i].range_count; j++) {
5294
0
      gf_fprintf(trace, "<Range level=\"%d\" range_size=\"%d\"/>\n", p->subsegments[i].ranges[j].level, p->subsegments[i].ranges[j].range_size);
5295
0
    }
5296
0
    gf_fprintf(trace, "</Subsegment>\n");
5297
0
  }
5298
0
  if (!p->size) {
5299
0
    gf_fprintf(trace, "<Subsegment range_count=\"\">\n");
5300
0
    gf_fprintf(trace, "<Range level=\"\" range_size=\"\"/>\n");
5301
0
    gf_fprintf(trace, "</Subsegment>\n");
5302
0
  }
5303
0
  gf_isom_box_dump_done("SubsegmentIndexBox", a, trace);
5304
0
  return GF_OK;
5305
0
}
5306
5307
5308
GF_Err leva_box_dump(GF_Box *a, FILE * trace)
5309
0
{
5310
0
  u32 i;
5311
0
  GF_LevelAssignmentBox *p = (GF_LevelAssignmentBox *)a;
5312
0
  gf_isom_box_dump_start(a, "LevelAssignmentBox", trace);
5313
5314
0
  gf_fprintf(trace, "level_count=\"%d\" >\n", p->level_count);
5315
0
  for (i = 0; i < p->level_count; i++) {
5316
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);
5317
0
  }
5318
0
  if (!p->size) {
5319
0
    gf_fprintf(trace, "<Assignement track_id=\"\" padding_flag=\"\" assignement_type=\"\" grouping_type=\"\" grouping_type_parameter=\"\" sub_track_id=\"\" />\n");
5320
0
  }
5321
0
  gf_isom_box_dump_done("LevelAssignmentBox", a, trace);
5322
0
  return GF_OK;
5323
0
}
5324
5325
GF_Err strk_box_dump(GF_Box *a, FILE * trace)
5326
0
{
5327
0
  gf_isom_box_dump_start(a, "SubTrackBox", trace);
5328
0
  gf_fprintf(trace, ">\n");
5329
0
  gf_isom_box_dump_done("SubTrackBox", a, trace);
5330
0
  return GF_OK;
5331
0
}
5332
5333
GF_Err stri_box_dump(GF_Box *a, FILE * trace)
5334
0
{
5335
0
  u32 i;
5336
0
  GF_SubTrackInformationBox *p = (GF_SubTrackInformationBox *)a;
5337
0
  gf_isom_box_dump_start(a, "SubTrackInformationBox", trace);
5338
5339
0
  gf_fprintf(trace, "switch_group=\"%d\" alternate_group=\"%d\" sub_track_id=\"%d\">\n", p->switch_group, p->alternate_group, p->sub_track_id);
5340
5341
0
  for (i = 0; i < p->attribute_count; i++) {
5342
0
    gf_fprintf(trace, "<SubTrackInformationAttribute value=\"%s\"/>\n", gf_4cc_to_str(p->attribute_list[i]) );
5343
0
  }
5344
0
  if (!p->size)
5345
0
    gf_fprintf(trace, "<SubTrackInformationAttribute value=\"\"/>\n");
5346
5347
0
  gf_isom_box_dump_done("SubTrackInformationBox", a, trace);
5348
0
  return GF_OK;
5349
0
}
5350
5351
GF_Err stsg_box_dump(GF_Box *a, FILE * trace)
5352
0
{
5353
0
  u32 i;
5354
0
  GF_SubTrackSampleGroupBox *p = (GF_SubTrackSampleGroupBox *)a;
5355
0
  gf_isom_box_dump_start(a, "SubTrackSampleGroupBox", trace);
5356
5357
0
  if (p->grouping_type)
5358
0
    gf_fprintf(trace, "grouping_type=\"%s\"", gf_4cc_to_str(p->grouping_type) );
5359
0
  gf_fprintf(trace, ">\n");
5360
5361
0
  for (i = 0; i < p->nb_groups; i++) {
5362
0
    gf_fprintf(trace, "<SubTrackSampleGroupBoxEntry group_description_index=\"%d\"/>\n", p->group_description_index[i]);
5363
0
  }
5364
0
  if (!p->size)
5365
0
    gf_fprintf(trace, "<SubTrackSampleGroupBoxEntry group_description_index=\"\"/>\n");
5366
5367
0
  gf_isom_box_dump_done("SubTrackSampleGroupBox", a, trace);
5368
0
  return GF_OK;
5369
0
}
5370
5371
GF_Err pcrb_box_dump(GF_Box *a, FILE * trace)
5372
0
{
5373
0
  u32 i;
5374
0
  GF_PcrInfoBox *p = (GF_PcrInfoBox *)a;
5375
0
  gf_isom_box_dump_start(a, "MPEG2TSPCRInfoBox", trace);
5376
0
  gf_fprintf(trace, "subsegment_count=\"%d\">\n", p->subsegment_count);
5377
5378
0
  for (i=0; i<p->subsegment_count; i++) {
5379
0
    gf_fprintf(trace, "<PCRInfo PCR=\""LLU"\" />\n", p->pcr_values[i]);
5380
0
  }
5381
0
  if (!p->size) {
5382
0
    gf_fprintf(trace, "<PCRInfo PCR=\"\" />\n");
5383
0
  }
5384
0
  gf_isom_box_dump_done("MPEG2TSPCRInfoBox", a, trace);
5385
0
  return GF_OK;
5386
0
}
5387
5388
GF_Err subs_box_dump(GF_Box *a, FILE * trace)
5389
0
{
5390
0
  u32 entry_count, i, j;
5391
0
  u16 subsample_count;
5392
0
  GF_SubSampleEntry *pSubSamp;
5393
0
  GF_SubSampleInformationBox *ptr = (GF_SubSampleInformationBox *) a;
5394
5395
0
  if (!a) return GF_BAD_PARAM;
5396
5397
0
  entry_count = gf_list_count(ptr->Samples);
5398
0
  gf_isom_box_dump_start(a, "SubSampleInformationBox", trace);
5399
5400
0
  gf_fprintf(trace, "EntryCount=\"%d\">\n", entry_count);
5401
5402
0
  for (i=0; i<entry_count; i++) {
5403
0
    GF_SubSampleInfoEntry *pSamp = (GF_SubSampleInfoEntry*) gf_list_get(ptr->Samples, i);
5404
5405
0
    subsample_count = gf_list_count(pSamp->SubSamples);
5406
5407
0
    gf_fprintf(trace, "<SampleEntry SampleDelta=\"%d\" SubSampleCount=\"%d\">\n", pSamp->sample_delta, subsample_count);
5408
5409
0
    for (j=0; j<subsample_count; j++) {
5410
0
      pSubSamp = (GF_SubSampleEntry*) gf_list_get(pSamp->SubSamples, j);
5411
0
      gf_fprintf(trace, "<SubSample Size=\"%u\" Priority=\"%u\" Discardable=\"%d\" Reserved=\"%08X\"/>\n", pSubSamp->subsample_size, pSubSamp->subsample_priority, pSubSamp->discardable, pSubSamp->reserved);
5412
0
    }
5413
0
    gf_fprintf(trace, "</SampleEntry>\n");
5414
0
  }
5415
0
  if (!ptr->size) {
5416
0
    gf_fprintf(trace, "<SampleEntry SampleDelta=\"\" SubSampleCount=\"\">\n");
5417
0
    gf_fprintf(trace, "<SubSample Size=\"\" Priority=\"\" Discardable=\"\" Reserved=\"\"/>\n");
5418
0
    gf_fprintf(trace, "</SampleEntry>\n");
5419
0
  }
5420
5421
0
  gf_isom_box_dump_done("SubSampleInformationBox", a, trace);
5422
0
  return GF_OK;
5423
0
}
5424
5425
#ifndef GPAC_DISABLE_ISOM_FRAGMENTS
5426
GF_Err tfdt_box_dump(GF_Box *a, FILE * trace)
5427
0
{
5428
0
  GF_TFBaseMediaDecodeTimeBox *ptr = (GF_TFBaseMediaDecodeTimeBox*) a;
5429
0
  if (!a) return GF_BAD_PARAM;
5430
0
  gf_isom_box_dump_start(a, "TrackFragmentBaseMediaDecodeTimeBox", trace);
5431
5432
0
  gf_fprintf(trace, "baseMediaDecodeTime=\""LLD"\">\n", ptr->baseMediaDecodeTime);
5433
0
  gf_isom_box_dump_done("TrackFragmentBaseMediaDecodeTimeBox", a, trace);
5434
0
  return GF_OK;
5435
0
}
5436
GF_Err rsot_box_dump(GF_Box *a, FILE * trace)
5437
0
{
5438
0
  GF_TFOriginalDurationBox *ptr = (GF_TFOriginalDurationBox*) a;
5439
0
  if (!a) return GF_BAD_PARAM;
5440
0
  gf_isom_box_dump_start(a, "RedundantSampleOriginalTimingBox", trace);
5441
0
  if (ptr->flags & 1) gf_fprintf(trace, " originalDuration=\"%u\"", ptr->original_duration);
5442
0
  if (ptr->flags & 2) gf_fprintf(trace, " elapsedDuration=\"%u\"", ptr->elapsed_duration);
5443
0
  gf_fprintf(trace, ">\n");
5444
0
  gf_isom_box_dump_done("RedundantSampleOriginalTimingBox", a, trace);
5445
0
  return GF_OK;
5446
0
}
5447
#endif /*GPAC_DISABLE_ISOM_FRAGMENTS*/
5448
5449
GF_Err rvcc_box_dump(GF_Box *a, FILE * trace)
5450
0
{
5451
0
  GF_RVCConfigurationBox *ptr = (GF_RVCConfigurationBox*) a;
5452
0
  if (!a) return GF_BAD_PARAM;
5453
5454
0
  gf_isom_box_dump_start(a, "RVCConfigurationBox", trace);
5455
0
  gf_fprintf(trace, "predefined=\"%d\"", ptr->predefined_rvc_config);
5456
0
  if (! ptr->predefined_rvc_config) gf_fprintf(trace, " rvc_meta_idx=\"%d\"", ptr->rvc_meta_idx);
5457
0
  gf_fprintf(trace, ">\n");
5458
0
  gf_isom_box_dump_done("RVCConfigurationBox", a, trace);
5459
0
  return GF_OK;
5460
0
}
5461
5462
GF_Err sbgp_box_dump(GF_Box *a, FILE * trace)
5463
0
{
5464
0
  u32 i;
5465
0
  GF_SampleGroupBox *ptr = (GF_SampleGroupBox*) a;
5466
0
  if (!a) return GF_BAD_PARAM;
5467
5468
0
  if (dump_skip_samples)
5469
0
    return GF_OK;
5470
5471
0
  gf_isom_box_dump_start(a, "SampleGroupBox", trace);
5472
5473
0
  if (ptr->grouping_type)
5474
0
    gf_fprintf(trace, "grouping_type=\"%s\"", gf_4cc_to_str(ptr->grouping_type) );
5475
5476
0
  if (ptr->version==1) {
5477
0
    if (isalnum(ptr->grouping_type_parameter&0xFF)) {
5478
0
      gf_fprintf(trace, " grouping_type_parameter=\"%s\"", gf_4cc_to_str(ptr->grouping_type_parameter) );
5479
0
    } else {
5480
0
      gf_fprintf(trace, " grouping_type_parameter=\"%u\"", ptr->grouping_type_parameter);
5481
0
    }
5482
0
  }
5483
0
  gf_fprintf(trace, ">\n");
5484
0
  for (i=0; i<ptr->entry_count; i++) {
5485
0
    GF_SampleGroupEntry *pe = &ptr->sample_entries[i];
5486
0
    if (pe->group_description_index>0x10000) {
5487
0
      gf_fprintf(trace, "<SampleGroupBoxEntry sample_count=\"%u\" group_description_index=\"%u\" group_description_in_traf=\"1\" />\n", pe->sample_count, pe->group_description_index-0x10000);
5488
0
    } else {
5489
0
      gf_fprintf(trace, "<SampleGroupBoxEntry sample_count=\"%u\" group_description_index=\"%u\"/>\n", ptr->sample_entries[i].sample_count, ptr->sample_entries[i].group_description_index );
5490
0
    }
5491
0
  }
5492
0
  if (!ptr->size) {
5493
0
    gf_fprintf(trace, "<SampleGroupBoxEntry sample_count=\"\" group_description_index=\"\" group_description_in_traf=\"\"/>\n");
5494
0
  }
5495
0
  gf_isom_box_dump_done("SampleGroupBox", a, trace);
5496
0
  return GF_OK;
5497
0
}
5498
5499
static void oinf_entry_dump(GF_OperatingPointsInformation *ptr, FILE * trace)
5500
0
{
5501
0
  u32 i, count;
5502
5503
0
  if (!ptr) {
5504
0
    gf_fprintf(trace, "<OperatingPointsInformation scalability_mask=\"Multiview|Spatial scalability|Auxiliary|unknown\" num_profile_tier_level=\"\" num_operating_points=\"\" dependency_layers=\"\">\n");
5505
5506
0
    gf_fprintf(trace, " <ProfileTierLevel general_profile_space=\"\" general_tier_flag=\"\" general_profile_idc=\"\" general_profile_compatibility_flags=\"\" general_constraint_indicator_flags=\"\" />\n");
5507
5508
0
    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");
5509
5510
0
    gf_fprintf(trace, "<Layer dependent_layerID=\"\" num_layers_dependent_on=\"\" dependent_on_layerID=\"\" dimension_identifier=\"\"/>\n");
5511
0
    gf_fprintf(trace, "</OperatingPointsInformation>\n");
5512
0
    return;
5513
0
  }
5514
5515
5516
0
  gf_fprintf(trace, "<OperatingPointsInformation");
5517
0
  gf_fprintf(trace, " scalability_mask=\"%u (", ptr->scalability_mask);
5518
0
  switch (ptr->scalability_mask) {
5519
0
  case 2:
5520
0
    gf_fprintf(trace, "Multiview");
5521
0
    break;
5522
0
  case 4:
5523
0
    gf_fprintf(trace, "Spatial scalability");
5524
0
    break;
5525
0
  case 8:
5526
0
    gf_fprintf(trace, "Auxiliary");
5527
0
    break;
5528
0
  default:
5529
0
    gf_fprintf(trace, "unknown");
5530
0
  }
5531
0
  gf_fprintf(trace, ")\" num_profile_tier_level=\"%u\"", gf_list_count(ptr->profile_tier_levels) );
5532
0
  gf_fprintf(trace, " num_operating_points=\"%u\" dependency_layers=\"%u\"", gf_list_count(ptr->operating_points), gf_list_count(ptr->dependency_layers));
5533
0
  gf_fprintf(trace, ">\n");
5534
5535
5536
0
  count=gf_list_count(ptr->profile_tier_levels);
5537
0
  for (i = 0; i < count; i++) {
5538
0
    LHEVC_ProfileTierLevel *ptl = (LHEVC_ProfileTierLevel *)gf_list_get(ptr->profile_tier_levels, i);
5539
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);
5540
0
  }
5541
5542
5543
0
  count=gf_list_count(ptr->operating_points);
5544
0
  for (i = 0; i < count; i++) {
5545
0
    LHEVC_OperatingPoint *op = (LHEVC_OperatingPoint *)gf_list_get(ptr->operating_points, i);
5546
0
    gf_fprintf(trace, "<OperatingPoint output_layer_set_idx=\"%u\"", op->output_layer_set_idx);
5547
0
    gf_fprintf(trace, " max_temporal_id=\"%u\" layer_count=\"%u\"", op->max_temporal_id, op->layer_count);
5548
0
    gf_fprintf(trace, " minPicWidth=\"%u\" minPicHeight=\"%u\"", op->minPicWidth, op->minPicHeight);
5549
0
    gf_fprintf(trace, " maxPicWidth=\"%u\" maxPicHeight=\"%u\"", op->maxPicWidth, op->maxPicHeight);
5550
0
    gf_fprintf(trace, " maxChromaFormat=\"%u\" maxBitDepth=\"%u\"", op->maxChromaFormat, op->maxBitDepth);
5551
0
    gf_fprintf(trace, " frame_rate_info_flag=\"%u\" bit_rate_info_flag=\"%u\"", op->frame_rate_info_flag, op->bit_rate_info_flag);
5552
0
    if (op->frame_rate_info_flag)
5553
0
      gf_fprintf(trace, " avgFrameRate=\"%u\" constantFrameRate=\"%u\"", op->avgFrameRate, op->constantFrameRate);
5554
0
    if (op->bit_rate_info_flag)
5555
0
      gf_fprintf(trace, " maxBitRate=\"%u\" avgBitRate=\"%u\"", op->maxBitRate, op->avgBitRate);
5556
0
    gf_fprintf(trace, "/>\n");
5557
0
  }
5558
0
  count=gf_list_count(ptr->dependency_layers);
5559
0
  for (i = 0; i < count; i++) {
5560
0
    u32 j;
5561
0
    LHEVC_DependentLayer *dep = (LHEVC_DependentLayer *)gf_list_get(ptr->dependency_layers, i);
5562
0
    gf_fprintf(trace, "<Layer dependent_layerID=\"%u\" num_layers_dependent_on=\"%u\"", dep->dependent_layerID, dep->num_layers_dependent_on);
5563
0
    if (dep->num_layers_dependent_on) {
5564
0
      gf_fprintf(trace, " dependent_on_layerID=\"");
5565
0
      for (j = 0; j < dep->num_layers_dependent_on; j++)
5566
0
        gf_fprintf(trace, "%d ", dep->dependent_on_layerID[j]);
5567
0
      gf_fprintf(trace, "\"");
5568
0
    }
5569
0
    gf_fprintf(trace, " dimension_identifier=\"");
5570
0
    for (j = 0; j < 16; j++)
5571
0
      if (ptr->scalability_mask & (1 << j))
5572
0
        gf_fprintf(trace, "%d ", dep->dimension_identifier[j]);
5573
0
    gf_fprintf(trace, "\"/>\n");
5574
0
  }
5575
0
  gf_fprintf(trace, "</OperatingPointsInformation>\n");
5576
0
  return;
5577
0
}
5578
5579
static void linf_dump(GF_LHVCLayerInformation *ptr, FILE * trace)
5580
0
{
5581
0
  u32 i, count;
5582
0
  if (!ptr) {
5583
0
    gf_fprintf(trace, "<LayerInformation num_layers=\"\">\n");
5584
0
    gf_fprintf(trace, "<LayerInfoItem layer_id=\"\" min_temporalId=\"\" max_temporalId=\"\" sub_layer_presence_flags=\"\"/>\n");
5585
0
    gf_fprintf(trace, "</LayerInformation>\n");
5586
0
    return;
5587
0
  }
5588
5589
0
  count = gf_list_count(ptr->num_layers_in_track);
5590
0
  gf_fprintf(trace, "<LayerInformation num_layers=\"%d\">\n", count );
5591
0
  for (i = 0; i < count; i++) {
5592
0
    LHVCLayerInfoItem *li = (LHVCLayerInfoItem *)gf_list_get(ptr->num_layers_in_track, i);
5593
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);
5594
0
  }
5595
0
  gf_fprintf(trace, "</LayerInformation>\n");
5596
0
  return;
5597
0
}
5598
5599
static void trif_dump(FILE * trace, char *data, u32 data_size)
5600
0
{
5601
0
  GF_BitStream *bs;
5602
0
  u32 id, independent, filter_disabled;
5603
0
  Bool full_picture, has_dep, tile_group;
5604
5605
0
  if (!data) {
5606
0
    gf_fprintf(trace, "<TileRegionGroupEntry ID=\"\" tileGroup=\"\" independent=\"\" full_picture=\"\" filter_disabled=\"\" x=\"\" y=\"\" w=\"\" h=\"\">\n");
5607
0
    gf_fprintf(trace, "<TileRegionDependency tileID=\"\"/>\n");
5608
0
    gf_fprintf(trace, "</TileRegionGroupEntry>\n");
5609
0
    return;
5610
0
  }
5611
5612
0
  bs = gf_bs_new(data, data_size, GF_BITSTREAM_READ);
5613
0
  id = gf_bs_read_u16(bs);
5614
0
  tile_group = gf_bs_read_int(bs, 1);
5615
0
  gf_fprintf(trace, "<TileRegionGroupEntry ID=\"%d\" tileGroup=\"%d\" ", id, tile_group);
5616
0
  if (tile_group) {
5617
0
    independent = gf_bs_read_int(bs, 2);
5618
0
    full_picture = (Bool)gf_bs_read_int(bs, 1);
5619
0
    filter_disabled = gf_bs_read_int(bs, 1);
5620
0
    has_dep = gf_bs_read_int(bs, 1);
5621
0
    gf_bs_read_int(bs, 2);
5622
0
    gf_fprintf(trace, "independent=\"%d\" full_picture=\"%d\" filter_disabled=\"%d\" ", independent, full_picture, filter_disabled);
5623
5624
0
    if (!full_picture) {
5625
0
      gf_fprintf(trace, "x=\"%d\" y=\"%d\" ", gf_bs_read_u16(bs), gf_bs_read_u16(bs));
5626
0
    }
5627
0
    gf_fprintf(trace, "w=\"%d\" h=\"%d\" ", gf_bs_read_u16(bs), gf_bs_read_u16(bs));
5628
0
    if (!has_dep) {
5629
0
      gf_fprintf(trace, "/>\n");
5630
0
    } else {
5631
0
      u32 count = gf_bs_read_u16(bs);
5632
0
      gf_fprintf(trace, ">\n");
5633
0
      while (count) {
5634
0
        count--;
5635
0
        gf_fprintf(trace, "<TileRegionDependency tileID=\"%d\"/>\n", gf_bs_read_u16(bs) );
5636
0
      }
5637
0
      gf_fprintf(trace, "</TileRegionGroupEntry>\n");
5638
0
    }
5639
0
  }
5640
0
  gf_bs_del(bs);
5641
0
}
5642
5643
static void nalm_dump(FILE * trace, char *data, u32 data_size)
5644
0
{
5645
0
  GF_BitStream *bs;
5646
5647
0
  Bool rle, large_size;
5648
0
  u32 entry_count;
5649
5650
0
  if (!data) {
5651
0
    gf_fprintf(trace, "<NALUMap rle=\"\" large_size=\"\">\n");
5652
0
    gf_fprintf(trace, "<NALUMapEntry NALU_startNumber=\"\" groupID=\"\"/>\n");
5653
0
    gf_fprintf(trace, "</NALUMap>\n");
5654
0
    return;
5655
0
  }
5656
5657
0
  bs = gf_bs_new(data, data_size, GF_BITSTREAM_READ);
5658
0
  gf_bs_read_int(bs, 6);
5659
0
  large_size = gf_bs_read_int(bs, 1);
5660
0
  rle = gf_bs_read_int(bs, 1);
5661
0
  entry_count = gf_bs_read_int(bs, large_size ? 16 : 8);
5662
0
  gf_fprintf(trace, "<NALUMap rle=\"%d\" large_size=\"%d\">\n", rle, large_size);
5663
5664
0
  while (entry_count) {
5665
0
    u32 ID;
5666
0
    gf_fprintf(trace, "<NALUMapEntry ");
5667
0
    if (rle) {
5668
0
      u32 start_num = gf_bs_read_int(bs, large_size ? 16 : 8);
5669
0
      gf_fprintf(trace, "NALU_startNumber=\"%d\" ", start_num);
5670
0
    }
5671
0
    ID = gf_bs_read_u16(bs);
5672
0
    gf_fprintf(trace, "groupID=\"%d\"/>\n", ID);
5673
0
    entry_count--;
5674
0
  }
5675
0
  gf_bs_del(bs);
5676
0
  gf_fprintf(trace, "</NALUMap>\n");
5677
0
  return;
5678
0
}
5679
5680
5681
GF_Err sgpd_box_dump(GF_Box *a, FILE * trace)
5682
0
{
5683
0
  u32 i;
5684
0
  GF_SampleGroupDescriptionBox *ptr = (GF_SampleGroupDescriptionBox*) a;
5685
0
  if (!a) return GF_BAD_PARAM;
5686
5687
0
  gf_isom_box_dump_start(a, "SampleGroupDescriptionBox", trace);
5688
5689
0
  if (ptr->grouping_type)
5690
0
    gf_fprintf(trace, "grouping_type=\"%s\"", gf_4cc_to_str(ptr->grouping_type) );
5691
0
  if (ptr->version>=1) gf_fprintf(trace, " default_length=\"%d\"", ptr->default_length);
5692
0
  if ((ptr->version>=2) && ptr->default_description_index) {
5693
0
    gf_fprintf(trace, " default_group_index=\"");
5694
0
    if (ptr->default_description_index>0x10000)
5695
0
      fprintf(trace, "%d(traf)", ptr->default_description_index-0x10000);
5696
0
    else
5697
0
      fprintf(trace, "%d", ptr->default_description_index);
5698
0
    gf_fprintf(trace, "\"");
5699
0
  }
5700
0
  if (ptr->flags & 1) gf_fprintf(trace, " static_samplegroup=\"yes\"");
5701
0
  if (ptr->flags & 2) gf_fprintf(trace, " static_mapping=\"yes\"");
5702
5703
0
  gf_fprintf(trace, ">\n");
5704
0
  for (i=0; i<gf_list_count(ptr->group_descriptions); i++) {
5705
0
    void *entry = gf_list_get(ptr->group_descriptions, i);
5706
0
    switch (ptr->grouping_type) {
5707
0
    case GF_ISOM_SAMPLE_GROUP_ROLL:
5708
0
      gf_fprintf(trace, "<RollRecoveryEntry roll_distance=\"%d\" />\n", ((GF_RollRecoveryEntry*)entry)->roll_distance );
5709
0
      break;
5710
0
    case GF_ISOM_SAMPLE_GROUP_PROL:
5711
0
      gf_fprintf(trace, "<AudioPreRollEntry roll_distance=\"%d\" />\n", ((GF_RollRecoveryEntry*)entry)->roll_distance );
5712
0
      break;
5713
0
    case GF_ISOM_SAMPLE_GROUP_TELE:
5714
0
      gf_fprintf(trace, "<TemporalLevelEntry level_independently_decodable=\"%d\"/>\n", ((GF_TemporalLevelEntry*)entry)->level_independently_decodable);
5715
0
      break;
5716
0
    case GF_ISOM_SAMPLE_GROUP_RAP:
5717
0
      gf_fprintf(trace, "<VisualRandomAccessEntry num_leading_samples_known=\"%s\"", ((GF_VisualRandomAccessEntry*)entry)->num_leading_samples_known ? "yes" : "no");
5718
0
      if (((GF_VisualRandomAccessEntry*)entry)->num_leading_samples_known)
5719
0
        gf_fprintf(trace, " num_leading_samples=\"%d\"", ((GF_VisualRandomAccessEntry*)entry)->num_leading_samples);
5720
0
      gf_fprintf(trace, "/>\n");
5721
0
      break;
5722
0
    case GF_ISOM_SAMPLE_GROUP_SYNC:
5723
0
      gf_fprintf(trace, "<SyncSampleGroupEntry NAL_unit_type=\"%d\"/>\n", ((GF_SYNCEntry*)entry)->NALU_type);
5724
0
      break;
5725
0
    case GF_ISOM_SAMPLE_GROUP_SEIG:
5726
0
    {
5727
0
      GF_CENCSampleEncryptionGroupEntry *seig = (GF_CENCSampleEncryptionGroupEntry *)entry;
5728
0
      Bool use_mkey = seig->key_info[0] ? GF_TRUE : GF_FALSE;
5729
5730
0
      gf_fprintf(trace, "<CENCSampleEncryptionGroupEntry IsEncrypted=\"%d\"", seig->IsProtected);
5731
0
      if (use_mkey) {
5732
0
        u32 k, nb_keys, kpos=3;
5733
0
        nb_keys = seig->key_info[1];
5734
0
        nb_keys <<= 8;
5735
0
        nb_keys |= seig->key_info[2];
5736
5737
0
        gf_fprintf(trace, ">\n");
5738
0
        for (k=0; k<nb_keys; k++) {
5739
0
          if (kpos + 17 > seig->key_info_size)
5740
0
            break;
5741
0
          u8 iv_size = seig->key_info[kpos];
5742
0
          gf_fprintf(trace, "<CENCKey IV_size=\"%d\" KID=\"", iv_size);
5743
0
          dump_data_hex(trace, seig->key_info+kpos+1, 16);
5744
0
          kpos += 17;
5745
0
          gf_fprintf(trace, "\"");
5746
0
          if ((seig->IsProtected == 1) && !iv_size) {
5747
0
            if (kpos + 1 >= seig->key_info_size) {
5748
0
              gf_fprintf(trace, "/>\n");
5749
0
              break;
5750
0
            }
5751
0
            u8 const_IV_size = seig->key_info[kpos];
5752
0
            gf_fprintf(trace, " constant_IV_size=\"%d\"  constant_IV=\"", const_IV_size);
5753
0
            if (kpos + 1 + const_IV_size > seig->key_info_size) {
5754
0
              gf_fprintf(trace, "invalid\"/>\n");
5755
0
              break;
5756
0
            }
5757
0
            dump_data_hex(trace, (char *)seig->key_info + kpos + 1, const_IV_size);
5758
0
            kpos += 1 + const_IV_size;
5759
0
            gf_fprintf(trace, "\"");
5760
0
          }
5761
0
          gf_fprintf(trace, "/>\n");
5762
0
        }
5763
0
        gf_fprintf(trace, "</CENCSampleEncryptionGroupEntry>\n");
5764
0
      } else {
5765
0
        gf_fprintf(trace, " IV_size=\"%d\" KID=\"", seig->key_info[3]);
5766
0
        dump_data_hex(trace, seig->key_info+4, 16);
5767
0
        if ((seig->IsProtected == 1) && !seig->key_info[3]) {
5768
0
          gf_fprintf(trace, "\" constant_IV_size=\"%d\"  constant_IV=\"", seig->key_info[20]);
5769
0
          dump_data_hex(trace, (char *)seig->key_info + 21, seig->key_info[20]);
5770
0
        }
5771
0
        gf_fprintf(trace, "\"/>\n");
5772
0
      }
5773
0
    }
5774
0
      break;
5775
0
    case GF_ISOM_SAMPLE_GROUP_OINF:
5776
0
      oinf_entry_dump(entry, trace);
5777
0
      break;
5778
0
    case GF_ISOM_SAMPLE_GROUP_LINF:
5779
0
      linf_dump(entry, trace);
5780
0
      break;
5781
0
    case GF_ISOM_SAMPLE_GROUP_TRIF:
5782
0
      trif_dump(trace, (char *) ((GF_DefaultSampleGroupDescriptionEntry*)entry)->data,  ((GF_DefaultSampleGroupDescriptionEntry*)entry)->length);
5783
0
      break;
5784
5785
0
    case GF_ISOM_SAMPLE_GROUP_NALM:
5786
0
      nalm_dump(trace, (char *) ((GF_DefaultSampleGroupDescriptionEntry*)entry)->data,  ((GF_DefaultSampleGroupDescriptionEntry*)entry)->length);
5787
0
      break;
5788
0
    case GF_ISOM_SAMPLE_GROUP_SAP:
5789
0
      gf_fprintf(trace, "<SAPEntry dependent_flag=\"%d\" SAP_type=\"%d\" />\n", ((GF_SAPEntry*)entry)->dependent_flag, ((GF_SAPEntry*)entry)->SAP_type);
5790
0
      break;
5791
0
    case GF_ISOM_SAMPLE_GROUP_SPOR:
5792
0
    {
5793
0
      GF_SubpictureOrderEntry *spor = (GF_SubpictureOrderEntry *) entry;
5794
0
      gf_fprintf(trace, "<SubPictureOrderEntry subpic_id_info_flag=\"%d\" refs=\"", spor->subpic_id_info_flag);
5795
0
      for (i=0; i<spor->num_subpic_ref_idx; i++) {
5796
0
        if (i) gf_fprintf(trace, " ");
5797
0
        gf_fprintf(trace, "%d", spor->subp_track_ref_idx[i]);
5798
0
      }
5799
0
      gf_fprintf(trace, "\"");
5800
0
      if (spor->subpic_id_info_flag) {
5801
0
        gf_fprintf(trace, " subpic_id_len_minus1=\"%d\" subpic_id_bit_pos=\"%d\" start_code_emul_flag=\"%d\"", spor->spinfo.subpic_id_len_minus1, spor->spinfo.subpic_id_bit_pos, spor->spinfo.start_code_emul_flag);
5802
0
        gf_fprintf(trace, " %s=\"%d\"", spor->spinfo.pps_sps_subpic_id_flag ? "pps_id" : "sps_id", spor->spinfo.xps_id);
5803
0
      }
5804
0
      gf_fprintf(trace, "/>\n");
5805
0
    }
5806
0
      break;
5807
0
    case GF_ISOM_SAMPLE_GROUP_SULM:
5808
0
    {
5809
0
      GF_SubpictureLayoutMapEntry *sulm = (GF_SubpictureLayoutMapEntry *) entry;
5810
0
      gf_fprintf(trace, "<SubPictureLayoutMapEntry groupID_info_4cc=\"%s\" groupIDs=\"", gf_4cc_to_str(sulm->groupID_info_4cc) );
5811
0
      for (i=0; i<sulm->nb_entries; i++) {
5812
0
        if (i) gf_fprintf(trace, " ");
5813
0
        gf_fprintf(trace, "%d", sulm->groupIDs[i]);
5814
0
      }
5815
0
      gf_fprintf(trace, "\"/>\n");
5816
0
    }
5817
0
      break;
5818
0
    case GF_ISOM_SAMPLE_GROUP_ILCE:
5819
0
    {
5820
0
      GF_FieldInterlaceType *ilce = (GF_FieldInterlaceType *) entry;
5821
0
      gf_fprintf(trace, "<FieldInterlaceTypeEntry interlace_type=\"%d\" interleaved=\"%d\" first_field_type=\"%d\" bottom_first=\"%d\"/>\n",
5822
0
        ilce->ilce_type>>6,
5823
0
        (ilce->ilce_type>>5) & 0x1,
5824
0
        (ilce->ilce_type>>4) & 0x1,
5825
0
        (ilce->ilce_type>>3) & 0x1
5826
0
      );
5827
0
    }
5828
0
      break;
5829
5830
0
    case GF_ISOM_SAMPLE_GROUP_ESGH:
5831
0
    {
5832
0
      GF_EssentialSamplegroupEntry *esgh = (GF_EssentialSamplegroupEntry *) entry;
5833
0
      gf_fprintf(trace, "<EssentialSampleGroupEntry samplegroup_types=\"");
5834
0
      for (i=0; i<esgh->nb_types; i++) {
5835
0
        if (i) gf_fprintf(trace, " ");
5836
0
        gf_fprintf(trace, "%s", gf_4cc_to_str(esgh->group_types[i]));
5837
0
      }
5838
0
      gf_fprintf(trace, "\"/>\n");
5839
0
    }
5840
0
      break;
5841
0
    default:
5842
0
      if (ptr->is_opaque) {
5843
0
        Bool do_dump = GF_TRUE;
5844
0
#ifdef GPAC_HAS_QJS
5845
0
        const char *opt = gf_opts_get_key("core", "boxdir");
5846
0
        if (opt) {
5847
0
          GF_DefaultSampleGroupDescriptionEntry *defe = (GF_DefaultSampleGroupDescriptionEntry*)entry;
5848
0
          char szPath[GF_MAX_PATH];
5849
0
          snprintf(szPath, GF_MAX_PATH-1, "%s/sgpd_%s.js", opt, gf_4cc_to_str(ptr->grouping_type) );
5850
0
          if (gf_file_exists(szPath)) {
5851
0
            dump_js_data(defe->data, defe->length, ptr->grouping_type, 0, NULL, trace, szPath);
5852
0
            do_dump = GF_FALSE;
5853
0
          }
5854
0
        }
5855
0
#endif
5856
0
        if (do_dump) {
5857
0
          gf_fprintf(trace, "<DefaultSampleGroupDescriptionEntry size=\"%d\" data=\"", ((GF_DefaultSampleGroupDescriptionEntry*)entry)->length);
5858
0
          dump_data(trace, (char *) ((GF_DefaultSampleGroupDescriptionEntry*)entry)->data,  ((GF_DefaultSampleGroupDescriptionEntry*)entry)->length);
5859
0
          gf_fprintf(trace, "\"/>\n");
5860
0
        }
5861
0
      }
5862
0
    }
5863
0
  }
5864
0
  if (!ptr->size) {
5865
0
    switch (ptr->grouping_type) {
5866
0
    case GF_ISOM_SAMPLE_GROUP_ROLL:
5867
0
      gf_fprintf(trace, "<RollRecoveryEntry roll_distance=\"\"/>\n");
5868
0
      break;
5869
0
    case GF_ISOM_SAMPLE_GROUP_PROL:
5870
0
      gf_fprintf(trace, "<AudioPreRollEntry roll_distance=\"\"/>\n");
5871
0
      break;
5872
0
    case GF_ISOM_SAMPLE_GROUP_TELE:
5873
0
      gf_fprintf(trace, "<TemporalLevelEntry level_independently_decodable=\"\"/>\n");
5874
0
      break;
5875
0
    case GF_ISOM_SAMPLE_GROUP_RAP:
5876
0
      gf_fprintf(trace, "<VisualRandomAccessEntry num_leading_samples_known=\"yes|no\" num_leading_samples=\"\" />\n");
5877
0
      break;
5878
0
    case GF_ISOM_SAMPLE_GROUP_SYNC:
5879
0
      gf_fprintf(trace, "<SyncSampleGroupEntry NAL_unit_type=\"\" />\n");
5880
0
      break;
5881
0
    case GF_ISOM_SAMPLE_GROUP_SEIG:
5882
0
      gf_fprintf(trace, "<CENCSampleEncryptionGroupEntry IsEncrypted=\"\" IV_size=\"\" KID=\"\" constant_IV_size=\"\"  constant_IV=\"\"/>\n");
5883
0
      break;
5884
0
    case GF_ISOM_SAMPLE_GROUP_OINF:
5885
0
      oinf_entry_dump(NULL, trace);
5886
0
      break;
5887
0
    case GF_ISOM_SAMPLE_GROUP_LINF:
5888
0
      linf_dump(NULL, trace);
5889
0
      break;
5890
0
    case GF_ISOM_SAMPLE_GROUP_TRIF:
5891
0
      trif_dump(trace, NULL, 0);
5892
0
      break;
5893
0
    case GF_ISOM_SAMPLE_GROUP_NALM:
5894
0
      nalm_dump(trace, NULL, 0);
5895
0
      break;
5896
0
    case GF_ISOM_SAMPLE_GROUP_SAP:
5897
0
      gf_fprintf(trace, "<SAPEntry dependent_flag=\"\" SAP_type=\"\" />\n");
5898
0
      break;
5899
0
    case GF_ISOM_SAMPLE_GROUP_SPOR:
5900
0
      gf_fprintf(trace, "<SubPictureOrderEntry subpic_id_info_flag=\"\" refs=\"\" subpic_id_len_minus1=\"\" subpic_id_bit_pos=\"\" start_code_emul_flag=\"\" pps_id=\"\" sps_id=\"\" />\n");
5901
0
      break;
5902
0
    case GF_ISOM_SAMPLE_GROUP_SULM:
5903
0
      gf_fprintf(trace, "<SubPictureLayoutMapEntry groupID_info_4cc=\"\" groupIDs=\"\" />\n");
5904
0
      break;
5905
0
    case GF_ISOM_SAMPLE_GROUP_ILCE:
5906
0
      gf_fprintf(trace, "<FieldInterlaceTypeEntry interlace_type=\"\" interleaved=\"\" first_field_type=\"\" bottom_first=\"\"/>\n");
5907
0
      break;
5908
5909
0
    case GF_ISOM_SAMPLE_GROUP_ESGH:
5910
0
      gf_fprintf(trace, "<EssentialSampleGroupEntry samplegroup_types=\"\" />\n");
5911
0
      break;
5912
5913
0
    default:
5914
0
      gf_fprintf(trace, "<DefaultSampleGroupDescriptionEntry size=\"\" data=\"\"/>\n");
5915
0
    }
5916
0
  }
5917
5918
0
  gf_isom_box_dump_done("SampleGroupDescriptionBox", a, trace);
5919
0
  return GF_OK;
5920
0
}
5921
5922
GF_Err saiz_box_dump(GF_Box *a, FILE * trace)
5923
0
{
5924
0
  u32 i;
5925
0
  GF_SampleAuxiliaryInfoSizeBox *ptr = (GF_SampleAuxiliaryInfoSizeBox*) a;
5926
0
  if (!a) return GF_BAD_PARAM;
5927
5928
0
  if (dump_skip_samples)
5929
0
    return GF_OK;
5930
5931
0
  gf_isom_box_dump_start(a, "SampleAuxiliaryInfoSizeBox", trace);
5932
5933
0
  gf_fprintf(trace, "default_sample_info_size=\"%d\" sample_count=\"%d\"", ptr->default_sample_info_size, ptr->sample_count);
5934
0
  if (ptr->flags & 1) {
5935
0
    if (isalnum(ptr->aux_info_type>>24)) {
5936
0
      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);
5937
0
    } else {
5938
0
      gf_fprintf(trace, " aux_info_type=\"%d\" aux_info_type_parameter=\"%d\"", ptr->aux_info_type, ptr->aux_info_type_parameter);
5939
0
    }
5940
0
  }
5941
0
  gf_fprintf(trace, ">\n");
5942
0
  if (ptr->default_sample_info_size==0) {
5943
0
    for (i=0; i<ptr->sample_count; i++) {
5944
0
      gf_fprintf(trace, "<SAISize size=\"%d\" />\n", ptr->sample_info_size[i]);
5945
0
    }
5946
0
  }
5947
0
  if (!ptr->size) {
5948
0
      gf_fprintf(trace, "<SAISize size=\"\" />\n");
5949
0
  }
5950
0
  gf_isom_box_dump_done("SampleAuxiliaryInfoSizeBox", a, trace);
5951
0
  return GF_OK;
5952
0
}
5953
5954
GF_Err saio_box_dump(GF_Box *a, FILE * trace)
5955
0
{
5956
0
  u32 i;
5957
0
  GF_SampleAuxiliaryInfoOffsetBox *ptr = (GF_SampleAuxiliaryInfoOffsetBox*) a;
5958
0
  if (!a) return GF_BAD_PARAM;
5959
5960
0
  if (dump_skip_samples)
5961
0
    return GF_OK;
5962
5963
0
  gf_isom_box_dump_start(a, "SampleAuxiliaryInfoOffsetBox", trace);
5964
5965
0
  gf_fprintf(trace, "entry_count=\"%d\"", ptr->entry_count);
5966
0
  if (ptr->flags & 1) {
5967
0
    if (isalnum(ptr->aux_info_type>>24)) {
5968
0
      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);
5969
0
    } else {
5970
0
      gf_fprintf(trace, " aux_info_type=\"%d\" aux_info_type_parameter=\"%d\"", ptr->aux_info_type, ptr->aux_info_type_parameter);
5971
0
    }
5972
0
  }
5973
5974
0
  gf_fprintf(trace, ">\n");
5975
0
  if (ptr->offsets) {
5976
0
    if (ptr->version==0) {
5977
0
      for (i=0; i<ptr->entry_count; i++) {
5978
0
        gf_fprintf(trace, "<SAIChunkOffset offset=\"%d\"/>\n", (u32) ptr->offsets[i]);
5979
0
      }
5980
0
    } else {
5981
0
      for (i=0; i<ptr->entry_count; i++) {
5982
0
        gf_fprintf(trace, "<SAIChunkOffset offset=\""LLD"\"/>\n", ptr->offsets[i]);
5983
0
      }
5984
0
    }
5985
0
  } else {
5986
0
    gf_fprintf(trace, "<!-- NO OFFSETS -->\n");
5987
0
  }
5988
0
  if (!ptr->size) {
5989
0
      gf_fprintf(trace, "<SAIChunkOffset offset=\"\"/>\n");
5990
0
  }
5991
0
  gf_isom_box_dump_done("SampleAuxiliaryInfoOffsetBox", a, trace);
5992
0
  return GF_OK;
5993
0
}
5994
5995
GF_Err pssh_box_dump(GF_Box *a, FILE * trace)
5996
0
{
5997
0
  GF_ProtectionSystemHeaderBox *ptr = (GF_ProtectionSystemHeaderBox*) a;
5998
0
  if (!a) return GF_BAD_PARAM;
5999
6000
0
  gf_isom_box_dump_start(a, "ProtectionSystemHeaderBox", trace);
6001
6002
0
  gf_fprintf(trace, "SystemID=\"");
6003
0
  dump_data_hex(trace, (char *) ptr->SystemID, 16);
6004
0
  gf_fprintf(trace, "\">\n");
6005
6006
0
  if (ptr->KID_count) {
6007
0
    u32 i;
6008
0
    for (i=0; i<ptr->KID_count; i++) {
6009
0
      gf_fprintf(trace, " <PSSHKey KID=\"");
6010
0
      dump_data_hex(trace, (char *) ptr->KIDs[i], 16);
6011
0
      gf_fprintf(trace, "\"/>\n");
6012
0
    }
6013
0
  }
6014
0
  if (ptr->private_data_size) {
6015
0
    gf_fprintf(trace, " <PSSHData size=\"%d\" value=\"", ptr->private_data_size);
6016
0
    dump_data_hex(trace, (char *) ptr->private_data, ptr->private_data_size);
6017
0
    gf_fprintf(trace, "\"/>\n");
6018
0
  }
6019
0
  if (!ptr->size) {
6020
0
    gf_fprintf(trace, " <PSSHKey KID=\"\"/>\n");
6021
0
    gf_fprintf(trace, " <PSSHData size=\"\" value=\"\"/>\n");
6022
0
  }
6023
0
  gf_isom_box_dump_done("ProtectionSystemHeaderBox", a, trace);
6024
0
  return GF_OK;
6025
0
}
6026
6027
GF_Err tenc_box_dump(GF_Box *a, FILE * trace)
6028
0
{
6029
0
  GF_TrackEncryptionBox *ptr = (GF_TrackEncryptionBox*) a;
6030
0
  if (!a) return GF_BAD_PARAM;
6031
6032
0
  gf_isom_box_dump_start(a, "TrackEncryptionBox", trace);
6033
6034
0
  gf_fprintf(trace, "isEncrypted=\"%d\"", ptr->isProtected);
6035
6036
0
  if (ptr->key_info[3])
6037
0
    gf_fprintf(trace, " IV_size=\"%d\" KID=\"", ptr->key_info[3]);
6038
0
  else {
6039
0
    gf_fprintf(trace, " constant_IV_size=\"%d\" constant_IV=\"", ptr->key_info[20]);
6040
0
    dump_data_hex(trace, (char *) ptr->key_info+21, ptr->key_info[20]);
6041
0
    gf_fprintf(trace, "\"  KID=\"");
6042
0
  }
6043
0
  dump_data_hex(trace, (char *) ptr->key_info+4, 16);
6044
0
  if (ptr->version)
6045
0
    gf_fprintf(trace, "\" crypt_byte_block=\"%u\" skip_byte_block=\"%u", ptr->crypt_byte_block, ptr->skip_byte_block);
6046
0
  gf_fprintf(trace, "\">\n");
6047
6048
0
  if (!ptr->size) {
6049
0
    gf_fprintf(trace, " IV_size=\"\" KID=\"\" constant_IV_size=\"\" constant_IV=\"\" crypt_byte_block=\"\" skip_byte_block=\"\">\n");
6050
0
    gf_fprintf(trace, "<TENCKey IV_size=\"\" KID=\"\" const_IV_size=\"\" constIV=\"\"/>\n");
6051
0
  }
6052
0
  gf_isom_box_dump_done("TrackEncryptionBox", a, trace);
6053
0
  return GF_OK;
6054
0
}
6055
6056
GF_Err piff_pssh_box_dump(GF_Box *a, FILE * trace)
6057
0
{
6058
0
  GF_PIFFProtectionSystemHeaderBox *ptr = (GF_PIFFProtectionSystemHeaderBox*) a;
6059
0
  if (!a) return GF_BAD_PARAM;
6060
6061
0
  gf_isom_box_dump_start(a, "PIFFProtectionSystemHeaderBox", trace);
6062
0
  fprintf(trace, "Version=\"%d\" Flags=\"%d\" ", ptr->version, ptr->flags);
6063
6064
0
  gf_fprintf(trace, "SystemID=\"");
6065
0
  dump_data_hex(trace, (char *) ptr->SystemID, 16);
6066
0
  gf_fprintf(trace, "\" PrivateData=\"");
6067
0
  dump_data_hex(trace, (char *) ptr->private_data, ptr->private_data_size);
6068
0
  gf_fprintf(trace, "\">\n");
6069
0
  gf_isom_box_dump_done("PIFFProtectionSystemHeaderBox", a, trace);
6070
0
  return GF_OK;
6071
0
}
6072
6073
GF_Err piff_tenc_box_dump(GF_Box *a, FILE * trace)
6074
0
{
6075
0
  GF_PIFFTrackEncryptionBox *ptr = (GF_PIFFTrackEncryptionBox*) a;
6076
0
  if (!a) return GF_BAD_PARAM;
6077
6078
0
  gf_isom_box_dump_start(a, "PIFFTrackEncryptionBox", trace);
6079
0
  fprintf(trace, "Version=\"%d\" Flags=\"%d\" ", ptr->version, ptr->flags);
6080
6081
0
  gf_fprintf(trace, "AlgorithmID=\"%d\" IV_size=\"%d\" KID=\"", ptr->AlgorithmID, ptr->key_info[3]);
6082
0
  dump_data_hex(trace,(char *) ptr->key_info+4, 16);
6083
0
  gf_fprintf(trace, "\">\n");
6084
0
  gf_isom_box_dump_done("PIFFTrackEncryptionBox", a, trace);
6085
0
  return GF_OK;
6086
0
}
6087
6088
GF_Err senc_box_dump(GF_Box *a, FILE * trace)
6089
0
{
6090
0
  u32 i, sample_count;
6091
0
  const char *name;
6092
0
  GF_BitStream *bs = NULL;
6093
0
  u32 piff_IV_size = 0;
6094
0
  Bool use_multikey = GF_FALSE;
6095
0
  GF_SampleEncryptionBox *ptr = (GF_SampleEncryptionBox *) a;
6096
0
  if (!a) return GF_BAD_PARAM;
6097
6098
0
  if (dump_skip_samples)
6099
0
    return GF_OK;
6100
6101
0
  if (ptr->internal_4cc == GF_ISOM_BOX_UUID_PSEC)
6102
0
    name = "PIFFSampleEncryptionBox";
6103
0
  else
6104
0
    name = "SampleEncryptionBox";
6105
6106
0
  gf_isom_box_dump_start(a, name, trace);
6107
6108
0
  if (ptr->internal_4cc == GF_ISOM_BOX_UUID_PSEC) {
6109
0
    gf_fprintf(trace, "Version=\"%d\" Flags=\"%d\" ", ptr->version, ptr->flags);
6110
0
    if (ptr->flags & 1) {
6111
0
      gf_fprintf(trace, " AlgorithmID=\"%d\" IV_size=\"%d\" KID=\"", ptr->AlgorithmID, ptr->IV_size);
6112
0
      dump_data(trace, (char *) ptr->KID, 16);
6113
0
      gf_fprintf(trace, "\"");
6114
0
      piff_IV_size = ptr->IV_size;
6115
0
    }
6116
0
  }
6117
6118
0
  sample_count = gf_list_count(ptr->samp_aux_info);
6119
0
  gf_fprintf(trace, "sampleCount=\"%d\">\n", sample_count);
6120
0
  if (ptr->internal_4cc != GF_ISOM_BOX_UUID_PSEC) {
6121
    //WARNING - PSEC (UUID) IS TYPECASTED TO SENC (FULL BOX) SO WE CANNOT USE USUAL FULL BOX FUNCTIONS
6122
0
    gf_fprintf(trace, "<FullBoxInfo Version=\"%d\" Flags=\"0x%X\"/>\n", ptr->version, ptr->flags);
6123
6124
0
    if ((ptr->version==1) && !ptr->piff_type)
6125
0
      use_multikey = GF_TRUE;
6126
0
  }
6127
6128
6129
0
  for (i=0; i<sample_count; i++) {
6130
0
    u32 nb_keys=0;
6131
0
    u32 iv_size=0;
6132
0
    u32 subs_bits=16;
6133
0
    GF_CENCSampleAuxInfo *sai = (GF_CENCSampleAuxInfo *)gf_list_get(ptr->samp_aux_info, i);
6134
0
    if (!sai) break;
6135
0
    if (sai->isNotProtected) continue;
6136
6137
0
    gf_fprintf(trace, "<SampleEncryptionEntry sampleNumber=\"%d\"", i+1);
6138
0
    if (sai->key_info) {
6139
0
      if (!use_multikey) {
6140
0
        iv_size = sai->key_info[3];
6141
0
      } else {
6142
0
        nb_keys = sai->key_info[1];
6143
0
        nb_keys <<= 8;
6144
0
        nb_keys |= sai->key_info[2];
6145
0
        subs_bits = 32;
6146
0
      }
6147
0
    }
6148
    //piff
6149
0
    else {
6150
0
      iv_size = piff_IV_size ? piff_IV_size : sai->key_info_size;
6151
0
    }
6152
6153
0
    if (!bs)
6154
0
      bs = gf_bs_new(sai->cenc_data, sai->cenc_data_size, GF_BITSTREAM_READ);
6155
0
    else
6156
0
      gf_bs_reassign_buffer(bs, sai->cenc_data, sai->cenc_data_size);
6157
6158
0
    if (!use_multikey) {
6159
0
      gf_fprintf(trace, " IV_size=\"%u\"", iv_size);
6160
0
      if (iv_size) {
6161
0
        gf_fprintf(trace, " IV=\"");
6162
0
        if (iv_size <= sai->cenc_data_size) {
6163
0
          dump_data_hex(trace, (char *) sai->cenc_data, iv_size);
6164
0
        } else {
6165
0
          gf_fprintf(trace, "CORRUPTED");
6166
0
        }
6167
0
        gf_fprintf(trace, "\"");
6168
0
        gf_bs_skip_bytes(bs, iv_size);
6169
0
      }
6170
0
    } else {
6171
0
      u32 k, nb_ivs = gf_bs_read_u16(bs);
6172
0
      if (nb_ivs) {
6173
0
        gf_fprintf(trace, " multiIV=\"[");
6174
0
      }
6175
0
      for (k=0; k<nb_ivs; k++) {
6176
0
        u32 pos;
6177
0
        u32 idx = gf_bs_read_u16(bs);
6178
0
        u8 mk_iv_size = gf_cenc_key_info_get_iv_size(sai->key_info, sai->key_info_size, idx, NULL, NULL);
6179
0
        pos = (u32) gf_bs_get_position(bs);
6180
0
        if (mk_iv_size + pos <= sai->cenc_data_size) {
6181
0
          gf_fprintf(trace, "%sidx:%d,iv_size:%d,IV:", k ? "," : "", idx, mk_iv_size);
6182
0
          dump_data_hex(trace, (char *) sai->cenc_data+pos, mk_iv_size);
6183
0
        } else {
6184
0
          gf_fprintf(trace, "%sidx:%d,iv_size:%d,IV:CORRUPTED", k ? "," : "", idx, mk_iv_size);
6185
0
        }
6186
0
        gf_bs_skip_bytes(bs, mk_iv_size);
6187
0
      }
6188
0
      if (nb_ivs) {
6189
0
        gf_fprintf(trace, "]\"");
6190
0
      }
6191
0
    }
6192
0
    if (use_multikey || ((ptr->flags & 0x2) && (sai->cenc_data_size>iv_size)) ) {
6193
0
      u32 j, nb_subs, total_bytes=0;
6194
6195
0
      nb_subs = gf_bs_read_int(bs, subs_bits);
6196
0
      gf_fprintf(trace, " SubsampleCount=\"%u\"", nb_subs);
6197
0
      gf_fprintf(trace, ">\n");
6198
6199
0
      for (j=0; j<nb_subs; j++) {
6200
0
        u32 clear, nb_crypt;
6201
0
        gf_fprintf(trace, "<SubSampleEncryptionEntry");
6202
0
        if (nb_keys>1) {
6203
0
          u32 kidx = gf_bs_read_u16(bs);
6204
0
          gf_fprintf(trace, " MultiKeyIndex=\"%u\"", kidx);
6205
0
        }
6206
0
        clear = gf_bs_read_u16(bs);
6207
0
        nb_crypt = gf_bs_read_u32(bs);
6208
0
        gf_fprintf(trace, " NumClearBytes=\"%u\" NumEncryptedBytes=\"%u\"/>\n", clear, nb_crypt);
6209
0
        total_bytes+=clear+nb_crypt;
6210
0
      }
6211
0
      if (!gf_sys_is_test_mode())
6212
0
        gf_fprintf(trace, "<!-- counted %u bytes for entry -->\n", total_bytes);
6213
0
    } else {
6214
0
      gf_fprintf(trace, ">\n");
6215
0
    }
6216
0
    gf_fprintf(trace, "</SampleEncryptionEntry>\n");
6217
0
  }
6218
0
  if (bs)
6219
0
    gf_bs_del(bs);
6220
6221
0
  if (!ptr->size) {
6222
0
    gf_fprintf(trace, "<SampleEncryptionEntry sampleCount=\"\" IV=\"\" SubsampleCount=\"\">\n");
6223
0
    gf_fprintf(trace, "<SubSampleEncryptionEntry NumClearBytes=\"\" NumEncryptedBytes=\"\"/>\n");
6224
0
    gf_fprintf(trace, "</SampleEncryptionEntry>\n");
6225
0
  }
6226
0
  gf_isom_box_dump_done(name, a, trace);
6227
0
  return GF_OK;
6228
0
}
6229
6230
GF_Err piff_psec_box_dump(GF_Box *a, FILE * trace)
6231
0
{
6232
0
  return senc_box_dump(a, trace);
6233
0
}
6234
6235
GF_Err prft_box_dump(GF_Box *a, FILE * trace)
6236
0
{
6237
0
  Double fracs;
6238
0
  GF_ProducerReferenceTimeBox *ptr = (GF_ProducerReferenceTimeBox *) a;
6239
0
  time_t secs;
6240
0
  struct tm t;
6241
0
  secs = (ptr->ntp >> 32) - GF_NTP_SEC_1900_TO_1970;
6242
0
  if (secs < 0) {
6243
0
    if (ptr->size) {
6244
0
      GF_LOG(GF_LOG_ERROR, GF_LOG_CONTAINER, ("NTP time is not valid, using value 0\n"));
6245
0
    }
6246
0
    secs = 0;
6247
0
  }
6248
0
  t = *gf_gmtime(&secs);
6249
0
  fracs = (Double) (ptr->ntp & 0xFFFFFFFFULL);
6250
0
  fracs /= 0xFFFFFFFF;
6251
0
  fracs *= 1000;
6252
0
  gf_isom_box_dump_start(a, "ProducerReferenceTimeBox", trace);
6253
6254
0
  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);
6255
0
  gf_isom_box_dump_done("ProducerReferenceTimeBox", a, trace);
6256
6257
0
  return GF_OK;
6258
0
}
6259
6260
GF_Err adkm_box_dump(GF_Box *a, FILE * trace)
6261
0
{
6262
0
  if (!a) return GF_BAD_PARAM;
6263
0
  gf_isom_box_dump_start(a, "AdobeDRMKeyManagementSystemBox", trace);
6264
6265
0
  gf_fprintf(trace, ">\n");
6266
0
  gf_isom_box_dump_done("AdobeDRMKeyManagementSystemBox", a, trace);
6267
0
  return GF_OK;
6268
0
}
6269
6270
GF_Err ahdr_box_dump(GF_Box *a, FILE * trace)
6271
0
{
6272
0
  if (!a) return GF_BAD_PARAM;
6273
0
  gf_isom_box_dump_start(a, "AdobeDRMHeaderBox", trace);
6274
0
  gf_fprintf(trace, ">\n");
6275
0
  gf_isom_box_dump_done("AdobeDRMHeaderBox", a, trace);
6276
0
  return GF_OK;
6277
0
}
6278
6279
GF_Err aprm_box_dump(GF_Box *a, FILE * trace)
6280
0
{
6281
0
  if (!a) return GF_BAD_PARAM;
6282
0
  gf_isom_box_dump_start(a, "AdobeStdEncryptionParamsBox", trace);
6283
0
  gf_fprintf(trace, ">\n");
6284
0
  gf_isom_box_dump_done("AdobeStdEncryptionParamsBox", a, trace);
6285
0
  return GF_OK;
6286
0
}
6287
6288
GF_Err aeib_box_dump(GF_Box *a, FILE * trace)
6289
0
{
6290
0
  GF_AdobeEncryptionInfoBox *ptr = (GF_AdobeEncryptionInfoBox *)a;
6291
0
  if (!a) return GF_BAD_PARAM;
6292
0
  gf_isom_box_dump_start(a, "AdobeEncryptionInfoBox", trace);
6293
0
  gf_fprintf(trace, "EncryptionAlgorithm=\"%s\" KeyLength=\"%d\">\n", ptr->enc_algo, ptr->key_length);
6294
0
  gf_isom_box_dump_done("AdobeEncryptionInfoBox", a, trace);
6295
0
  return GF_OK;
6296
0
}
6297
6298
GF_Err akey_box_dump(GF_Box *a, FILE * trace)
6299
0
{
6300
0
  if (!a) return GF_BAD_PARAM;
6301
0
  gf_isom_box_dump_start(a, "AdobeKeyInfoBox", trace);
6302
0
  gf_fprintf(trace, ">\n");
6303
0
  gf_isom_box_dump_done("AdobeKeyInfoBox", a, trace);
6304
0
  return GF_OK;
6305
0
}
6306
6307
GF_Err flxs_box_dump(GF_Box *a, FILE * trace)
6308
0
{
6309
0
  if (!a) return GF_BAD_PARAM;
6310
0
  gf_isom_box_dump_start(a, "AdobeFlashAccessParamsBox", trace);
6311
0
  gf_fprintf(trace, ">\n");
6312
0
  gf_isom_box_dump_done("AdobeFlashAccessParamsBox", a, trace);
6313
0
  return GF_OK;
6314
0
}
6315
6316
GF_Err adaf_box_dump(GF_Box *a, FILE * trace)
6317
0
{
6318
0
  GF_AdobeDRMAUFormatBox *ptr = (GF_AdobeDRMAUFormatBox *)a;
6319
0
  if (!a) return GF_BAD_PARAM;
6320
0
  gf_isom_box_dump_start(a, "AdobeDRMAUFormatBox ", trace);
6321
0
  gf_fprintf(trace, "SelectiveEncryption=\"%d\" IV_length=\"%d\">\n", ptr->selective_enc ? 1 : 0, ptr->IV_length);
6322
0
  gf_isom_box_dump_done("AdobeDRMAUFormatBox", a, trace);
6323
0
  return GF_OK;
6324
0
}
6325
6326
/* Image File Format dump */
6327
GF_Err ispe_box_dump(GF_Box *a, FILE * trace)
6328
0
{
6329
0
  GF_ImageSpatialExtentsPropertyBox *ptr = (GF_ImageSpatialExtentsPropertyBox *)a;
6330
0
  if (!a) return GF_BAD_PARAM;
6331
0
  gf_isom_box_dump_start(a, "ImageSpatialExtentsPropertyBox", trace);
6332
0
  gf_fprintf(trace, "image_width=\"%d\" image_height=\"%d\">\n", ptr->image_width, ptr->image_height);
6333
0
  gf_isom_box_dump_done("ImageSpatialExtentsPropertyBox", a, trace);
6334
0
  return GF_OK;
6335
0
}
6336
6337
GF_Err a1lx_box_dump(GF_Box *a, FILE * trace)
6338
0
{
6339
0
  GF_AV1LayeredImageIndexingPropertyBox *ptr = (GF_AV1LayeredImageIndexingPropertyBox*)a;
6340
0
  if (!a) return GF_BAD_PARAM;
6341
0
  gf_isom_box_dump_start(a, "AV1LayeredImageIndexingPropertyBox", trace);
6342
0
  gf_fprintf(trace, "large_size=\"%d\" layer_size0=\"%d\" layer_size1=\"%d\" layer_size2=\"%d\">\n", ptr->large_size, ptr->layer_size[0], ptr->layer_size[1], ptr->layer_size[2]);
6343
0
  gf_isom_box_dump_done("AV1LayeredImageIndexingPropertyBox", a, trace);
6344
0
  return GF_OK;
6345
0
}
6346
6347
GF_Err a1op_box_dump(GF_Box *a, FILE * trace)
6348
0
{
6349
0
  GF_AV1OperatingPointSelectorPropertyBox *ptr = (GF_AV1OperatingPointSelectorPropertyBox*)a;
6350
0
  if (!a) return GF_BAD_PARAM;
6351
0
  gf_isom_box_dump_start(a, "AV1OperatingPointSelectorPropertyBox", trace);
6352
0
  gf_fprintf(trace, "op_index=\"%d\">\n", ptr->op_index);
6353
0
  gf_isom_box_dump_done("AV1OperatingPointSelectorPropertyBox", a, trace);
6354
0
  return GF_OK;
6355
0
}
6356
6357
GF_Err colr_box_dump(GF_Box *a, FILE * trace)
6358
0
{
6359
0
  u8 *prof_data_64=NULL;
6360
0
  u32 size_64;
6361
0
  GF_ColourInformationBox *ptr = (GF_ColourInformationBox *)a;
6362
0
  if (!a) return GF_BAD_PARAM;
6363
6364
0
  gf_isom_box_dump_start(a, "ColourInformationBox", trace);
6365
6366
0
  if (ptr->is_jp2) {
6367
0
    gf_fprintf(trace, "method=\"%d\" precedence=\"%d\" approx=\"%d\"", ptr->method, ptr->precedence, ptr->approx);
6368
0
    if (ptr->opaque_size) {
6369
0
      gf_fprintf(trace, " colour=\"");
6370
0
      dump_data_hex(trace, ptr->opaque,ptr->opaque_size);
6371
0
      gf_fprintf(trace, "\"");
6372
0
    }
6373
0
    gf_fprintf(trace, ">\n");
6374
0
  } else {
6375
0
    switch (ptr->colour_type) {
6376
0
    case GF_ISOM_SUBTYPE_NCLC:
6377
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);
6378
0
      break;
6379
0
    case GF_ISOM_SUBTYPE_NCLX:
6380
0
      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);
6381
0
      break;
6382
0
    case GF_ISOM_SUBTYPE_PROF:
6383
0
    case GF_ISOM_SUBTYPE_RICC:
6384
0
      gf_fprintf(trace, "colour_type=\"%s\">\n", gf_4cc_to_str(ptr->colour_type));
6385
0
      if (ptr->opaque != NULL) {
6386
0
        gf_fprintf(trace, "<profile><![CDATA[");
6387
0
        size_64 = 2*ptr->opaque_size+3;
6388
0
        prof_data_64 = gf_malloc(sizeof(char) * size_64);
6389
0
        size_64 = gf_base64_encode((const char *) ptr->opaque, ptr->opaque_size, (char *)prof_data_64, size_64);
6390
0
        prof_data_64[size_64] = 0;
6391
0
        gf_fprintf(trace, "%s", prof_data_64);
6392
0
        gf_fprintf(trace, "]]></profile>");
6393
0
      }
6394
0
      break;
6395
0
    default:
6396
0
      gf_fprintf(trace, "colour_type=\"%s\">\n", gf_4cc_to_str(ptr->colour_type));
6397
0
      break;
6398
0
    }
6399
0
  }
6400
6401
0
  gf_isom_box_dump_done("ColourInformationBox", a, trace);
6402
0
  return GF_OK;
6403
0
}
6404
6405
GF_Err pixi_box_dump(GF_Box *a, FILE * trace)
6406
0
{
6407
0
  u32 i;
6408
0
  GF_PixelInformationPropertyBox *ptr = (GF_PixelInformationPropertyBox *)a;
6409
0
  if (!a) return GF_BAD_PARAM;
6410
0
  gf_isom_box_dump_start(a, "PixelInformationPropertyBox", trace);
6411
0
  gf_fprintf(trace, ">\n");
6412
0
  for (i = 0; i < ptr->num_channels; i++) {
6413
0
    gf_fprintf(trace, "<BitPerChannel bits_per_channel=\"%d\"/>\n", ptr->bits_per_channel[i]);
6414
0
  }
6415
0
  if (!ptr->size)
6416
0
    gf_fprintf(trace, "<BitPerChannel bits_per_channel=\"\"/>\n");
6417
6418
0
  gf_isom_box_dump_done("PixelInformationPropertyBox", a, trace);
6419
0
  return GF_OK;
6420
0
}
6421
6422
GF_Err rloc_box_dump(GF_Box *a, FILE * trace)
6423
0
{
6424
0
  GF_RelativeLocationPropertyBox *ptr = (GF_RelativeLocationPropertyBox *)a;
6425
0
  if (!a) return GF_BAD_PARAM;
6426
0
  gf_isom_box_dump_start(a, "RelativeLocationPropertyBox", trace);
6427
0
  gf_fprintf(trace, "horizontal_offset=\"%d\" vertical_offset=\"%d\">\n", ptr->horizontal_offset, ptr->vertical_offset);
6428
0
  gf_isom_box_dump_done("RelativeLocationPropertyBox", a, trace);
6429
0
  return GF_OK;
6430
0
}
6431
6432
GF_Err irot_box_dump(GF_Box *a, FILE * trace)
6433
0
{
6434
0
  GF_ImageRotationBox *ptr = (GF_ImageRotationBox *)a;
6435
0
  if (!a) return GF_BAD_PARAM;
6436
0
  gf_isom_box_dump_start(a, "ImageRotationBox", trace);
6437
0
  gf_fprintf(trace, "angle=\"%d\">\n", (ptr->angle*90));
6438
0
  gf_isom_box_dump_done("ImageRotationBox", a, trace);
6439
0
  return GF_OK;
6440
0
}
6441
6442
GF_Err imir_box_dump(GF_Box *a, FILE * trace)
6443
0
{
6444
0
  if (!a) return GF_BAD_PARAM;
6445
0
  if (a->type==GF_ISOM_BOX_TYPE_IMIR) {
6446
0
    GF_ImageMirrorBox *ptr = (GF_ImageMirrorBox *)a;
6447
0
    gf_isom_box_dump_start(a, "ImageMirrorBox", trace);
6448
0
    gf_fprintf(trace, "axis=\"%s\">\n", (ptr->axis ? "horizontal" : "vertical"));
6449
0
    gf_isom_box_dump_done("ImageMirrorBox", a, trace);
6450
0
  } else if (a->type==GF_ISOM_BOX_TYPE_ILCE) {
6451
0
    GF_FieldInterlaceTypeBox *ptr = (GF_FieldInterlaceTypeBox *)a;
6452
0
    gf_isom_box_dump_start(a, "FieldInterlaceTypeBox", trace);
6453
0
    gf_fprintf(trace, "interlace_type=\"%d\" interleaved=\"%d\" first_field_type=\"%d\" bottom_first=\"%d\">\n",
6454
0
      ptr->interlace_type>>6,
6455
0
      (ptr->interlace_type>>5)&1,
6456
0
      (ptr->interlace_type>>4)&1,
6457
0
      (ptr->interlace_type>>3)&1
6458
0
    );
6459
0
    gf_isom_box_dump_done("FieldInterlaceTypeBox", a, trace);
6460
0
  }
6461
0
  return GF_OK;
6462
0
}
6463
6464
GF_Err txlo_box_dump(GF_Box *a, FILE *trace)
6465
0
{
6466
0
  GF_TextLayoutPropertyBox *ptr = (GF_TextLayoutPropertyBox *)a;
6467
0
  if (!a)
6468
0
    return GF_BAD_PARAM;
6469
0
  gf_isom_box_dump_start(a, "TextLayoutPropertyBox", trace);
6470
0
  gf_fprintf(trace, "reference_width=\"%d\" reference_height=\"%d\" x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" font_size=\"%d\" direction=\"%s\" writing_mode=\"%s\">\n",
6471
0
               ptr->reference_width, ptr->reference_height, ptr->x, ptr->y, ptr->width, ptr->height, ptr->font_size, ptr->direction, ptr->writing_mode);
6472
0
  gf_isom_box_dump_done("TextLayoutPropertyBox", a, trace);
6473
0
  return GF_OK;
6474
0
}
6475
6476
GF_Err fnch_box_dump(GF_Box *a, FILE *trace)
6477
0
{
6478
0
  GF_FontCharacteristicsPropertyBox *ptr = (GF_FontCharacteristicsPropertyBox *)a;
6479
0
  if (!a)
6480
0
    return GF_BAD_PARAM;
6481
0
  gf_isom_box_dump_start(a, "FontCharacteristicsPropertyBox", trace);
6482
0
  gf_fprintf(trace, "font_family=\"%s\" font_style=\"%s\" font_weight=\"%s\">\n",
6483
0
               ptr->font_family, ptr->font_style, ptr->font_weight);
6484
0
  gf_isom_box_dump_done("FontCharacteristicsPropertyBox", a, trace);
6485
0
  return GF_OK;
6486
0
}
6487
6488
GF_Err clli_box_dump(GF_Box *a, FILE * trace)
6489
0
{
6490
0
  GF_ContentLightLevelBox *ptr = (GF_ContentLightLevelBox *)a;
6491
0
  if (!a) return GF_BAD_PARAM;
6492
0
  gf_isom_box_dump_start(a, "ContentLightLevelBox", trace);
6493
0
  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);
6494
0
  gf_isom_box_dump_done("ContentLightLevelBox", a, trace);
6495
0
  return GF_OK;
6496
0
}
6497
6498
GF_Err mdcv_box_dump(GF_Box *a, FILE * trace)
6499
0
{
6500
0
  int c = 0;
6501
0
  GF_MasteringDisplayColourVolumeBox *ptr = (GF_MasteringDisplayColourVolumeBox *)a;
6502
0
  if (!a) return GF_BAD_PARAM;
6503
0
  gf_isom_box_dump_start(a, "MasteringDisplayColourVolumeBox", trace);
6504
0
  for (c = 0; c < 3; c++) {
6505
0
    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);
6506
0
  }
6507
0
  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);
6508
0
  gf_isom_box_dump_done("MasteringDisplayColourVolumeBox", a, trace);
6509
0
  return GF_OK;
6510
0
}
6511
6512
GF_Err ipco_box_dump(GF_Box *a, FILE * trace)
6513
0
{
6514
0
  gf_isom_box_dump_start(a, "ItemPropertyContainerBox", trace);
6515
0
  gf_fprintf(trace, ">\n");
6516
0
  gf_isom_box_dump_done("ItemPropertyContainerBox", a, trace);
6517
0
  return GF_OK;
6518
0
}
6519
6520
GF_Err iprp_box_dump(GF_Box *a, FILE * trace)
6521
0
{
6522
0
  gf_isom_box_dump_start(a, "ItemPropertiesBox", trace);
6523
0
  gf_fprintf(trace, ">\n");
6524
0
  gf_isom_box_dump_done("ItemPropertiesBox", a, trace);
6525
0
  return GF_OK;
6526
0
}
6527
6528
GF_Err ipma_box_dump(GF_Box *a, FILE * trace)
6529
0
{
6530
0
  u32 i, j;
6531
0
  GF_ItemPropertyAssociationBox *ptr = (GF_ItemPropertyAssociationBox *)a;
6532
0
  u32 entry_count;
6533
0
  if (!a) return GF_BAD_PARAM;
6534
0
  entry_count = gf_list_count(ptr->entries);
6535
0
  gf_isom_box_dump_start(a, "ItemPropertyAssociationBox", trace);
6536
0
  gf_fprintf(trace, "entry_count=\"%d\">\n", entry_count);
6537
0
  for (i = 0; i < entry_count; i++) {
6538
0
    GF_ItemPropertyAssociationEntry *entry = (GF_ItemPropertyAssociationEntry *)gf_list_get(ptr->entries, i);
6539
0
    gf_fprintf(trace, "<AssociationEntry item_ID=\"%d\" association_count=\"%d\">\n", entry->item_id, entry->nb_associations);
6540
0
    for (j = 0; j < entry->nb_associations; j++) {
6541
0
      gf_fprintf(trace, "<Property index=\"%d\" essential=\"%d\"/>\n", entry->associations[j].index, entry->associations[j].essential);
6542
0
    }
6543
0
    gf_fprintf(trace, "</AssociationEntry>\n");
6544
0
  }
6545
0
  if (!ptr->size) {
6546
0
    gf_fprintf(trace, "<AssociationEntry item_ID=\"\" association_count=\"\">\n");
6547
0
    gf_fprintf(trace, "<Property index=\"\" essential=\"\"/>\n");
6548
0
    gf_fprintf(trace, "</AssociationEntry>\n");
6549
0
  }
6550
0
  gf_isom_box_dump_done("ItemPropertyAssociationBox", a, trace);
6551
0
  return GF_OK;
6552
0
}
6553
6554
GF_Err auxc_box_dump(GF_Box *a, FILE * trace)
6555
0
{
6556
0
  GF_AuxiliaryTypePropertyBox *ptr = (GF_AuxiliaryTypePropertyBox *)a;
6557
6558
0
  gf_isom_box_dump_start(a, "AuxiliaryTypePropertyBox", trace);
6559
0
  gf_fprintf(trace, "aux_type=\"%s\" ", ptr->aux_urn);
6560
0
  dump_data_attribute(trace, "aux_subtype", ptr->data, ptr->data_size);
6561
0
  gf_fprintf(trace, ">\n");
6562
0
  gf_isom_box_dump_done("AuxiliaryTypePropertyBox", a, trace);
6563
0
  return GF_OK;
6564
0
}
6565
6566
GF_Err auxi_box_dump(GF_Box *a, FILE * trace)
6567
0
{
6568
0
  GF_AuxiliaryTypeInfoBox *ptr = (GF_AuxiliaryTypeInfoBox *)a;
6569
6570
0
  gf_isom_box_dump_start(a, "AuxiliaryTypeInfoBox", trace);
6571
0
  gf_fprintf(trace, "aux_track_type=\"%s\" ", ptr->aux_track_type);
6572
0
  gf_fprintf(trace, ">\n");
6573
0
  gf_isom_box_dump_done("AuxiliaryTypeInfoBox", a, trace);
6574
0
  return GF_OK;
6575
0
}
6576
6577
GF_Err oinf_box_dump(GF_Box *a, FILE * trace)
6578
0
{
6579
0
  GF_OINFPropertyBox *ptr = (GF_OINFPropertyBox *)a;
6580
0
  gf_isom_box_dump_start(a, "OperatingPointsInformationPropertyBox", trace);
6581
0
  gf_fprintf(trace, ">\n");
6582
6583
0
  oinf_entry_dump(ptr->oinf, trace);
6584
6585
0
  gf_isom_box_dump_done("OperatingPointsInformationPropertyBox", a, trace);
6586
0
  return GF_OK;
6587
0
}
6588
GF_Err tols_box_dump(GF_Box *a, FILE * trace)
6589
0
{
6590
0
  GF_TargetOLSPropertyBox *ptr = (GF_TargetOLSPropertyBox *)a;
6591
0
  gf_isom_box_dump_start(a, "TargetOLSPropertyBox", trace);
6592
0
  gf_fprintf(trace, "target_ols_index=\"%d\">\n", ptr->target_ols_index);
6593
6594
0
  gf_isom_box_dump_done("TargetOLSPropertyBox", a, trace);
6595
0
  return GF_OK;
6596
0
}
6597
6598
GF_Err trgr_box_dump(GF_Box *a, FILE * trace)
6599
0
{
6600
0
  gf_isom_box_dump_start(a, "TrackGroupBox", trace);
6601
0
  gf_fprintf(trace, ">\n");
6602
0
  gf_isom_box_dump_done("TrackGroupBox", a, trace);
6603
0
  return GF_OK;
6604
0
}
6605
6606
GF_Err trgt_box_dump(GF_Box *a, FILE * trace)
6607
0
{
6608
0
  GF_TrackGroupTypeBox *ptr = (GF_TrackGroupTypeBox *) a;
6609
0
  a->type = ptr->group_type;
6610
  //don't allow UNKN or UUID as type (possible buffer overflow when typecasting to GF_UnknownBox)
6611
0
  if ((a->type==GF_ISOM_BOX_TYPE_UNKNOWN) || (a->type==GF_ISOM_BOX_TYPE_UUID))
6612
0
    a->type = GF_4CC('u','k','n','w');
6613
0
  gf_isom_box_dump_start(a, "TrackGroupTypeBox", trace);
6614
0
  a->type = GF_ISOM_BOX_TYPE_TRGT;
6615
0
  gf_fprintf(trace, "track_group_id=\"%d\">\n", ptr->track_group_id);
6616
0
  gf_isom_box_dump_done("TrackGroupTypeBox", a, trace);
6617
0
  return GF_OK;
6618
0
}
6619
6620
GF_Err grpl_box_dump(GF_Box *a, FILE * trace)
6621
0
{
6622
0
  gf_isom_box_dump_start(a, "GroupListBox", trace);
6623
0
  gf_fprintf(trace, ">\n");
6624
0
  gf_isom_box_dump_done("GroupListBox", a, trace);
6625
0
  return GF_OK;
6626
0
}
6627
6628
GF_Err grptype_box_dump(GF_Box *a, FILE * trace)
6629
0
{
6630
0
  u32 i;
6631
0
  GF_EntityToGroupTypeBox *ptr = (GF_EntityToGroupTypeBox *) a;
6632
0
  a->type = ptr->grouping_type;
6633
  //don't allow UNKN or UUID as type (possible buffer overflow when typecasting to GF_UnknownBox)
6634
0
  if ((a->type==GF_ISOM_BOX_TYPE_UNKNOWN) || (a->type==GF_ISOM_BOX_TYPE_UUID))
6635
0
    a->type = GF_4CC('u','k','n','w');
6636
0
  gf_isom_box_dump_start(a, "EntityToGroupTypeBox", trace);
6637
0
  a->type = GF_ISOM_BOX_TYPE_GRPT;
6638
0
  gf_fprintf(trace, "group_id=\"%d\"", ptr->group_id);
6639
0
  if (ptr->data) dump_data_attribute(trace, "data", ptr->data, ptr->data_len);
6640
0
  else if (!ptr->size) gf_fprintf(trace, " data=\"\"");
6641
0
  gf_fprintf(trace, ">\n");
6642
6643
0
  for (i=0; i<ptr->entity_id_count ; i++)
6644
0
    gf_fprintf(trace, "<EntityToGroupTypeBoxEntry EntityID=\"%d\"/>\n", ptr->entity_ids[i]);
6645
6646
0
  if (!ptr->size)
6647
0
    gf_fprintf(trace, "<EntityToGroupTypeBoxEntry EntityID=\"\"/>\n");
6648
6649
0
  gf_isom_box_dump_done("EntityToGroupTypeBox", a, trace);
6650
0
  return GF_OK;
6651
0
}
6652
6653
GF_Err stvi_box_dump(GF_Box *a, FILE * trace)
6654
0
{
6655
0
  GF_StereoVideoBox *ptr = (GF_StereoVideoBox *) a;
6656
0
  gf_isom_box_dump_start(a, "StereoVideoBox", trace);
6657
6658
0
  gf_fprintf(trace, "single_view_allowed=\"%d\" stereo_scheme=\"%d\" ", ptr->single_view_allowed, ptr->stereo_scheme);
6659
0
  dump_data_attribute(trace, "stereo_indication_type", ptr->stereo_indication_type, ptr->sit_len);
6660
0
  gf_fprintf(trace, ">\n");
6661
0
  gf_isom_box_dump_done("StereoVideoBox", a, trace);
6662
0
  return GF_OK;
6663
0
}
6664
6665
GF_Err def_parent_box_dump(GF_Box *a, FILE *trace)
6666
0
{
6667
0
  char *name = "GenericContainerBox";
6668
6669
0
  switch (a->type) {
6670
0
  case GF_QT_BOX_TYPE_WAVE:
6671
0
    name = "DecompressionParamBox";
6672
0
    break;
6673
0
  case GF_QT_BOX_TYPE_TMCD:
6674
0
    name = "TimeCodeBox";
6675
0
    break;
6676
0
  case GF_ISOM_BOX_TYPE_GMHD:
6677
0
    name = "GenericMediaHeaderBox";
6678
0
    break;
6679
0
  case GF_QT_BOX_TYPE_TAPT:
6680
0
    name = "TrackApertureBox";
6681
0
    break;
6682
0
  case GF_ISOM_BOX_TYPE_STRD:
6683
0
    name = "SubTrackDefinitionBox";
6684
0
    break;
6685
0
  case GF_ISOM_BOX_TYPE_SV3D:
6686
0
    name = "SphericalVideoBox";
6687
0
    break;
6688
0
  case GF_ISOM_BOX_TYPE_PROJ:
6689
0
    name = "ProjectionBox";
6690
0
    break;
6691
0
  case GF_ISOM_BOX_TYPE_OTYP:
6692
0
    name = "OriginalFileTypeBox";
6693
0
    break;
6694
0
  }
6695
6696
0
  gf_isom_box_dump_start(a, name, trace);
6697
0
  gf_fprintf(trace, ">\n");
6698
0
  gf_isom_box_dump_done(name, a, trace);
6699
0
  return GF_OK;
6700
0
}
6701
6702
GF_Err def_parent_full_box_dump(GF_Box *a, FILE *trace)
6703
0
{
6704
0
  char *name = "GenericFullBox";
6705
6706
0
  switch (a->type) {
6707
0
  case GF_ISOM_BOX_TYPE_MVCI:
6708
0
    name = "MultiviewInformationBox";
6709
0
    break;
6710
0
  }
6711
6712
0
  gf_isom_box_dump_start(a, name, trace);
6713
0
  gf_fprintf(trace, ">\n");
6714
0
  gf_isom_box_dump_done(name, a, trace);
6715
0
  return GF_OK;
6716
0
}
6717
GF_Err fiin_box_dump(GF_Box *a, FILE * trace)
6718
0
{
6719
0
  gf_isom_box_dump_start(a, "FDItemInformationBox", trace);
6720
0
  gf_fprintf(trace, ">\n");
6721
0
  gf_isom_box_dump_done("FDItemInformationBox", a, trace);
6722
0
  return GF_OK;
6723
0
}
6724
6725
GF_Err fecr_box_dump(GF_Box *a, FILE * trace)
6726
0
{
6727
0
  u32 i;
6728
0
  char *box_name;
6729
0
  FECReservoirBox *ptr = (FECReservoirBox *) a;
6730
0
  if (a->type==GF_ISOM_BOX_TYPE_FIRE) {
6731
0
    box_name = "FILEReservoirBox";
6732
0
  } else {
6733
0
    box_name = "FECReservoirBox";
6734
0
  }
6735
0
  gf_isom_box_dump_start(a, box_name, trace);
6736
6737
0
  gf_fprintf(trace, ">\n");
6738
6739
0
  for (i=0; i<ptr->nb_entries; i++) {
6740
0
    gf_fprintf(trace, "<%sEntry itemID=\"%d\" symbol_count=\"%d\"/>\n", box_name, ptr->entries[i].item_id, ptr->entries[i].symbol_count);
6741
0
  }
6742
0
  if (!ptr->size) {
6743
0
    gf_fprintf(trace, "<%sEntry itemID=\"\" symbol_count=\"\"/>\n", box_name);
6744
0
  }
6745
0
  gf_isom_box_dump_done(box_name, a, trace);
6746
0
  return GF_OK;
6747
0
}
6748
6749
GF_Err gitn_box_dump(GF_Box *a, FILE * trace)
6750
0
{
6751
0
  u32 i;
6752
0
  GroupIdToNameBox *ptr = (GroupIdToNameBox *) a;
6753
0
  gf_isom_box_dump_start(a, "GroupIdToNameBox", trace);
6754
6755
0
  gf_fprintf(trace, ">\n");
6756
6757
0
  for (i=0; i<ptr->nb_entries; i++) {
6758
0
    gf_fprintf(trace, "<GroupIdToNameBoxEntry groupID=\"%d\" name=\"%s\"/>\n", ptr->entries[i].group_id, ptr->entries[i].name);
6759
0
  }
6760
0
  if (!ptr->size) {
6761
0
    gf_fprintf(trace, "<GroupIdToNameBoxEntryEntry groupID=\"\" name=\"\"/>\n");
6762
0
  }
6763
6764
0
  gf_isom_box_dump_done("GroupIdToNameBox", a, trace);
6765
0
  return GF_OK;
6766
0
}
6767
6768
GF_Err paen_box_dump(GF_Box *a, FILE * trace)
6769
0
{
6770
0
  gf_isom_box_dump_start(a, "FDPartitionEntryBox", trace);
6771
0
  gf_fprintf(trace, ">\n");
6772
0
  gf_isom_box_dump_done("FDPartitionEntryBox", a, trace);
6773
0
  return GF_OK;
6774
0
}
6775
6776
GF_Err fpar_box_dump(GF_Box *a, FILE * trace)
6777
0
{
6778
0
  u32 i;
6779
0
  FilePartitionBox *ptr = (FilePartitionBox *) a;
6780
0
  gf_isom_box_dump_start(a, "FilePartitionBox", trace);
6781
6782
0
  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);
6783
6784
0
  if (ptr->scheme_specific_info)
6785
0
    dump_data_attribute(trace, "scheme_specific_info", (char*)ptr->scheme_specific_info, (u32)strlen(ptr->scheme_specific_info) );
6786
6787
0
  gf_fprintf(trace, ">\n");
6788
6789
0
  for (i=0; i<ptr->nb_entries; i++) {
6790
0
    gf_fprintf(trace, "<FilePartitionBoxEntry block_count=\"%d\" block_size=\"%d\"/>\n", ptr->entries[i].block_count, ptr->entries[i].block_size);
6791
0
  }
6792
0
  if (!ptr->size) {
6793
0
    gf_fprintf(trace, "<FilePartitionBoxEntry block_count=\"\" block_size=\"\"/>\n");
6794
0
  }
6795
6796
0
  gf_isom_box_dump_done("FilePartitionBox", a, trace);
6797
0
  return GF_OK;
6798
0
}
6799
6800
GF_Err segr_box_dump(GF_Box *a, FILE * trace)
6801
0
{
6802
0
  u32 i, k;
6803
0
  FDSessionGroupBox *ptr = (FDSessionGroupBox *) a;
6804
0
  gf_isom_box_dump_start(a, "FDSessionGroupBox", trace);
6805
0
  gf_fprintf(trace, ">\n");
6806
6807
0
  for (i=0; i<ptr->num_session_groups; i++) {
6808
0
    gf_fprintf(trace, "<FDSessionGroupBoxEntry groupIDs=\"");
6809
0
    for (k=0; k<ptr->session_groups[i].nb_groups; k++) {
6810
0
      gf_fprintf(trace, "%d ", ptr->session_groups[i].group_ids[k]);
6811
0
    }
6812
0
    gf_fprintf(trace, "\" channels=\"");
6813
0
    for (k=0; k<ptr->session_groups[i].nb_channels; k++) {
6814
0
      gf_fprintf(trace, "%d ", ptr->session_groups[i].channels[k]);
6815
0
    }
6816
0
    gf_fprintf(trace, "\"/>\n");
6817
0
  }
6818
0
  if (!ptr->size) {
6819
0
    gf_fprintf(trace, "<FDSessionGroupBoxEntry groupIDs=\"\" channels=\"\"/>\n");
6820
0
  }
6821
6822
0
  gf_isom_box_dump_done("FDSessionGroupBox", a, trace);
6823
0
  return GF_OK;
6824
0
}
6825
6826
GF_Err srpp_box_dump(GF_Box *a, FILE * trace)
6827
0
{
6828
0
  GF_SRTPProcessBox *ptr = (GF_SRTPProcessBox *) a;
6829
0
  gf_isom_box_dump_start(a, "SRTPProcessBox", trace);
6830
6831
0
  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);
6832
0
  gf_isom_box_dump_done("SRTPProcessBox", a, trace);
6833
0
  return GF_OK;
6834
0
}
6835
6836
#ifndef GPAC_DISABLE_ISOM_HINTING
6837
6838
GF_Err fdpa_box_dump(GF_Box *a, FILE * trace)
6839
0
{
6840
0
  u32 i;
6841
0
  GF_FDpacketBox *ptr = (GF_FDpacketBox *) a;
6842
0
  if (!a) return GF_BAD_PARAM;
6843
6844
0
  gf_isom_box_dump_start(a, "FDpacketBox", trace);
6845
0
  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);
6846
6847
0
  for (i=0; i<ptr->header_ext_count; i++) {
6848
0
    gf_fprintf(trace, "<FDHeaderExt type=\"%d\"", ptr->headers[i].header_extension_type);
6849
0
    if (ptr->headers[i].header_extension_type > 127) {
6850
0
      dump_data_attribute(trace, "content", (char *) ptr->headers[i].content, 3);
6851
0
    } else if (ptr->headers[i].data_length) {
6852
0
      dump_data_attribute(trace, "data", ptr->headers[i].data, ptr->headers[i].data_length);
6853
0
    }
6854
0
    gf_fprintf(trace, "/>\n");
6855
0
  }
6856
0
  if (!ptr->size) {
6857
0
    gf_fprintf(trace, "<FDHeaderExt type=\"\" content=\"\" data=\"\"/>\n");
6858
0
  }
6859
0
  gf_isom_box_dump_done("FDpacketBox", a, trace);
6860
0
  return GF_OK;
6861
0
}
6862
6863
GF_Err extr_box_dump(GF_Box *a, FILE * trace)
6864
0
{
6865
0
  GF_ExtraDataBox *ptr = (GF_ExtraDataBox *) a;
6866
0
  if (!a) return GF_BAD_PARAM;
6867
0
  gf_isom_box_dump_start(a, "ExtraDataBox", trace);
6868
0
  dump_data_attribute(trace, "data", ptr->data, ptr->data_length);
6869
0
  gf_fprintf(trace, ">\n");
6870
0
  if (ptr->feci)
6871
0
    gf_isom_box_dump(ptr->feci, trace);
6872
0
  gf_isom_box_dump_done("ExtraDataBox", a, trace);
6873
0
  return GF_OK;
6874
0
}
6875
6876
GF_Err fdsa_box_dump(GF_Box *a, FILE * trace)
6877
0
{
6878
0
  GF_Err e;
6879
0
  GF_HintSample *ptr = (GF_HintSample *) a;
6880
0
  if (!a) return GF_BAD_PARAM;
6881
6882
0
  gf_isom_box_dump_start(a, "FDSampleBox", trace);
6883
0
  gf_fprintf(trace, ">\n");
6884
6885
0
  e = gf_isom_box_array_dump(ptr->packetTable, trace, a->internal_flags);
6886
0
  if (e) return e;
6887
0
  gf_isom_box_dump_done("FDSampleBox", a, trace);
6888
0
  return GF_OK;
6889
0
}
6890
6891
#endif /*GPAC_DISABLE_ISOM_HINTING*/
6892
6893
GF_Err trik_box_dump(GF_Box *a, FILE * trace)
6894
0
{
6895
0
  u32 i;
6896
0
  GF_TrickPlayBox *p = (GF_TrickPlayBox *) a;
6897
6898
0
  gf_isom_box_dump_start(a, "TrickPlayBox", trace);
6899
6900
0
  gf_fprintf(trace, ">\n");
6901
0
  for (i=0; i<p->entry_count; i++) {
6902
0
    gf_fprintf(trace, "<TrickPlayBoxEntry pic_type=\"%d\" dependency_level=\"%d\"/>\n", p->entries[i].pic_type, p->entries[i].dependency_level);
6903
0
  }
6904
0
  if (!p->size)
6905
0
    gf_fprintf(trace, "<TrickPlayBoxEntry pic_type=\"\" dependency_level=\"\"/>\n");
6906
6907
0
  gf_isom_box_dump_done("TrickPlayBox", a, trace);
6908
0
  return GF_OK;
6909
0
}
6910
6911
GF_Err bloc_box_dump(GF_Box *a, FILE * trace)
6912
0
{
6913
0
  GF_BaseLocationBox *p = (GF_BaseLocationBox *) a;
6914
6915
0
  gf_isom_box_dump_start(a, "BaseLocationBox", trace);
6916
6917
0
  gf_fprintf(trace, "baseLocation=\"%s\" basePurlLocation=\"%s\">\n", p->baseLocation, p->basePurlLocation);
6918
0
  gf_isom_box_dump_done("BaseLocationBox", a, trace);
6919
0
  return GF_OK;
6920
0
}
6921
6922
GF_Err ainf_box_dump(GF_Box *a, FILE * trace)
6923
0
{
6924
0
  GF_AssetInformationBox *p = (GF_AssetInformationBox *) a;
6925
6926
0
  gf_isom_box_dump_start(a, "AssetInformationBox", trace);
6927
6928
0
  gf_fprintf(trace, "profile_version=\"%d\" APID=\"%s\">\n", p->profile_version, p->APID);
6929
0
  gf_isom_box_dump_done("AssetInformationBox", a, trace);
6930
0
  return GF_OK;
6931
0
}
6932
6933
6934
GF_Err mhac_box_dump(GF_Box *a, FILE * trace)
6935
0
{
6936
0
  GF_MHAConfigBox *p = (GF_MHAConfigBox *) a;
6937
6938
0
  gf_isom_box_dump_start(a, "MHAConfigurationBox", trace);
6939
6940
0
  gf_fprintf(trace, "configurationVersion=\"%d\" mpegh3daProfileLevelIndication=\"0x%02X\" referenceChannelLayout=\"%d\" data=\"", p->configuration_version, p->mha_pl_indication, p->reference_channel_layout);
6941
0
  dump_data(trace, p->mha_config, p->mha_config_size);
6942
0
  gf_fprintf(trace, "\">\n");
6943
6944
0
  gf_isom_box_dump_done("MHAConfigurationBox", a, trace);
6945
0
  return GF_OK;
6946
0
}
6947
6948
GF_Err mhap_box_dump(GF_Box *a, FILE * trace)
6949
0
{
6950
0
  u32 i;
6951
0
  GF_MHACompatibleProfilesBox *p = (GF_MHACompatibleProfilesBox *) a;
6952
6953
0
  gf_isom_box_dump_start(a, "MHACompatibleProfilesBox", trace);
6954
0
  gf_fprintf(trace, "compatible_profiles=\"");
6955
0
  for (i=0; i<p->num_profiles; i++) {
6956
0
    if (i)
6957
0
      gf_fprintf(trace, " ", p->compat_profiles[i]);
6958
0
    gf_fprintf(trace, "%d", p->compat_profiles[i]);
6959
0
  }
6960
0
  gf_fprintf(trace, "\">\n");
6961
0
  gf_isom_box_dump_done("MHACompatibleProfilesBox", a, trace);
6962
0
  return GF_OK;
6963
0
}
6964
GF_Err tmcd_box_dump(GF_Box *a, FILE * trace)
6965
0
{
6966
0
  GF_TimeCodeSampleEntryBox *p = (GF_TimeCodeSampleEntryBox *) a;
6967
6968
0
  gf_isom_box_dump_start(a, "TimeCodeSampleEntryBox", trace);
6969
6970
0
  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);
6971
6972
0
  gf_isom_box_dump_done("TimeCodeSampleEntryBox", a, trace);
6973
0
  return GF_OK;
6974
0
}
6975
6976
GF_Err tcmi_box_dump(GF_Box *a, FILE * trace)
6977
0
{
6978
0
  GF_TimeCodeMediaInformationBox *p = (GF_TimeCodeMediaInformationBox *) a;
6979
6980
0
  gf_isom_box_dump_start(a, "TimeCodeMediaInformationBox", trace);
6981
0
  gf_fprintf(trace, "textFont=\"%d\" textFace=\"%d\" textSize=\"%d\" textColorRed=\"%d\" textColorGreen=\"%d\" textColorBlue=\"%d\" backColorRed=\"%d\" backColorGreen=\"%d\" backColorBlue=\"%d\"",
6982
0
      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);
6983
0
  if (p->font)
6984
0
    gf_fprintf(trace, " font=\"%s\"", p->font);
6985
6986
0
  gf_fprintf(trace, ">\n");
6987
6988
0
  gf_isom_box_dump_done("TimeCodeMediaInformationBox", a, trace);
6989
0
  return GF_OK;
6990
0
}
6991
6992
GF_Err fiel_box_dump(GF_Box *a, FILE * trace)
6993
0
{
6994
0
  GF_FieldInfoBox *p = (GF_FieldInfoBox *) a;
6995
6996
0
  gf_isom_box_dump_start(a, "FieldInfoBox", trace);
6997
0
  gf_fprintf(trace, "count=\"%d\" order=\"%d\">\n", p->field_count, p->field_order);
6998
0
  gf_isom_box_dump_done("FieldInfoBox", a, trace);
6999
0
  return GF_OK;
7000
0
}
7001
7002
GF_Err gama_box_dump(GF_Box *a, FILE * trace)
7003
0
{
7004
0
  GF_GamaInfoBox *p = (GF_GamaInfoBox *) a;
7005
7006
0
  gf_isom_box_dump_start(a, "GamaInfoBox", trace);
7007
0
  gf_fprintf(trace, "gama=\"%d\">\n", p->gama);
7008
0
  gf_isom_box_dump_done("GamaInfoBox", a, trace);
7009
0
  return GF_OK;
7010
0
}
7011
7012
GF_Err chrm_box_dump(GF_Box *a, FILE * trace)
7013
0
{
7014
0
  GF_ChromaInfoBox *p = (GF_ChromaInfoBox *) a;
7015
0
  if (a->type==GF_QT_BOX_TYPE_ENDA) {
7016
0
    gf_isom_box_dump_start(a, "AudioEndianBox", trace);
7017
0
    gf_fprintf(trace, "littleEndian=\"%d\">\n", p->chroma);
7018
0
    gf_isom_box_dump_done("AudioEndianBox", a, trace);
7019
0
  } else {
7020
0
    gf_isom_box_dump_start(a, "ChromaInfoBox", trace);
7021
0
    gf_fprintf(trace, "chroma=\"%d\">\n", p->chroma);
7022
0
    gf_isom_box_dump_done("ChromaInfoBox", a, trace);
7023
0
  }
7024
0
  return GF_OK;
7025
0
}
7026
7027
GF_Err chan_box_dump(GF_Box *a, FILE * trace)
7028
0
{
7029
0
  u32 i;
7030
0
  GF_ChannelLayoutInfoBox *p = (GF_ChannelLayoutInfoBox *) a;
7031
7032
0
  gf_isom_box_dump_start(a, "ChannelLayoutInfoBox", trace);
7033
0
  gf_fprintf(trace, "layout=\"%d\" bitmap=\"%d\">\n", p->layout_tag, p->bitmap);
7034
0
  for (i=0; i<p->num_audio_description; i++) {
7035
0
    GF_AudioChannelDescription *adesc = &p->audio_descs[i];
7036
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]);
7037
0
  }
7038
0
  gf_isom_box_dump_done("ChannelLayoutInfoBox", a, trace);
7039
0
  return GF_OK;
7040
0
}
7041
7042
GF_Err jp_box_dump(GF_Box *a, FILE * trace)
7043
0
{
7044
0
  GF_JP2SignatureBox *p = (GF_JP2SignatureBox *) a;
7045
0
  gf_isom_box_dump_start(a, "JP2SignatureBox", trace);
7046
0
  gf_fprintf(trace, "signature=\"0x%.8X\">\n", p->signature);
7047
0
  gf_isom_box_dump_done("JP2SignatureBox", a, trace);
7048
0
  return GF_OK;
7049
0
}
7050
7051
GF_Err jp2h_box_dump(GF_Box *a, FILE * trace)
7052
0
{
7053
0
  gf_isom_box_dump_start(a, "JP2HeaderBox", trace);
7054
0
  gf_fprintf(trace, ">\n");
7055
0
  gf_isom_box_dump_done("JP2HeaderBox", a, trace);
7056
0
  return GF_OK;
7057
0
}
7058
7059
GF_Err jp2p_box_dump(GF_Box *a, FILE * trace)
7060
0
{
7061
0
  GF_JP2ProfileBox *p = (GF_JP2ProfileBox *) a;
7062
0
  u32 i, count = gf_list_count(p->compatible_brands);
7063
7064
0
  gf_isom_box_dump_start(a, "JP2ProfileBox", trace);
7065
0
  gf_fprintf(trace, ">\n");
7066
0
  for (i=0; i<count; i++) {
7067
0
    u32 *brand = (u32 *)gf_list_get(p->compatible_brands, i);
7068
0
    gf_fprintf(trace, "<CompatibleBrand brand=\"%s\"/>\n", gf_4cc_to_str(*brand));
7069
0
  }
7070
0
  gf_isom_box_dump_done("JP2ProfileBox", a, trace);
7071
0
  return GF_OK;
7072
0
}
7073
7074
GF_Err jsub_box_dump(GF_Box *a, FILE * trace)
7075
0
{
7076
0
  GF_JP2SubSamplingBox *p = (GF_JP2SubSamplingBox *) a;
7077
7078
0
  gf_isom_box_dump_start(a, "JP2SubSamplingBox", trace);
7079
0
  gf_fprintf(trace, "HorizontalSub=\"%d\" VerticalSub=\"%d\" ", p->horizontal_sub, p->vertical_sub);
7080
0
  gf_fprintf(trace, "HorizontalOffset=\"%d\" VerticalOffset=\"%d\">\n", p->horizontal_offset, p->vertical_offset);
7081
0
  gf_isom_box_dump_done("JP2SubSamplingBox", a, trace);
7082
0
  return GF_OK;
7083
0
}
7084
7085
GF_Err orfo_box_dump(GF_Box *a, FILE * trace)
7086
0
{
7087
0
  GF_JP2OriginalFormatBox *p = (GF_JP2OriginalFormatBox *) a;
7088
7089
0
  gf_isom_box_dump_start(a, "JP2OriginalFormatBox", trace);
7090
0
  gf_fprintf(trace, "FieldCount=\"%d\" FieldOrder=\"%d\">\n", p->original_fieldcount, p->original_fieldorder);
7091
0
  gf_isom_box_dump_done("JP2OriginalFormatBox", a, trace);
7092
0
  return GF_OK;
7093
0
}
7094
7095
GF_Err ihdr_box_dump(GF_Box *a, FILE * trace)
7096
0
{
7097
0
  GF_J2KImageHeaderBox  *p = (GF_J2KImageHeaderBox *) a;
7098
0
  gf_isom_box_dump_start(a, "ImageHeaderBox", trace);
7099
0
  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);
7100
0
  gf_isom_box_dump_done("ImageHeaderBox", a, trace);
7101
0
  return GF_OK;
7102
0
}
7103
7104
GF_Err dfla_box_dump(GF_Box *a, FILE * trace)
7105
0
{
7106
0
  GF_FLACConfigBox *ptr = (GF_FLACConfigBox *)a;
7107
0
  gf_isom_box_dump_start(a, "FLACSpecificBox", trace);
7108
0
  gf_fprintf(trace, " dataSize=\"%d\">\n", ptr->dataSize);
7109
0
  gf_isom_box_dump_done("FLACSpecificBox", a, trace);
7110
0
  return GF_OK;
7111
0
}
7112
7113
GF_Err ddts_box_dump(GF_Box *a, FILE * trace)
7114
0
{
7115
0
  GF_DTSSpecificBox *ptr = (GF_DTSSpecificBox *)a;
7116
7117
0
  gf_isom_box_dump_start(a, "DTSSpecificBox", trace);
7118
0
  gf_fprintf(trace, "SamplingFrequency=\"%d\" MaxBitrate=\"%d\" AvgBitrate=\"%d\" "
7119
0
    "SampleDepth=\"%d\" FrameDuration=\"%d\" StreamConstruction=\"%d\" "
7120
0
    "CoreLFEPresent=\"%d\" CoreLayout=\"%d\" CoreSize=\"%d\" StereoDownmix=\"%d\" "
7121
0
    "RepresentationType=\"%d\" ChannelLayout=\"%d\" MultiAssetFlag=\"%d\" "
7122
0
    "LBRDurationMod=\"%d\">\n",
7123
0
    ptr->cfg.SamplingFrequency, ptr->cfg.MaxBitrate, ptr->cfg.AvgBitrate,
7124
0
    ptr->cfg.SampleDepth, ptr->cfg.FrameDuration, ptr->cfg.StreamConstruction,
7125
0
    ptr->cfg.CoreLFEPresent, ptr->cfg.CoreLayout, ptr->cfg.CoreSize,
7126
0
    ptr->cfg.StereoDownmix, ptr->cfg.RepresentationType, ptr->cfg.ChannelLayout,
7127
0
    ptr->cfg.MultiAssetFlag, ptr->cfg.LBRDurationMod);
7128
0
  gf_isom_box_dump_done("DTSSpecificBox", a, trace);
7129
0
  return GF_OK;
7130
0
}
7131
7132
GF_Err udts_box_dump(GF_Box *a, FILE * trace)
7133
0
{
7134
0
  GF_UDTSSpecificBox *ptr = (GF_UDTSSpecificBox *)a;
7135
0
  u32 byte;
7136
0
  u8 i;
7137
0
  u8 *data;
7138
0
  gf_isom_box_dump_start(a, "UDTSSpecificBox", trace);
7139
0
  gf_fprintf(trace,
7140
0
    "DecoderProfileCode=\"%d\" FrameDurationCode=\"%d\" MaxPayloadCode=\"%d\" "
7141
0
    "NumPresentationsCode=\"%d\" ChannelMask=\"%d\" BaseSamplingFrequencyCode=\"%d\" "
7142
0
    "SampleRateMod=\"%d\" RepresentationType=\"%d\" StreamIndex=\"%d\" "
7143
0
    "ExpansionBoxPresent=\"%d\">\n",
7144
0
    ptr->cfg.DecoderProfileCode, ptr->cfg.FrameDurationCode, ptr->cfg.MaxPayloadCode,
7145
0
    ptr->cfg.NumPresentationsCode, ptr->cfg.ChannelMask,
7146
0
    ptr->cfg.BaseSamplingFrequencyCode, ptr->cfg.SampleRateMod,
7147
0
    ptr->cfg.RepresentationType, ptr->cfg.StreamIndex, ptr->cfg.ExpansionBoxPresent);
7148
0
  if ((ptr->cfg.NumPresentationsCode + 1) * 16 < ptr->cfg.PresentationIDTagDataSize) {
7149
0
    data = ptr->cfg.PresentationIDTagData;
7150
0
    for (i=0; i<=ptr->cfg.NumPresentationsCode; i++) {
7151
0
      if (ptr->cfg.IDTagPresent[i]) {
7152
0
        gf_fprintf(trace, " PresentationIDTag%d=\"", i + 1);
7153
0
        for (byte=0; byte<16; byte++)
7154
0
          gf_fprintf(trace, "%02X", *data++);
7155
0
        gf_fprintf(trace, "\"");
7156
0
      }
7157
0
    }
7158
0
  }
7159
0
  gf_isom_box_dump_done("UDTSSpecificBox", a, trace);
7160
0
  return GF_OK;
7161
0
}
7162
7163
GF_Err mvcg_box_dump(GF_Box *a, FILE * trace)
7164
0
{
7165
0
  u32 i;
7166
0
  GF_MultiviewGroupBox *ptr = (GF_MultiviewGroupBox *)a;
7167
0
  gf_isom_box_dump_start(a, "MultiviewGroupBox", trace);
7168
0
  gf_fprintf(trace, " multiview_group_id=\"%d\">\n", ptr->multiview_group_id);
7169
0
  for (i=0; i<ptr->num_entries; i++) {
7170
0
    gf_fprintf(trace, "<MVCIEntry type=\"%d\"", ptr->entries[i].entry_type);
7171
0
    switch (ptr->entries[i].entry_type) {
7172
0
    case 0:
7173
0
      gf_fprintf(trace, " trackID=\"%d\"", ptr->entries[i].trackID);
7174
0
      break;
7175
0
    case 1:
7176
0
      gf_fprintf(trace, " trackID=\"%d\" tierID=\"%d\"", ptr->entries[i].trackID, ptr->entries[i].tierID);
7177
0
      break;
7178
0
    case 2:
7179
0
      gf_fprintf(trace, " output_view_id=\"%d\"", ptr->entries[i].output_view_id);
7180
0
      break;
7181
0
    case 3:
7182
0
      gf_fprintf(trace, " start_view_id=\"%d\" view_count=\"%d\"", ptr->entries[i].start_view_id, ptr->entries[i].view_count);
7183
0
      break;
7184
0
    }
7185
0
    gf_fprintf(trace, "/>\n");
7186
0
  }
7187
0
  gf_isom_box_dump_done("MultiviewGroupBox", a, trace);
7188
0
  return GF_OK;
7189
0
}
7190
7191
GF_Err vwid_box_dump(GF_Box *a, FILE * trace)
7192
0
{
7193
0
  u32 i, j;
7194
0
  GF_ViewIdentifierBox *ptr = (GF_ViewIdentifierBox *) a;
7195
0
  gf_isom_box_dump_start(a, "ViewIdentifierBox", trace);
7196
0
  gf_fprintf(trace, " min_temporal_id=\"%d\" max_temporal_id=\"%d\">\n", ptr->min_temporal_id, ptr->max_temporal_id);
7197
0
  for (i=0; i<ptr->num_views; i++) {
7198
0
    gf_fprintf(trace, "<ViewInfo viewid=\"%d\" viewOrderindex=\"%d\" texInStream=\"%d\" texInTrack=\"%d\" depthInStream=\"%d\" depthInTrack=\"%d\" baseViewId=\"%d\">\n",
7199
0
      ptr->views[i].view_id,
7200
0
      ptr->views[i].view_order_index,
7201
0
      ptr->views[i].texture_in_stream,
7202
0
      ptr->views[i].texture_in_track,
7203
0
      ptr->views[i].depth_in_stream,
7204
0
      ptr->views[i].depth_in_track,
7205
0
      ptr->views[i].base_view_type
7206
0
    );
7207
0
    for (j=0; j<ptr->views[i].num_ref_views; j++) {
7208
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);
7209
0
    }
7210
0
    gf_fprintf(trace, "</ViewInfo>\n");
7211
0
  }
7212
0
  gf_isom_box_dump_done("ViewIdentifierBox", a, trace);
7213
0
  return GF_OK;
7214
0
}
7215
7216
GF_Err pcmC_box_dump(GF_Box *a, FILE * trace)
7217
0
{
7218
0
  GF_PCMConfigBox *p = (GF_PCMConfigBox *) a;
7219
7220
0
  gf_isom_box_dump_start(a, "PCMConfigurationBox", trace);
7221
0
  gf_fprintf(trace, " format_flags=\"%d\" PCM_sample_size=\"%d\">\n", p->format_flags, p->PCM_sample_size);
7222
0
  gf_isom_box_dump_done("PCMConfigurationBox", a, trace);
7223
0
  return GF_OK;
7224
0
}
7225
7226
GF_Err chnl_box_dump(GF_Box *a, FILE * trace)
7227
0
{
7228
0
  GF_ChannelLayoutBox *p = (GF_ChannelLayoutBox *) a;
7229
0
  gf_isom_box_dump_start(a, "ChannelLayoutBox", trace);
7230
0
  gf_fprintf(trace, " stream_structure=\"%d\"", p->layout.stream_structure);
7231
0
  if (p->layout.stream_structure & 2)
7232
0
    gf_fprintf(trace, " object_count=\"%d\"", p->layout.object_count);
7233
7234
0
  if (p->layout.stream_structure & 1) {
7235
0
    gf_fprintf(trace, " definedLayout=\"%d\"", p->layout.definedLayout);
7236
0
    if (p->layout.definedLayout!=0) {
7237
0
      gf_fprintf(trace, " omittedChannelsMap=\""LLU"\"", p->layout.omittedChannelsMap);
7238
0
    }
7239
0
  }
7240
7241
0
  gf_fprintf(trace, ">\n");
7242
0
  if ((p->layout.stream_structure & 1) && (p->layout.definedLayout==0)) {
7243
0
    u32 i;
7244
0
    for (i=0; i<p->layout.channels_count; i++) {
7245
0
      gf_fprintf(trace, "<Speaker position=\"%d\"", p->layout.layouts[i].position);
7246
0
      if (p->layout.layouts[i].position==126) {
7247
0
        gf_fprintf(trace, " azimuth=\"%d\" elevation=\"%d\"", p->layout.layouts[i].azimuth, p->layout.layouts[i].elevation);
7248
0
      }
7249
0
      gf_fprintf(trace, "/>\n");
7250
0
    }
7251
0
  }
7252
7253
0
  gf_isom_box_dump_done("ChannelLayoutBox", a, trace);
7254
0
  return GF_OK;
7255
0
}
7256
7257
GF_Err srat_box_dump(GF_Box *a, FILE * trace)
7258
0
{
7259
0
  GF_SamplingRateBox *p = (GF_SamplingRateBox *) a;
7260
7261
0
  gf_isom_box_dump_start(a, "SamplingRateBox", trace);
7262
0
  gf_fprintf(trace, " sampling_rate=\"%u\">\n", p->sampling_rate);
7263
0
  gf_isom_box_dump_done("SamplingRateBox", a, trace);
7264
0
  return GF_OK;
7265
0
}
7266
7267
GF_Err load_box_dump(GF_Box *a, FILE * trace)
7268
0
{
7269
0
  GF_TrackLoadBox *p = (GF_TrackLoadBox *) a;
7270
7271
0
  gf_isom_box_dump_start(a, "TrackLoadBox", trace);
7272
0
  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);
7273
0
  gf_isom_box_dump_done("TrackLoadBox", a, trace);
7274
0
  return GF_OK;
7275
0
}
7276
7277
GF_Err emsg_box_dump(GF_Box *a, FILE * trace)
7278
0
{
7279
0
  GF_EventMessageBox *p = (GF_EventMessageBox *) a;
7280
7281
0
  gf_isom_box_dump_start(a, "EventMessageBox", trace);
7282
0
  fprintf(trace, "timescale=\"%u\" presentation_time%s=\""LLU"\" event_duration=\"%u\" event_id=\"%u\"",
7283
0
    p->timescale, (p->version==0) ? "_delta" : "", p->presentation_time_delta, p->event_duration, p->event_id);
7284
7285
0
  if (p->scheme_id_uri)
7286
0
    fprintf(trace, " scheme_id_uri=\"%s\"", p->scheme_id_uri);
7287
0
  if (p->value)
7288
0
    fprintf(trace, " value=\"%s\"", p->value);
7289
7290
0
  if (p->message_data)
7291
0
    dump_data_attribute(trace, " message_data", p->message_data, p->message_data_size);
7292
7293
0
  gf_fprintf(trace, ">\n");
7294
0
  gf_isom_box_dump_done("EventMessageBox", a, trace);
7295
0
  return GF_OK;
7296
0
}
7297
7298
void scte35_dump_xml(FILE *dump, GF_BitStream *bs);
7299
GF_Err emib_box_dump(GF_Box *a, FILE * trace)
7300
0
{
7301
0
  GF_EventMessageBox *p = (GF_EventMessageBox *) a;
7302
7303
0
  gf_isom_box_dump_start(a, "EventMessageInstanceBox", trace);
7304
0
  fprintf(trace, "presentation_time_delta=\""LLD"\" event_duration=\"%u\" event_id=\"%u\"",
7305
0
    p->presentation_time_delta, p->event_duration, p->event_id);
7306
7307
0
  if (p->scheme_id_uri)
7308
0
    fprintf(trace, " scheme_id_uri=\"%s\"", p->scheme_id_uri);
7309
0
  if (p->value)
7310
0
    fprintf(trace, " value=\"%s\"", p->value);
7311
7312
0
  if (p->message_data) {
7313
0
    dump_data_attribute(trace, " message_data", p->message_data, p->message_data_size);
7314
0
    gf_fprintf(trace, ">\n");
7315
7316
0
#ifndef GPAC_DISABLE_INSPECT
7317
0
    if (p->scheme_id_uri && !strcmp(p->scheme_id_uri, "urn:scte:scte35:2013:bin")) {
7318
0
      GF_BitStream *bs = gf_bs_new(p->message_data, p->message_data_size, GF_BITSTREAM_READ);
7319
0
      scte35_dump_xml(trace, bs);
7320
0
      gf_bs_del(bs);
7321
0
    }
7322
0
#endif
7323
0
  } else {
7324
0
    gf_fprintf(trace, ">\n");
7325
0
  }
7326
7327
0
  gf_isom_box_dump_done("EventMessageInstanceBox", a, trace);
7328
0
  return GF_OK;
7329
0
}
7330
7331
GF_Err emeb_box_dump(GF_Box *a, FILE * trace)
7332
0
{
7333
0
  gf_isom_box_dump_start(a, "EventMessageEmptyBox", trace);
7334
0
  gf_fprintf(trace, ">\n");
7335
0
  gf_isom_box_dump_done("EventMessageEmptyBox", a, trace);
7336
0
  return GF_OK;
7337
0
}
7338
7339
GF_Err evte_box_dump(GF_Box *a, FILE * trace)
7340
0
{
7341
  //GF_EventMessageSampleEntryBox *p = (GF_EventMessageSampleEntryBox *)a;
7342
0
  gf_isom_box_dump_start(a, "EventMessageSampleEntryBox", trace);
7343
0
  gf_fprintf(trace, ">\n");
7344
0
  gf_isom_box_dump_done("EventMessageSampleEntryBox", a, trace);
7345
0
  return GF_OK;
7346
0
}
7347
7348
GF_Err silb_box_dump(GF_Box *a, FILE * trace)
7349
0
{
7350
0
  GF_SchemeIdListBox *p = (GF_SchemeIdListBox *) a;
7351
0
  gf_isom_box_dump_start(a, "SchemeIdListBox", trace);
7352
7353
0
  fprintf(trace, "number_of_schemes=\"%u\" other_schemes_flag=\"%u\"",
7354
0
    p->number_of_schemes, p->other_schemes_flag);
7355
0
  gf_fprintf(trace, ">\n");
7356
7357
0
  for (u32 i=0; i<p->number_of_schemes; ++i) {
7358
0
    GF_SchemeIdListBoxEntry *ent = (GF_SchemeIdListBoxEntry*)gf_list_get(p->schemes, i);
7359
0
    fprintf(trace, "<SchemeIdListBoxEntry scheme_id_uri=\"%s\" value=\"%s\" value=\"%u\"/>\n",
7360
0
      ent->scheme_id_uri, ent->value, ent->atleast_once_flag);
7361
0
  }
7362
7363
0
  gf_isom_box_dump_done("SchemeIdListBox", a, trace);
7364
0
  return GF_OK;
7365
0
}
7366
7367
GF_Err csgp_box_dump(GF_Box *a, FILE * trace)
7368
0
{
7369
0
  u32 i;
7370
0
  GF_CompactSampleGroupBox *ptr = (GF_CompactSampleGroupBox*)a;
7371
0
  Bool use_msb_traf = ptr->flags & (1<<7);
7372
0
  Bool use_grpt_param = ptr->flags & (1<<6);
7373
7374
0
  gf_isom_box_dump_start(a, "CompactSampleGroupBox", trace);
7375
0
  fprintf(trace, "Version=\"%u\" Flags=\"%d\" 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\"",
7376
0
    ptr->version,
7377
0
    ptr->flags,
7378
0
    use_msb_traf,
7379
0
    use_grpt_param,
7380
0
    ((ptr->flags>>4) & 0x3),
7381
0
    ((ptr->flags>>2) & 0x3),
7382
0
    (ptr->flags & 0x3),
7383
0
    gf_4cc_to_str(ptr->grouping_type),
7384
0
    ptr->pattern_count
7385
0
  );
7386
7387
0
  if (use_grpt_param)
7388
0
    fprintf(trace, " grouping_type_paramter=\"%u\"", ptr->grouping_type_parameter);
7389
0
  fprintf(trace, ">\n");
7390
7391
0
  for (i=0; i<ptr->pattern_count; i++) {
7392
0
    u32 j;
7393
0
    fprintf(trace, "<Pattern length=\"%u\" sample_count=\"%u\" sample_group_indices=\"", ptr->patterns[i].length, ptr->patterns[i].sample_count);
7394
0
    for (j=0; j<ptr->patterns[i].length; j++) {
7395
0
      u32 idx = ptr->patterns[i].sample_group_description_indices[j];
7396
0
      if (j) fprintf(trace, " ");
7397
0
      if (use_msb_traf && (idx>0x10000))
7398
0
        fprintf(trace, "%d(traf)", idx-0x10000);
7399
0
      else
7400
0
        fprintf(trace, "%d", idx);
7401
0
    }
7402
0
    fprintf(trace, "\"/>\n");
7403
0
  }
7404
7405
0
  gf_isom_box_dump_done("CompactSampleGroupBox", a, trace);
7406
0
  return GF_OK;
7407
0
}
7408
7409
7410
GF_Err ienc_box_dump(GF_Box *a, FILE * trace)
7411
0
{
7412
0
  u32 i, nb_keys, kpos;
7413
0
  GF_ItemEncryptionPropertyBox *ptr = (GF_ItemEncryptionPropertyBox *)a;
7414
0
  if (!a) return GF_BAD_PARAM;
7415
0
  gf_isom_box_dump_start(a, "ItemEncryptionPropertyBox", trace);
7416
0
  if (ptr->version)
7417
0
    gf_fprintf(trace, " skip_byte_block=\"%u\" crypt_byte_block=\"%u\"", ptr->skip_byte_block, ptr->crypt_byte_block);
7418
0
  gf_fprintf(trace, ">\n");
7419
0
  nb_keys = ptr->key_info ? ptr->key_info[2] : 0;
7420
0
  kpos = 3;
7421
0
  for (i = 0; i < nb_keys; i++) {
7422
0
    u8 iv_size = ptr->key_info[kpos];
7423
0
    gf_fprintf(trace, "<KeyInfo KID=\"");
7424
0
    dump_data_hex(trace, ptr->key_info + kpos + 1, 16);
7425
0
    gf_fprintf(trace, "\"");
7426
0
    kpos+=17;
7427
0
    if (iv_size) {
7428
0
      gf_fprintf(trace, " IV_size=\"%d\"/>\n", iv_size);
7429
0
    } else {
7430
0
      iv_size = ptr->key_info[kpos];
7431
0
      gf_fprintf(trace, " constant_IV_size=\"%d\" constant_IV=\"", iv_size);
7432
0
      dump_data_hex(trace, ptr->key_info + kpos + 1, iv_size);
7433
0
      gf_fprintf(trace, "\"/>\n");
7434
0
      kpos += 1 + iv_size;
7435
0
    }
7436
0
  }
7437
0
  if (!ptr->size)
7438
0
    gf_fprintf(trace, "<KeyInfo KID=\"\" IV_size=\"\" constant_IV_size=\"\" constant_IV=\"\" />\n");
7439
7440
0
  gf_isom_box_dump_done("ItemEncryptionPropertyBox", a, trace);
7441
0
  return GF_OK;
7442
0
}
7443
7444
GF_Err iaux_box_dump(GF_Box *a, FILE * trace)
7445
0
{
7446
0
  GF_AuxiliaryInfoPropertyBox *ptr = (GF_AuxiliaryInfoPropertyBox *)a;
7447
0
  if (!a) return GF_BAD_PARAM;
7448
0
  gf_isom_box_dump_start(a, "ItemAuxiliaryInformationBox", trace);
7449
0
  gf_fprintf(trace, " aux_info_type=\"%d\" aux_info_parameter=\"%d\">\n", ptr->aux_info_type, ptr->aux_info_parameter);
7450
0
  gf_isom_box_dump_done("ItemAuxiliaryInformationBox", a, trace);
7451
0
  return GF_OK;
7452
0
}
7453
7454
#include <gpac/utf.h>
7455
7456
GF_Err xtra_box_dump(GF_Box *a, FILE * trace)
7457
0
{
7458
0
  GF_XtraBox *ptr = (GF_XtraBox *)a;
7459
0
  u32 i, count = gf_list_count(ptr->tags);
7460
7461
0
  gf_isom_box_dump_start(a, "XtraBox", trace);
7462
0
  gf_fprintf(trace, ">\n");
7463
0
  for (i=0; i<count; i++) {
7464
0
    GF_XtraTag *tag = gf_list_get(ptr->tags, i);
7465
7466
0
    gf_fprintf(trace, "<WMATag name=\"%s\" version=\"%d\" type=\"%d\"", tag->name, tag->flags, tag->prop_type);
7467
0
    if (!tag->prop_type) {
7468
0
      u16 *src_str = (u16 *) tag->prop_value;
7469
0
      u32 len = UTF8_MAX_BYTES_PER_CHAR * gf_utf8_wcslen(src_str);
7470
0
      char *utf8str = (char *)gf_malloc(len + 1);
7471
0
      u32 res_len = gf_utf8_wcstombs(utf8str, len, (const unsigned short **) &src_str);
7472
0
      if (res_len != GF_UTF8_FAIL) {
7473
0
        utf8str[res_len] = 0;
7474
7475
0
        gf_fprintf(trace, " value=\"%s\"", utf8str);
7476
0
      }
7477
0
      gf_free(utf8str);
7478
0
    } else {
7479
0
      gf_fprintf(trace, " value=\"");
7480
0
      dump_data_hex(trace, tag->prop_value, tag->prop_size);
7481
0
      gf_fprintf(trace, "\"");
7482
0
    }
7483
0
    gf_fprintf(trace, " />\n");
7484
0
  }
7485
0
  gf_isom_box_dump_done("XtraBox", a, trace);
7486
0
  return GF_OK;
7487
0
}
7488
7489
7490
GF_Err st3d_box_dump(GF_Box *a, FILE * trace)
7491
0
{
7492
0
  GF_Stereo3DBox  *ptr = (GF_Stereo3DBox *)a;
7493
0
  if (!a) return GF_BAD_PARAM;
7494
0
  gf_isom_box_dump_start(a, "Stereo3DBox", trace);
7495
0
  gf_fprintf(trace, " stereo_type=\"%d\">\n", ptr->stereo_type);
7496
0
  gf_isom_box_dump_done("Stereo3DBox", a, trace);
7497
0
  return GF_OK;
7498
0
}
7499
7500
GF_Err svhd_box_dump(GF_Box *a, FILE * trace)
7501
0
{
7502
0
  GF_SphericalVideoInfoBox *ptr = (GF_SphericalVideoInfoBox *)a;
7503
0
  if (!a) return GF_BAD_PARAM;
7504
0
  gf_isom_box_dump_start(a, "SphericalVideoInfoBox", trace);
7505
0
  gf_fprintf(trace, " info=\"%s\">\n", ptr->string);
7506
0
  gf_isom_box_dump_done("SphericalVideoInfoBox", a, trace);
7507
0
  return GF_OK;
7508
0
}
7509
7510
GF_Err prhd_box_dump(GF_Box *a, FILE * trace)
7511
0
{
7512
0
  GF_ProjectionHeaderBox *ptr = (GF_ProjectionHeaderBox *)a;
7513
0
  if (!a) return GF_BAD_PARAM;
7514
0
  gf_isom_box_dump_start(a, "ProjectionHeaderBox", trace);
7515
0
  gf_fprintf(trace, " yaw=\"%d\" pitch=\"%d\" roll=\"%d\">\n", ptr->yaw, ptr->pitch, ptr->roll);
7516
0
  gf_isom_box_dump_done("ProjectionHeaderBox", a, trace);
7517
0
  return GF_OK;
7518
0
}
7519
7520
GF_Err proj_type_box_dump(GF_Box *a, FILE * trace)
7521
0
{
7522
0
  GF_ProjectionTypeBox *ptr = (GF_ProjectionTypeBox *)a;
7523
0
  if (!a) return GF_BAD_PARAM;
7524
0
  if (ptr->type == GF_ISOM_BOX_TYPE_CBMP) {
7525
0
    gf_isom_box_dump_start(a, "CubemapProjectionBox", trace);
7526
0
    gf_fprintf(trace, " layout=\"%d\" padding=\"%d\">\n", ptr->layout, ptr->padding);
7527
0
    gf_isom_box_dump_done("CubemapProjectionBox", a, trace);
7528
0
  }
7529
0
  else if (ptr->type == GF_ISOM_BOX_TYPE_EQUI) {
7530
0
    gf_isom_box_dump_start(a, "EquirectangularProjectionBox", trace);
7531
0
    gf_fprintf(trace, " top=\"%d\" bottom=\"%d\" left=\"%d\" right=\"%d\">\n", ptr->bounds_top, ptr->bounds_bottom, ptr->bounds_left, ptr->bounds_right);
7532
0
    gf_isom_box_dump_done("EquirectangularProjectionBox", a, trace);
7533
0
  }
7534
0
  else if (ptr->type == GF_ISOM_BOX_TYPE_MSHP) {
7535
0
    gf_isom_box_dump_start(a, "MeshProjectionBox", trace);
7536
0
    gf_fprintf(trace, " crc=\"%08X\" encoding=\"%s\" left=\"%d\" right=\"%d\">\n", ptr->crc, gf_4cc_to_str(ptr->encoding_4cc) );
7537
0
    gf_isom_box_dump_done("MeshProjectionBox", a, trace);
7538
0
  }
7539
0
  return GF_OK;
7540
0
}
7541
7542
GF_Err keys_box_dump(GF_Box *a, FILE * trace)
7543
0
{
7544
0
  u32 i;
7545
0
  GF_MetaKey *k;
7546
0
  GF_MetaKeysBox *ptr = (GF_MetaKeysBox *)a;
7547
0
  gf_isom_box_dump_start(a, "KeysBox", trace);
7548
0
  gf_fprintf(trace, ">\n");
7549
7550
0
  i=0;
7551
0
  while ( (k = (GF_MetaKey*)gf_list_enum(ptr->keys, &i))) {
7552
0
    gf_fprintf(trace, " <Key ns=\"%s\"", gf_4cc_to_str(k->ns) );
7553
0
    if (k->data) {
7554
0
      if (gf_utf8_is_legal(k->data, k->size)) {
7555
0
        gf_fprintf(trace, " name=\"");
7556
0
        dump_data_string(trace, k->data, k->size);
7557
0
        gf_fprintf(trace, "\"");
7558
0
      } else if (k->size<100) {
7559
0
        dump_data_attribute(trace, "name", k->data, k->size);
7560
0
      } else {
7561
0
        gf_fprintf(trace, " nameSize=\"%u\"", k->size);
7562
0
      }
7563
0
    }
7564
0
    gf_fprintf(trace, "/>\n");
7565
0
  }
7566
0
  gf_isom_box_dump_done("KeysBox", NULL, trace);
7567
0
  return GF_OK;
7568
0
}
7569
GF_Err sref_box_dump(GF_Box *a, FILE * trace)
7570
0
{
7571
0
  GF_SampleReferences *ptr = (GF_SampleReferences*)a;
7572
0
  u32 i, nb_entries = gf_list_count(ptr->entries);
7573
7574
0
  gf_isom_box_dump_start(a, "SampleReferences", trace);
7575
0
  gf_fprintf(trace, ">\n");
7576
7577
0
  for (i=0; i<nb_entries; i++) {
7578
0
    u32 j;
7579
0
    GF_SampleRefEntry *ent = gf_list_get(ptr->entries, i);
7580
0
    gf_fprintf(trace, "<SampleReferenceEntry sampleID=\"%u\" refs=\"", ent->sampleID);
7581
0
    for (j=0; j<ent->nb_refs; j++) {
7582
0
      if (j) gf_fprintf(trace, " ");
7583
0
      gf_fprintf(trace, "%u", ent->sample_refs[j]);
7584
0
    }
7585
0
    gf_fprintf(trace, "\"/>\n");
7586
0
  }
7587
7588
0
  gf_isom_box_dump_done("SampleReferences", NULL, trace);
7589
0
  return GF_OK;
7590
0
}
7591
7592
GF_Err empty_box_dump(GF_Box *a, FILE * trace)
7593
0
{
7594
0
  if (!a) return GF_BAD_PARAM;
7595
0
  char *name=NULL;
7596
0
  switch(a->type) {
7597
0
  case GF_QT_BOX_TYPE_FRCD: name = "ForcedSubtitleBox"; break;
7598
0
  default: return GF_BAD_PARAM;
7599
0
  }
7600
0
  gf_isom_box_dump_start(a, name, trace);
7601
0
  gf_isom_box_dump_done(name, a, trace);
7602
0
  return GF_OK;
7603
0
}
7604
7605
GF_Err extl_box_dump(GF_Box *a, FILE * trace)
7606
0
{
7607
0
  GF_ExternalTrackLocationBox *ptr = (GF_ExternalTrackLocationBox *)a;
7608
0
  if (!a) return GF_BAD_PARAM;
7609
0
  gf_isom_box_dump_start(a, "ExternalTrackLocationBox", trace);
7610
0
  gf_fprintf(trace, " referenced_trackID=\"%u\" referenced_type=\"%s\"", ptr->referenced_track_ID, gf_4cc_to_str(ptr->referenced_handler_type));
7611
0
  gf_fprintf(trace, " media_timescale=\"%u\"", ptr->media_timescale);
7612
0
  gf_fprintf(trace, " location=\"%s\">\n", ptr->location ? ptr->location : "NONE");
7613
0
  gf_isom_box_dump_done("ExternalTrackLocationBox", a, trace);
7614
0
  return GF_OK;
7615
0
}
7616
7617
#ifdef GPAC_HAS_QJS
7618
#include "../quickjs/quickjs.h"
7619
7620
void qjs_module_init_gpaccore(JSContext *ctx);
7621
void js_dump_error(JSContext *ctx);
7622
7623
static char *js_pref = "import { Bitstream as BS } from 'gpaccore'\n \
7624
\
7625
function _gpac_parse_box(ab) => {\n\
7626
let bs = ab.byteLength ? new BS(ab) : null;\n\
7627
";
7628
7629
7630
static char *js_suf = "\n\
7631
if (bs && bs.overflow) throw \"Too many bytes read\";\n\
7632
else this.__unparsed = bs ? bs.available : 0;\n\
7633
}\n\
7634
globalThis.__do_parse = _gpac_parse_box;\n";
7635
7636
void dump_element(JSContext *ctx, FILE *trace, const char *name, JSValue obj, Bool skip_name, u32 parent_type, GF_Box *box, u8 *buf, u32 buflen)
7637
0
{
7638
0
  u32 len, i, j, pass=0;
7639
0
  u32 unparsed_bytes=0;
7640
0
  Bool has_child=GF_FALSE;
7641
0
  u32 box_has_children=0;
7642
0
  JSPropertyEnum *tab;
7643
0
  const char *key, *str;
7644
0
  JSValue val;
7645
0
  JSValue v_name;
7646
0
  const char *s_name=NULL;
7647
0
  Bool is_array = JS_IsArray(ctx, obj);
7648
0
  char *elem_name = NULL;
7649
7650
0
  if (is_array) {
7651
0
    elem_name = gf_strdup(name);
7652
0
    gf_dynstrcat(&elem_name, "Entry", NULL);
7653
0
  }
7654
0
  if (skip_name) {
7655
0
    v_name = JS_GetPropertyStr(ctx, obj, "Name");
7656
0
    s_name = JS_ToCString(ctx, v_name);
7657
0
    name = s_name;
7658
0
  }
7659
7660
0
  val = JS_GetPropertyStr(ctx, obj, "container");
7661
0
  JS_ToInt32(ctx, &box_has_children, val);
7662
0
  JS_FreeValue(ctx, val);
7663
7664
0
  val = JS_GetPropertyStr(ctx, obj, "__unparsed");
7665
0
  JS_ToInt32(ctx, &unparsed_bytes, val);
7666
0
  JS_FreeValue(ctx, val);
7667
7668
  //try parsing remainer as boxes
7669
0
  if (box && box_has_children && (unparsed_bytes>=8)) {
7670
0
    u32 osize = (u32) box->size;
7671
0
    u32 boff = buflen-unparsed_bytes;
7672
0
    box->size = unparsed_bytes;
7673
0
    GF_BitStream *bs = gf_bs_new(buf+boff, unparsed_bytes, GF_BITSTREAM_READ);
7674
0
    gf_bs_set_cookie(bs, GF_ISOM_BS_COOKIE_NO_LOGS);
7675
0
    GF_Err e = gf_isom_box_array_read(box, bs);
7676
0
    if (e==GF_OK)
7677
0
      unparsed_bytes = 0;
7678
0
    box->size = osize;
7679
0
    gf_bs_del(bs);
7680
0
  }
7681
7682
0
  fprintf(trace, "<%s", name);
7683
0
  if (box && gf_list_count(box->child_boxes))
7684
0
    has_child = GF_TRUE;
7685
7686
0
  JS_GetOwnPropertyNames(ctx, &tab, &len, obj, JS_GPN_STRING_MASK | JS_GPN_ENUM_ONLY);
7687
7688
0
  for (j=0;j<2;j++) {
7689
0
  for (i=0; i<len; i++) {
7690
0
    val = JS_GetProperty(ctx, obj, tab[i].atom);
7691
0
    key = JS_AtomToCString(ctx, tab[i].atom);
7692
0
    str = JS_ToCString(ctx, val);
7693
7694
0
    if (JS_IsArray(ctx, val)) {
7695
0
      has_child = GF_TRUE;
7696
0
      if (pass)
7697
0
        dump_element(ctx, trace, is_array ? elem_name : key, val, GF_FALSE, 0, NULL, NULL, 0);
7698
0
    } else if (JS_IsObject(val)) {
7699
0
      has_child = GF_TRUE;
7700
0
      if (pass)
7701
0
        dump_element(ctx, trace, is_array ? elem_name :key, val, GF_FALSE, 0, NULL, NULL, 0);
7702
0
    } else if (!strcmp(key, "__unparsed")) {
7703
7704
0
    } else if (!pass) {
7705
0
      if (!skip_name || strcmp(key, "Name"))
7706
0
        fprintf(trace, " %s=\"%s\"", key, str);
7707
0
    }
7708
0
    JS_FreeCString(ctx, key);
7709
0
    JS_FreeCString(ctx, str);
7710
0
    JS_FreeValue(ctx, val);
7711
0
  }
7712
0
    if (!pass) {
7713
0
      if (!has_child) {
7714
0
        fprintf(trace, "/>\n");
7715
0
        break;
7716
0
      } else {
7717
0
        fprintf(trace, ">\n");
7718
0
        pass++;
7719
0
      }
7720
0
    }
7721
0
  }
7722
7723
0
  for(i = 0; i < len; i++)
7724
0
    JS_FreeAtom(ctx, tab[i].atom);
7725
0
  js_free(ctx, tab);
7726
0
  if (unparsed_bytes) {
7727
0
    fprintf(trace, "<!-- %d unparsed bytes -->\n", unparsed_bytes);
7728
0
  }
7729
7730
0
  if (parent_type) {
7731
0
    JSValue par = JS_GetPropertyStr(ctx, obj, "Container");
7732
0
    const char *s_par = JS_ToCString(ctx, par);
7733
0
    if (s_par) {
7734
0
      if (!strstr(s_par, gf_4cc_to_str(parent_type)))
7735
0
        fprintf(trace, "<!-- Invalid as child of %s -->\n", gf_4cc_to_str(parent_type));
7736
0
      JS_FreeCString(ctx, s_par);
7737
0
    }
7738
0
    JS_FreeValue(ctx, par);
7739
0
  }
7740
7741
0
  if (elem_name) gf_free(elem_name);
7742
0
  if (has_child) {
7743
0
    if (box)
7744
0
      gf_isom_box_dump_done(name, box, trace);
7745
0
    else
7746
0
      fprintf(trace, "</%s>\n", name);
7747
0
  }
7748
7749
0
  if (s_name) {
7750
0
    JS_FreeCString(ctx, s_name);
7751
0
    JS_FreeValue(ctx, v_name);
7752
0
  }
7753
0
}
7754
7755
static JSRuntime *rt = NULL;
7756
static JSContext *ctx = NULL;
7757
7758
GF_Err dump_js_data(u8 *data, u32 size, u32 b4cc, u32 par_type, GF_Box *box, FILE *trace, char *szPath)
7759
0
{
7760
0
  GF_Err e = GF_OK;
7761
0
  char *buf=NULL;
7762
0
  u8 *file;
7763
0
  u32 blen, flen;
7764
7765
0
  if (!rt) {
7766
0
    rt = JS_NewRuntime();
7767
0
    ctx = JS_NewContext(rt);
7768
0
    qjs_module_init_gpaccore(ctx);
7769
0
  }
7770
7771
0
  gf_dynstrcat(&buf, js_pref, NULL);
7772
0
  gf_file_load_data(szPath, &file, &flen);
7773
0
  gf_dynstrcat(&buf, file, NULL);
7774
0
  gf_free(file);
7775
0
  gf_dynstrcat(&buf, js_suf, NULL);
7776
0
  blen = (u32) strlen(buf);
7777
7778
0
  JSValue ret = JS_Eval(ctx, (char *)buf, blen, szPath, JS_EVAL_TYPE_MODULE);
7779
0
  if (JS_IsException(ret)) {
7780
0
    e = GF_BAD_PARAM;
7781
0
    js_dump_error(ctx);
7782
0
  }
7783
0
  JS_FreeValue(ctx, ret);
7784
0
  gf_free(buf);
7785
7786
0
  if (!e) {
7787
0
    JSValue js_print(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv);
7788
7789
0
    JSValue global_obj = JS_GetGlobalObject(ctx);
7790
0
    JS_SetPropertyStr(ctx, global_obj, "print", JS_NewCFunction(ctx, js_print, "print", 1));
7791
0
    JS_SetPropertyStr(ctx, global_obj, "alert", JS_NewCFunction(ctx, js_print, "alert", 1));
7792
7793
0
    JSValue obj = JS_NewObject(ctx);
7794
0
    char szName[100];
7795
0
    sprintf(szName, "%s", gf_4cc_to_str(b4cc));
7796
0
    if (box) {
7797
0
      JS_SetPropertyStr(ctx, obj, "type", JS_NewString(ctx, szName));
7798
0
      JS_SetPropertyStr(ctx, obj, "Size", JS_NewInt32(ctx, (u32) box->size));
7799
0
      strcat(szName, "Box");
7800
0
    } else {
7801
      //sample group description
7802
0
      strcat(szName, "Entry");
7803
0
      par_type=0;
7804
0
    }
7805
0
    JS_SetPropertyStr(ctx, obj, "Name", JS_NewString(ctx, szName));
7806
0
    JS_SetPropertyStr(ctx, obj, "__unparsed", JS_NewInt32(ctx, 0));
7807
7808
0
    JSValue arg = JS_NewArrayBuffer(ctx, data, size, NULL, NULL, 0);
7809
0
    JSValue fun = JS_GetPropertyStr(ctx, global_obj, "__do_parse");
7810
7811
0
    ret = JS_Call(ctx, fun, obj, 1, &arg);
7812
0
    if (JS_IsException(ret)) {
7813
0
      e = GF_BAD_PARAM;
7814
0
      js_dump_error(ctx);
7815
0
    }
7816
0
    JS_FreeValue(ctx, ret);
7817
7818
0
    JS_FreeValue(ctx, global_obj);
7819
7820
0
    if (e==GF_OK) {
7821
0
      dump_element(ctx, trace, szName, obj, GF_TRUE, par_type, box, data, size);
7822
0
    } else {
7823
0
      gf_fprintf(trace, "<!-- JS Error parsing box %s -->\n", szName);
7824
0
    }
7825
0
    JS_FreeValue(ctx, obj);
7826
0
    JS_FreeValue(ctx, arg);
7827
0
    JS_FreeValue(ctx, fun);
7828
0
  }
7829
0
  return e;
7830
0
}
7831
7832
static void gf_isom_dump_js_cleanup()
7833
0
{
7834
0
  if (ctx) JS_FreeContext(ctx);
7835
0
  if (rt) JS_FreeRuntime(rt);
7836
0
  ctx=NULL;
7837
  rt=NULL;
7838
0
}
7839
7840
#endif
7841
7842
7843
#endif /*GPAC_DISABLE_ISOM_DUMP*/