📄 box_dump.c
字号:
/* * GPAC - Multimedia Framework C SDK * * Copyright (c) Jean Le Feuvre 2000-2005 * 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>static GF_Err apple_tag_dump(GF_Box *a, FILE * trace);void NullBoxErr(FILE * trace){ 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, "%%"); 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(void *ptr, FILE * trace){ GF_Box *a = (GF_Box *) ptr; if (!a) { NullBoxErr(trace); return GF_OK; } switch (a->type) { case GF_ISOM_BOX_TYPE_HINT: case GF_ISOM_BOX_TYPE_DPND: case GF_ISOM_BOX_TYPE_MPOD: case GF_ISOM_BOX_TYPE_SYNC: case GF_ISOM_BOX_TYPE_IPIR: case GF_ISOM_BOX_TYPE_CHAP: 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: 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_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_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_CHPL: return chpl_dump(a, trace); case GF_ISOM_BOX_TYPE_PDIN: return dpin_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: return ftyp_dump(a, trace); case GF_ISOM_BOX_TYPE_FADB: return padb_dump(a, trace);#ifndef GF_ISOM_NO_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_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);#endif 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: return avcc_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: return mp4v_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_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); /* 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_IMIF: return imif_dump(a, trace); case GF_ISOM_BOX_TYPE_IPMC: return ipmc_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_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); /*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); default: return defa_dump(a, trace); }}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;}GF_EXPORTGF_Err gf_isom_dump(GF_ISOFile *mov, FILE * trace){ GF_Err gf_box_dump(void *ptr, FILE * trace); void BadTopBoxErr(GF_Box *a, 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 GF_ISOM_NO_FRAGMENTS case GF_ISOM_BOX_TYPE_MOOF:#endif 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=\"%d\"/>\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; 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 = "Unknown"; 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); fprintf(trace, "</%sTrackReferenceBox>\n", s); 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); fprintf(trace, "</FreeSpaceBox>\n"); 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); fprintf(trace, "</MediaDataBox>\n"); 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(p->mvhd, trace);#ifndef GF_ISOM_NO_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_array_dump(p->boxes, trace); fprintf(trace, "</MovieBox>\n"); 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); fprintf(trace, "</MovieHeaderBox>");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -