src/isomedia/box_dump.c (4,047 lines of code) (raw):

/* * GPAC - Multimedia Framework C SDK * * Authors: Jean Le Feuvre * Copyright (c) Telecom ParisTech 2000-2012 * All rights reserved * * This file is part of GPAC / ISO Media File Format sub-project * * GPAC is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * GPAC is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; see the file COPYING. If not, write to * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. * */ #include <gpac/internal/isomedia_dev.h> #include <gpac/utf.h> #include <gpac/network.h> #include <gpac/color.h> #include <time.h> #ifndef GPAC_DISABLE_ISOM_DUMP static GF_Err apple_tag_dump(GF_Box *a, FILE * trace); void NullBoxErr(FILE * trace, u32 box_4cc) { if (box_4cc) { fprintf(trace, "<!--ERROR: NULL Box Found, expecting %s -->\n", gf_4cc_to_str(box_4cc) ); } else { fprintf(trace, "<!--ERROR: NULL Box Found-->\n"); } } void BadTopBoxErr(GF_Box *a, FILE * trace) { fprintf(trace, "<!--ERROR: Invalid Top-level Box Found (\"%s\")-->\n", gf_4cc_to_str(a->type)); } static void DumpData(FILE *trace, char *data, u32 dataLength) { u32 i; fprintf(trace, "data:application/octet-string,"); for (i=0; i<dataLength; i++) { fprintf(trace, "%02X", (unsigned char) data[i]); } } static void DumpDataHex(FILE *trace, char *data, u32 dataLength) { u32 i; fprintf(trace, "0x"); for (i=0; i<dataLength; i++) { fprintf(trace, "%02X", (unsigned char) data[i]); } } GF_Err DumpBox(GF_Box *a, FILE * trace) { if (a->size > 0xFFFFFFFF) { fprintf(trace, "<BoxInfo LargeSize=\""LLD"\" ", LLD_CAST a->size); } else { fprintf(trace, "<BoxInfo Size=\"%d\" ", (u32) a->size); } if (a->type == GF_ISOM_BOX_TYPE_UUID) { u32 i; fprintf(trace, "UUID=\"{"); for (i=0; i<16; i++) { fprintf(trace, "%02X", (unsigned char) ((GF_UUIDBox*)a)->uuid[i]); if ((i<15) && (i%4)==3) fprintf(trace, "-"); } fprintf(trace, "}\"/>\n"); } else { fprintf(trace, "Type=\"%s\"/>\n", gf_4cc_to_str(a->type)); } return GF_OK; } GF_Err gf_box_dump_ex(void *ptr, FILE * trace, u32 box_4cc) { GF_Box *a = (GF_Box *) ptr; if (!a) { NullBoxErr(trace, box_4cc); return GF_OK; } switch (a->type) { case GF_ISOM_BOX_TYPE_REFT: return reftype_dump(a, trace); case GF_ISOM_BOX_TYPE_FREE: case GF_ISOM_BOX_TYPE_SKIP: return free_dump(a, trace); case GF_ISOM_BOX_TYPE_MDAT: return mdat_dump(a, trace); case GF_ISOM_BOX_TYPE_MOOV: return moov_dump(a, trace); case GF_ISOM_BOX_TYPE_MVHD: return mvhd_dump(a, trace); case GF_ISOM_BOX_TYPE_MDHD: return mdhd_dump(a, trace); case GF_ISOM_BOX_TYPE_VMHD: return vmhd_dump(a, trace); case GF_ISOM_BOX_TYPE_SMHD: return smhd_dump(a, trace); case GF_ISOM_BOX_TYPE_HMHD: return hmhd_dump(a, trace); //the same box is used for all MPEG4 systems streams case GF_ISOM_BOX_TYPE_ODHD: case GF_ISOM_BOX_TYPE_CRHD: case GF_ISOM_BOX_TYPE_SDHD: case GF_ISOM_BOX_TYPE_NMHD: case GF_ISOM_BOX_TYPE_STHD: return nmhd_dump(a, trace); case GF_ISOM_BOX_TYPE_STBL: return stbl_dump(a, trace); case GF_ISOM_BOX_TYPE_DINF: return dinf_dump(a, trace); case GF_ISOM_BOX_TYPE_URL: return url_dump(a, trace); case GF_ISOM_BOX_TYPE_URN: return urn_dump(a, trace); case GF_ISOM_BOX_TYPE_CPRT: return cprt_dump(a, trace); case GF_ISOM_BOX_TYPE_KIND: return kind_dump(a, trace); case GF_ISOM_BOX_TYPE_HDLR: return hdlr_dump(a, trace); case GF_ISOM_BOX_TYPE_IODS: return iods_dump(a, trace); case GF_ISOM_BOX_TYPE_TRAK: return trak_dump(a, trace); case GF_ISOM_BOX_TYPE_MP4S: return mp4s_dump(a, trace); case GF_ISOM_BOX_TYPE_MP4V: return mp4v_dump(a, trace); case GF_ISOM_BOX_TYPE_MP4A: return mp4a_dump(a, trace); case GF_ISOM_BOX_TYPE_GNRM: return gnrm_dump(a, trace); case GF_ISOM_BOX_TYPE_GNRV: return gnrv_dump(a, trace); case GF_ISOM_BOX_TYPE_GNRA: return gnra_dump(a, trace); case GF_ISOM_BOX_TYPE_EDTS: return edts_dump(a, trace); case GF_ISOM_BOX_TYPE_UDTA: return udta_dump(a, trace); case GF_ISOM_BOX_TYPE_DREF: return dref_dump(a, trace); case GF_ISOM_BOX_TYPE_STSD: return stsd_dump(a, trace); case GF_ISOM_BOX_TYPE_STTS: return stts_dump(a, trace); case GF_ISOM_BOX_TYPE_CTTS: return ctts_dump(a, trace); case GF_ISOM_BOX_TYPE_CSLG: return cslg_dump(a, trace); case GF_ISOM_BOX_TYPE_STSH: return stsh_dump(a, trace); case GF_ISOM_BOX_TYPE_ELST: return elst_dump(a, trace); case GF_ISOM_BOX_TYPE_STSC: return stsc_dump(a, trace); case GF_ISOM_BOX_TYPE_STZ2: case GF_ISOM_BOX_TYPE_STSZ: return stsz_dump(a, trace); case GF_ISOM_BOX_TYPE_STCO: return stco_dump(a, trace); case GF_ISOM_BOX_TYPE_STSS: return stss_dump(a, trace); case GF_ISOM_BOX_TYPE_STDP: return stdp_dump(a, trace); case GF_ISOM_BOX_TYPE_SDTP: return sdtp_dump(a, trace); case GF_ISOM_BOX_TYPE_CO64: return co64_dump(a, trace); case GF_ISOM_BOX_TYPE_ESDS: return esds_dump(a, trace); case GF_ISOM_BOX_TYPE_MINF: return minf_dump(a, trace); case GF_ISOM_BOX_TYPE_TKHD: return tkhd_dump(a, trace); case GF_ISOM_BOX_TYPE_TREF: return tref_dump(a, trace); case GF_ISOM_BOX_TYPE_MDIA: return mdia_dump(a, trace); case GF_ISOM_BOX_TYPE_ELNG: return elng_dump(a, trace); case GF_ISOM_BOX_TYPE_CHPL: return chpl_dump(a, trace); case GF_ISOM_BOX_TYPE_PDIN: return dpin_dump(a, trace); case GF_ISOM_BOX_TYPE_SBGP: return sbgp_dump(a, trace); case GF_ISOM_BOX_TYPE_SGPD: return sgpd_dump(a, trace); case GF_ISOM_BOX_TYPE_SAIZ: return saiz_dump(a, trace); case GF_ISOM_BOX_TYPE_SAIO: return saio_dump(a, trace); case GF_ISOM_BOX_TYPE_RTP_STSD: return ghnt_dump(a, trace); case GF_ISOM_BOX_TYPE_RTPO: return rtpo_dump(a, trace); case GF_ISOM_BOX_TYPE_HNTI: return hnti_dump(a, trace); case GF_ISOM_BOX_TYPE_SDP: return sdp_dump(a, trace); case GF_ISOM_BOX_TYPE_HINF: return hinf_dump(a, trace); case GF_ISOM_BOX_TYPE_RELY: return rely_dump(a, trace); case GF_ISOM_BOX_TYPE_TIMS: return tims_dump(a, trace); case GF_ISOM_BOX_TYPE_TSRO: return tsro_dump(a, trace); case GF_ISOM_BOX_TYPE_SNRO: return snro_dump(a, trace); case GF_ISOM_BOX_TYPE_TRPY: return trpy_dump(a, trace); case GF_ISOM_BOX_TYPE_NUMP: return nump_dump(a, trace); case GF_ISOM_BOX_TYPE_TOTL: return totl_dump(a, trace); case GF_ISOM_BOX_TYPE_NPCK: return npck_dump(a, trace); case GF_ISOM_BOX_TYPE_TPYL: return tpyl_dump(a, trace); case GF_ISOM_BOX_TYPE_TPAY: return tpay_dump(a, trace); case GF_ISOM_BOX_TYPE_MAXR: return maxr_dump(a, trace); case GF_ISOM_BOX_TYPE_DMED: return dmed_dump(a, trace); case GF_ISOM_BOX_TYPE_DIMM: return dimm_dump(a, trace); case GF_ISOM_BOX_TYPE_DREP: return drep_dump(a, trace); case GF_ISOM_BOX_TYPE_TMIN: return tmin_dump(a, trace); case GF_ISOM_BOX_TYPE_TMAX: return tmax_dump(a, trace); case GF_ISOM_BOX_TYPE_PMAX: return pmax_dump(a, trace); case GF_ISOM_BOX_TYPE_DMAX: return dmax_dump(a, trace); case GF_ISOM_BOX_TYPE_PAYT: return payt_dump(a, trace); case GF_ISOM_BOX_TYPE_NAME: return name_dump(a, trace); case GF_ISOM_BOX_TYPE_FTYP: case GF_ISOM_BOX_TYPE_STYP: return ftyp_dump(a, trace); case GF_ISOM_BOX_TYPE_PADB: return padb_dump(a, trace); #ifndef GPAC_DISABLE_ISOM_FRAGMENTS case GF_ISOM_BOX_TYPE_MVEX: return mvex_dump(a, trace); case GF_ISOM_BOX_TYPE_MEHD: return mehd_dump(a, trace); case GF_ISOM_BOX_TYPE_TREX: return trex_dump(a, trace); case GF_ISOM_BOX_TYPE_TREP: return trep_dump(a, trace); case GF_ISOM_BOX_TYPE_MOOF: return moof_dump(a, trace); case GF_ISOM_BOX_TYPE_MFHD: return mfhd_dump(a, trace); case GF_ISOM_BOX_TYPE_TRAF: return traf_dump(a, trace); case GF_ISOM_BOX_TYPE_TFHD: return tfhd_dump(a, trace); case GF_ISOM_BOX_TYPE_TRUN: return trun_dump(a, trace); case GF_ISOM_BOX_TYPE_TFDT: return tfdt_dump(a, trace); #endif case GF_ISOM_BOX_TYPE_SUBS: return subs_dump(a, trace); case GF_ISOM_BOX_TYPE_RVCC: return rvcc_dump(a, trace); case GF_ISOM_BOX_TYPE_VOID: return void_dump(a, trace); case GF_ISOM_BOX_TYPE_STSF: return stsf_dump(a, trace); case GF_ISOM_SUBTYPE_3GP_AMR: case GF_ISOM_SUBTYPE_3GP_AMR_WB: case GF_ISOM_SUBTYPE_3GP_QCELP: case GF_ISOM_SUBTYPE_3GP_EVRC: case GF_ISOM_SUBTYPE_3GP_SMV: return gppa_dump(a, trace); case GF_ISOM_SUBTYPE_3GP_H263: return gppv_dump(a, trace); case GF_ISOM_BOX_TYPE_DAMR: case GF_ISOM_BOX_TYPE_DEVC: case GF_ISOM_BOX_TYPE_DQCP: case GF_ISOM_BOX_TYPE_DSMV: case GF_ISOM_BOX_TYPE_D263: return gppc_dump(a, trace); case GF_ISOM_BOX_TYPE_AVCC: case GF_ISOM_BOX_TYPE_SVCC: return avcc_dump(a, trace); case GF_ISOM_BOX_TYPE_HVCC: case GF_ISOM_BOX_TYPE_SHCC: return hvcc_dump(a, trace); case GF_ISOM_BOX_TYPE_BTRT: return btrt_dump(a, trace); case GF_ISOM_BOX_TYPE_M4DS: return m4ds_dump(a, trace); case GF_ISOM_BOX_TYPE_AVC1: case GF_ISOM_BOX_TYPE_AVC2: case GF_ISOM_BOX_TYPE_AVC3: case GF_ISOM_BOX_TYPE_AVC4: case GF_ISOM_BOX_TYPE_SVC1: case GF_ISOM_BOX_TYPE_HVC1: case GF_ISOM_BOX_TYPE_HEV1: case GF_ISOM_BOX_TYPE_HVC2: case GF_ISOM_BOX_TYPE_HEV2: case GF_ISOM_BOX_TYPE_SHC1: case GF_ISOM_BOX_TYPE_SHV1: case GF_ISOM_BOX_TYPE_HVT1: return mp4v_dump(a, trace); case GF_ISOM_BOX_TYPE_PASP: return pasp_dump(a, trace); case GF_ISOM_BOX_TYPE_FTAB: return ftab_dump(a, trace); case GF_ISOM_BOX_TYPE_TX3G: return tx3g_dump(a, trace); case GF_ISOM_BOX_TYPE_TEXT: return text_dump(a, trace); case GF_ISOM_BOX_TYPE_STYL: return styl_dump(a, trace); case GF_ISOM_BOX_TYPE_HLIT: return hlit_dump(a, trace); case GF_ISOM_BOX_TYPE_HCLR: return hclr_dump(a, trace); case GF_ISOM_BOX_TYPE_KROK: return krok_dump(a, trace); case GF_ISOM_BOX_TYPE_DLAY: return dlay_dump(a, trace); case GF_ISOM_BOX_TYPE_HREF: return href_dump(a, trace); case GF_ISOM_BOX_TYPE_TBOX: return tbox_dump(a, trace); case GF_ISOM_BOX_TYPE_BLNK: return blnk_dump(a, trace); case GF_ISOM_BOX_TYPE_TWRP: return twrp_dump(a, trace); case GF_ISOM_BOX_TYPE_PSSH: return pssh_dump(a, trace); case GF_ISOM_BOX_TYPE_TENC: return tenc_dump(a, trace); /* ISMA 1.0 Encryption and Authentication V 1.0 */ case GF_ISOM_BOX_TYPE_IKMS: return iKMS_dump(a, trace); case GF_ISOM_BOX_TYPE_ISFM: return iSFM_dump(a, trace); /*MPEG-21 extensions*/ case GF_ISOM_BOX_TYPE_META: return meta_dump(a, trace); case GF_ISOM_BOX_TYPE_XML: return xml_dump(a, trace); case GF_ISOM_BOX_TYPE_BXML: return bxml_dump(a, trace); case GF_ISOM_BOX_TYPE_ILOC: return iloc_dump(a, trace); case GF_ISOM_BOX_TYPE_PITM: return pitm_dump(a, trace); case GF_ISOM_BOX_TYPE_IPRO: return ipro_dump(a, trace); case GF_ISOM_BOX_TYPE_INFE: return infe_dump(a, trace); case GF_ISOM_BOX_TYPE_IINF: return iinf_dump(a, trace); case GF_ISOM_BOX_TYPE_SINF: return sinf_dump(a, trace); case GF_ISOM_BOX_TYPE_FRMA: return frma_dump(a, trace); case GF_ISOM_BOX_TYPE_SCHM: return schm_dump(a, trace); case GF_ISOM_BOX_TYPE_SCHI: return schi_dump(a, trace); case GF_ISOM_BOX_TYPE_ENCA: return mp4a_dump(a, trace); case GF_ISOM_BOX_TYPE_ENCV: return mp4v_dump(a, trace); case GF_ISOM_BOX_TYPE_ENCS: return mp4s_dump(a, trace); case GF_ISOM_BOX_TYPE_PRFT: return prft_dump(a, trace); case GF_ISOM_BOX_TYPE_0xA9NAM: case GF_ISOM_BOX_TYPE_0xA9CMT: case GF_ISOM_BOX_TYPE_0xA9DAY: case GF_ISOM_BOX_TYPE_0xA9ART: case GF_ISOM_BOX_TYPE_0xA9TRK: case GF_ISOM_BOX_TYPE_0xA9ALB: case GF_ISOM_BOX_TYPE_0xA9COM: case GF_ISOM_BOX_TYPE_0xA9WRT: case GF_ISOM_BOX_TYPE_0xA9TOO: case GF_ISOM_BOX_TYPE_0xA9CPY: case GF_ISOM_BOX_TYPE_0xA9DES: case GF_ISOM_BOX_TYPE_0xA9GEN: case GF_ISOM_BOX_TYPE_0xA9GRP: case GF_ISOM_BOX_TYPE_GNRE: case GF_ISOM_BOX_TYPE_DISK: case GF_ISOM_BOX_TYPE_TRKN: case GF_ISOM_BOX_TYPE_TMPO: case GF_ISOM_BOX_TYPE_CPIL: case GF_ISOM_BOX_TYPE_COVR: case GF_ISOM_BOX_TYPE_iTunesSpecificInfo: return apple_tag_dump(a, trace); #ifndef GPAC_DISABLE_ISOM_ADOBE /*Adobe extensions*/ case GF_ISOM_BOX_TYPE_ABST: return abst_dump(a, trace); case GF_ISOM_BOX_TYPE_AFRA: return afra_dump(a, trace); case GF_ISOM_BOX_TYPE_ASRT: return asrt_dump(a, trace); case GF_ISOM_BOX_TYPE_AFRT: return afrt_dump(a, trace); #endif /*Apple extensions*/ case GF_ISOM_BOX_TYPE_ILST: return ilst_dump(a, trace); case GF_ISOM_BOX_TYPE_OHDR: return ohdr_dump(a, trace); case GF_ISOM_BOX_TYPE_GRPI: return grpi_dump(a, trace); case GF_ISOM_BOX_TYPE_MDRI: return mdri_dump(a, trace); case GF_ISOM_BOX_TYPE_ODTT: return odtt_dump(a, trace); case GF_ISOM_BOX_TYPE_ODRB: return odrb_dump(a, trace); case GF_ISOM_BOX_TYPE_ODKM: return odkm_dump(a, trace); case GF_ISOM_BOX_TYPE_ODAF: return iSFM_dump(a, trace); case GF_ISOM_BOX_TYPE_TSEL: return tsel_dump(a, trace); case GF_ISOM_BOX_TYPE_METX: return metx_dump(a, trace); case GF_ISOM_BOX_TYPE_METT: return metx_dump(a, trace); case GF_ISOM_BOX_TYPE_DIMS: return dims_dump(a, trace); case GF_ISOM_BOX_TYPE_DIMC: return dimC_dump(a, trace); case GF_ISOM_BOX_TYPE_DIST: return diST_dump(a, trace); case GF_ISOM_BOX_TYPE_AC3: return ac3_dump(a, trace); case GF_ISOM_BOX_TYPE_DAC3: return dac3_dump(a, trace); case GF_ISOM_BOX_TYPE_LSR1: return lsr1_dump(a, trace); case GF_ISOM_BOX_TYPE_LSRC: return lsrc_dump(a, trace); case GF_ISOM_BOX_TYPE_SIDX: return sidx_dump(a, trace); case GF_ISOM_BOX_TYPE_PCRB: return pcrb_dump(a, trace); case GF_ISOM_BOX_TYPE_SENC: return senc_dump(a, trace); case GF_ISOM_BOX_TYPE_UUID: switch ( ((GF_UnknownUUIDBox *)a)->internal_4cc) { case GF_ISOM_BOX_UUID_TENC: return piff_tenc_dump(a, trace); case GF_ISOM_BOX_UUID_PSEC: return piff_psec_dump(a, trace); case GF_ISOM_BOX_UUID_PSSH: return piff_pssh_dump(a, trace); case GF_ISOM_BOX_UUID_TFRF: case GF_ISOM_BOX_UUID_TFXD: default: return defa_dump(a, trace); } #ifndef GPAC_DISABLE_TTXT case GF_ISOM_BOX_TYPE_STXT: return metx_dump(a, trace); case GF_ISOM_BOX_TYPE_TXTC: return txtc_dump(a, trace); case GF_ISOM_BOX_TYPE_VTTC: case GF_ISOM_BOX_TYPE_CTIM: case GF_ISOM_BOX_TYPE_IDEN: case GF_ISOM_BOX_TYPE_STTG: case GF_ISOM_BOX_TYPE_PAYL: case GF_ISOM_BOX_TYPE_VTTA: return boxstring_dump(a, trace); case GF_ISOM_BOX_TYPE_VTCU: return vtcu_dump(a, trace); case GF_ISOM_BOX_TYPE_VTTE: return vtte_dump(a, trace); case GF_ISOM_BOX_TYPE_WVTT: return wvtt_dump(a, trace); case GF_ISOM_BOX_TYPE_STPP: return metx_dump(a, trace); case GF_ISOM_BOX_TYPE_SBTT: return metx_dump(a, trace); #endif /*Adobe's protection boxes*/ case GF_ISOM_BOX_TYPE_ADKM: return adkm_dump(a, trace); case GF_ISOM_BOX_TYPE_AHDR: return ahdr_dump(a, trace); case GF_ISOM_BOX_TYPE_ADAF: return adaf_dump(a, trace); case GF_ISOM_BOX_TYPE_APRM: return aprm_dump(a, trace); case GF_ISOM_BOX_TYPE_AEIB: return aeib_dump(a, trace); case GF_ISOM_BOX_TYPE_AKEY: return akey_dump(a, trace); case GF_ISOM_BOX_TYPE_FLXS: return flxs_dump(a, trace); default: return defa_dump(a, trace); } } GF_Err gf_box_dump(void *ptr, FILE * trace) { return gf_box_dump_ex(ptr, trace, 0); } GF_Err gf_box_array_dump(GF_List *list, FILE * trace) { u32 i; GF_Box *a; if (!list) return GF_OK; i=0; while ((a = (GF_Box *)gf_list_enum(list, &i))) { gf_box_dump(a, trace); } return GF_OK; } void gf_box_dump_done(char *name, GF_Box *ptr, FILE *trace) { if (ptr && ptr->other_boxes) { gf_box_array_dump(ptr->other_boxes, trace); } if (name) fprintf(trace, "</%s>\n", name); } GF_EXPORT GF_Err gf_isom_dump(GF_ISOFile *mov, FILE * trace) { u32 i; GF_Box *box; if (!mov || !trace) return GF_BAD_PARAM; fprintf(trace, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); fprintf(trace, "<!--MP4Box dump trace-->\n"); fprintf(trace, "<IsoMediaFile Name=\"%s\">\n", mov->fileName); i=0; while ((box = (GF_Box *)gf_list_enum(mov->TopBoxes, &i))) { switch (box->type) { case GF_ISOM_BOX_TYPE_FTYP: case GF_ISOM_BOX_TYPE_MOOV: case GF_ISOM_BOX_TYPE_MDAT: case GF_ISOM_BOX_TYPE_FREE: case GF_ISOM_BOX_TYPE_META: case GF_ISOM_BOX_TYPE_SKIP: #ifndef GPAC_DISABLE_ISOM_FRAGMENTS case GF_ISOM_BOX_TYPE_MOOF: case GF_ISOM_BOX_TYPE_STYP: case GF_ISOM_BOX_TYPE_SIDX: case GF_ISOM_BOX_TYPE_PCRB: #ifndef GPAC_DISABLE_ISOM_ADOBE /*Adobe specific*/ case GF_ISOM_BOX_TYPE_AFRA: case GF_ISOM_BOX_TYPE_ABST: #endif #endif case GF_ISOM_BOX_TYPE_MFRA: case GF_ISOM_BOX_TYPE_PRFT: break; default: BadTopBoxErr(box, trace); break; } gf_box_dump(box, trace); } fprintf(trace, "</IsoMediaFile>\n"); return GF_OK; } GF_Err gf_full_box_dump(GF_Box *a, FILE * trace) { GF_FullBox *p; p = (GF_FullBox *)a; fprintf(trace, "<FullBoxInfo Version=\"%d\" Flags=\"0x%X\"/>\n", p->version, p->flags); return GF_OK; } GF_Err reftype_dump(GF_Box *a, FILE * trace) { char *s; u32 i; GF_TrackReferenceTypeBox *p; p = (GF_TrackReferenceTypeBox *)a; p->type = p->reference_type; switch (a->type) { case GF_ISOM_BOX_TYPE_HINT: s = "Hint"; break; case GF_ISOM_BOX_TYPE_DPND: s = "Stream"; break; case GF_ISOM_BOX_TYPE_MPOD: s = "OD"; break; case GF_ISOM_BOX_TYPE_SYNC: s = "Sync"; break; case GF_ISOM_BOX_TYPE_CHAP: s = "Chapter"; break; default: s = (char *) gf_4cc_to_str(a->type); break; } fprintf(trace, "<%sTrackReferenceBox Tracks=\"", s); for (i=0; i<p->trackIDCount; i++) fprintf(trace, " %d", p->trackIDs[i]); fprintf(trace, "\">\n"); DumpBox(a, trace); gf_box_dump_done(NULL, a, trace); fprintf(trace, "</%sTrackReferenceBox>\n", s); p->type = GF_ISOM_BOX_TYPE_REFT; return GF_OK; } GF_Err free_dump(GF_Box *a, FILE * trace) { GF_FreeSpaceBox *p; p = (GF_FreeSpaceBox *)a; fprintf(trace, "<FreeSpaceBox size=\"%d\">\n", p->dataSize); DumpBox(a, trace); gf_box_dump_done("FreeSpaceBox", a, trace); return GF_OK; } GF_Err mdat_dump(GF_Box *a, FILE * trace) { GF_MediaDataBox *p; p = (GF_MediaDataBox *)a; fprintf(trace, "<MediaDataBox dataSize=\""LLD"\">\n", LLD_CAST p->dataSize); DumpBox(a, trace); gf_box_dump_done("MediaDataBox", a, trace); return GF_OK; } GF_Err moov_dump(GF_Box *a, FILE * trace) { GF_MovieBox *p; p = (GF_MovieBox *)a; fprintf(trace, "<MovieBox>\n"); DumpBox(a, trace); if (p->iods) gf_box_dump(p->iods, trace); if (p->meta) gf_box_dump(p->meta, trace); gf_box_dump_ex(p->mvhd, trace,GF_ISOM_BOX_TYPE_MVHD); #ifndef GPAC_DISABLE_ISOM_FRAGMENTS if (p->mvex) gf_box_dump(p->mvex, trace); #endif gf_box_array_dump(p->trackList, trace); if (p->udta) gf_box_dump(p->udta, trace); gf_box_dump_done("MovieBox", a, trace); return GF_OK; } GF_Err mvhd_dump(GF_Box *a, FILE * trace) { GF_MovieHeaderBox *p; p = (GF_MovieHeaderBox *) a; fprintf(trace, "<MovieHeaderBox "); fprintf(trace, "CreationTime=\""LLD"\" ", LLD_CAST p->creationTime); fprintf(trace, "ModificationTime=\""LLD"\" ", LLD_CAST p->modificationTime); fprintf(trace, "TimeScale=\"%d\" ", p->timeScale); fprintf(trace, "Duration=\""LLD"\" ", LLD_CAST p->duration); fprintf(trace, "NextTrackID=\"%d\">\n", p->nextTrackID); DumpBox(a, trace); gf_full_box_dump(a, trace); gf_box_dump_done("MovieHeaderBox", a, trace); return GF_OK; } GF_Err mdhd_dump(GF_Box *a, FILE * trace) { GF_MediaHeaderBox *p; p = (GF_MediaHeaderBox *)a; fprintf(trace, "<MediaHeaderBox "); fprintf(trace, "CreationTime=\""LLD"\" ", LLD_CAST p->creationTime); fprintf(trace, "ModificationTime=\""LLD"\" ", LLD_CAST p->modificationTime); fprintf(trace, "TimeScale=\"%d\" ", p->timeScale); fprintf(trace, "Duration=\""LLD"\" ", LLD_CAST p->duration); fprintf(trace, "LanguageCode=\"%c%c%c\">\n", p->packedLanguage[0], p->packedLanguage[1], p->packedLanguage[2]); DumpBox(a, trace); gf_full_box_dump(a, trace); gf_box_dump_done("MediaHeaderBox", a, trace); return GF_OK; } GF_Err vmhd_dump(GF_Box *a, FILE * trace) { fprintf(trace, "<VideoMediaHeaderBox>\n"); DumpBox(a, trace); gf_full_box_dump(a, trace); gf_box_dump_done("VideoMediaHeaderBox", a, trace); return GF_OK; } GF_Err smhd_dump(GF_Box *a, FILE * trace) { fprintf(trace, "<SoundMediaHeaderBox>\n"); DumpBox(a, trace); gf_full_box_dump(a, trace); gf_box_dump_done("SoundMediaHeaderBox", a, trace); return GF_OK; } GF_Err hmhd_dump(GF_Box *a, FILE * trace) { GF_HintMediaHeaderBox *p; p = (GF_HintMediaHeaderBox *)a; fprintf(trace, "<HintMediaHeaderBox "); fprintf(trace, "MaximumPDUSize=\"%d\" ", p->maxPDUSize); fprintf(trace, "AveragePDUSize=\"%d\" ", p->avgPDUSize); fprintf(trace, "MaxBitRate=\"%d\" ", p->maxBitrate); fprintf(trace, "AverageBitRate=\"%d\">\n", p->avgBitrate); DumpBox(a, trace); gf_full_box_dump(a, trace); gf_box_dump_done("HintMediaHeaderBox", a, trace); return GF_OK; } GF_Err nmhd_dump(GF_Box *a, FILE * trace) { fprintf(trace, "<MPEGMediaHeaderBox>\n"); DumpBox(a, trace); gf_full_box_dump(a, trace); gf_box_dump_done("MPEGMediaHeaderBox", a, trace); return GF_OK; } GF_Err stbl_dump(GF_Box *a, FILE * trace) { GF_SampleTableBox *p; p = (GF_SampleTableBox *)a; fprintf(trace, "<SampleTableBox>\n"); DumpBox(a, trace); gf_box_dump_ex(p->SampleDescription, trace, GF_ISOM_BOX_TYPE_STSD); gf_box_dump_ex(p->TimeToSample, trace, GF_ISOM_BOX_TYPE_STTS); if (p->CompositionOffset) gf_box_dump(p->CompositionOffset, trace); if (p->CompositionToDecode) gf_box_dump(p->CompositionToDecode, trace); if (p->SyncSample) gf_box_dump(p->SyncSample, trace); if (p->ShadowSync) gf_box_dump(p->ShadowSync, trace); gf_box_dump_ex(p->SampleToChunk, trace, GF_ISOM_BOX_TYPE_STSC); gf_box_dump_ex(p->SampleSize, trace, GF_ISOM_BOX_TYPE_STSZ); gf_box_dump_ex(p->ChunkOffset, trace, GF_ISOM_BOX_TYPE_STCO); if (p->DegradationPriority) gf_box_dump(p->DegradationPriority, trace); if (p->SampleDep) gf_box_dump(p->SampleDep, trace); if (p->PaddingBits) gf_box_dump(p->PaddingBits, trace); if (p->SubSamples) gf_box_dump(p->SubSamples, trace); if (p->Fragments) gf_box_dump(p->Fragments, trace); if (p->sampleGroupsDescription) gf_box_array_dump(p->sampleGroupsDescription, trace); if (p->sampleGroups) gf_box_array_dump(p->sampleGroups, trace); if (p->sai_sizes) { u32 i; for (i = 0; i < gf_list_count(p->sai_sizes); i++) { GF_SampleAuxiliaryInfoSizeBox *saiz = (GF_SampleAuxiliaryInfoSizeBox *)gf_list_get(p->sai_sizes, i); gf_box_dump(saiz, trace); } } if (p->sai_offsets) { u32 i; for (i = 0; i < gf_list_count(p->sai_offsets); i++) { GF_SampleAuxiliaryInfoOffsetBox *saio = (GF_SampleAuxiliaryInfoOffsetBox *)gf_list_get(p->sai_offsets, i); gf_box_dump(saio, trace); } } gf_box_dump_done("SampleTableBox", a, trace); return GF_OK; } GF_Err dinf_dump(GF_Box *a, FILE * trace) { GF_DataInformationBox *p; p = (GF_DataInformationBox *)a; fprintf(trace, "<DataInformationBox>"); DumpBox(a, trace); gf_box_dump_ex(p->dref, trace, GF_ISOM_BOX_TYPE_DREF); gf_box_dump_done("DataInformationBox", a, trace); return GF_OK; } GF_Err url_dump(GF_Box *a, FILE * trace) { GF_DataEntryURLBox *p; p = (GF_DataEntryURLBox *)a; fprintf(trace, "<URLDataEntryBox"); if (p->location) { fprintf(trace, " URL=\"%s\">\n", p->location); } else { fprintf(trace, ">\n"); if (! (p->flags & 1) ) { fprintf(trace, "<!--ERROR: No location indicated-->\n"); } else { fprintf(trace, "<!--Data is contained in the movie file-->\n"); } } DumpBox(a, trace); gf_full_box_dump(a, trace); gf_box_dump_done("URLDataEntryBox", a, trace); return GF_OK; } GF_Err urn_dump(GF_Box *a, FILE * trace) { GF_DataEntryURNBox *p; p = (GF_DataEntryURNBox *)a; fprintf(trace, "<URNDataEntryBox"); if (p->nameURN) fprintf(trace, " URN=\"%s\"", p->nameURN); if (p->location) fprintf(trace, " URL=\"%s\"", p->location); fprintf(trace, ">\n"); DumpBox(a, trace); gf_full_box_dump(a, trace); gf_box_dump_done("URNDataEntryBox", a, trace); return GF_OK; } GF_Err cprt_dump(GF_Box *a, FILE * trace) { GF_CopyrightBox *p; p = (GF_CopyrightBox *)a; fprintf(trace, "<CopyrightBox LanguageCode=\"%s\" CopyrightNotice=\"%s\">\n", p->packedLanguageCode, p->notice); DumpBox(a, trace); gf_full_box_dump(a, trace); gf_box_dump_done("CopyrightBox", a, trace); return GF_OK; } GF_Err kind_dump(GF_Box *a, FILE * trace) { GF_KindBox *p; p = (GF_KindBox *)a; fprintf(trace, "<KindBox schemeURI=\"%s\" value=\"%s\">\n", p->schemeURI, (p->value ? p->value : "")); DumpBox(a, trace); gf_full_box_dump(a, trace); gf_box_dump_done("KindBox", a, trace); return GF_OK; } static char *format_duration(u64 dur, u32 timescale, char *szDur) { u32 h, m, s, ms; dur = (u32) (( ((Double) (s64) dur)/timescale)*1000); h = (u32) (dur / 3600000); dur -= h*3600000; m = (u32) (dur / 60000); dur -= m*60000; s = (u32) (dur/1000); dur -= s*1000; ms = (u32) (dur); sprintf(szDur, "%02d:%02d:%02d.%03d", h, m, s, ms); return szDur; } static void dump_escape_string(FILE * trace, char *name) { u32 i, len = (u32) strlen(name); for (i=0; i<len; i++) { if (name[i]=='"') fprintf(trace, "&quot;"); else fputc(name[i], trace); } } GF_Err chpl_dump(GF_Box *a, FILE * trace) { u32 i, count; char szDur[20]; GF_ChapterListBox *p = (GF_ChapterListBox *)a; fprintf(trace, "<ChapterListBox>\n"); DumpBox(a, trace); gf_full_box_dump(a, trace); count = gf_list_count(p->list); for (i=0; i<count; i++) { GF_ChapterEntry *ce = (GF_ChapterEntry *)gf_list_get(p->list, i); fprintf(trace, "<Chapter name=\""); dump_escape_string(trace, ce->name); fprintf(trace, "\" startTime=\"%s\" />\n", format_duration(ce->start_time, 1000*10000, szDur)); } gf_box_dump_done("ChapterListBox", a, trace); return GF_OK; } GF_Err dpin_dump(GF_Box *a, FILE * trace) { u32 i; GF_ProgressiveDownloadBox *p = (GF_ProgressiveDownloadBox *)a; fprintf(trace, "<ProgressiveDownloadBox>\n"); DumpBox(a, trace); gf_full_box_dump(a, trace); for (i=0; i<p->count; i++) { fprintf(trace, "<DownloadInfo rate=\"%d\" estimatedTime=\"%d\" />\n", p->rates[i], p->times[i]); } gf_box_dump_done("ProgressiveDownloadBox", a, trace); return GF_OK; } GF_Err hdlr_dump(GF_Box *a, FILE * trace) { GF_HandlerBox *p = (GF_HandlerBox *)a; if (p->nameUTF8 && (u32) p->nameUTF8[0] == strlen(p->nameUTF8+1)) { fprintf(trace, "<HandlerBox Type=\"%s\" Name=\"%s\" ", gf_4cc_to_str(p->handlerType), p->nameUTF8+1); } else { fprintf(trace, "<HandlerBox Type=\"%s\" Name=\"%s\" ", gf_4cc_to_str(p->handlerType), p->nameUTF8); } fprintf(trace, "reserved1=\"%d\" reserved2=\"", p->reserved1); DumpData(trace, (char *) p->reserved2, 12); fprintf(trace, "\""); fprintf(trace, ">\n"); DumpBox(a, trace); gf_full_box_dump(a, trace); gf_box_dump_done("HandlerBox", a, trace); return GF_OK; } GF_Err iods_dump(GF_Box *a, FILE * trace) { GF_ObjectDescriptorBox *p; p = (GF_ObjectDescriptorBox *)a; fprintf(trace, "<ObjectDescriptorBox>\n"); DumpBox(a, trace); gf_full_box_dump(a, trace); if (p->descriptor) { #ifndef GPAC_DISABLE_OD_DUMP gf_odf_dump_desc(p->descriptor, trace, 1, GF_TRUE); #else fprintf(trace, "<!-- Object Descriptor Dumping disabled in this build of GPAC -->\n"); #endif } else { fprintf(trace, "<!--WARNING: Object Descriptor not present-->\n"); } gf_box_dump_done("ObjectDescriptorBox", a, trace); return GF_OK; } GF_Err trak_dump(GF_Box *a, FILE * trace) { GF_TrackBox *p; p = (GF_TrackBox *)a; fprintf(trace, "<TrackBox>\n"); DumpBox(a, trace); if (p->Header) { gf_box_dump(p->Header, trace); } else { fprintf(trace, "<!--INVALID FILE: Missing Track Header-->\n"); } if (p->References) gf_box_dump(p->References, trace); if (p->meta) gf_box_dump(p->meta, trace); if (p->editBox) gf_box_dump(p->editBox, trace); if (p->Media) gf_box_dump(p->Media, trace); if (p->udta) gf_box_dump(p->udta, trace); gf_box_dump_done("TrackBox", a, trace); return GF_OK; } GF_Err mp4s_dump(GF_Box *a, FILE * trace) { GF_MPEGSampleEntryBox *p; p = (GF_MPEGSampleEntryBox *)a; fprintf(trace, "<MPEGSystemsSampleDescriptionBox DataReferenceIndex=\"%d\">\n", p->dataReferenceIndex); DumpBox(a, trace); if (p->esd) { gf_box_dump(p->esd, trace); } else { fprintf(trace, "<!--INVALID MP4 FILE: ESDBox not present in MPEG Sample Description or corrupted-->\n"); } if (a->type == GF_ISOM_BOX_TYPE_ENCS) { gf_box_array_dump(p->protections, trace); } gf_box_dump_done("MPEGSystemsSampleDescriptionBox", a, trace); return GF_OK; } void base_visual_entry_dump(GF_VisualSampleEntryBox *p, FILE * trace) { fprintf(trace, " DataReferenceIndex=\"%d\" Width=\"%d\" Height=\"%d\"", p->dataReferenceIndex, p->Width, p->Height); //dump reserved info fprintf(trace, " XDPI=\"%d\" YDPI=\"%d\" BitDepth=\"%d\"", p->horiz_res, p->vert_res, p->bit_depth); if (strlen((const char*)p->compressor_name) ) fprintf(trace, " CompressorName=\"%s\"\n", p->compressor_name+1); } GF_Err mp4v_dump(GF_Box *a, FILE * trace) { GF_MPEGVisualSampleEntryBox *p = (GF_MPEGVisualSampleEntryBox *)a; const char *name = p->avc_config ? "AVCSampleEntryBox" : "MPEGVisualSampleDescriptionBox"; fprintf(trace, "<%s", name); base_visual_entry_dump((GF_VisualSampleEntryBox *)p, trace); fprintf(trace, ">\n"); DumpBox(a, trace); if (p->esd) { gf_box_dump(p->esd, trace); } else { if (p->hevc_config) gf_box_dump(p->hevc_config, trace); if (p->avc_config) gf_box_dump(p->avc_config, trace); if (p->ipod_ext) gf_box_dump(p->ipod_ext, trace); if (p->descr) gf_box_dump(p->descr, trace); if (p->svc_config) gf_box_dump(p->svc_config, trace); if (p->shvc_config) gf_box_dump(p->shvc_config, trace); } if (a->type == GF_ISOM_BOX_TYPE_ENCV) { gf_box_array_dump(p->protections, trace); } if (p->pasp) gf_box_dump(p->pasp, trace); if (p->rvcc) gf_box_dump(p->rvcc, trace); gf_box_dump_done(NULL, a, trace); fprintf(trace, "</%s>\n", name); return GF_OK; } void base_audio_entry_dump(GF_AudioSampleEntryBox *p, FILE * trace) { fprintf(trace, " DataReferenceIndex=\"%d\" SampleRate=\"%d\"", p->dataReferenceIndex, p->samplerate_hi); fprintf(trace, " Channels=\"%d\" BitsPerSample=\"%d\"", p->channel_count, p->bitspersample); } GF_Err mp4a_dump(GF_Box *a, FILE * trace) { GF_MPEGAudioSampleEntryBox *p; p = (GF_MPEGAudioSampleEntryBox *)a; fprintf(trace, "<MPEGAudioSampleDescriptionBox"); base_audio_entry_dump((GF_AudioSampleEntryBox *)p, trace); fprintf(trace, ">\n"); DumpBox(a, trace); if (p->esd) { gf_box_dump(p->esd, trace); } else { fprintf(trace, "<!--INVALID MP4 FILE: ESDBox not present in MPEG Sample Description or corrupted-->\n"); } if (a->type == GF_ISOM_BOX_TYPE_ENCA) { gf_box_array_dump(p->protections, trace); } gf_box_dump_done("MPEGAudioSampleDescriptionBox", a, trace); return GF_OK; } GF_Err gnrm_dump(GF_Box *a, FILE * trace) { GF_GenericSampleEntryBox *p = (GF_GenericSampleEntryBox *)a; fprintf(trace, "<SampleDescriptionBox DataReferenceIndex=\"%d\" ExtensionDataSize=\"%d\">\n", p->dataReferenceIndex, p->data_size); a->type = p->EntryType; DumpBox(a, trace); a->type = GF_ISOM_BOX_TYPE_GNRM; gf_box_dump_done("SampleDescriptionBox", a, trace); return GF_OK; } GF_Err gnrv_dump(GF_Box *a, FILE * trace) { GF_GenericVisualSampleEntryBox *p = (GF_GenericVisualSampleEntryBox *)a; fprintf(trace, "<VisualSampleDescriptionBox 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", p->dataReferenceIndex, p->version, p->revision, p->vendor, p->temporal_quality, p->spatial_quality, p->Width, p->Height, p->horiz_res, p->vert_res, p->compressor_name+1, p->bit_depth); a->type = p->EntryType; DumpBox(a, trace); a->type = GF_ISOM_BOX_TYPE_GNRV; gf_box_dump_done("VisualSampleDescriptionBox", a, trace); return GF_OK; } GF_Err gnra_dump(GF_Box *a, FILE * trace) { GF_GenericAudioSampleEntryBox *p = (GF_GenericAudioSampleEntryBox *)a; fprintf(trace, "<AudioSampleDescriptionBox DataReferenceIndex=\"%d\" Version=\"%d\" Revision=\"%d\" Vendor=\"%d\" ChannelCount=\"%d\" BitsPerSample=\"%d\" Samplerate=\"%d\">\n", p->dataReferenceIndex, p->version, p->revision, p->vendor, p->channel_count, p->bitspersample, p->samplerate_hi); a->type = p->EntryType; DumpBox(a, trace); a->type = GF_ISOM_BOX_TYPE_GNRA; gf_box_dump_done("AudioSampleDescriptionBox", a, trace); return GF_OK; } GF_Err edts_dump(GF_Box *a, FILE * trace) { GF_EditBox *p; p = (GF_EditBox *)a; fprintf(trace, "<EditBox>\n"); DumpBox(a, trace); gf_box_dump_ex(p->editList, trace, GF_ISOM_BOX_TYPE_ELST); gf_box_dump_done("EditBox", a, trace); return GF_OK; } GF_Err udta_dump(GF_Box *a, FILE * trace) { GF_UserDataBox *p; GF_UserDataMap *map; u32 i; p = (GF_UserDataBox *)a; fprintf(trace, "<UserDataBox>\n"); DumpBox(a, trace); i=0; while ((map = (GF_UserDataMap *)gf_list_enum(p->recordList, &i))) { gf_box_array_dump(map->other_boxes, trace); } gf_box_dump_done("UserDataBox", a, trace); return GF_OK; } GF_Err dref_dump(GF_Box *a, FILE * trace) { // GF_DataReferenceBox *p = (GF_DataReferenceBox *)a; fprintf(trace, "<DataReferenceBox>\n"); DumpBox(a, trace); gf_full_box_dump(a, trace); gf_box_dump_done("DataReferenceBox", a, trace); return GF_OK; } GF_Err stsd_dump(GF_Box *a, FILE * trace) { // GF_SampleDescriptionBox *p = (GF_SampleDescriptionBox *)a; fprintf(trace, "<SampleDescriptionBox>\n"); DumpBox(a, trace); gf_full_box_dump(a, trace); gf_box_dump_done("SampleDescriptionBox", a, trace); return GF_OK; } GF_Err stts_dump(GF_Box *a, FILE * trace) { GF_TimeToSampleBox *p; u32 i, nb_samples; p = (GF_TimeToSampleBox *)a; fprintf(trace, "<TimeToSampleBox EntryCount=\"%d\">\n", p->nb_entries); DumpBox(a, trace); gf_full_box_dump(a, trace); nb_samples = 0; for (i=0; i<p->nb_entries; i++) { fprintf(trace, "<TimeToSampleEntry SampleDelta=\"%d\" SampleCount=\"%d\"/>\n", p->entries[i].sampleDelta, p->entries[i].sampleCount); nb_samples += p->entries[i].sampleCount; } fprintf(trace, "<!-- counted %d samples in STTS entries -->\n", nb_samples); gf_box_dump_done("TimeToSampleBox", a, trace); return GF_OK; } GF_Err ctts_dump(GF_Box *a, FILE * trace) { GF_CompositionOffsetBox *p; u32 i, nb_samples; p = (GF_CompositionOffsetBox *)a; fprintf(trace, "<CompositionOffsetBox EntryCount=\"%d\">\n", p->nb_entries); DumpBox(a, trace); gf_full_box_dump(a, trace); nb_samples = 0; for (i=0; i<p->nb_entries; i++) { fprintf(trace, "<CompositionOffsetEntry CompositionOffset=\"%d\" SampleCount=\"%d\"/>\n", p->entries[i].decodingOffset, p->entries[i].sampleCount); nb_samples += p->entries[i].sampleCount; } fprintf(trace, "<!-- counted %d samples in CTTS entries -->\n", nb_samples); gf_box_dump_done("CompositionOffsetBox", a, trace); return GF_OK; } GF_Err cslg_dump(GF_Box *a, FILE * trace) { GF_CompositionToDecodeBox *p; p = (GF_CompositionToDecodeBox *)a; fprintf(trace, "<CompositionToDecodeBox compositionToDTSShift=\"%d\" leastDecodeToDisplayDelta=\"%d\" compositionStartTime=\"%d\" compositionEndTime=\"%d\">\n", p->leastDecodeToDisplayDelta, p->greatestDecodeToDisplayDelta, p->compositionStartTime, p->compositionEndTime); DumpBox(a, trace); gf_full_box_dump(a, trace); gf_box_dump_done("CompositionToDecodeBox", a, trace); return GF_OK; } GF_Err stsh_dump(GF_Box *a, FILE * trace) { GF_ShadowSyncBox *p; u32 i; GF_StshEntry *t; p = (GF_ShadowSyncBox *)a; fprintf(trace, "<SyncShadowBox EntryCount=\"%d\">\n", gf_list_count(p->entries)); DumpBox(a, trace); gf_full_box_dump(a, trace); i=0; while ((t = (GF_StshEntry *)gf_list_enum(p->entries, &i))) { fprintf(trace, "<SyncShadowEntry ShadowedSample=\"%d\" SyncSample=\"%d\"/>\n", t->shadowedSampleNumber, t->syncSampleNumber); } gf_box_dump_done("SyncShadowBox", a, trace); return GF_OK; } GF_Err elst_dump(GF_Box *a, FILE * trace) { GF_EditListBox *p; u32 i; GF_EdtsEntry *t; p = (GF_EditListBox *)a; fprintf(trace, "<EditListBox EntryCount=\"%d\">\n", gf_list_count(p->entryList)); DumpBox(a, trace); gf_full_box_dump(a, trace); i=0; while ((t = (GF_EdtsEntry *)gf_list_enum(p->entryList, &i))) { fprintf(trace, "<EditListEntry Duration=\""LLD"\" MediaTime=\""LLD"\" MediaRate=\"%u\"/>\n", LLD_CAST t->segmentDuration, LLD_CAST t->mediaTime, t->mediaRate); } gf_box_dump_done("EditListBox", a, trace); return GF_OK; } GF_Err stsc_dump(GF_Box *a, FILE * trace) { GF_SampleToChunkBox *p; u32 i, nb_samples; p = (GF_SampleToChunkBox *)a; fprintf(trace, "<SampleToChunkBox EntryCount=\"%d\">\n", p->nb_entries); DumpBox(a, trace); gf_full_box_dump(a, trace); nb_samples = 0; for (i=0; i<p->nb_entries; i++) { fprintf(trace, "<SampleToChunkEntry FirstChunk=\"%d\" SamplesPerChunk=\"%d\" SampleDescriptionIndex=\"%d\"/>\n", p->entries[i].firstChunk, p->entries[i].samplesPerChunk, p->entries[i].sampleDescriptionIndex); if (i+1<p->nb_entries) { nb_samples += (p->entries[i+1].firstChunk - p->entries[i].firstChunk) * p->entries[i].samplesPerChunk; } else { nb_samples += p->entries[i].samplesPerChunk; } } fprintf(trace, "<!-- counted %d samples in STSC entries (could be less than sample count) -->\n", nb_samples); gf_box_dump_done("SampleToChunkBox", a, trace); return GF_OK; } GF_Err stsz_dump(GF_Box *a, FILE * trace) { GF_SampleSizeBox *p; u32 i; p = (GF_SampleSizeBox *)a; fprintf(trace, "<%sBox SampleCount=\"%d\"", (a->type == GF_ISOM_BOX_TYPE_STSZ) ? "SampleSize" : "CompactSampleSize", p->sampleCount); if (a->type == GF_ISOM_BOX_TYPE_STSZ) { if (p->sampleSize) { fprintf(trace, " ConstantSampleSize=\"%d\"", p->sampleSize); } } else { fprintf(trace, " SampleSizeBits=\"%d\"", p->sampleSize); } fprintf(trace, ">\n"); DumpBox(a, trace); gf_full_box_dump(a, trace); if ((a->type != GF_ISOM_BOX_TYPE_STSZ) || !p->sampleSize) { if (!p->sizes) { fprintf(trace, "<!--WARNING: No Sample Size indications-->\n"); } else { for (i=0; i<p->sampleCount; i++) { fprintf(trace, "<SampleSizeEntry Size=\"%d\"/>\n", p->sizes[i]); } } } gf_box_dump_done(NULL, a, trace); fprintf(trace, "</%sBox>\n", (a->type == GF_ISOM_BOX_TYPE_STSZ) ? "SampleSize" : "CompactSampleSize"); return GF_OK; } GF_Err stco_dump(GF_Box *a, FILE * trace) { GF_ChunkOffsetBox *p; u32 i; p = (GF_ChunkOffsetBox *)a; fprintf(trace, "<ChunkOffsetBox EntryCount=\"%d\">\n", p->nb_entries); DumpBox(a, trace); gf_full_box_dump(a, trace); if (!p->offsets) { fprintf(trace, "<!--Warning: No Chunk Offsets indications-->\n"); } else { for (i=0; i<p->nb_entries; i++) { fprintf(trace, "<ChunkEntry offset=\"%d\"/>\n", p->offsets[i]); } } gf_box_dump_done("ChunkOffsetBox", a, trace); return GF_OK; } GF_Err stss_dump(GF_Box *a, FILE * trace) { GF_SyncSampleBox *p; u32 i; p = (GF_SyncSampleBox *)a; fprintf(trace, "<SyncSampleBox EntryCount=\"%d\">\n", p->nb_entries); DumpBox(a, trace); gf_full_box_dump(a, trace); if (!p->sampleNumbers) { fprintf(trace, "<!--Warning: No Key Frames indications-->\n"); } else { for (i=0; i<p->nb_entries; i++) { fprintf(trace, "<SyncSampleEntry sampleNumber=\"%d\"/>\n", p->sampleNumbers[i]); } } gf_box_dump_done("SyncSampleBox", a, trace); return GF_OK; } GF_Err stdp_dump(GF_Box *a, FILE * trace) { GF_DegradationPriorityBox *p; u32 i; p = (GF_DegradationPriorityBox *)a; fprintf(trace, "<DegradationPriorityBox EntryCount=\"%d\">\n", p->nb_entries); DumpBox(a, trace); gf_full_box_dump(a, trace); if (!p->priorities) { fprintf(trace, "<!--Warning: No Degradation Priority indications-->\n"); } else { for (i=0; i<p->nb_entries; i++) { fprintf(trace, "<DegradationPriorityEntry DegradationPriority=\"%d\"/>\n", p->priorities[i]); } } gf_box_dump_done("DegradationPriorityBox", a, trace); return GF_OK; } GF_Err sdtp_dump(GF_Box *a, FILE * trace) { GF_SampleDependencyTypeBox *p; u32 i; p = (GF_SampleDependencyTypeBox*)a; fprintf(trace, "<SampleDependencyTypeBox SampleCount=\"%d\">\n", p->sampleCount); DumpBox(a, trace); gf_full_box_dump(a, trace); if (!p->sample_info) { fprintf(trace, "<!--Warning: No sample dependencies indications-->\n"); } else { for (i=0; i<p->sampleCount; i++) { u8 flag = p->sample_info[i]; fprintf(trace, "<SampleDependencyEntry "); switch ( (flag >> 4) & 3) { case 0: fprintf(trace, "dependsOnOther=\"unknown\" "); break; case 1: fprintf(trace, "dependsOnOther=\"yes\" "); break; case 2: fprintf(trace, "dependsOnOther=\"no\" "); break; case 3: fprintf(trace, "dependsOnOther=\"!! RESERVED !!\" "); break; } switch ( (flag >> 2) & 3) { case 0: fprintf(trace, "dependedOn=\"unknown\" "); break; case 1: fprintf(trace, "dependedOn=\"yes\" "); break; case 2: fprintf(trace, "dependedOn=\"no\" "); break; case 3: fprintf(trace, "dependedOn=\"!! RESERVED !!\" "); break; } switch ( flag & 3) { case 0: fprintf(trace, "hasRedundancy=\"unknown\" "); break; case 1: fprintf(trace, "hasRedundancy=\"yes\" "); break; case 2: fprintf(trace, "hasRedundancy=\"no\" "); break; case 3: fprintf(trace, "hasRedundancy=\"!! RESERVED !!\" "); break; } fprintf(trace, " />\n"); } } gf_box_dump_done("SampleDependencyTypeBox", a, trace); return GF_OK; } GF_Err co64_dump(GF_Box *a, FILE * trace) { GF_ChunkLargeOffsetBox *p; u32 i; p = (GF_ChunkLargeOffsetBox *)a; fprintf(trace, "<ChunkLargeOffsetBox EntryCount=\"%d\">\n", p->nb_entries); DumpBox(a, trace); gf_full_box_dump(a, trace); if (!p->offsets) { fprintf(trace, "<Warning: No Chunk Offsets indications/>\n"); } else { for (i=0; i<p->nb_entries; i++) fprintf(trace, "<ChunkOffsetEntry offset=\""LLD"\"/>\n", LLD_CAST p->offsets[i]); } gf_box_dump_done("ChunkLargeOffsetBox", a, trace); return GF_OK; } GF_Err esds_dump(GF_Box *a, FILE * trace) { GF_ESDBox *p; p = (GF_ESDBox *)a; fprintf(trace, "<MPEG4ESDescriptorBox>\n"); DumpBox(a, trace); gf_full_box_dump(a, trace); if (p->desc) { #ifndef GPAC_DISABLE_OD_DUMP gf_odf_dump_desc(p->desc, trace, 1, GF_TRUE); #else fprintf(trace, "<!-- Object Descriptor Dumping disabled in this build of GPAC -->\n"); #endif } else { fprintf(trace, "<!--INVALID MP4 FILE: ESD not present in MPEG Sample Description or corrupted-->\n"); } gf_box_dump_done("MPEG4ESDescriptorBox", a, trace); return GF_OK; } GF_Err minf_dump(GF_Box *a, FILE * trace) { GF_MediaInformationBox *p; p = (GF_MediaInformationBox *)a; fprintf(trace, "<MediaInformationBox>\n"); DumpBox(a, trace); gf_box_dump_ex(p->InfoHeader, trace, GF_ISOM_BOX_TYPE_NMHD); gf_box_dump_ex(p->dataInformation, trace, GF_ISOM_BOX_TYPE_DINF); gf_box_dump_ex(p->sampleTable, trace, GF_ISOM_BOX_TYPE_STBL); gf_box_dump_done("MediaInformationBox", a, trace); return GF_OK; } GF_Err tkhd_dump(GF_Box *a, FILE * trace) { GF_TrackHeaderBox *p; p = (GF_TrackHeaderBox *)a; fprintf(trace, "<TrackHeaderBox "); fprintf(trace, "CreationTime=\""LLD"\" ModificationTime=\""LLD"\" TrackID=\"%u\" Duration=\""LLD"\"", LLD_CAST p->creationTime, LLD_CAST p->modificationTime, p->trackID, LLD_CAST p->duration); if (p->alternate_group) fprintf(trace, " AlternateGroupID=\"%d\"", p->alternate_group); if (p->volume) { fprintf(trace, " Volume=\"%.2f\"", (Float)p->volume / 256); } else if (p->width || p->height) { fprintf(trace, " Width=\"%.2f\" Height=\"%.2f\"", (Float)p->width / 65536, (Float)p->height / 65536); if (p->layer) fprintf(trace, " Layer=\"%d\"", p->layer); } fprintf(trace, ">\n"); if (p->width || p->height) { fprintf(trace, "<Matrix m11=\"0x%.8x\" m12=\"0x%.8x\" m13=\"0x%.8x\" \ m21=\"0x%.8x\" m22=\"0x%.8x\" m23=\"0x%.8x\" \ m31=\"0x%.8x\" m32=\"0x%.8x\" m33=\"0x%.8x\"/>", p->matrix[0], p->matrix[1], p->matrix[2], p->matrix[3], p->matrix[4], p->matrix[5], p->matrix[6], p->matrix[7], p->matrix[8]); } DumpBox(a, trace); gf_full_box_dump(a, trace); gf_box_dump_done("TrackHeaderBox", a, trace); return GF_OK; } GF_Err tref_dump(GF_Box *a, FILE * trace) { // GF_TrackReferenceBox *p = (GF_TrackReferenceBox *)a; fprintf(trace, "<TrackReferenceBox>\n"); DumpBox(a, trace); gf_box_dump_done("TrackReferenceBox", a, trace); return GF_OK; } GF_Err mdia_dump(GF_Box *a, FILE * trace) { GF_MediaBox *p = (GF_MediaBox *)a; fprintf(trace, "<MediaBox>\n"); DumpBox(a, trace); gf_box_dump_ex(p->mediaHeader, trace, GF_ISOM_BOX_TYPE_MDHD); gf_box_dump_ex(p->handler, trace,GF_ISOM_BOX_TYPE_HDLR); gf_box_dump_ex(p->information, trace, GF_ISOM_BOX_TYPE_MINF); gf_box_dump_done("MediaBox", a, trace); return GF_OK; } GF_Err elng_dump(GF_Box *a, FILE * trace) { GF_ExtendedLanguageBox *p = (GF_ExtendedLanguageBox *)a; fprintf(trace, "<ExtendedLanguageBox LanguageCode=\"%s\">\n", p->extended_language); DumpBox(a, trace); gf_box_dump_done("ExtendedLanguageBox", a, trace); return GF_OK; } GF_Err defa_dump(GF_Box *a, FILE * trace) { fprintf(trace, "<UnknownBox>\n"); DumpBox(a, trace); fprintf(trace, "</UnknownBox>\n"); return GF_OK; } GF_Err void_dump(GF_Box *a, FILE * trace) { fprintf(trace, "<VoidBox/>\n"); return GF_OK; } GF_Err ftyp_dump(GF_Box *a, FILE * trace) { GF_FileTypeBox *p; u32 i; p = (GF_FileTypeBox *)a; fprintf(trace, "<%s MajorBrand=\"%s\" MinorVersion=\"%d\">\n", (a->type == GF_ISOM_BOX_TYPE_FTYP ? "FileTypeBox" : "SegmentTypeBox"), gf_4cc_to_str(p->majorBrand), p->minorVersion); DumpBox(a, trace); for (i=0; i<p->altCount; i++) { fprintf(trace, "<BrandEntry AlternateBrand=\"%s\"/>\n", gf_4cc_to_str(p->altBrand[i])); } gf_box_dump_done(NULL, a, trace); fprintf(trace, "</%s>\n",(a->type == GF_ISOM_BOX_TYPE_FTYP ? "FileTypeBox" : "SegmentTypeBox")); return GF_OK; } GF_Err padb_dump(GF_Box *a, FILE * trace) { GF_PaddingBitsBox *p; u32 i; p = (GF_PaddingBitsBox *)a; fprintf(trace, "<PaddingBitsBox EntryCount=\"%d\">\n", p->SampleCount); DumpBox(a, trace); for (i=0; i<p->SampleCount; i+=1) { fprintf(trace, "<PaddingBitsEntry PaddingBits=\"%d\"/>\n", p->padbits[i]); } gf_box_dump_done("PaddingBitsBox", a, trace); return GF_OK; } GF_Err stsf_dump(GF_Box *a, FILE * trace) { GF_SampleFragmentBox *p; GF_StsfEntry *ent; u32 i, j, count; p = (GF_SampleFragmentBox *)a; count = gf_list_count(p->entryList); fprintf(trace, "<SampleFragmentBox EntryCount=\"%d\">\n", count); DumpBox(a, trace); for (i=0; i<count; i++) { ent = (GF_StsfEntry *)gf_list_get(p->entryList, i); fprintf(trace, "<SampleFragmentEntry SampleNumber=\"%d\" FragmentCount=\"%d\">\n", ent->SampleNumber, ent->fragmentCount); for (j=0; j<ent->fragmentCount; j++) fprintf(trace, "<FragmentSizeEntry size=\"%d\"/>\n", ent->fragmentSizes[j]); fprintf(trace, "</SampleFragmentEntry>\n"); } gf_box_dump_done("SampleFragmentBox", a, trace); return GF_OK; } GF_Err gppa_dump(GF_Box *a, FILE * trace) { char *szName; GF_3GPPAudioSampleEntryBox *p = (GF_3GPPAudioSampleEntryBox *)a; switch (p->type) { case GF_ISOM_SUBTYPE_3GP_AMR: szName = "AMRSampleDescription"; break; case GF_ISOM_SUBTYPE_3GP_AMR_WB: szName = "AMR_WB_SampleDescription"; break; case GF_ISOM_SUBTYPE_3GP_EVRC: szName = "EVRCSampleDescription"; break; case GF_ISOM_SUBTYPE_3GP_QCELP: szName = "QCELPSampleDescription"; break; case GF_ISOM_SUBTYPE_3GP_SMV: szName = "SMVSampleDescription"; break; default: szName = "3GPAudioSampleDescription"; break; } fprintf(trace, "<%sBox", szName); base_audio_entry_dump((GF_AudioSampleEntryBox *)p, trace); fprintf(trace, ">\n"); DumpBox(a, trace); if (p->info) { gf_box_dump(p->info, trace); } else { fprintf(trace, "<!--INVALID 3GPP FILE: Config not present in Sample Description-->\n"); } gf_box_dump_done(NULL, a, trace); fprintf(trace, "</%sBox>\n", szName); return GF_OK; } GF_Err gppv_dump(GF_Box *a, FILE * trace) { char *szName; GF_3GPPVisualSampleEntryBox *p = (GF_3GPPVisualSampleEntryBox *)a; switch (p->type) { case GF_ISOM_SUBTYPE_3GP_H263: szName = "H263SampleDescription"; break; default: szName = "3GPVisualSampleDescription"; break; } fprintf(trace, "<%sBox", szName); base_visual_entry_dump((GF_VisualSampleEntryBox *)p, trace); fprintf(trace, ">\n"); DumpBox(a, trace); if (p->info) { gf_box_dump(p->info, trace); } else { fprintf(trace, "<!--INVALID 3GPP FILE: Config not present in Sample Description-->\n"); } gf_box_dump_done(NULL, a, trace); fprintf(trace, "</%sBox>\n", szName); return GF_OK; } GF_Err gppc_dump(GF_Box *a, FILE * trace) { GF_3GPPConfigBox *p = (GF_3GPPConfigBox *)a; const char *name = gf_4cc_to_str(p->cfg.vendor); switch (p->cfg.type) { case GF_ISOM_SUBTYPE_3GP_AMR: case GF_ISOM_SUBTYPE_3GP_AMR_WB: fprintf(trace, "<AMRConfigurationBox Vendor=\"%s\" Version=\"%d\"", name, p->cfg.decoder_version); fprintf(trace, " FramesPerSample=\"%d\" SupportedModes=\"%x\" ModeRotating=\"%d\"", p->cfg.frames_per_sample, p->cfg.AMR_mode_set, p->cfg.AMR_mode_change_period); fprintf(trace, ">\n"); DumpBox(a, trace); gf_box_dump_done("AMRConfigurationBox", a, trace); break; case GF_ISOM_SUBTYPE_3GP_EVRC: fprintf(trace, "<EVRCConfigurationBox Vendor=\"%s\" Version=\"%d\" FramesPerSample=\"%d\" >\n", name, p->cfg.decoder_version, p->cfg.frames_per_sample); DumpBox(a, trace); gf_box_dump_done("EVRCConfigurationBox", a, trace); break; case GF_ISOM_SUBTYPE_3GP_QCELP: fprintf(trace, "<QCELPConfigurationBox Vendor=\"%s\" Version=\"%d\" FramesPerSample=\"%d\" >\n", name, p->cfg.decoder_version, p->cfg.frames_per_sample); DumpBox(a, trace); gf_box_dump_done("QCELPConfigurationBox", a, trace); break; case GF_ISOM_SUBTYPE_3GP_SMV: fprintf(trace, "<SMVConfigurationBox Vendor=\"%s\" Version=\"%d\" FramesPerSample=\"%d\" >\n", name, p->cfg.decoder_version, p->cfg.frames_per_sample); DumpBox(a, trace); gf_box_dump_done("SMVConfigurationBox", a, trace); break; case GF_ISOM_SUBTYPE_3GP_H263: fprintf(trace, "<H263ConfigurationBox Vendor=\"%s\" Version=\"%d\"", name, p->cfg.decoder_version); fprintf(trace, " Profile=\"%d\" Level=\"%d\"", p->cfg.H263_profile, p->cfg.H263_level); fprintf(trace, ">\n"); DumpBox(a, trace); gf_box_dump_done("H263ConfigurationBox", a, trace); break; default: break; } return GF_OK; } GF_Err avcc_dump(GF_Box *a, FILE * trace) { u32 i, count; GF_AVCConfigurationBox *p = (GF_AVCConfigurationBox *) a; const char *name = (p->type==GF_ISOM_BOX_TYPE_SVCC) ? "SVC" : "AVC"; fprintf(trace, "<%sConfigurationBox>\n", name); fprintf(trace, "<%sDecoderConfigurationRecord configurationVersion=\"%d\" AVCProfileIndication=\"%d\" profile_compatibility=\"%d\" AVCLevelIndication=\"%d\" nal_unit_size=\"%d\"", name, p->config->configurationVersion, p->config->AVCProfileIndication, p->config->profile_compatibility, p->config->AVCLevelIndication, p->config->nal_unit_size); if (p->type==GF_ISOM_BOX_TYPE_SVCC) fprintf(trace, " complete_representation=\"%d\"", p->config->complete_representation); if (p->type==GF_ISOM_BOX_TYPE_AVCC) { switch (p->config->AVCProfileIndication) { case 100: case 110: case 122: case 144: fprintf(trace, " chroma_format=\"%d\" luma_bit_depth=\"%d\" chroma_bit_depth=\"%d\"", p->config->chroma_format, p->config->luma_bit_depth, p->config->chroma_bit_depth); break; } } fprintf(trace, ">\n"); count = gf_list_count(p->config->sequenceParameterSets); for (i=0; i<count; i++) { GF_AVCConfigSlot *c = (GF_AVCConfigSlot *)gf_list_get(p->config->sequenceParameterSets, i); fprintf(trace, "<SequenceParameterSet size=\"%d\" content=\"", c->size); DumpData(trace, c->data, c->size); fprintf(trace, "\"/>\n"); } count = gf_list_count(p->config->pictureParameterSets); for (i=0; i<count; i++) { GF_AVCConfigSlot *c = (GF_AVCConfigSlot *)gf_list_get(p->config->pictureParameterSets, i); fprintf(trace, "<PictureParameterSet size=\"%d\" content=\"", c->size); DumpData(trace, c->data, c->size); fprintf(trace, "\"/>\n"); } if (p->config->sequenceParameterSetExtensions) { count = gf_list_count(p->config->sequenceParameterSetExtensions); for (i=0; i<count; i++) { GF_AVCConfigSlot *c = (GF_AVCConfigSlot *)gf_list_get(p->config->sequenceParameterSetExtensions, i); fprintf(trace, "<SequenceParameterSetExtensions size=\"%d\" content=\"", c->size); DumpData(trace, c->data, c->size); fprintf(trace, "\"/>\n"); } } fprintf(trace, "</%sDecoderConfigurationRecord>\n", name); DumpBox(a, trace); gf_box_dump_done(NULL, a, trace); fprintf(trace, "</%sConfigurationBox>\n", name); return GF_OK; } GF_Err hvcc_dump(GF_Box *a, FILE * trace) { u32 i, count; const char *name = (a->type==GF_ISOM_BOX_TYPE_HVCC) ? "HEVC" : "SHVC"; GF_HEVCConfigurationBox *p = (GF_HEVCConfigurationBox *) a; fprintf(trace, "<%sConfigurationBox>\n", name); fprintf(trace, "<%sDecoderConfigurationRecord nal_unit_size=\"%d\" ", name, p->config->nal_unit_size); fprintf(trace, "configurationVersion=\"%d\" ", p->config->configurationVersion); fprintf(trace, "profile_space=\"%d\" ", p->config->profile_space); fprintf(trace, "tier_flag=\"%d\" ", p->config->tier_flag); fprintf(trace, "profile_idc=\"%d\" ", p->config->profile_idc); fprintf(trace, "general_profile_compatibility_flags=\"%d\" ", p->config->general_profile_compatibility_flags); fprintf(trace, "progressive_source_flag=\"%d\" ", p->config->progressive_source_flag); fprintf(trace, "interlaced_source_flag=\"%d\" ", p->config->interlaced_source_flag); fprintf(trace, "non_packed_constraint_flag=\"%d\" ", p->config->non_packed_constraint_flag); fprintf(trace, "frame_only_constraint_flag=\"%d\" ", p->config->frame_only_constraint_flag); fprintf(trace, "constraint_indicator_flags=\""LLD"\" ", p->config->constraint_indicator_flags); fprintf(trace, "level_idc=\"%d\" ", p->config->level_idc); fprintf(trace, "min_spatial_segmentation_idc=\"%d\" ", p->config->min_spatial_segmentation_idc); fprintf(trace, "parallelismType=\"%d\" ", p->config->parallelismType); fprintf(trace, "chroma_format=\"%d\" luma_bit_depth=\"%d\" chroma_bit_depth=\"%d\" avgFrameRate=\"%d\" constantFrameRate=\"%d\" numTemporalLayers=\"%d\" temporalIdNested=\"%d\"", 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); if (p->config->is_shvc) { fprintf(trace, " completeRepresentation=\"%d\" nonHEVCBaseLayer=\"%d\" numLayers=\"%d\" scalabilityMask=\"0x%02X\" ", p->config->complete_representation, p->config->non_hevc_base_layer, p->config->num_layers, p->config->scalability_mask); } fprintf(trace, ">\n"); count = gf_list_count(p->config->param_array); for (i=0; i<count; i++) { u32 nalucount, j; GF_HEVCParamArray *ar = (GF_HEVCParamArray*)gf_list_get(p->config->param_array, i); fprintf(trace, "<ParameterSetArray nalu_type=\"%d\" complete_set=\"%d\">\n", ar->type, ar->array_completeness); nalucount = gf_list_count(ar->nalus); for (j=0; j<nalucount; j++) { GF_AVCConfigSlot *c = (GF_AVCConfigSlot *)gf_list_get(ar->nalus, j); fprintf(trace, "<ParameterSet size=\"%d\" content=\"", c->size); DumpData(trace, c->data, c->size); fprintf(trace, "\"/>\n"); } fprintf(trace, "</ParameterSetArray>\n"); } fprintf(trace, "</%sDecoderConfigurationRecord>\n", name); DumpBox(a, trace); gf_box_dump_done(NULL, a, trace); fprintf(trace, "</%sConfigurationBox>\n", name); return GF_OK; } GF_Err m4ds_dump(GF_Box *a, FILE * trace) { u32 i; GF_Descriptor *desc; GF_MPEG4ExtensionDescriptorsBox *p = (GF_MPEG4ExtensionDescriptorsBox *) a; fprintf(trace, "<MPEG4ExtensionDescriptorsBox>\n"); i=0; while ((desc = (GF_Descriptor *)gf_list_enum(p->descriptors, &i))) { #ifndef GPAC_DISABLE_OD_DUMP gf_odf_dump_desc(desc, trace, 1, GF_TRUE); #else fprintf(trace, "<!-- Object Descriptor Dumping disabled in this build of GPAC -->\n"); #endif } DumpBox(a, trace); gf_box_dump_done("MPEG4ExtensionDescriptorsBox", a, trace); return GF_OK; } GF_Err btrt_dump(GF_Box *a, FILE * trace) { GF_BitRateBox *p = (GF_BitRateBox*)a; fprintf(trace, "<BitRateBox BufferSizeDB=\"%d\" avgBitRate=\"%d\" maxBitRate=\"%d\">\n", p->bufferSizeDB, p->avgBitrate, p->maxBitrate); DumpBox(a, trace); gf_box_dump_done("BitRateBox", a, trace); return GF_OK; } GF_Err ftab_dump(GF_Box *a, FILE * trace) { u32 i; GF_FontTableBox *p = (GF_FontTableBox *)a; fprintf(trace, "<FontTableBox>\n"); DumpBox(a, trace); for (i=0; i<p->entry_count; i++) { fprintf(trace, "<FontRecord ID=\"%d\" name=\"%s\"/>\n", p->fonts[i].fontID, p->fonts[i].fontName ? p->fonts[i].fontName : "NULL"); } gf_box_dump_done("FontTableBox", a, trace); return GF_OK; } static void gpp_dump_rgba8(FILE * trace, char *name, u32 col) { fprintf(trace, "%s=\"%x %x %x %x\"", name, (col>>16)&0xFF, (col>>8)&0xFF, (col)&0xFF, (col>>24)&0xFF); } static void gpp_dump_rgb16(FILE * trace, char *name, char col[6]) { fprintf(trace, "%s=\"%x %x %x\"", name, *((u16*)col), *((u16*)(col+1)), *((u16*)(col+2))); } static void gpp_dump_box(FILE * trace, GF_BoxRecord *rec) { fprintf(trace, "<BoxRecord top=\"%d\" left=\"%d\" bottom=\"%d\" right=\"%d\"/>\n", rec->top, rec->left, rec->bottom, rec->right); } static void gpp_dump_style(FILE * trace, GF_StyleRecord *rec) { fprintf(trace, "<StyleRecord startChar=\"%d\" endChar=\"%d\" fontID=\"%d\" styles=\"", rec->startCharOffset, rec->endCharOffset, rec->fontID); if (!rec->style_flags) { fprintf(trace, "Normal"); } else { if (rec->style_flags & 1) fprintf(trace, "Bold "); if (rec->style_flags & 2) fprintf(trace, "Italic "); if (rec->style_flags & 4) fprintf(trace, "Underlined "); } fprintf(trace, "\" fontSize=\"%d\" ", rec->font_size); gpp_dump_rgba8(trace, "textColor", rec->text_color); fprintf(trace, "/>\n"); } GF_Err tx3g_dump(GF_Box *a, FILE * trace) { GF_Tx3gSampleEntryBox *p = (GF_Tx3gSampleEntryBox *)a; fprintf(trace, "<Tx3gSampleEntryBox dataReferenceIndex=\"%d\" displayFlags=\"%x\" horizontal-justification=\"%d\" vertical-justification=\"%d\" ", p->dataReferenceIndex, p->displayFlags, p->horizontal_justification, p->vertical_justification); gpp_dump_rgba8(trace, "backgroundColor", p->back_color); fprintf(trace, ">\n"); DumpBox(a, trace); fprintf(trace, "<DefaultBox>\n"); gpp_dump_box(trace, &p->default_box); gf_box_dump_done("DefaultBox", a, trace); fprintf(trace, "<DefaultStyle>\n"); gpp_dump_style(trace, &p->default_style); fprintf(trace, "</DefaultStyle>\n"); gf_box_dump_ex(p->font_table, trace, GF_ISOM_BOX_TYPE_FTAB); gf_box_dump_done("Tx3gSampleEntryBox", a, trace); return GF_OK; } GF_Err text_dump(GF_Box *a, FILE * trace) { GF_TextSampleEntryBox *p = (GF_TextSampleEntryBox *)a; fprintf(trace, "<TextSampleEntryBox dataReferenceIndex=\"%d\" displayFlags=\"%x\" textJustification=\"%d\" ", p->dataReferenceIndex, p->displayFlags, p->textJustification); if (p->textName) fprintf(trace, "textName=\"%s\" ", p->textName); gpp_dump_rgb16(trace, "background-color", p->background_color); gpp_dump_rgb16(trace, " foreground-color", p->foreground_color); fprintf(trace, ">\n"); DumpBox(a, trace); fprintf(trace, "<DefaultBox>\n"); gpp_dump_box(trace, &p->default_box); gf_box_dump_done("DefaultBox", a, trace); gf_box_dump_done("TextSampleEntryBox", a, trace); return GF_OK; } GF_Err styl_dump(GF_Box *a, FILE * trace) { u32 i; GF_TextStyleBox*p = (GF_TextStyleBox*)a; fprintf(trace, "<TextStyleBox>\n"); DumpBox(a, trace); for (i=0; i<p->entry_count; i++) gpp_dump_style(trace, &p->styles[i]); gf_box_dump_done("TextStyleBox", a, trace); return GF_OK; } GF_Err hlit_dump(GF_Box *a, FILE * trace) { GF_TextHighlightBox*p = (GF_TextHighlightBox*)a; fprintf(trace, "<TextHighlightBox startcharoffset=\"%d\" endcharoffset=\"%d\">\n", p->startcharoffset, p->endcharoffset); DumpBox(a, trace); gf_box_dump_done("TextHighlightBox", a, trace); return GF_OK; } GF_Err hclr_dump(GF_Box *a, FILE * trace) { GF_TextHighlightColorBox*p = (GF_TextHighlightColorBox*)a; fprintf(trace, "<TextHighlightColorBox "); gpp_dump_rgba8(trace, "highlight_color", p->hil_color); fprintf(trace, ">\n"); DumpBox(a, trace); gf_box_dump_done("TextHighlightColorBox", a, trace); return GF_OK; } GF_Err krok_dump(GF_Box *a, FILE * trace) { u32 i; GF_TextKaraokeBox*p = (GF_TextKaraokeBox*)a; fprintf(trace, "<TextKaraokeBox highlight_starttime=\"%d\">\n", p->highlight_starttime); DumpBox(a, trace); for (i=0; i<p->nb_entries; i++) { 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); } gf_box_dump_done("TextKaraokeBox", a, trace); return GF_OK; } GF_Err dlay_dump(GF_Box *a, FILE * trace) { GF_TextScrollDelayBox*p = (GF_TextScrollDelayBox*)a; fprintf(trace, "<TextScrollDelayBox scroll_delay=\"%d\">\n", p->scroll_delay); DumpBox(a, trace); gf_box_dump_done("TextScrollDelayBox", a, trace); return GF_OK; } GF_Err href_dump(GF_Box *a, FILE * trace) { GF_TextHyperTextBox*p = (GF_TextHyperTextBox*)a; fprintf(trace, "<TextHyperTextBox startcharoffset=\"%d\" startcharoffset=\"%d\" URL=\"%s\" altString=\"%s\">\n", p->startcharoffset, p->endcharoffset, p->URL ? p->URL : "NULL", p->URL_hint ? p->URL_hint : "NULL"); DumpBox(a, trace); gf_box_dump_done("TextHyperTextBox", a, trace); return GF_OK; } GF_Err tbox_dump(GF_Box *a, FILE * trace) { GF_TextBoxBox*p = (GF_TextBoxBox*)a; fprintf(trace, "<TextBoxBox>\n"); gpp_dump_box(trace, &p->box); DumpBox(a, trace); gf_box_dump_done("TextBoxBox", a, trace); return GF_OK; } GF_Err blnk_dump(GF_Box *a, FILE * trace) { GF_TextBlinkBox*p = (GF_TextBlinkBox*)a; fprintf(trace, "<TextBlinkBox start_charoffset=\"%d\" end_charoffset=\"%d\">\n", p->startcharoffset, p->endcharoffset); DumpBox(a, trace); gf_box_dump_done("TextBlinkBox", a, trace); return GF_OK; } GF_Err twrp_dump(GF_Box *a, FILE * trace) { GF_TextWrapBox*p = (GF_TextWrapBox*)a; fprintf(trace, "<TextWrapBox wrap_flag=\"%s\">\n", p->wrap_flag ? ( (p->wrap_flag>1) ? "Reserved" : "Automatic" ) : "No Wrap"); DumpBox(a, trace); gf_box_dump_done("TextWrapBox", a, trace); return GF_OK; } GF_Err meta_dump(GF_Box *a, FILE * trace) { GF_MetaBox *p; p = (GF_MetaBox *)a; fprintf(trace, "<MetaBox>\n"); DumpBox(a, trace); gf_full_box_dump(a, trace); if (p->handler) gf_box_dump(p->handler, trace); if (p->primary_resource) gf_box_dump(p->primary_resource, trace); if (p->file_locations) gf_box_dump(p->file_locations, trace); if (p->item_locations) gf_box_dump(p->item_locations, trace); if (p->protections) gf_box_dump(p->protections, trace); if (p->item_infos) gf_box_dump(p->item_infos, trace); if (p->IPMP_control) gf_box_dump(p->IPMP_control, trace); gf_box_dump_done("MetaBox", a, trace); return GF_OK; } GF_Err xml_dump(GF_Box *a, FILE * trace) { GF_XMLBox *p = (GF_XMLBox *)a; fprintf(trace, "<XMLBox>\n"); DumpBox(a, trace); gf_full_box_dump(a, trace); fprintf(trace, "<![CDATA[\n"); gf_fwrite(p->xml, p->xml_length, 1, trace); fprintf(trace, "]]>\n"); gf_box_dump_done("XMLBox", a, trace); return GF_OK; } GF_Err bxml_dump(GF_Box *a, FILE * trace) { GF_BinaryXMLBox *p = (GF_BinaryXMLBox *)a; fprintf(trace, "<BinaryXMLBox binarySize=\"%d\">\n", p->data_length); DumpBox(a, trace); gf_full_box_dump(a, trace); gf_box_dump_done("BinaryXMLBox", a, trace); return GF_OK; } GF_Err pitm_dump(GF_Box *a, FILE * trace) { GF_PrimaryItemBox *p = (GF_PrimaryItemBox *)a; fprintf(trace, "<PrimaryItemBox item_ID=\"%d\">\n", p->item_ID); DumpBox(a, trace); gf_full_box_dump(a, trace); gf_box_dump_done("PrimaryItemBox", a, trace); return GF_OK; } GF_Err ipro_dump(GF_Box *a, FILE * trace) { GF_ItemProtectionBox *p = (GF_ItemProtectionBox *)a; fprintf(trace, "<ItemProtectionBox>\n"); DumpBox(a, trace); gf_full_box_dump(a, trace); gf_box_array_dump(p->protection_information, trace); gf_box_dump_done("ItemProtectionBox", a, trace); return GF_OK; } GF_Err infe_dump(GF_Box *a, FILE * trace) { GF_ItemInfoEntryBox *p = (GF_ItemInfoEntryBox *)a; fprintf(trace, "<ItemInfoEntryBox item_ID=\"%d\" item_protection_index=\"%d\" item_name=\"%s\" content_type=\"%s\" content_encoding=\"%s\">\n", p->item_ID, p->item_protection_index, p->item_name, p->content_type, p->content_encoding); DumpBox(a, trace); gf_full_box_dump(a, trace); gf_box_dump_done("ItemInfoEntryBox", a, trace); return GF_OK; } GF_Err iinf_dump(GF_Box *a, FILE * trace) { GF_ItemInfoBox *p = (GF_ItemInfoBox *)a; fprintf(trace, "<ItemInfoBox>\n"); DumpBox(a, trace); gf_full_box_dump(a, trace); gf_box_array_dump(p->item_infos, trace); gf_box_dump_done("ItemInfoBox", a, trace); return GF_OK; } GF_Err iloc_dump(GF_Box *a, FILE * trace) { u32 i, j, count, count2; GF_ItemLocationBox *p = (GF_ItemLocationBox*)a; fprintf(trace, "<ItemLocationBox offset_size=\"%d\" length_size=\"%d\" base_offset_size=\"%d\">\n", p->offset_size, p->length_size, p->base_offset_size); DumpBox(a, trace); gf_full_box_dump(a, trace); count = gf_list_count(p->location_entries); for (i=0; i<count; i++) { GF_ItemLocationEntry *ie = (GF_ItemLocationEntry *)gf_list_get(p->location_entries, i); count2 = gf_list_count(ie->extent_entries); fprintf(trace, "<ItemLocationEntry item_ID=\"%d\" data_reference_index=\"%d\" base_offset=\""LLD"\" />\n", ie->item_ID, ie->data_reference_index, LLD_CAST ie->base_offset); for (j=0; j<count2; j++) { GF_ItemExtentEntry *iee = (GF_ItemExtentEntry *)gf_list_get(ie->extent_entries, j); fprintf(trace, "<ItemExtentEntry extent_offset=\""LLD"\" extent_length=\""LLD"\" />\n", LLD_CAST iee->extent_offset, LLD_CAST iee->extent_length); } } gf_box_dump_done("ItemLocationBox", a, trace); return GF_OK; } GF_Err hinf_dump(GF_Box *a, FILE * trace) { // GF_HintInfoBox *p = (GF_HintInfoBox *)a; fprintf(trace, "<HintInfoBox>\n"); DumpBox(a, trace); gf_box_dump_done("HintInfoBox", a, trace); return GF_OK; } GF_Err trpy_dump(GF_Box *a, FILE * trace) { GF_TRPYBox *p = (GF_TRPYBox *)a; fprintf(trace, "<LargeTotalRTPBytesBox RTPBytesSent=\""LLD"\">\n", LLD_CAST p->nbBytes); DumpBox(a, trace); gf_box_dump_done("LargeTotalRTPBytesBox", a, trace); return GF_OK; } GF_Err totl_dump(GF_Box *a, FILE * trace) { GF_TOTLBox *p; p = (GF_TOTLBox *)a; fprintf(trace, "<TotalRTPBytesBox RTPBytesSent=\"%d\">\n", p->nbBytes); DumpBox(a, trace); gf_box_dump_done("TotalRTPBytesBox", a, trace); return GF_OK; } GF_Err nump_dump(GF_Box *a, FILE * trace) { GF_NUMPBox *p; p = (GF_NUMPBox *)a; fprintf(trace, "<LargeTotalPacketBox PacketsSent=\""LLD"\">\n", LLD_CAST p->nbPackets); DumpBox(a, trace); gf_box_dump_done("LargeTotalPacketBox", a, trace); return GF_OK; } GF_Err npck_dump(GF_Box *a, FILE * trace) { GF_NPCKBox *p; p = (GF_NPCKBox *)a; fprintf(trace, "<TotalPacketBox packetsSent=\"%d\">\n", p->nbPackets); DumpBox(a, trace); gf_box_dump_done("TotalPacketBox", a, trace); return GF_OK; } GF_Err tpyl_dump(GF_Box *a, FILE * trace) { GF_NTYLBox *p; p = (GF_NTYLBox *)a; fprintf(trace, "<LargeTotalMediaBytesBox BytesSent=\""LLD"\">\n", LLD_CAST p->nbBytes); DumpBox(a, trace); gf_box_dump_done("LargeTotalMediaBytesBox", a, trace); return GF_OK; } GF_Err tpay_dump(GF_Box *a, FILE * trace) { GF_TPAYBox *p; p = (GF_TPAYBox *)a; fprintf(trace, "<TotalMediaBytesBox BytesSent=\"%d\">\n", p->nbBytes); DumpBox(a, trace); gf_box_dump_done("TotalMediaBytesBox", a, trace); return GF_OK; } GF_Err maxr_dump(GF_Box *a, FILE * trace) { GF_MAXRBox *p; p = (GF_MAXRBox *)a; fprintf(trace, "<MaxDataRateBox MaxDataRate=\"%d\" Granularity=\"%d\">\n", p->maxDataRate, p->granularity); DumpBox(a, trace); gf_box_dump_done("MaxDataRateBox", a, trace); return GF_OK; } GF_Err dmed_dump(GF_Box *a, FILE * trace) { GF_DMEDBox *p; p = (GF_DMEDBox *)a; fprintf(trace, "<BytesFromMediaTrackBox BytesSent=\""LLD"\">\n", LLD_CAST p->nbBytes); DumpBox(a, trace); gf_box_dump_done("BytesFromMediaTrackBox", a, trace); return GF_OK; } GF_Err dimm_dump(GF_Box *a, FILE * trace) { GF_DIMMBox *p; p = (GF_DIMMBox *)a; fprintf(trace, "<ImmediateDataBytesBox BytesSent=\""LLD"\">\n", LLD_CAST p->nbBytes); DumpBox(a, trace); gf_box_dump_done("ImmediateDataBytesBox", a, trace); return GF_OK; } GF_Err drep_dump(GF_Box *a, FILE * trace) { GF_DREPBox *p; p = (GF_DREPBox *)a; fprintf(trace, "<RepeatedDataBytesBox RepeatedBytes=\""LLD"\">\n", LLD_CAST p->nbBytes); DumpBox(a, trace); gf_box_dump_done("RepeatedDataBytesBox", a, trace); return GF_OK; } GF_Err tmin_dump(GF_Box *a, FILE * trace) { GF_TMINBox *p; p = (GF_TMINBox *)a; fprintf(trace, "<MinTransmissionTimeBox MinimumTransmitTime=\"%d\">\n", p->minTime); DumpBox(a, trace); gf_box_dump_done("MinTransmissionTimeBox", a, trace); return GF_OK; } GF_Err tmax_dump(GF_Box *a, FILE * trace) { GF_TMAXBox *p; p = (GF_TMAXBox *)a; fprintf(trace, "<MaxTransmissionTimeBox MaximumTransmitTime=\"%d\">\n", p->maxTime); DumpBox(a, trace); gf_box_dump_done("MaxTransmissionTimeBox", a, trace); return GF_OK; } GF_Err pmax_dump(GF_Box *a, FILE * trace) { GF_PMAXBox *p; p = (GF_PMAXBox *)a; fprintf(trace, "<MaxPacketSizeBox MaximumSize=\"%d\">\n", p->maxSize); DumpBox(a, trace); gf_box_dump_done("MaxPacketSizeBox", a, trace); return GF_OK; } GF_Err dmax_dump(GF_Box *a, FILE * trace) { GF_DMAXBox *p; p = (GF_DMAXBox *)a; fprintf(trace, "<MaxPacketDurationBox MaximumDuration=\"%d\">\n", p->maxDur); DumpBox(a, trace); gf_box_dump_done("MaxPacketDurationBox", a, trace); return GF_OK; } GF_Err payt_dump(GF_Box *a, FILE * trace) { GF_PAYTBox *p; p = (GF_PAYTBox *)a; fprintf(trace, "<PayloadTypeBox PayloadID=\"%d\" PayloadString=\"%s\">\n", p->payloadCode, p->payloadString); DumpBox(a, trace); gf_box_dump_done("PayloadTypeBox", a, trace); return GF_OK; } GF_Err name_dump(GF_Box *a, FILE * trace) { GF_NameBox *p; p = (GF_NameBox *)a; fprintf(trace, "<NameBox Name=\"%s\">\n", p->string); DumpBox(a, trace); gf_box_dump_done("NameBox", a, trace); return GF_OK; } GF_Err rely_dump(GF_Box *a, FILE * trace) { GF_RelyHintBox *p; p = (GF_RelyHintBox *)a; fprintf(trace, "<RelyTransmissionBox Prefered=\"%d\" required=\"%d\">\n", p->prefered, p->required); DumpBox(a, trace); gf_box_dump_done("RelyTransmissionBox", a, trace); return GF_OK; } GF_Err snro_dump(GF_Box *a, FILE * trace) { GF_SeqOffHintEntryBox *p; p = (GF_SeqOffHintEntryBox *)a; fprintf(trace, "<PacketSequenceOffsetBox SeqNumOffset=\"%d\">\n", p->SeqOffset); DumpBox(a, trace); gf_box_dump_done("PacketSequenceOffsetBox", a, trace); return GF_OK; } GF_Err tims_dump(GF_Box *a, FILE * trace) { GF_TSHintEntryBox *p; p = (GF_TSHintEntryBox *)a; fprintf(trace, "<RTPTimeScaleBox TimeScale=\"%d\">\n", p->timeScale); DumpBox(a, trace); gf_box_dump_done("RTPTimeScaleBox", a, trace); return GF_OK; } GF_Err tsro_dump(GF_Box *a, FILE * trace) { GF_TimeOffHintEntryBox *p; p = (GF_TimeOffHintEntryBox *)a; fprintf(trace, "<TimeStampOffsetBox TimeStampOffset=\"%d\">\n", p->TimeOffset); DumpBox(a, trace); gf_box_dump_done("TimeStampOffsetBox", a, trace); return GF_OK; } GF_Err ghnt_dump(GF_Box *a, FILE * trace) { GF_HintSampleEntryBox *p; p = (GF_HintSampleEntryBox *)a; fprintf(trace, "<GenericHintSampleEntryBox EntrySubType=\"%s\" DataReferenceIndex=\"%d\" HintTrackVersion=\"%d\" LastCompatibleVersion=\"%d\" MaxPacketSize=\"%d\">\n", gf_4cc_to_str(p->type), p->dataReferenceIndex, p->HintTrackVersion, p->LastCompatibleVersion, p->MaxPacketSize); DumpBox(a, trace); gf_box_array_dump(p->HintDataTable, trace); gf_box_dump_done("GenericHintSampleEntryBox", a, trace); return GF_OK; } GF_Err hnti_dump(GF_Box *a, FILE * trace) { GF_HintTrackInfoBox *p; GF_Box *ptr; GF_RTPBox *rtp; u32 i; p = (GF_HintTrackInfoBox *)a; fprintf(trace, "<HintTrackInfoBox>\n"); DumpBox(a, trace); i=0; while ((ptr = (GF_Box *)gf_list_enum(p->other_boxes, &i))) { if (ptr->type !=GF_ISOM_BOX_TYPE_RTP) { gf_box_dump(ptr, trace); } else { rtp = (GF_RTPBox *)ptr; fprintf(trace, "<RTPInfoBox subType=\"%s\">\n", gf_4cc_to_str(rtp->subType)); fprintf(trace, "<!-- sdp text: %s -->\n", rtp->sdpText); gf_box_dump_done("RTPInfoBox", a, trace); } } gf_box_dump_done("HintTrackInfoBox", NULL, trace); return GF_OK; } GF_Err sdp_dump(GF_Box *a, FILE * trace) { GF_SDPBox *p; p = (GF_SDPBox *)a; fprintf(trace, "<SDPBox>\n"); DumpBox(a, trace); fprintf(trace, "<!-- sdp text: %s -->\n", p->sdpText); gf_box_dump_done("SDPBox", a, trace); return GF_OK; } GF_Err rtpo_dump(GF_Box *a, FILE * trace) { GF_RTPOBox *p; p = (GF_RTPOBox *)a; fprintf(trace, "<RTPTimeOffsetBox PacketTimeOffset=\"%d\">\n", p->timeOffset); DumpBox(a, trace); gf_box_dump_done("RTPTimeOffsetBox", a, trace); return GF_OK; } #ifndef GPAC_DISABLE_ISOM_FRAGMENTS GF_Err mvex_dump(GF_Box *a, FILE * trace) { GF_MovieExtendsBox *p; p = (GF_MovieExtendsBox *)a; fprintf(trace, "<MovieExtendsBox>\n"); DumpBox(a, trace); if (p->mehd) gf_box_dump(p->mehd, trace); gf_box_array_dump(p->TrackExList, trace); gf_box_array_dump(p->TrackExPropList, trace); gf_box_dump_done("MovieExtendsBox", a, trace); return GF_OK; } GF_Err mehd_dump(GF_Box *a, FILE * trace) { GF_MovieExtendsHeaderBox *p = (GF_MovieExtendsHeaderBox*)a; fprintf(trace, "<MovieExtendsHeaderBox fragmentDuration=\""LLD"\" >\n", LLD_CAST p->fragment_duration); DumpBox(a, trace); gf_full_box_dump(a, trace); gf_box_dump_done("MovieExtendsHeaderBox", a, trace); return GF_OK; } void sample_flags_dump(const char *name, u32 sample_flags, FILE * trace) { fprintf(trace, "<%s", name); fprintf(trace, " IsLeading=\"%d\"", GF_ISOM_GET_FRAG_LEAD(sample_flags) ); fprintf(trace, " SampleDependsOn=\"%d\"", GF_ISOM_GET_FRAG_DEPENDS(sample_flags) ); fprintf(trace, " SampleIsDependedOn=\"%d\"", GF_ISOM_GET_FRAG_DEPENDED(sample_flags) ); fprintf(trace, " SampleHasRedundancy=\"%d\"", GF_ISOM_GET_FRAG_REDUNDANT(sample_flags) ); fprintf(trace, " SamplePadding=\"%d\"", GF_ISOM_GET_FRAG_PAD(sample_flags) ); fprintf(trace, " SampleSync=\"%d\"", GF_ISOM_GET_FRAG_SYNC(sample_flags)); fprintf(trace, " SampleDegradationPriority=\"%d\"", GF_ISOM_GET_FRAG_DEG(sample_flags)); fprintf(trace, "/>\n"); } GF_Err trex_dump(GF_Box *a, FILE * trace) { GF_TrackExtendsBox *p; p = (GF_TrackExtendsBox *)a; fprintf(trace, "<TrackExtendsBox TrackID=\"%d\"", p->trackID); fprintf(trace, " SampleDescriptionIndex=\"%d\" SampleDuration=\"%d\" SampleSize=\"%d\"", p->def_sample_desc_index, p->def_sample_duration, p->def_sample_size); fprintf(trace, ">\n"); sample_flags_dump("DefaultSampleFlags", p->def_sample_flags, trace); DumpBox(a, trace); gf_full_box_dump(a, trace); gf_box_dump_done("TrackExtendsBox", a, trace); return GF_OK; } GF_Err trep_dump(GF_Box *a, FILE * trace) { GF_TrackExtensionPropertiesBox *p = (GF_TrackExtensionPropertiesBox*)a; fprintf(trace, "<TrackExtensionPropertiesBox TrackID=\"%d\">\n", p->trackID); DumpBox(a, trace); gf_full_box_dump(a, trace); gf_box_dump_done("TrackExtensionPropertiesBox", a, trace); return GF_OK; } GF_Err moof_dump(GF_Box *a, FILE * trace) { GF_MovieFragmentBox *p; p = (GF_MovieFragmentBox *)a; fprintf(trace, "<MovieFragmentBox TrackFragments=\"%d\">\n", gf_list_count(p->TrackList)); DumpBox(a, trace); if (p->mfhd) gf_box_dump(p->mfhd, trace); gf_box_array_dump(p->TrackList, trace); gf_box_dump_done("MovieFragmentBox", a, trace); return GF_OK; } GF_Err mfhd_dump(GF_Box *a, FILE * trace) { GF_MovieFragmentHeaderBox *p; p = (GF_MovieFragmentHeaderBox *)a; fprintf(trace, "<MovieFragmentHeaderBox FragmentSequenceNumber=\"%d\">\n", p->sequence_number); DumpBox(a, trace); gf_full_box_dump(a, trace); gf_box_dump_done("MovieFragmentHeaderBox", a, trace); return GF_OK; } GF_Err traf_dump(GF_Box *a, FILE * trace) { GF_TrackFragmentBox *p; p = (GF_TrackFragmentBox *)a; fprintf(trace, "<TrackFragmentBox>\n"); DumpBox(a, trace); if (p->tfhd) gf_box_dump(p->tfhd, trace); if (p->subs) gf_box_dump(p->subs, trace); if (p->sdtp) gf_box_dump(p->sdtp, trace); if (p->tfdt) gf_box_dump(p->tfdt, trace); if (p->sampleGroupsDescription) gf_box_array_dump(p->sampleGroupsDescription, trace); if (p->sampleGroups) gf_box_array_dump(p->sampleGroups, trace); gf_box_array_dump(p->TrackRuns, trace); if (p->sai_sizes) gf_box_array_dump(p->sai_sizes, trace); if (p->sai_offsets) gf_box_array_dump(p->sai_offsets, trace); if (p->piff_sample_encryption) gf_box_dump(p->piff_sample_encryption, trace); if (p->sample_encryption) gf_box_dump(p->sample_encryption, trace); gf_box_dump_done("TrackFragmentBox", a, trace); return GF_OK; } static void frag_dump_sample_flags(FILE * trace, u32 flags) { fprintf(trace, " SamplePadding=\"%d\" Sync=\"%d\" DegradationPriority=\"%d\" IsLeading=\"%d\" DependsOn=\"%d\" IsDependedOn=\"%d\" HasRedundancy=\"%d\"", GF_ISOM_GET_FRAG_PAD(flags), GF_ISOM_GET_FRAG_SYNC(flags), GF_ISOM_GET_FRAG_DEG(flags), 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_Err tfhd_dump(GF_Box *a, FILE * trace) { GF_TrackFragmentHeaderBox *p; p = (GF_TrackFragmentHeaderBox *)a; fprintf(trace, "<TrackFragmentHeaderBox TrackID=\"%d\"", p->trackID); if (p->flags & GF_ISOM_TRAF_BASE_OFFSET) { fprintf(trace, " BaseDataOffset=\""LLU"\"", p->base_data_offset); } else { fprintf(trace, " BaseDataOffset=\"%s\"", (p->flags & GF_ISOM_MOOF_BASE_OFFSET) ? "moof" : "moof-or-previous-traf"); } if (p->flags & GF_ISOM_TRAF_SAMPLE_DESC) fprintf(trace, " SampleDescriptionIndex=\"%d\"", p->sample_desc_index); if (p->flags & GF_ISOM_TRAF_SAMPLE_DUR) fprintf(trace, " SampleDuration=\"%d\"", p->def_sample_duration); if (p->flags & GF_ISOM_TRAF_SAMPLE_SIZE) fprintf(trace, " SampleSize=\"%d\"", p->def_sample_size); if (p->flags & GF_ISOM_TRAF_SAMPLE_FLAGS) { frag_dump_sample_flags(trace, p->def_sample_flags); } fprintf(trace, ">\n"); DumpBox(a, trace); gf_full_box_dump(a, trace); gf_box_dump_done("TrackFragmentHeaderBox", a, trace); return GF_OK; } GF_Err trun_dump(GF_Box *a, FILE * trace) { u32 i; GF_TrunEntry *ent; GF_TrackFragmentRunBox *p; p = (GF_TrackFragmentRunBox *)a; fprintf(trace, "<TrackRunBox SampleCount=\"%d\"", p->sample_count); if (p->flags & GF_ISOM_TRUN_DATA_OFFSET) fprintf(trace, " DataOffset=\"%d\"", p->data_offset); fprintf(trace, ">\n"); if (p->flags & GF_ISOM_TRUN_FIRST_FLAG) { sample_flags_dump("FirstSampleFlags", p->first_sample_flags, trace); } DumpBox(a, trace); gf_full_box_dump(a, trace); if (p->flags & (GF_ISOM_TRUN_DURATION|GF_ISOM_TRUN_SIZE|GF_ISOM_TRUN_CTS_OFFSET|GF_ISOM_TRUN_FLAGS)) { i=0; while ((ent = (GF_TrunEntry *)gf_list_enum(p->entries, &i))) { fprintf(trace, "<TrackRunEntry"); if (p->flags & GF_ISOM_TRUN_DURATION) fprintf(trace, " Duration=\"%d\"", ent->Duration); if (p->flags & GF_ISOM_TRUN_SIZE) fprintf(trace, " Size=\"%d\"", ent->size); if (p->flags & GF_ISOM_TRUN_CTS_OFFSET) fprintf(trace, " CTSOffset=\"%d\"", ent->CTS_Offset); if (p->flags & GF_ISOM_TRUN_FLAGS) { frag_dump_sample_flags(trace, ent->flags); } fprintf(trace, "/>\n"); } } else { fprintf(trace, "<!-- all default values used -->\n"); } gf_box_dump_done("TrackRunBox", a, trace); return GF_OK; } #endif #ifndef GPAC_DISABLE_ISOM_HINTING GF_Err DTE_Dump(GF_List *dte, FILE * trace) { GF_GenericDTE *p; GF_ImmediateDTE *i_p; GF_SampleDTE *s_p; GF_StreamDescDTE *sd_p; u32 i, count; count = gf_list_count(dte); for (i=0; i<count; i++) { p = (GF_GenericDTE *)gf_list_get(dte, i); switch (p->source) { case 0: fprintf(trace, "<EmptyDataEntry/>\n"); break; case 1: i_p = (GF_ImmediateDTE *) p; fprintf(trace, "<ImmediateDataEntry DataSize=\"%d\"/>\n", i_p->dataLength); break; case 2: s_p = (GF_SampleDTE *) p; fprintf(trace, "<SampleDataEntry DataSize=\"%d\" SampleOffset=\"%d\" SampleNumber=\"%d\" TrackReference=\"%d\"/>\n", s_p->dataLength, s_p->byteOffset, s_p->sampleNumber, s_p->trackRefIndex); break; case 3: sd_p = (GF_StreamDescDTE *) p; fprintf(trace, "<SampleDescriptionEntry DataSize=\"%d\" DescriptionOffset=\"%d\" StreamDescriptionindex=\"%d\" TrackReference=\"%d\"/>\n", sd_p->dataLength, sd_p->byteOffset, sd_p->streamDescIndex, sd_p->trackRefIndex); break; default: fprintf(trace, "<UnknownTableEntry/>\n"); break; } } return GF_OK; } GF_EXPORT GF_Err gf_isom_dump_hint_sample(GF_ISOFile *the_file, u32 trackNumber, u32 SampleNum, FILE * trace) { GF_ISOSample *tmp; GF_HintSampleEntryBox *entry; u32 descIndex, count, count2, i; GF_Err e; GF_BitStream *bs; GF_HintSample *s; GF_TrackBox *trak; GF_RTPPacket *pck; trak = gf_isom_get_track_from_file(the_file, trackNumber); if (!trak || !IsHintTrack(trak)) return GF_BAD_PARAM; tmp = gf_isom_get_sample(the_file, trackNumber, SampleNum, &descIndex); if (!tmp) return GF_BAD_PARAM; e = Media_GetSampleDesc(trak->Media, descIndex, (GF_SampleEntryBox **) &entry, &count); if (e) { gf_isom_sample_del(&tmp); return e; } //check we can read the sample switch (entry->type) { case GF_ISOM_BOX_TYPE_RTP_STSD: break; default: gf_isom_sample_del(&tmp); return GF_NOT_SUPPORTED; } bs = gf_bs_new(tmp->data, tmp->dataLength, GF_BITSTREAM_READ); s = gf_isom_hint_sample_new(entry->type); gf_isom_hint_sample_read(s, bs, tmp->dataLength); gf_bs_del(bs); count = gf_list_count(s->packetTable); fprintf(trace, "<RTPHintSample SampleNumber=\"%d\" DecodingTime=\""LLD"\" RandomAccessPoint=\"%d\" PacketCount=\"%u\">\n", SampleNum, LLD_CAST tmp->DTS, tmp->IsRAP, count); for (i=0; i<count; i++) { pck = (GF_RTPPacket *)gf_list_get(s->packetTable, i); fprintf(trace, "<RTPHintPacket PacketNumber=\"%d\" P=\"%d\" X=\"%d\" M=\"%d\" PayloadType=\"%d\"", i+1, pck->P_bit, pck->X_bit, pck->M_bit, pck->payloadType); fprintf(trace, " SequenceNumber=\"%d\" RepeatedPacket=\"%d\" DropablePacket=\"%d\" RelativeTransmissionTime=\"%d\" FullPacketSize=\"%d\">\n", pck->SequenceNumber, pck->R_bit, pck->B_bit, pck->relativeTransTime, gf_isom_hint_rtp_length(pck)); //TLV is made of Boxes count2 = gf_list_count(pck->TLV); if (count2) { fprintf(trace, "<PrivateExtensionTable EntryCount=\"%d\">\n", count2); gf_box_array_dump(pck->TLV, trace); fprintf(trace, "</PrivateExtensionTable>\n"); } //DTE is made of NON boxes count2 = gf_list_count(pck->DataTable); if (count2) { fprintf(trace, "<PacketDataTable EntryCount=\"%d\">\n", count2); DTE_Dump(pck->DataTable, trace); fprintf(trace, "</PacketDataTable>\n"); } fprintf(trace, "</RTPHintPacket>\n"); } fprintf(trace, "</RTPHintSample>\n"); gf_isom_sample_del(&tmp); gf_isom_hint_sample_del(s); return GF_OK; } #endif /*GPAC_DISABLE_ISOM_HINTING*/ static void gpp_dump_box_nobox(FILE * trace, GF_BoxRecord *rec) { fprintf(trace, "<TextBox top=\"%d\" left=\"%d\" bottom=\"%d\" right=\"%d\"/>\n", rec->top, rec->left, rec->bottom, rec->right); } static void gpp_print_char_offsets(FILE * trace, u32 start, u32 end, u32 *shift_offset, u32 so_count) { u32 i; if (shift_offset) { for (i=0; i<so_count; i++) { if (start>shift_offset[i]) { start --; break; } } for (i=0; i<so_count; i++) { if (end>shift_offset[i]) { end --; break; } } } if (start || end) fprintf(trace, "fromChar=\"%d\" toChar=\"%d\" ", start, end); } static void gpp_dump_style_nobox(FILE * trace, GF_StyleRecord *rec, u32 *shift_offset, u32 so_count) { fprintf(trace, "<Style "); if (rec->startCharOffset || rec->endCharOffset) gpp_print_char_offsets(trace, rec->startCharOffset, rec->endCharOffset, shift_offset, so_count); fprintf(trace, "styles=\""); if (!rec->style_flags) { fprintf(trace, "Normal"); } else { if (rec->style_flags & 1) fprintf(trace, "Bold "); if (rec->style_flags & 2) fprintf(trace, "Italic "); if (rec->style_flags & 4) fprintf(trace, "Underlined "); } fprintf(trace, "\" fontID=\"%d\" fontSize=\"%d\" ", rec->fontID, rec->font_size); gpp_dump_rgba8(trace, "color", rec->text_color); fprintf(trace, "/>\n"); } static char *ttd_format_time(u64 ts, u32 timescale, char *szDur, Bool is_srt) { u32 h, m, s, ms; ts = (u32) (ts*1000 / timescale); h = (u32) (ts / 3600000); m = (u32) (ts/ 60000) - h*60; s = (u32) (ts/1000) - h*3600 - m*60; ms = (u32) (ts) - h*3600000 - m*60000 - s*1000; if (is_srt) { sprintf(szDur, "%02d:%02d:%02d,%03d", h, m, s, ms); } else { sprintf(szDur, "%02d:%02d:%02d.%03d", h, m, s, ms); } return szDur; } //#define DUMP_OLD_TEXT static GF_Err gf_isom_dump_ttxt_track(GF_ISOFile *the_file, u32 track, FILE *dump) { u32 i, j, count, di, nb_descs, shift_offset[20], so_count; u64 last_DTS; size_t len; GF_Box *a; Bool has_scroll; char szDur[100]; GF_Tx3gSampleEntryBox *txt; GF_TrackBox *trak = gf_isom_get_track_from_file(the_file, track); if (!trak) return GF_BAD_PARAM; switch (trak->Media->handler->handlerType) { case GF_ISOM_MEDIA_TEXT: case GF_ISOM_MEDIA_SUBT: break; default: return GF_BAD_PARAM; } txt = (GF_Tx3gSampleEntryBox *)gf_list_get(trak->Media->information->sampleTable->SampleDescription->other_boxes, 0); switch (txt->type) { case GF_ISOM_BOX_TYPE_TX3G: case GF_ISOM_BOX_TYPE_TEXT: break; case GF_ISOM_BOX_TYPE_STPP: case GF_ISOM_BOX_TYPE_SBTT: default: return GF_BAD_PARAM; } fprintf(dump, "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"); fprintf(dump, "<!-- GPAC 3GPP Text Stream -->\n"); #ifdef DUMP_OLD_TEXT fprintf(dump, "<TextStream version=\"1.0\">\n"); #else fprintf(dump, "<TextStream version=\"1.1\">\n"); #endif 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); nb_descs = gf_list_count(trak->Media->information->sampleTable->SampleDescription->other_boxes); for (i=0; i<nb_descs; i++) { GF_Tx3gSampleEntryBox *txt = (GF_Tx3gSampleEntryBox *)gf_list_get(trak->Media->information->sampleTable->SampleDescription->other_boxes, i); if (txt->type==GF_ISOM_BOX_TYPE_TX3G) { fprintf(dump, "<TextSampleDescription horizontalJustification=\""); switch (txt->horizontal_justification) { case 1: fprintf(dump, "center"); break; case -1: fprintf(dump, "right"); break; default: fprintf(dump, "left"); break; } fprintf(dump, "\" verticalJustification=\""); switch (txt->vertical_justification) { case 1: fprintf(dump, "center"); break; case -1: fprintf(dump, "bottom"); break; default: fprintf(dump, "top"); break; } fprintf(dump, "\" "); gpp_dump_rgba8(dump, "backColor", txt->back_color); fprintf(dump, " verticalText=\"%s\"", (txt->displayFlags & GF_TXT_VERTICAL) ? "yes" : "no"); fprintf(dump, " fillTextRegion=\"%s\"", (txt->displayFlags & GF_TXT_FILL_REGION) ? "yes" : "no"); fprintf(dump, " continuousKaraoke=\"%s\"", (txt->displayFlags & GF_TXT_KARAOKE) ? "yes" : "no"); has_scroll = GF_FALSE; if (txt->displayFlags & GF_TXT_SCROLL_IN) { has_scroll = GF_TRUE; if (txt->displayFlags & GF_TXT_SCROLL_OUT) fprintf(dump, " scroll=\"InOut\""); else fprintf(dump, " scroll=\"In\""); } else if (txt->displayFlags & GF_TXT_SCROLL_OUT) { has_scroll = GF_TRUE; fprintf(dump, " scroll=\"Out\""); } else { fprintf(dump, " scroll=\"None\""); } if (has_scroll) { u32 mode = (txt->displayFlags & GF_TXT_SCROLL_DIRECTION)>>7; switch (mode) { case GF_TXT_SCROLL_CREDITS: fprintf(dump, " scrollMode=\"Credits\""); break; case GF_TXT_SCROLL_MARQUEE: fprintf(dump, " scrollMode=\"Marquee\""); break; case GF_TXT_SCROLL_DOWN: fprintf(dump, " scrollMode=\"Down\""); break; case GF_TXT_SCROLL_RIGHT: fprintf(dump, " scrollMode=\"Right\""); break; default: fprintf(dump, " scrollMode=\"Unknown\""); break; } } fprintf(dump, ">\n"); fprintf(dump, "<FontTable>\n"); if (txt->font_table) { for (j=0; j<txt->font_table->entry_count; j++) { fprintf(dump, "<FontTableEntry fontName=\"%s\" fontID=\"%d\"/>\n", txt->font_table->fonts[j].fontName, txt->font_table->fonts[j].fontID); } } fprintf(dump, "</FontTable>\n"); if ((txt->default_box.bottom == txt->default_box.top) || (txt->default_box.right == txt->default_box.left)) { txt->default_box.top = txt->default_box.left = 0; txt->default_box.right = trak->Header->width / 65536; txt->default_box.bottom = trak->Header->height / 65536; } gpp_dump_box_nobox(dump, &txt->default_box); gpp_dump_style_nobox(dump, &txt->default_style, NULL, 0); fprintf(dump, "</TextSampleDescription>\n"); } else { GF_TextSampleEntryBox *text = (GF_TextSampleEntryBox *)gf_list_get(trak->Media->information->sampleTable->SampleDescription->other_boxes, i); fprintf(dump, "<TextSampleDescription horizontalJustification=\""); switch (text->textJustification) { case 1: fprintf(dump, "center"); break; case -1: fprintf(dump, "right"); break; default: fprintf(dump, "left"); break; } fprintf(dump, "\""); gpp_dump_rgb16(dump, " backColor", text->background_color); if ((text->default_box.bottom == text->default_box.top) || (text->default_box.right == text->default_box.left)) { text->default_box.top = text->default_box.left = 0; text->default_box.right = trak->Header->width / 65536; text->default_box.bottom = trak->Header->height / 65536; } if (text->displayFlags & GF_TXT_SCROLL_IN) { if (text->displayFlags & GF_TXT_SCROLL_OUT) fprintf(dump, " scroll=\"InOut\""); else fprintf(dump, " scroll=\"In\""); } else if (text->displayFlags & GF_TXT_SCROLL_OUT) { fprintf(dump, " scroll=\"Out\""); } else { fprintf(dump, " scroll=\"None\""); } fprintf(dump, ">\n"); gpp_dump_box_nobox(dump, &text->default_box); fprintf(dump, "</TextSampleDescription>\n"); } } fprintf(dump, "</TextStreamHeader>\n"); last_DTS = 0; count = gf_isom_get_sample_count(the_file, track); for (i=0; i<count; i++) { GF_BitStream *bs; GF_TextSample *txt; GF_ISOSample *s = gf_isom_get_sample(the_file, track, i+1, &di); if (!s) continue; fprintf(dump, "<TextSample sampleTime=\"%s\"", ttd_format_time(s->DTS, trak->Media->mediaHeader->timeScale, szDur, GF_FALSE)); if (nb_descs>1) fprintf(dump, " sampleDescriptionIndex=\"%d\"", di); bs = gf_bs_new(s->data, s->dataLength, GF_BITSTREAM_READ); txt = gf_isom_parse_texte_sample(bs); gf_bs_del(bs); if (txt->highlight_color) { fprintf(dump, " "); gpp_dump_rgba8(dump, "highlightColor", txt->highlight_color->hil_color); } if (txt->scroll_delay) { Double delay = txt->scroll_delay->scroll_delay; delay /= trak->Media->mediaHeader->timeScale; fprintf(dump, " scrollDelay=\"%g\"", delay); } if (txt->wrap) fprintf(dump, " wrap=\"%s\"", (txt->wrap->wrap_flag==0x01) ? "Automatic" : "None"); so_count = 0; #ifndef DUMP_OLD_TEXT fprintf(dump, " xml:space=\"preserve\">"); #endif if (!txt->len) { #ifdef DUMP_OLD_TEXT fprintf(dump, " text=\"\""); #endif last_DTS = (u32) trak->Media->mediaHeader->duration; } else { unsigned short utf16Line[10000]; last_DTS = s->DTS; /*UTF16*/ if ((txt->len>2) && ((unsigned char) txt->text[0] == (unsigned char) 0xFE) && ((unsigned char) txt->text[1] == (unsigned char) 0xFF)) { /*copy 2 more chars because the lib always add 2 '0' at the end for UTF16 end of string*/ memcpy((char *) utf16Line, txt->text+2, sizeof(char) * (txt->len)); len = gf_utf8_wcslen((const u16*)utf16Line); } else { char *str; str = txt->text; len = gf_utf8_mbstowcs((u16*)utf16Line, 10000, (const char **) &str); } if (len != (size_t) -1) { utf16Line[len] = 0; #ifdef DUMP_OLD_TEXT fprintf(dump, " text=\"\'"); #endif for (j=0; j<len; j++) { if ((utf16Line[j]=='\n') || (utf16Line[j]=='\r') || (utf16Line[j]==0x85) || (utf16Line[j]==0x2028) || (utf16Line[j]==0x2029) ) { #ifndef DUMP_OLD_TEXT fprintf(dump, "\n"); #else fprintf(dump, "\'\'"); #endif if ((utf16Line[j]=='\r') && (utf16Line[j+1]=='\n')) { shift_offset[so_count] = j; so_count++; j++; } } else { switch (utf16Line[j]) { case '\'': fprintf(dump, "&apos;"); break; case '\"': fprintf(dump, "&quot;"); break; case '&': fprintf(dump, "&amp;"); break; case '>': fprintf(dump, "&gt;"); break; case '<': fprintf(dump, "&lt;"); break; default: if (utf16Line[j] < 128) { fprintf(dump, "%c", (u8) utf16Line[j]); } else { fprintf(dump, "&#%d;", utf16Line[j]); } break; } } } #ifdef DUMP_OLD_TEXT fprintf(dump, "\'\""); #endif } else { #ifdef DUMP_OLD_TEXT fprintf(dump, "text=\"%s\"", txt->text); #endif } } #ifdef DUMP_OLD_TEXT fprintf(dump, ">\n"); #endif if (txt->box) gpp_dump_box_nobox(dump, &txt->box->box); if (txt->styles) { for (j=0; j<txt->styles->entry_count; j++) { gpp_dump_style_nobox(dump, &txt->styles->styles[j], shift_offset, so_count); } } j=0; while ((a = (GF_Box *)gf_list_enum(txt->others, &j))) { switch (a->type) { case GF_ISOM_BOX_TYPE_HLIT: fprintf(dump, "<Highlight "); gpp_print_char_offsets(dump, ((GF_TextHighlightBox *)a)->startcharoffset, ((GF_TextHighlightBox *)a)->endcharoffset, shift_offset, so_count); fprintf(dump, "/>\n"); break; case GF_ISOM_BOX_TYPE_HREF: { GF_TextHyperTextBox *ht = (GF_TextHyperTextBox *)a; fprintf(dump, "<HyperLink "); gpp_print_char_offsets(dump, ht->startcharoffset, ht->endcharoffset, shift_offset, so_count); fprintf(dump, "URL=\"%s\" URLToolTip=\"%s\"/>\n", ht->URL ? ht->URL : "", ht->URL_hint ? ht->URL_hint : ""); } break; case GF_ISOM_BOX_TYPE_BLNK: fprintf(dump, "<Blinking "); gpp_print_char_offsets(dump, ((GF_TextBlinkBox *)a)->startcharoffset, ((GF_TextBlinkBox *)a)->endcharoffset, shift_offset, so_count); fprintf(dump, "/>\n"); break; case GF_ISOM_BOX_TYPE_KROK: { u32 k; Double t; GF_TextKaraokeBox *krok = (GF_TextKaraokeBox *)a; t = krok->highlight_starttime; t /= trak->Media->mediaHeader->timeScale; fprintf(dump, "<Karaoke startTime=\"%g\">\n", t); for (k=0; k<krok->nb_entries; k++) { t = krok->records[k].highlight_endtime; t /= trak->Media->mediaHeader->timeScale; fprintf(dump, "<KaraokeRange "); gpp_print_char_offsets(dump, krok->records[k].start_charoffset, krok->records[k].end_charoffset, shift_offset, so_count); fprintf(dump, "endTime=\"%g\"/>\n", t); } fprintf(dump, "</Karaoke>\n"); } break; } } fprintf(dump, "</TextSample>\n"); gf_isom_sample_del(&s); gf_isom_delete_text_sample(txt); gf_set_progress("TTXT Extract", i, count); } if (last_DTS < trak->Media->mediaHeader->duration) { fprintf(dump, "<TextSample sampleTime=\"%s\" text=\"\" />\n", ttd_format_time(trak->Media->mediaHeader->duration, trak->Media->mediaHeader->timeScale, szDur, GF_FALSE)); } fprintf(dump, "</TextStream>\n"); if (count) gf_set_progress("TTXT Extract", count, count); return GF_OK; } static GF_Err gf_isom_dump_srt_track(GF_ISOFile *the_file, u32 track, FILE *dump) { u32 i, j, k, count, di, len, ts, cur_frame; u64 start, end; GF_Tx3gSampleEntryBox *txtd; GF_BitStream *bs; char szDur[100]; GF_TrackBox *trak = gf_isom_get_track_from_file(the_file, track); if (!trak) return GF_BAD_PARAM; switch (trak->Media->handler->handlerType) { case GF_ISOM_MEDIA_TEXT: case GF_ISOM_MEDIA_SUBT: break; default: return GF_BAD_PARAM; } ts = trak->Media->mediaHeader->timeScale; cur_frame = 0; start = end = 0; count = gf_isom_get_sample_count(the_file, track); for (i=0; i<count; i++) { GF_TextSample *txt; GF_ISOSample *s = gf_isom_get_sample(the_file, track, i+1, &di); if (!s) continue; start = s->DTS; if (s->dataLength==2) { gf_isom_sample_del(&s); continue; } if (i+1<count) { GF_ISOSample *next = gf_isom_get_sample_info(the_file, track, i+2, NULL, NULL); if (next) { end = next->DTS; gf_isom_sample_del(&next); } } else { end = gf_isom_get_media_duration(the_file, track) ; } cur_frame++; fprintf(dump, "%d\n", cur_frame); ttd_format_time(start, ts, szDur, GF_TRUE); fprintf(dump, "%s --> ", szDur); ttd_format_time(end, ts, szDur, GF_TRUE); fprintf(dump, "%s\n", szDur); bs = gf_bs_new(s->data, s->dataLength, GF_BITSTREAM_READ); txt = gf_isom_parse_texte_sample(bs); gf_bs_del(bs); txtd = (GF_Tx3gSampleEntryBox *)gf_list_get(trak->Media->information->sampleTable->SampleDescription->other_boxes, di-1); if (!txt->len) { fprintf(dump, "\n"); } else { u32 styles, char_num, new_styles, color, new_color; u16 utf16Line[10000]; /*UTF16*/ if ((txt->len>2) && ((unsigned char) txt->text[0] == (unsigned char) 0xFE) && ((unsigned char) txt->text[1] == (unsigned char) 0xFF)) { memcpy(utf16Line, txt->text+2, sizeof(char)*txt->len); ( ((char *)utf16Line)[txt->len] ) = 0; len = txt->len; } else { u8 *str = (u8 *) (txt->text); size_t res = gf_utf8_mbstowcs(utf16Line, 10000, (const char **) &str); if (res==(size_t)-1) return GF_NON_COMPLIANT_BITSTREAM; len = (u32) res; utf16Line[len] = 0; } char_num = 0; styles = 0; new_styles = txtd->default_style.style_flags; color = new_color = txtd->default_style.text_color; for (j=0; j<len; j++) { Bool is_new_line; if (txt->styles) { new_styles = txtd->default_style.style_flags; new_color = txtd->default_style.text_color; for (k=0; k<txt->styles->entry_count; k++) { if (txt->styles->styles[k].startCharOffset>char_num) continue; if (txt->styles->styles[k].endCharOffset<char_num+1) continue; if (txt->styles->styles[k].style_flags & (GF_TXT_STYLE_ITALIC | GF_TXT_STYLE_BOLD | GF_TXT_STYLE_UNDERLINED)) { new_styles = txt->styles->styles[k].style_flags; new_color = txt->styles->styles[k].text_color; break; } } } if (new_styles != styles) { if ((new_styles & GF_TXT_STYLE_BOLD) && !(styles & GF_TXT_STYLE_BOLD)) fprintf(dump, "<b>"); if ((new_styles & GF_TXT_STYLE_ITALIC) && !(styles & GF_TXT_STYLE_ITALIC)) fprintf(dump, "<i>"); if ((new_styles & GF_TXT_STYLE_UNDERLINED) && !(styles & GF_TXT_STYLE_UNDERLINED)) fprintf(dump, "<u>"); if ((styles & GF_TXT_STYLE_UNDERLINED) && !(new_styles & GF_TXT_STYLE_UNDERLINED)) fprintf(dump, "</u>"); if ((styles & GF_TXT_STYLE_ITALIC) && !(new_styles & GF_TXT_STYLE_ITALIC)) fprintf(dump, "</i>"); if ((styles & GF_TXT_STYLE_BOLD) && !(new_styles & GF_TXT_STYLE_BOLD)) fprintf(dump, "</b>"); styles = new_styles; } if (new_color != color) { if (new_color ==txtd->default_style.text_color) { fprintf(dump, "</font>"); } else { fprintf(dump, "<font color=\"%s\">", gf_color_get_name(new_color) ); } color = new_color; } /*not sure if styles must be reseted at line breaks in srt...*/ is_new_line = GF_FALSE; if ((utf16Line[j]=='\n') || (utf16Line[j]=='\r') ) { if ((utf16Line[j]=='\r') && (utf16Line[j+1]=='\n')) j++; fprintf(dump, "\n"); is_new_line = GF_TRUE; } if (!is_new_line) { size_t sl; char szChar[30]; s16 swT[2], *swz; swT[0] = utf16Line[j]; swT[1] = 0; swz= (s16 *)swT; sl = gf_utf8_wcstombs(szChar, 30, (const unsigned short **) &swz); if (sl == (size_t)-1) sl=0; szChar[(u32) sl]=0; fprintf(dump, "%s", szChar); } char_num++; } new_styles = 0; if (new_styles != styles) { if (styles & GF_TXT_STYLE_UNDERLINED) fprintf(dump, "</u>"); if (styles & GF_TXT_STYLE_ITALIC) fprintf(dump, "</i>"); if (styles & GF_TXT_STYLE_BOLD) fprintf(dump, "</b>"); styles = 0; } if (color != txtd->default_style.text_color) { fprintf(dump, "</font>"); color = txtd->default_style.text_color; } fprintf(dump, "\n"); } gf_isom_sample_del(&s); gf_isom_delete_text_sample(txt); fprintf(dump, "\n"); gf_set_progress("SRT Extract", i, count); } if (count) gf_set_progress("SRT Extract", i, count); return GF_OK; } static GF_Err gf_isom_dump_svg_track(GF_ISOFile *the_file, u32 track, FILE *dump) { char nhmlFileName[1024]; FILE *nhmlFile; u32 i, count, di, ts, cur_frame; u64 start, end; GF_BitStream *bs; GF_TrackBox *trak = gf_isom_get_track_from_file(the_file, track); if (!trak) return GF_BAD_PARAM; switch (trak->Media->handler->handlerType) { case GF_ISOM_MEDIA_TEXT: case GF_ISOM_MEDIA_SUBT: break; default: return GF_BAD_PARAM; } strcpy(nhmlFileName, the_file->fileName); strcat(nhmlFileName, ".nhml"); nhmlFile = gf_fopen(nhmlFileName, "wt"); fprintf(nhmlFile, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); fprintf(nhmlFile, "<NHNTStream streamType=\"3\" objectTypeIndication=\"10\" timeScale=\"%d\" baseMediaFile=\"file.svg\" inRootOD=\"yes\">\n", trak->Media->mediaHeader->timeScale); fprintf(nhmlFile, "<NHNTSample isRAP=\"yes\" DTS=\"0\" xmlFrom=\"doc.start\" xmlTo=\"text_1.start\"/>\n"); ts = trak->Media->mediaHeader->timeScale; cur_frame = 0; start = end = 0; fprintf(dump, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); 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); fprintf(dump, "<g transform=\"translate(%d, %d)\" text-anchor=\"middle\">\n", (trak->Header->width >> 16)/2 , (trak->Header->height >> 16)/2); count = gf_isom_get_sample_count(the_file, track); for (i=0; i<count; i++) { GF_TextSample *txt; GF_ISOSample *s = gf_isom_get_sample(the_file, track, i+1, &di); if (!s) continue; start = s->DTS; if (s->dataLength==2) { gf_isom_sample_del(&s); continue; } if (i+1<count) { GF_ISOSample *next = gf_isom_get_sample_info(the_file, track, i+2, NULL, NULL); if (next) { end = next->DTS; gf_isom_sample_del(&next); } } cur_frame++; bs = gf_bs_new(s->data, s->dataLength, GF_BITSTREAM_READ); txt = gf_isom_parse_texte_sample(bs); gf_bs_del(bs); if (!txt->len) continue; fprintf(dump, " <text id=\"text_%d\" display=\"none\">%s\n", cur_frame, txt->text); fprintf(dump, " <set attributeName=\"display\" to=\"inline\" begin=\"%g\" end=\"%g\"/>\n", ((s64)start*1.0)/ts, ((s64)end*1.0)/ts); fprintf(dump, " <discard begin=\"%g\"/>\n", ((s64)end*1.0)/ts); fprintf(dump, " </text>\n"); gf_isom_sample_del(&s); gf_isom_delete_text_sample(txt); fprintf(dump, "\n"); gf_set_progress("SRT Extract", i, count); if (i == count - 2) { fprintf(nhmlFile, "<NHNTSample isRAP=\"no\" DTS=\"%f\" xmlFrom=\"text_%d.start\" xmlTo=\"doc.end\"/>\n", ((s64)start*1.0), cur_frame); } else { 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); } } fprintf(dump, "</g>\n"); fprintf(dump, "</svg>\n"); fprintf(nhmlFile, "</NHNTStream>\n"); gf_fclose(nhmlFile); if (count) gf_set_progress("SRT Extract", i, count); return GF_OK; } GF_EXPORT GF_Err gf_isom_text_dump(GF_ISOFile *the_file, u32 track, FILE *dump, GF_TextDumpType dump_type) { switch (dump_type) { case GF_TEXTDUMPTYPE_SVG: return gf_isom_dump_svg_track(the_file, track, dump); case GF_TEXTDUMPTYPE_SRT: return gf_isom_dump_srt_track(the_file, track, dump); case GF_TEXTDUMPTYPE_TTXT: default: return gf_isom_dump_ttxt_track(the_file, track, dump); } } /* ISMA 1.0 Encryption and Authentication V 1.0 dump */ GF_Err sinf_dump(GF_Box *a, FILE * trace) { GF_ProtectionInfoBox *p; p = (GF_ProtectionInfoBox *)a; fprintf(trace, "<ProtectionInfoBox>\n"); DumpBox(a, trace); gf_box_dump_ex(p->original_format, trace, GF_ISOM_BOX_TYPE_FRMA); gf_box_dump_ex(p->scheme_type, trace, GF_ISOM_BOX_TYPE_SCHM); gf_box_dump_ex(p->info, trace, GF_ISOM_BOX_TYPE_SCHI); gf_box_dump_done("ProtectionInfoBox", a, trace); return GF_OK; } GF_Err frma_dump(GF_Box *a, FILE * trace) { GF_OriginalFormatBox *p; p = (GF_OriginalFormatBox *)a; fprintf(trace, "<OriginalFormatBox data_format=\"%s\">\n", gf_4cc_to_str(p->data_format)); DumpBox(a, trace); gf_box_dump_done("OriginalFormatBox", a, trace); return GF_OK; } GF_Err schm_dump(GF_Box *a, FILE * trace) { GF_SchemeTypeBox *p; p = (GF_SchemeTypeBox *)a; fprintf(trace, "<SchemeTypeBox scheme_type=\"%s\" scheme_version=\"%d\" ", gf_4cc_to_str(p->scheme_type), p->scheme_version); if (p->URI) fprintf(trace, "scheme_uri=\"%s\"", p->URI); fprintf(trace, ">\n"); DumpBox(a, trace); gf_full_box_dump(a, trace); gf_box_dump_done("SchemeTypeBox", a, trace); return GF_OK; } GF_Err schi_dump(GF_Box *a, FILE * trace) { GF_SchemeInformationBox *p; p = (GF_SchemeInformationBox *)a; fprintf(trace, "<SchemeInformationBox>\n"); DumpBox(a, trace); if (p->ikms) gf_box_dump(p->ikms, trace); if (p->isfm) gf_box_dump(p->isfm, trace); if (p->okms) gf_box_dump(p->okms, trace); if (p->tenc) gf_box_dump(p->tenc, trace); if (p->adkm) gf_box_dump(p->adkm, trace); gf_box_dump_done("SchemeInformationBox", a, trace); return GF_OK; } GF_Err iKMS_dump(GF_Box *a, FILE * trace) { GF_ISMAKMSBox *p; p = (GF_ISMAKMSBox *)a; fprintf(trace, "<KMSBox kms_URI=\"%s\">\n", p->URI); DumpBox(a, trace); gf_full_box_dump(a, trace); gf_box_dump_done("KMSBox", a, trace); return GF_OK; } GF_Err iSFM_dump(GF_Box *a, FILE * trace) { GF_ISMASampleFormatBox *p; const char *name = (a->type==GF_ISOM_BOX_TYPE_ISFM) ? "ISMASampleFormat" : "OMADRMAUFormatBox"; p = (GF_ISMASampleFormatBox *)a; fprintf(trace, "<%s selective_encryption=\"%d\" key_indicator_length=\"%d\" IV_length=\"%d\">\n", name, p->selective_encryption, p->key_indicator_length, p->IV_length); DumpBox(a, trace); gf_full_box_dump(a, trace); gf_box_dump_done(NULL, a, trace); fprintf(trace, "</%s>\n", name); return GF_OK; } static void dump_data(FILE *trace, char *name, char *data, u32 data_size) { u32 i; fprintf(trace, "%s=\"0x", name); for (i=0; i<data_size; i++) fprintf(trace, "%02X", (unsigned char) data[i]); fprintf(trace, "\" "); } GF_EXPORT GF_Err gf_isom_dump_ismacryp_protection(GF_ISOFile *the_file, u32 trackNumber, FILE * trace) { u32 i, count; GF_SampleEntryBox *entry; GF_Err e; GF_TrackBox *trak; trak = gf_isom_get_track_from_file(the_file, trackNumber); if (!trak) return GF_BAD_PARAM; fprintf(trace, "<ISMACrypSampleDescriptions>\n"); count = gf_isom_get_sample_description_count(the_file, trackNumber); for (i=0; i<count; i++) { e = Media_GetSampleDesc(trak->Media, i+1, (GF_SampleEntryBox **) &entry, NULL); if (e) return e; switch (entry->type) { case GF_ISOM_BOX_TYPE_ENCA: case GF_ISOM_BOX_TYPE_ENCV: case GF_ISOM_BOX_TYPE_ENCT: case GF_ISOM_BOX_TYPE_ENCS: break; default: continue; } gf_box_dump(entry, trace); } fprintf(trace, "</ISMACrypSampleDescriptions>\n"); return GF_OK; } GF_EXPORT GF_Err gf_isom_dump_ismacryp_sample(GF_ISOFile *the_file, u32 trackNumber, u32 SampleNum, FILE * trace) { GF_ISOSample *samp; GF_ISMASample *isma_samp; u32 descIndex; samp = gf_isom_get_sample(the_file, trackNumber, SampleNum, &descIndex); if (!samp) return GF_BAD_PARAM; isma_samp = gf_isom_get_ismacryp_sample(the_file, trackNumber, samp, descIndex); if (!isma_samp) { gf_isom_sample_del(&samp); return GF_NOT_SUPPORTED; } fprintf(trace, "<ISMACrypSample SampleNumber=\"%d\" DataSize=\"%d\" CompositionTime=\""LLD"\" ", SampleNum, isma_samp->dataLength, LLD_CAST (samp->DTS+samp->CTS_Offset) ); if (samp->CTS_Offset) fprintf(trace, "DecodingTime=\""LLD"\" ", LLD_CAST samp->DTS); if (gf_isom_has_sync_points(the_file, trackNumber)) fprintf(trace, "RandomAccessPoint=\"%s\" ", samp->IsRAP ? "Yes" : "No"); fprintf(trace, "IsEncrypted=\"%s\" ", (isma_samp->flags & GF_ISOM_ISMA_IS_ENCRYPTED) ? "Yes" : "No"); if (isma_samp->flags & GF_ISOM_ISMA_IS_ENCRYPTED) { fprintf(trace, "IV=\""LLD"\" ", LLD_CAST isma_samp->IV); if (isma_samp->key_indicator) dump_data(trace, "KeyIndicator", (char*)isma_samp->key_indicator, isma_samp->KI_length); } fprintf(trace, "/>\n"); gf_isom_sample_del(&samp); gf_isom_ismacryp_delete_sample(isma_samp); return GF_OK; } /* end of ISMA 1.0 Encryption and Authentication V 1.0 */ /* Apple extensions */ static GF_Err apple_tag_dump(GF_Box *a, FILE * trace) { GF_BitStream *bs; u32 val; Bool no_dump = GF_FALSE; char *name = "Unknown"; GF_ListItemBox *itune = (GF_ListItemBox *)a; switch (itune->type) { case GF_ISOM_BOX_TYPE_0xA9NAM: name = "Name"; break; case GF_ISOM_BOX_TYPE_0xA9CMT: name = "Comment"; break; case GF_ISOM_BOX_TYPE_0xA9DAY: name = "Created"; break; case GF_ISOM_BOX_TYPE_0xA9ART: name = "Artist"; break; case GF_ISOM_BOX_TYPE_0xA9TRK: name = "Track"; break; case GF_ISOM_BOX_TYPE_0xA9ALB: name = "Album"; break; case GF_ISOM_BOX_TYPE_0xA9COM: name = "Compositor"; break; case GF_ISOM_BOX_TYPE_0xA9WRT: name = "Writer"; break; case GF_ISOM_BOX_TYPE_0xA9TOO: name = "Tool"; break; case GF_ISOM_BOX_TYPE_0xA9CPY: name = "Copyright"; break; case GF_ISOM_BOX_TYPE_0xA9DES: name = "Description"; break; case GF_ISOM_BOX_TYPE_0xA9GEN: case GF_ISOM_BOX_TYPE_GNRE: name = "Genre"; break; case GF_ISOM_BOX_TYPE_aART: name = "AlbumArtist"; break; case GF_ISOM_BOX_TYPE_PGAP: name = "Gapeless"; break; case GF_ISOM_BOX_TYPE_DISK: name = "Disk"; break; case GF_ISOM_BOX_TYPE_TRKN: name = "TrackNumber"; break; case GF_ISOM_BOX_TYPE_TMPO: name = "Tempo"; break; case GF_ISOM_BOX_TYPE_CPIL: name = "Compilation"; break; case GF_ISOM_BOX_TYPE_COVR: name = "CoverArt"; no_dump = GF_TRUE; break; case GF_ISOM_BOX_TYPE_iTunesSpecificInfo: name = "iTunesSpecific"; no_dump = GF_TRUE; break; case GF_ISOM_BOX_TYPE_0xA9GRP: name = "Group"; break; case GF_ISOM_ITUNE_ENCODER: name = "Encoder"; break; } fprintf(trace, "<%sBox", name); if (!no_dump) { switch (itune->type) { case GF_ISOM_BOX_TYPE_DISK: case GF_ISOM_BOX_TYPE_TRKN: bs = gf_bs_new(itune->data->data, itune->data->dataSize, GF_BITSTREAM_READ); gf_bs_read_int(bs, 16); val = gf_bs_read_int(bs, 16); if (itune->type==GF_ISOM_BOX_TYPE_DISK) { fprintf(trace, " DiskNumber=\"%d\" NbDisks=\"%d\" ", val, gf_bs_read_int(bs, 16) ); } else { fprintf(trace, " TrackNumber=\"%d\" NbTracks=\"%d\" ", val, gf_bs_read_int(bs, 16) ); } gf_bs_del(bs); break; case GF_ISOM_BOX_TYPE_TMPO: bs = gf_bs_new(itune->data->data, itune->data->dataSize, GF_BITSTREAM_READ); fprintf(trace, " BPM=\"%d\" ", gf_bs_read_int(bs, 16) ); gf_bs_del(bs); break; case GF_ISOM_BOX_TYPE_CPIL: fprintf(trace, " IsCompilation=\"%s\" ", itune->data->data[0] ? "yes" : "no"); break; case GF_ISOM_BOX_TYPE_PGAP: fprintf(trace, " IsGapeless=\"%s\" ", itune->data->data[0] ? "yes" : "no"); break; default: if (strcmp(name, "Unknown") && itune->data->data) { if (itune->data && itune->data->data[0]) { fprintf(trace, " value=\"%s\" ", itune->data->data); } else { fprintf(trace, " value=\""); DumpData(trace, itune->data->data, itune->data->dataSize); fprintf(trace, "\" "); } } break; } } fprintf(trace, ">\n"); if (itune->data) gf_full_box_dump((GF_Box *)itune->data, trace); DumpBox(a, trace); gf_box_dump_done(NULL, a, trace); fprintf(trace, "</%sBox>\n", name); return GF_OK; } #ifndef GPAC_DISABLE_ISOM_ADOBE GF_Err abst_dump(GF_Box *a, FILE * trace) { u32 i; GF_AdobeBootstrapInfoBox *p = (GF_AdobeBootstrapInfoBox*)a; fprintf(trace, "<AdobeBootstrapBox BootstrapinfoVersion=\"%u\" Profile=\"%u\" Live=\"%u\" Update=\"%u\" TimeScale=\"%u\" CurrentMediaTime=\""LLU"\" SmpteTimeCodeOffset=\""LLU"\" ", p->bootstrapinfo_version, p->profile, p->live, p->update, p->time_scale, p->current_media_time, p->smpte_time_code_offset); if (p->movie_identifier) fprintf(trace, "MovieIdentifier=\"%s\" ", p->movie_identifier); if (p->drm_data) fprintf(trace, "DrmData=\"%s\" ", p->drm_data); if (p->meta_data) fprintf(trace, "MetaData=\"%s\" ", p->meta_data); fprintf(trace, ">\n"); DumpBox(a, trace); gf_full_box_dump(a, trace); for (i=0; i<p->server_entry_count; i++) { char *str = (char*)gf_list_get(p->server_entry_table, i); fprintf(trace, "<ServerEntry>%s</ServerEntry>\n", str); } for (i=0; i<p->quality_entry_count; i++) { char *str = (char*)gf_list_get(p->quality_entry_table, i); fprintf(trace, "<QualityEntry>%s</QualityEntry>\n", str); } for (i=0; i<p->segment_run_table_count; i++) gf_box_dump(gf_list_get(p->segment_run_table_entries, i), trace); for (i=0; i<p->fragment_run_table_count; i++) gf_box_dump(gf_list_get(p->fragment_run_table_entries, i), trace); gf_box_dump_done("AdobeBootstrapBox", a, trace); return GF_OK; } GF_Err afra_dump(GF_Box *a, FILE * trace) { u32 i; GF_AdobeFragRandomAccessBox *p = (GF_AdobeFragRandomAccessBox*)a; fprintf(trace, "<AdobeFragmentRandomAccessBox LongIDs=\"%u\" LongOffsets=\"%u\" TimeScale=\"%u\">\n", p->long_ids, p->long_offsets, p->time_scale); DumpBox(a, trace); gf_full_box_dump(a, trace); for (i=0; i<p->entry_count; i++) { GF_AfraEntry *ae = (GF_AfraEntry *)gf_list_get(p->local_access_entries, i); fprintf(trace, "<LocalAccessEntry Time=\""LLU"\" Offset=\""LLU"\"/>\n", ae->time, ae->offset); } for (i=0; i<p->global_entry_count; i++) { GF_GlobalAfraEntry *gae = (GF_GlobalAfraEntry *)gf_list_get(p->global_access_entries, i); fprintf(trace, "<GlobalAccessEntry Time=\""LLU"\" Segment=\"%u\" Fragment=\"%u\" AfraOffset=\""LLU"\" OffsetFromAfra=\""LLU"\"/>\n", gae->time, gae->segment, gae->fragment, gae->afra_offset, gae->offset_from_afra); } gf_box_dump_done("AdobeFragmentRandomAccessBox", a, trace); return GF_OK; } GF_Err afrt_dump(GF_Box *a, FILE * trace) { u32 i; GF_AdobeFragmentRunTableBox *p = (GF_AdobeFragmentRunTableBox*)a; fprintf(trace, "<AdobeFragmentRunTableBox TimeScale=\"%u\">\n", p->timescale); DumpBox(a, trace); gf_full_box_dump(a, trace); for (i=0; i<p->quality_entry_count; i++) { char *str = (char*)gf_list_get(p->quality_segment_url_modifiers, i); fprintf(trace, "<QualityEntry>%s</QualityEntry>\n", str); } for (i=0; i<p->fragment_run_entry_count; i++) { GF_AdobeFragmentRunEntry *fre = (GF_AdobeFragmentRunEntry *)gf_list_get(p->fragment_run_entry_table, i); fprintf(trace, "<FragmentRunEntry FirstFragment=\"%u\" FirstFragmentTimestamp=\""LLU"\" FirstFragmentDuration=\"%u\"", fre->first_fragment, fre->first_fragment_timestamp, fre->fragment_duration); if (!fre->fragment_duration) fprintf(trace, " DiscontinuityIndicator=\"%u\"", fre->discontinuity_indicator); fprintf(trace, "/>\n"); } gf_box_dump_done("AdobeFragmentRunTableBox", a, trace); return GF_OK; } GF_Err asrt_dump(GF_Box *a, FILE * trace) { u32 i; GF_AdobeSegmentRunTableBox *p = (GF_AdobeSegmentRunTableBox*)a; fprintf(trace, "<AdobeSegmentRunTableBox>\n"); DumpBox(a, trace); gf_full_box_dump(a, trace); for (i=0; i<p->quality_entry_count; i++) { char *str = (char*)gf_list_get(p->quality_segment_url_modifiers, i); fprintf(trace, "<QualityEntry>%s</QualityEntry>\n", str); } for (i=0; i<p->segment_run_entry_count; i++) { GF_AdobeSegmentRunEntry *sre = (GF_AdobeSegmentRunEntry *)gf_list_get(p->segment_run_entry_table, i); fprintf(trace, "<SegmentRunEntry FirstSegment=\"%u\" FragmentsPerSegment=\"%u\"/>\n", sre->first_segment, sre->fragment_per_segment); } gf_box_dump_done("AdobeSegmentRunTableBox", a, trace); return GF_OK; } #endif /*GPAC_DISABLE_ISOM_ADOBE*/ GF_Err ilst_dump(GF_Box *a, FILE * trace) { u32 i; GF_Box *tag; GF_Err e; GF_ItemListBox *ptr; ptr = (GF_ItemListBox *)a; fprintf(trace, "<ItemListBox>\n"); DumpBox(a, trace); i=0; while ( (tag = (GF_Box*)gf_list_enum(ptr->other_boxes, &i))) { e = apple_tag_dump(tag, trace); if(e) return e; } gf_box_dump_done("ItemListBox", NULL, trace); return GF_OK; } GF_Err ListEntry_dump(GF_Box *a, FILE * trace) { fprintf(trace, "<ListEntry>\n"); DumpBox(a, trace); gf_box_dump(a, trace); fprintf(trace, "</ListEntry>\n"); return GF_OK; } GF_Err data_dump(GF_Box *a, FILE * trace) { fprintf(trace, "<data>\n"); DumpBox(a, trace); gf_full_box_dump(a, trace); fprintf(trace, "</data>\n"); return GF_OK; } GF_Err ohdr_dump(GF_Box *a, FILE * trace) { GF_OMADRMCommonHeaderBox *ptr = (GF_OMADRMCommonHeaderBox *)a; fprintf(trace, "<OMADRMCommonHeaderBox EncryptionMethod=\"%d\" PaddingScheme=\"%d\" PlaintextLength=\""LLD"\" ", ptr->EncryptionMethod, ptr->PaddingScheme, ptr->PlaintextLength); if (ptr->RightsIssuerURL) fprintf(trace, "RightsIssuerURL=\"%s\" ", ptr->RightsIssuerURL); if (ptr->ContentID) fprintf(trace, "ContentID=\"%s\" ", ptr->ContentID); if (ptr->TextualHeaders) { u32 i, offset; char *start = ptr->TextualHeaders; fprintf(trace, "TextualHeaders=\""); i=offset=0; while (i<ptr->TextualHeadersLen) { if (start[i]==0) { fprintf(trace, "%s ", start+offset); offset=i+1; } i++; } fprintf(trace, "%s\" ", start+offset); } fprintf(trace, ">\n"); gf_full_box_dump((GF_Box *)a, trace); gf_box_dump_done("OMADRMCommonHeaderBox", a, trace); return GF_OK; } GF_Err grpi_dump(GF_Box *a, FILE * trace) { GF_OMADRMGroupIDBox *ptr = (GF_OMADRMGroupIDBox *)a; fprintf(trace, "<OMADRMGroupIDBox GroupID=\"%s\" EncryptionMethod=\"%d\" GroupKey=\" ", ptr->GroupID, ptr->GKEncryptionMethod); DumpData(trace, ptr->GroupKey, ptr->GKLength); fprintf(trace, ">\n"); gf_full_box_dump((GF_Box *)a, trace); gf_box_dump_done("OMADRMGroupIDBox", a, trace); return GF_OK; } GF_Err mdri_dump(GF_Box *a, FILE * trace) { //GF_OMADRMMutableInformationBox *ptr = (GF_OMADRMMutableInformationBox*)a; fprintf(trace, "<OMADRMMutableInformationBox>\n"); gf_box_dump((GF_Box *)a, trace); gf_box_dump_done("OMADRMMutableInformationBox", a, trace); return GF_OK; } GF_Err odtt_dump(GF_Box *a, FILE * trace) { GF_OMADRMTransactionTrackingBox *ptr = (GF_OMADRMTransactionTrackingBox *)a; fprintf(trace, "<OMADRMTransactionTrackingBox TransactionID=\""); DumpData(trace, ptr->TransactionID, 16); fprintf(trace, "\">\n"); gf_full_box_dump((GF_Box *)a, trace); gf_box_dump_done("OMADRMTransactionTrackingBox", a, trace); return GF_OK; } GF_Err odrb_dump(GF_Box *a, FILE * trace) { GF_OMADRMRightsObjectBox*ptr = (GF_OMADRMRightsObjectBox*)a; fprintf(trace, "<OMADRMRightsObjectBox OMARightsObject=\""); DumpData(trace, ptr->oma_ro, ptr->oma_ro_size); fprintf(trace, "\">\n"); gf_full_box_dump((GF_Box *)a, trace); gf_box_dump_done("OMADRMRightsObjectBox", a, trace); return GF_OK; } GF_Err odkm_dump(GF_Box *a, FILE * trace) { GF_OMADRMKMSBox *ptr = (GF_OMADRMKMSBox*)a; fprintf(trace, "<OMADRMKMSBox>\n"); gf_full_box_dump((GF_Box *)a, trace); if (ptr->hdr) gf_box_dump((GF_Box *)ptr->hdr, trace); if (ptr->fmt) gf_box_dump((GF_Box *)ptr->fmt, trace); gf_box_dump_done("OMADRMKMSBox", a, trace); return GF_OK; } GF_Err pasp_dump(GF_Box *a, FILE * trace) { GF_PixelAspectRatioBox *ptr = (GF_PixelAspectRatioBox*)a; fprintf(trace, "<PixelAspectRatioBox hSpacing=\"%d\" vSpacing=\"%d\" >\n", ptr->hSpacing, ptr->vSpacing); DumpBox((GF_Box *)a, trace); gf_box_dump_done("PixelAspectRatioBox", a, trace); return GF_OK; } GF_Err tsel_dump(GF_Box *a, FILE * trace) { u32 i; GF_TrackSelectionBox *ptr = (GF_TrackSelectionBox *)a; fprintf(trace, "<TrackSelectionBox switchGroup=\"%d\" criteria=\"", ptr->switchGroup); for (i=0; i<ptr->attributeListCount; i++) { if (i) fprintf(trace, ";"); fprintf(trace, "%s", gf_4cc_to_str(ptr->attributeList[i])); } fprintf(trace, "\">\n"); gf_full_box_dump((GF_Box *)a, trace); gf_box_dump_done("TrackSelectionBox", a, trace); return GF_OK; } GF_Err metx_dump(GF_Box *a, FILE * trace) { GF_MetaDataSampleEntryBox *ptr = (GF_MetaDataSampleEntryBox*)a; const char *name; switch (ptr->type) { case GF_ISOM_BOX_TYPE_METX: name = "XMLMetaDataSampleEntryBox"; break; case GF_ISOM_BOX_TYPE_METT: name = "TextMetaDataSampleEntryBox"; break; case GF_ISOM_BOX_TYPE_SBTT: name = "SubtitleSampleEntryBox"; break; case GF_ISOM_BOX_TYPE_STXT: name = "SimpleTextSampleEntryBox"; break; case GF_ISOM_BOX_TYPE_STPP: name = "XMLSubtitleSampleEntryBox"; break; default: name = "UnknownTextSampleEntryBox"; break; } fprintf(trace, "<%s ", name); if (ptr->type==GF_ISOM_BOX_TYPE_METX) { fprintf(trace, "namespace=\"%s\" ", ptr->xml_namespace); if (ptr->xml_schema_loc) fprintf(trace, "schema_location=\"%s\" ", ptr->xml_schema_loc); if (ptr->content_encoding) fprintf(trace, "content_encoding=\"%s\" ", ptr->content_encoding); } else if (ptr->type==GF_ISOM_BOX_TYPE_STPP) { fprintf(trace, "namespace=\"%s\" ", ptr->xml_namespace); if (ptr->xml_schema_loc) fprintf(trace, "schema_location=\"%s\" ", ptr->xml_schema_loc); if (ptr->mime_type) fprintf(trace, "auxiliary_mime_types=\"%s\" ", ptr->mime_type); } //mett, sbtt, stxt else { fprintf(trace, "mime_type=\"%s\" ", ptr->mime_type); if (ptr->content_encoding) fprintf(trace, "content_encoding=\"%s\" ", ptr->content_encoding); } fprintf(trace, ">\n"); DumpBox(a, trace); if ((ptr->type!=GF_ISOM_BOX_TYPE_METX) && (ptr->type!=GF_ISOM_BOX_TYPE_STPP) ) { if (ptr->config) gf_box_dump(ptr->config, trace); } gf_box_array_dump(ptr->protections, trace); gf_box_dump_done(NULL, a, trace); fprintf(trace, "</%s>\n", name); return GF_OK; } GF_Err txtc_dump(GF_Box *a, FILE * trace) { GF_TextConfigBox *ptr = (GF_TextConfigBox*)a; const char *name = "TextConfigBox"; fprintf(trace, "<%s>", name); DumpBox(a, trace); if (ptr->config) fprintf(trace, "%s", ptr->config); gf_box_dump_done(NULL, a, trace); fprintf(trace, "</%s>\n", name); return GF_OK; } GF_Err dims_dump(GF_Box *a, FILE * trace) { GF_DIMSSampleEntryBox *p = (GF_DIMSSampleEntryBox*)a; fprintf(trace, "<DIMSSampleEntryBox dataReferenceIndex=\"%d\">\n", p->dataReferenceIndex); DumpBox(a, trace); if (p->config) gf_box_dump(p->config, trace); if (p->scripts) gf_box_dump(p->scripts, trace); gf_box_array_dump(p->protections, trace); gf_box_dump_done("DIMSSampleEntryBox", a, trace); return GF_OK; } GF_Err diST_dump(GF_Box *a, FILE * trace) { GF_DIMSScriptTypesBox *p = (GF_DIMSScriptTypesBox*)a; fprintf(trace, "<DIMSScriptTypesBox types=\"%s\">\n", p->content_script_types); DumpBox(a, trace); gf_box_dump_done("DIMSScriptTypesBox", a, trace); return GF_OK; } GF_Err dimC_dump(GF_Box *a, FILE * trace) { GF_DIMSSceneConfigBox *p = (GF_DIMSSceneConfigBox *)a; fprintf(trace, "<DIMSSceneConfigBox profile=\"%d\" level=\"%d\" pathComponents=\"%d\" useFullRequestHosts=\"%d\" streamType=\"%d\" containsRedundant=\"%d\" textEncoding=\"%s\" contentEncoding=\"%s\" >\n", p->profile, p->level, p->pathComponents, p->fullRequestHost, p->streamType, p->containsRedundant, p->textEncoding, p->contentEncoding); DumpBox(a, trace); gf_box_dump_done("DIMSSceneConfigBox", a, trace); return GF_OK; } GF_Err dac3_dump(GF_Box *a, FILE * trace) { GF_AC3ConfigBox *p = (GF_AC3ConfigBox *)a; if (p->cfg.is_ec3) { u32 i; fprintf(trace, "<EC3SpecificBox nb_streams=\"%d\" data_rate=\"%d\">\n", p->cfg.nb_streams, p->cfg.brcode); for (i=0; i<p->cfg.nb_streams; i++) { fprintf(trace, "<EC3StreamConfig fscod=\"%d\" bsid=\"%d\" bsmod=\"%d\" acmod=\"%d\" lfon=\"%d\" num_sub_dep=\"%d\" chan_loc=\"%d\"/>\n", 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].nb_dep_sub, p->cfg.streams[i].chan_loc); } a->type = GF_ISOM_BOX_TYPE_DEC3; DumpBox(a, trace); a->type = GF_ISOM_BOX_TYPE_DAC3; gf_box_dump_done("EC3SpecificBox", a, trace); } else { fprintf(trace, "<AC3SpecificBox fscod=\"%d\" bsid=\"%d\" bsmod=\"%d\" acmod=\"%d\" lfon=\"%d\" bit_rate_code=\"%d\">\n", 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); DumpBox(a, trace); gf_box_dump_done("AC3SpecificBox", a, trace); } return GF_OK; } GF_Err ac3_dump(GF_Box *a, FILE * trace) { GF_AC3SampleEntryBox *p = (GF_AC3SampleEntryBox *)a; if (p->is_ec3) fprintf(trace, "<EC3SampleEntryBox"); else fprintf(trace, "<AC3SampleEntryBox"); base_audio_entry_dump((GF_AudioSampleEntryBox *)p, trace); fprintf(trace, ">\n"); if (p->is_ec3) a->type = GF_ISOM_BOX_TYPE_EC3; DumpBox(a, trace); if (p->is_ec3) a->type = GF_ISOM_BOX_TYPE_AC3; gf_box_dump_ex(p->info, trace, p->is_ec3 ? GF_ISOM_BOX_TYPE_DEC3 : GF_ISOM_BOX_TYPE_DAC3); gf_box_dump_done(p->is_ec3 ? "EC3SampleEntryBox" : "AC3SampleEntryBox", a, trace); return GF_OK; } GF_Err lsrc_dump(GF_Box *a, FILE * trace) { GF_LASERConfigurationBox *p = (GF_LASERConfigurationBox *)a; fprintf(trace, "<LASeRConfigurationBox "); dump_data(trace, "LASeRHeader", p->hdr, p->hdr_size); fprintf(trace, ">"); DumpBox(a, trace); gf_box_dump_done("LASeRConfigurationBox", a, trace); return GF_OK; } GF_Err lsr1_dump(GF_Box *a, FILE * trace) { GF_LASeRSampleEntryBox *p = (GF_LASeRSampleEntryBox*)a; fprintf(trace, "<LASeRSampleEntryBox DataReferenceIndex=\"%d\">\n", p->dataReferenceIndex); DumpBox(a, trace); if (p->lsr_config) gf_box_dump(p->lsr_config, trace); if (p->descr) gf_box_dump(p->descr, trace); gf_box_dump_done("LASeRSampleEntryBox", a, trace); return GF_OK; } GF_Err sidx_dump(GF_Box *a, FILE * trace) { u32 i; GF_SegmentIndexBox *p = (GF_SegmentIndexBox *)a; fprintf(trace, "<SegmentIndexBox reference_ID=\"%d\" timescale=\"%d\" earliest_presentation_time=\""LLD"\" first_offset=\""LLD"\">\n", p->reference_ID, p->timescale, p->earliest_presentation_time, p->first_offset); DumpBox(a, trace); gf_full_box_dump(a, trace); for (i=0; i<p->nb_refs; i++) { 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); } gf_box_dump_done("SegmentIndexBox", a, trace); return GF_OK; } GF_Err pcrb_dump(GF_Box *a, FILE * trace) { u32 i; GF_PcrInfoBox *p = (GF_PcrInfoBox *)a; fprintf(trace, "<MPEG2TSPCRInfoBox subsegment_count=\"%d\">\n", p->subsegment_count); DumpBox(a, trace); for (i=0; i<p->subsegment_count; i++) { fprintf(trace, "<PCRInfo PCR=\""LLU"\" />\n", p->pcr_values[i]); } gf_box_dump_done("MPEG2TSPCRInfoBox", a, trace); return GF_OK; } GF_Err subs_dump(GF_Box *a, FILE * trace) { u32 entry_count, i, j; u16 subsample_count; GF_SubSampleInfoEntry *pSamp; GF_SubSampleEntry *pSubSamp; GF_SubSampleInformationBox *ptr = (GF_SubSampleInformationBox *) a; if (!a) return GF_BAD_PARAM; entry_count = gf_list_count(ptr->Samples); fprintf(trace, "<SubSampleInformationBox EntryCount=\"%d\">\n", entry_count); DumpBox(a, trace); for (i=0; i<entry_count; i++) { pSamp = (GF_SubSampleInfoEntry*) gf_list_get(ptr->Samples, i); subsample_count = gf_list_count(pSamp->SubSamples); fprintf(trace, "<SampleEntry SampleDelta=\"%d\" SubSampleCount=\"%d\">\n", pSamp->sample_delta, subsample_count); for (j=0; j<subsample_count; j++) { pSubSamp = (GF_SubSampleEntry*) gf_list_get(pSamp->SubSamples, j); fprintf(trace, "<SubSample Size=\"%u\" Priority=\"%u\" Discardable=\"%d\" Reserved=\"%08X\"/>\n", pSubSamp->subsample_size, pSubSamp->subsample_priority, pSubSamp->discardable, pSubSamp->reserved); } fprintf(trace, "</SampleEntry>\n"); } gf_box_dump_done("SubSampleInformationBox", a, trace); return GF_OK; } #ifndef GPAC_DISABLE_ISOM_FRAGMENTS GF_Err tfdt_dump(GF_Box *a, FILE * trace) { GF_TFBaseMediaDecodeTimeBox *ptr = (GF_TFBaseMediaDecodeTimeBox*) a; if (!a) return GF_BAD_PARAM; fprintf(trace, "<TrackFragmentBaseMediaDecodeTimeBox baseMediaDecodeTime=\""LLD"\">\n", ptr->baseMediaDecodeTime); DumpBox(a, trace); gf_full_box_dump(a, trace); gf_box_dump_done("TrackFragmentBaseMediaDecodeTimeBox", a, trace); return GF_OK; } #endif /*GPAC_DISABLE_ISOM_FRAGMENTS*/ GF_Err rvcc_dump(GF_Box *a, FILE * trace) { GF_RVCConfigurationBox *ptr = (GF_RVCConfigurationBox*) a; if (!a) return GF_BAD_PARAM; fprintf(trace, "<RVCConfigurationBox predefined=\"%d\"", ptr->predefined_rvc_config); if (! ptr->predefined_rvc_config) fprintf(trace, " rvc_meta_idx=\"%d\"", ptr->rvc_meta_idx); fprintf(trace, ">\n"); DumpBox(a, trace); gf_box_dump_done("RVCConfigurationBox", a, trace); return GF_OK; } GF_Err sbgp_dump(GF_Box *a, FILE * trace) { u32 i; GF_SampleGroupBox *ptr = (GF_SampleGroupBox*) a; if (!a) return GF_BAD_PARAM; fprintf(trace, "<SampleGroupBox grouping_type=\"%s\"", gf_4cc_to_str(ptr->grouping_type) ); if (ptr->version==1) fprintf(trace, " grouping_type_parameter=\"%d\"", ptr->grouping_type_parameter); fprintf(trace, ">\n"); DumpBox(a, trace); gf_full_box_dump((GF_Box *)a, trace); for (i=0; i<ptr->entry_count; i++) { fprintf(trace, "<SampleGroupBoxEntry sample_count=\"%d\" group_description_index=\"%d\"/>\n", ptr->sample_entries[i].sample_count, ptr->sample_entries[i].group_description_index ); } gf_box_dump_done("SampleGroupBox", a, trace); return GF_OK; } GF_Err sgpd_dump(GF_Box *a, FILE * trace) { u32 i; GF_SampleGroupDescriptionBox *ptr = (GF_SampleGroupDescriptionBox*) a; if (!a) return GF_BAD_PARAM; fprintf(trace, "<SampleGroupDescriptionBox grouping_type=\"%s\"", gf_4cc_to_str(ptr->grouping_type) ); if (ptr->version==1) fprintf(trace, " default_length=\"%d\"", ptr->default_length); if ((ptr->version>=2) && ptr->default_description_index) fprintf(trace, " default_group_index=\"%d\"", ptr->default_description_index); fprintf(trace, ">\n"); DumpBox(a, trace); gf_full_box_dump((GF_Box *)a, trace); for (i=0; i<gf_list_count(ptr->group_descriptions); i++) { void *entry = gf_list_get(ptr->group_descriptions, i); switch (ptr->grouping_type) { case GF_4CC( 'r', 'o', 'l', 'l' ): fprintf(trace, "<RollRecoveryEntry roll_distance=\"%d\" />\n", ((GF_RollRecoveryEntry*)entry)->roll_distance ); break; case GF_4CC( 'r', 'a', 'p', ' ' ): fprintf(trace, "<VisualRandomAccessEntry num_leading_samples_known=\"%s\"", ((GF_VisualRandomAccessEntry*)entry)->num_leading_samples_known ? "yes" : "no"); if (((GF_VisualRandomAccessEntry*)entry)->num_leading_samples_known) fprintf(trace, " num_leading_samples=\"%d\" />", ((GF_VisualRandomAccessEntry*)entry)->num_leading_samples); fprintf(trace, "/>\n"); break; case GF_4CC( 's', 'e', 'i', 'g' ): fprintf(trace, "<CENCSampleEncryptionGroupEntry IsEncrypted=\"%d\" IV_size=\"%d\" KID=\"", ((GF_CENCSampleEncryptionGroupEntry*)entry)->IsEncrypted, ((GF_CENCSampleEncryptionGroupEntry*)entry)->IV_size); DumpDataHex(trace, (char *)((GF_CENCSampleEncryptionGroupEntry*)entry)->KID, 16); fprintf(trace, "\"/>\n"); break; case GF_4CC( 't', 'r', 'i', 'f' ): { u32 x,y,w,h, id, independent; Bool full_frame; gf_isom_parse_trif_info( (const char *) ((GF_DefaultSampleGroupDescriptionEntry*)entry)->data, ((GF_DefaultSampleGroupDescriptionEntry*)entry)->length, &id, &independent, &full_frame, &x, &y, &w, &h); fprintf(trace, "<TileRegionGroupEntry ID=\"%d\" independent=\"%d\"", id, independent); if (!full_frame) fprintf(trace, " x=\"%d\" y=\"%d\"", x, y); fprintf(trace, " w=\"%d\" h=\"%d\"/>\n", w, h); } break; default: fprintf(trace, "<DefaultSampleGroupDescriptionEntry size=\"%d\" data=\"", ((GF_DefaultSampleGroupDescriptionEntry*)entry)->length); DumpData(trace, (char *) ((GF_DefaultSampleGroupDescriptionEntry*)entry)->data, ((GF_DefaultSampleGroupDescriptionEntry*)entry)->length); fprintf(trace, "\"/>\n"); } } gf_box_dump_done("SampleGroupDescriptionBox", a, trace); return GF_OK; } GF_Err saiz_dump(GF_Box *a, FILE * trace) { u32 i; GF_SampleAuxiliaryInfoSizeBox *ptr = (GF_SampleAuxiliaryInfoSizeBox*) a; if (!a) return GF_BAD_PARAM; fprintf(trace, "<SampleAuxiliaryInfoSizeBox default_sample_info_size=\"%d\" sample_count=\"%d\"", ptr->default_sample_info_size, ptr->sample_count); if (ptr->flags & 1) { if (isalnum(ptr->aux_info_type>>24)) { fprintf(trace, " aux_info_type=\"%s\" aux_info_type_parameter=\"%d\"", gf_4cc_to_str(ptr->aux_info_type), ptr->aux_info_type_parameter); } else { fprintf(trace, " aux_info_type=\"%d\" aux_info_type_parameter=\"%d\"", ptr->aux_info_type, ptr->aux_info_type_parameter); } } fprintf(trace, ">\n"); DumpBox(a, trace); gf_full_box_dump((GF_Box *)a, trace); if (ptr->default_sample_info_size==0) { for (i=0; i<ptr->sample_count; i++) { fprintf(trace, "<SAISize size=\"%d\" />\n", ptr->sample_info_size[i]); } } gf_box_dump_done("SampleAuxiliaryInfoSizeBox", a, trace); return GF_OK; } GF_Err saio_dump(GF_Box *a, FILE * trace) { u32 i; GF_SampleAuxiliaryInfoOffsetBox *ptr = (GF_SampleAuxiliaryInfoOffsetBox*) a; if (!a) return GF_BAD_PARAM; fprintf(trace, "<SampleAuxiliaryInfoOffsetBox entry_count=\"%d\"", ptr->entry_count); if (ptr->flags & 1) { if (isalnum(ptr->aux_info_type>>24)) { fprintf(trace, " aux_info_type=\"%s\" aux_info_type_parameter=\"%d\"", gf_4cc_to_str(ptr->aux_info_type), ptr->aux_info_type_parameter); } else { fprintf(trace, " aux_info_type=\"%d\" aux_info_type_parameter=\"%d\"", ptr->aux_info_type, ptr->aux_info_type_parameter); } } fprintf(trace, ">\n"); DumpBox(a, trace); gf_full_box_dump((GF_Box *)a, trace); if (ptr->version==0) { for (i=0; i<ptr->entry_count; i++) { fprintf(trace, "<SAIChunkOffset offset=\"%d\"/>\n", ptr->offsets[i]); } } else { for (i=0; i<ptr->entry_count; i++) { fprintf(trace, "<SAIChunkOffset offset=\""LLD"\"/>\n", ptr->offsets_large[i]); } } gf_box_dump_done("SampleAuxiliaryInfoOffsetBox", a, trace); return GF_OK; } GF_Err pssh_dump(GF_Box *a, FILE * trace) { GF_ProtectionSystemHeaderBox *ptr = (GF_ProtectionSystemHeaderBox*) a; if (!a) return GF_BAD_PARAM; fprintf(trace, "<ProtectionSystemHeaderBox SystemID=\""); DumpDataHex(trace, (char *) ptr->SystemID, 16); fprintf(trace, "\">\n"); DumpBox(a, trace); gf_full_box_dump((GF_Box *)a, trace); if (ptr->KID_count) { u32 i; for (i=0; i<ptr->KID_count; i++) { fprintf(trace, " <PSSHKey KID=\""); DumpDataHex(trace, (char *) ptr->KIDs[i], 16); fprintf(trace, "\"/>\n"); } } if (ptr->private_data_size) { fprintf(trace, " <PSSHData size=\"%d\" value=\"", ptr->private_data_size); DumpDataHex(trace, (char *) ptr->private_data, ptr->private_data_size); fprintf(trace, "\"/>\n"); } gf_box_dump_done("ProtectionSystemHeaderBox", a, trace); return GF_OK; } GF_Err tenc_dump(GF_Box *a, FILE * trace) { GF_TrackEncryptionBox *ptr = (GF_TrackEncryptionBox*) a; if (!a) return GF_BAD_PARAM; fprintf(trace, "<TrackEncryptionBox isEncrypted=\"%d\" IV_size=\"%d\" KID=\"", ptr->IsEncrypted, ptr->IV_size); DumpDataHex(trace, (char *) ptr->KID, 16); fprintf(trace, "\">\n"); DumpBox(a, trace); gf_full_box_dump((GF_Box *)a, trace); gf_box_dump_done("TrackEncryptionBox", a, trace); return GF_OK; } GF_Err piff_pssh_dump(GF_Box *a, FILE * trace) { GF_PIFFProtectionSystemHeaderBox *ptr = (GF_PIFFProtectionSystemHeaderBox*) a; if (!a) return GF_BAD_PARAM; fprintf(trace, "<PIFFProtectionSystemHeaderBox SystemID=\""); DumpDataHex(trace, (char *) ptr->SystemID, 16); fprintf(trace, "\" PrivateData=\""); DumpDataHex(trace, (char *) ptr->private_data, ptr->private_data_size); fprintf(trace, "\">\n"); DumpBox(a, trace); fprintf(trace, "<FullBoxInfo Version=\"%d\" Flags=\"%d\"/>\n", ptr->version, ptr->flags); gf_box_dump_done("PIFFProtectionSystemHeaderBox", a, trace); return GF_OK; } GF_Err piff_tenc_dump(GF_Box *a, FILE * trace) { GF_PIFFTrackEncryptionBox *ptr = (GF_PIFFTrackEncryptionBox*) a; if (!a) return GF_BAD_PARAM; fprintf(trace, "<PIFFTrackEncryptionBox AlgorithmID=\"%d\" IV_size=\"%d\" KID=\"", ptr->AlgorithmID, ptr->IV_size); DumpDataHex(trace,(char *) ptr->KID, 16); fprintf(trace, "\">\n"); DumpBox(a, trace); fprintf(trace, "<FullBoxInfo Version=\"%d\" Flags=\"%d\"/>\n", ptr->version, ptr->flags); gf_box_dump_done("PIFFTrackEncryptionBox", a, trace); return GF_OK; } GF_Err piff_psec_dump(GF_Box *a, FILE * trace) { u32 i, j, sample_count; GF_PIFFSampleEncryptionBox *ptr = (GF_PIFFSampleEncryptionBox *) a; if (!a) return GF_BAD_PARAM; sample_count = gf_list_count(ptr->samp_aux_info); fprintf(trace, "<PIFFSampleEncryptionBox sampleCount=\"%d\"", sample_count); if (ptr->flags & 1) { fprintf(trace, " AlgorithmID=\"%d\" IV_size=\"%d\" KID=\"", ptr->AlgorithmID, ptr->IV_size); DumpData(trace, (char *) ptr->KID, 16); fprintf(trace, "\""); } fprintf(trace, ">\n"); DumpBox(a, trace); if (sample_count) { for (i=0; i<sample_count; i++) { GF_CENCSampleAuxInfo *cenc_sample = (GF_CENCSampleAuxInfo *)gf_list_get(ptr->samp_aux_info, i); if (cenc_sample) { if (!strlen((char *)cenc_sample->IV)) continue; fprintf(trace, "<PIFFSampleEncryptionEntry IV=\""); DumpDataHex(trace, (char *) cenc_sample->IV, 16); if (ptr->flags & 0x2) { fprintf(trace, "\" SubsampleCount=\"%d\"", cenc_sample->subsample_count); fprintf(trace, ">\n"); for (j=0; j<cenc_sample->subsample_count; j++) { fprintf(trace, "<PIFFSubSampleEncryptionEntry NumClearBytes=\"%d\" NumEncryptedBytes=\"%d\"/>\n", cenc_sample->subsamples[j].bytes_clear_data, cenc_sample->subsamples[j].bytes_encrypted_data); } } fprintf(trace, "</PIFFSampleEncryptionEntry>\n"); } } } gf_box_dump_done("PIFFSampleEncryptionBox", a, trace); return GF_OK; } GF_Err senc_dump(GF_Box *a, FILE * trace) { u32 i, j, sample_count; GF_SampleEncryptionBox *ptr = (GF_SampleEncryptionBox *) a; if (!a) return GF_BAD_PARAM; sample_count = gf_list_count(ptr->samp_aux_info); fprintf(trace, "<SampleEncryptionBox sampleCount=\"%d\">\n", sample_count); DumpBox(a, trace); //WARNING - PSEC (UUID) IS TYPECASTED TO SENC (FULL BOX) SO WE CANNOT USE USUAL FULL BOX FUNCTIONS fprintf(trace, "<FullBoxInfo Version=\"%d\" Flags=\"0x%X\"/>\n", ptr->version, ptr->flags); for (i=0; i<sample_count; i++) { GF_CENCSampleAuxInfo *cenc_sample = (GF_CENCSampleAuxInfo *)gf_list_get(ptr->samp_aux_info, i); if (cenc_sample) { fprintf(trace, "<SampleEncryptionEntry sampleCount=\"%d\" IV=\"", i+1); DumpDataHex(trace, (char *) cenc_sample->IV, 16); fprintf(trace, "\""); if (ptr->flags & 0x2) { fprintf(trace, " SubsampleCount=\"%d\"", cenc_sample->subsample_count); fprintf(trace, ">\n"); for (j=0; j<cenc_sample->subsample_count; j++) { fprintf(trace, "<SubSampleEncryptionEntry NumClearBytes=\"%d\" NumEncryptedBytes=\"%d\"/>\n", cenc_sample->subsamples[j].bytes_clear_data, cenc_sample->subsamples[j].bytes_encrypted_data); } } else { fprintf(trace, ">\n"); } fprintf(trace, "</SampleEncryptionEntry>\n"); } } gf_box_dump_done("SampleEncryptionBox", a, trace); return GF_OK; } GF_Err prft_dump(GF_Box *a, FILE * trace) { Double fracs; GF_ProducerReferenceTimeBox *ptr = (GF_ProducerReferenceTimeBox *) a; time_t secs = (ptr->ntp >> 32) - GF_NTP_SEC_1900_TO_1970; struct tm t = *gmtime(&secs); fracs = (Double) (ptr->ntp & 0xFFFFFFFFULL); fracs /= 0xFFFFFFFF; fracs *= 1000; fprintf(trace, "<ProducerReferenceTimeBox 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); DumpBox(a, trace); gf_full_box_dump((GF_Box *)a, trace); gf_box_dump_done("ProducerReferenceTimeBox", a, trace); return GF_OK; } GF_Err adkm_dump(GF_Box *a, FILE * trace) { GF_AdobeDRMKeyManagementSystemBox *ptr = (GF_AdobeDRMKeyManagementSystemBox *)a; if (!a) return GF_BAD_PARAM; fprintf(trace, "<GF_AdobeDRMKeyManagementSystemBox>\n"); DumpBox(a, trace); gf_full_box_dump((GF_Box *)a, trace); if (ptr->header) gf_box_dump((GF_Box *)ptr->header, trace); if (ptr->au_format) gf_box_dump((GF_Box *)ptr->au_format, trace); gf_box_dump_done("GF_AdobeDRMKeyManagementSystemBox", a, trace); return GF_OK; } GF_Err ahdr_dump(GF_Box *a, FILE * trace) { GF_AdobeDRMHeaderBox *ptr = (GF_AdobeDRMHeaderBox *)a; if (!a) return GF_BAD_PARAM; fprintf(trace, "<GF_AdobeDRMHeaderBox>\n"); DumpBox(a, trace); gf_full_box_dump((GF_Box *)a, trace); if (ptr->std_enc_params) gf_box_dump((GF_Box *)ptr->std_enc_params, trace); gf_box_dump_done("GF_AdobeDRMHeaderBox", a, trace); return GF_OK; } GF_Err aprm_dump(GF_Box *a, FILE * trace) { GF_AdobeStdEncryptionParamsBox *ptr = (GF_AdobeStdEncryptionParamsBox *)a; if (!a) return GF_BAD_PARAM; fprintf(trace, "<GF_AdobeStdEncryptionParamsBox>\n"); DumpBox(a, trace); gf_full_box_dump((GF_Box *)a, trace); if (ptr->enc_info) gf_box_dump((GF_Box *)ptr->enc_info, trace); if (ptr->key_info) gf_box_dump((GF_Box *)ptr->key_info, trace); gf_box_dump_done("GF_AdobeStdEncryptionParamsBox", a, trace); return GF_OK; } GF_Err aeib_dump(GF_Box *a, FILE * trace) { GF_AdobeEncryptionInfoBox *ptr = (GF_AdobeEncryptionInfoBox *)a; if (!a) return GF_BAD_PARAM; fprintf(trace, "<GF_AdobeEncryptionInfoBox EncryptionAlgorithm=\"%s\" KeyLength=\"%d\">\n", ptr->enc_algo, ptr->key_length); DumpBox(a, trace); gf_full_box_dump((GF_Box *)a, trace); gf_box_dump_done("GF_AdobeEncryptionInfoBox", a, trace); return GF_OK; } GF_Err akey_dump(GF_Box *a, FILE * trace) { GF_AdobeKeyInfoBox *ptr = (GF_AdobeKeyInfoBox *)a; if (!a) return GF_BAD_PARAM; fprintf(trace, "<GF_AdobeKeyInfoBox>\n"); DumpBox(a, trace); gf_full_box_dump((GF_Box *)a, trace); if (ptr->params) gf_box_dump((GF_Box *)ptr->params, trace); gf_box_dump_done("GF_AdobeKeyInfoBox", a, trace); return GF_OK; } GF_Err flxs_dump(GF_Box *a, FILE * trace) { GF_AdobeFlashAccessParamsBox *ptr = (GF_AdobeFlashAccessParamsBox *)a; if (!a) return GF_BAD_PARAM; fprintf(trace, "<GF_AdobeFlashAccessParamsBox>\n"); DumpBox(a, trace); if (ptr->metadata) fprintf(trace, "<FmrmsV2Metadata=\"%s\"/>\n", ptr->metadata); gf_box_dump_done("GF_AdobeFlashAccessParamsBox", a, trace); return GF_OK; } GF_Err adaf_dump(GF_Box *a, FILE * trace) { GF_AdobeDRMAUFormatBox *ptr = (GF_AdobeDRMAUFormatBox *)a; if (!a) return GF_BAD_PARAM; fprintf(trace, "<GF_AdobeDRMAUFormatBox SelectiveEncryption=\"%d\" IV_length=\"%d\">\n", ptr->selective_enc ? 1 : 0, ptr->IV_length); DumpBox(a, trace); gf_full_box_dump((GF_Box *)a, trace); gf_box_dump_done("GF_AdobeDRMAUFormatBox", a, trace); return GF_OK; } #endif /*GPAC_DISABLE_ISOM_DUMP*/