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