📄 odf_dump.c
字号:
/* * GPAC - Multimedia Framework C SDK * * Copyright (c) Jean Le Feuvre 2000-2005 * All rights reserved * * This file is part of GPAC / MPEG-4 ObjectDescriptor 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/odf_dev.h>#include <gpac/constants.h>/*for import flags*/#include <gpac/media_tools.h>#define OD_MAX_TREE 100#define OD_FORMAT_INDENT( ind_buf, indent ) \ { \ u32 z; \ assert(OD_MAX_TREE>indent); \ for (z=0; z<indent; z++) ind_buf[z] = ' '; \ ind_buf[z] = 0; \ } \GF_EXPORTGF_Err gf_odf_dump_com(void *p, FILE *trace, u32 indent, Bool XMTDump){ GF_ODCom *com = (GF_ODCom *)p; switch (com->tag) { case GF_ODF_OD_UPDATE_TAG: return gf_odf_dump_od_update((GF_ODUpdate *)com, trace, indent, XMTDump); case GF_ODF_OD_REMOVE_TAG: return gf_odf_dump_od_remove((GF_ODRemove *)com, trace, indent, XMTDump); case GF_ODF_ESD_UPDATE_TAG: return gf_odf_dump_esd_update((GF_ESDUpdate *)com, trace, indent, XMTDump); case GF_ODF_ESD_REMOVE_TAG: return gf_odf_dump_esd_remove((GF_ESDRemove *)com, trace, indent, XMTDump); case GF_ODF_IPMP_UPDATE_TAG: return gf_odf_dump_ipmp_update((GF_IPMPUpdate *)com, trace, indent, XMTDump); case GF_ODF_IPMP_REMOVE_TAG: return gf_odf_dump_ipmp_remove((GF_IPMPRemove *)com, trace, indent, XMTDump); default: return gf_odf_dump_base_command((GF_BaseODCom *) com, trace, indent, XMTDump); }}GF_EXPORTGF_Err gf_odf_dump_au(char *data, u32 dataLength, FILE *trace, u32 indent, Bool XMTDump){ GF_ODCom *com; GF_ODCodec *odread = gf_odf_codec_new(); gf_odf_codec_set_au(odread, data, dataLength); gf_odf_codec_decode(odread); while (1) { com = gf_odf_codec_get_com(odread); if (!com) break; gf_odf_dump_com(com, trace, indent, XMTDump); gf_odf_com_del(&com); } gf_odf_codec_del(odread); return GF_OK;}GF_EXPORTGF_Err gf_odf_dump_com_list(GF_List *commandList, FILE *trace, u32 indent, Bool XMTDump){ GF_ODCom *com; u32 i; i=0; while ((com = (GF_ODCom *)gf_list_enum(commandList, &i))) { gf_odf_dump_com(com, trace, indent, XMTDump); } return GF_OK;}GF_EXPORTGF_Err gf_odf_dump_desc(void *ptr, FILE *trace, u32 indent, Bool XMTDump){ GF_Descriptor *desc = (GF_Descriptor *)ptr; switch (desc->tag) { case GF_ODF_IOD_TAG : return gf_odf_dump_iod((GF_InitialObjectDescriptor *)desc, trace, indent, XMTDump); case GF_ODF_ESD_TAG : return gf_odf_dump_esd((GF_ESD *)desc, trace, indent, XMTDump); case GF_ODF_DCD_TAG : return gf_odf_dump_dcd((GF_DecoderConfig *)desc, trace, indent, XMTDump); case GF_ODF_SLC_TAG: return gf_odf_dump_slc((GF_SLConfig *)desc, trace, indent, XMTDump); case GF_ODF_CC_TAG: return gf_odf_dump_cc((GF_CCDescriptor *)desc, trace, indent, XMTDump); case GF_ODF_CC_DATE_TAG: return gf_odf_dump_cc_date((GF_CC_Date *)desc, trace, indent, XMTDump); case GF_ODF_CC_NAME_TAG: return gf_odf_dump_cc_name((GF_CC_Name *)desc, trace, indent, XMTDump); case GF_ODF_CI_TAG: return gf_odf_dump_ci((GF_CIDesc *)desc, trace, indent, XMTDump); case GF_ODF_ESD_INC_TAG: return gf_odf_dump_esd_inc((GF_ES_ID_Inc *)desc, trace, indent, XMTDump); case GF_ODF_ESD_REF_TAG: return gf_odf_dump_esd_ref((GF_ES_ID_Ref *)desc, trace, indent, XMTDump); case GF_ODF_TEXT_TAG: return gf_odf_dump_exp_text((GF_ExpandedTextual *)desc, trace, indent, XMTDump); case GF_ODF_EXT_PL_TAG: return gf_odf_dump_pl_ext((GF_PLExt *)desc, trace, indent, XMTDump); case GF_ODF_IPI_PTR_TAG: case GF_ODF_ISOM_IPI_PTR_TAG: return gf_odf_dump_ipi_ptr((GF_IPIPtr *)desc, trace, indent, XMTDump); case GF_ODF_IPMP_TAG: return gf_odf_dump_ipmp((GF_IPMP_Descriptor *)desc, trace, indent, XMTDump); case GF_ODF_IPMP_PTR_TAG: return gf_odf_dump_ipmp_ptr((GF_IPMPPtr *)desc, trace, indent, XMTDump); case GF_ODF_KW_TAG: return gf_odf_dump_kw((GF_KeyWord *)desc, trace, indent, XMTDump); case GF_ODF_LANG_TAG: return gf_odf_dump_lang((GF_Language *)desc, trace, indent, XMTDump); case GF_ODF_ISOM_IOD_TAG: return gf_odf_dump_isom_iod((GF_IsomInitialObjectDescriptor *)desc, trace, indent, XMTDump); case GF_ODF_ISOM_OD_TAG: return gf_odf_dump_isom_od((GF_IsomObjectDescriptor *)desc, trace, indent, XMTDump); case GF_ODF_OD_TAG: return gf_odf_dump_od((GF_ObjectDescriptor *)desc, trace, indent, XMTDump); case GF_ODF_OCI_DATE_TAG: return gf_odf_dump_oci_date((GF_OCI_Data *)desc, trace, indent, XMTDump); case GF_ODF_OCI_NAME_TAG: return gf_odf_dump_oci_name((GF_OCICreators *)desc, trace, indent, XMTDump); case GF_ODF_PL_IDX_TAG: return gf_odf_dump_pl_idx((GF_PL_IDX *)desc, trace, indent, XMTDump); case GF_ODF_QOS_TAG: return gf_odf_dump_qos((GF_QoS_Descriptor *)desc, trace, indent, XMTDump); case GF_ODF_RATING_TAG: return gf_odf_dump_rating((GF_Rating *)desc, trace, indent, XMTDump); case GF_ODF_REG_TAG: return gf_odf_dump_reg((GF_Registration *)desc, trace, indent, XMTDump); case GF_ODF_SHORT_TEXT_TAG: return gf_odf_dump_short_text((GF_ShortTextual *)desc, trace, indent, XMTDump); case GF_ODF_SMPTE_TAG: return gf_odf_dump_smpte_camera((GF_SMPTECamera *)desc, trace, indent, XMTDump); case GF_ODF_SCI_TAG: return gf_odf_dump_sup_cid((GF_SCIDesc *)desc, trace, indent, XMTDump); case GF_ODF_SEGMENT_TAG: return gf_odf_dump_segment((GF_Segment *)desc, trace, indent, XMTDump); case GF_ODF_MEDIATIME_TAG: return gf_odf_dump_mediatime((GF_MediaTime *)desc, trace, indent, XMTDump); case GF_ODF_TEXT_CFG_TAG: return gf_odf_dump_txtcfg((GF_TextConfig *)desc, trace, indent, XMTDump); case GF_ODF_MUXINFO_TAG: return gf_odf_dump_muxinfo((GF_MuxInfo *)desc, trace, indent, XMTDump); case GF_ODF_BIFS_CFG_TAG: return gf_odf_dump_bifs_cfg((GF_BIFSConfig *)desc, trace, indent, XMTDump); case GF_ODF_LASER_CFG_TAG: return gf_odf_dump_laser_cfg((GF_LASERConfig *)desc, trace, indent, XMTDump); case GF_ODF_UI_CFG_TAG: return gf_odf_dump_ui_cfg((GF_UIConfig *)desc, trace, indent, XMTDump); case GF_ODF_IPMP_TL_TAG: return gf_odf_dump_ipmp_tool_list((GF_IPMP_ToolList*)desc, trace, indent, XMTDump); case GF_ODF_IPMP_TOOL_TAG: return gf_odf_dump_ipmp_tool((GF_IPMP_Tool*)desc, trace, indent, XMTDump); default: return gf_odf_dump_default((GF_DefaultDescriptor *)desc, trace, indent, XMTDump); } return GF_OK;}static void StartDescDump(FILE *trace, const char *descName, u32 indent, Bool XMTDump){ char ind_buf[OD_MAX_TREE]; OD_FORMAT_INDENT(ind_buf, indent); if (!XMTDump) { fprintf(trace, "%s {\n", descName); } else { fprintf(trace, "%s<%s ", ind_buf, descName); }}static void EndDescDump(FILE *trace, const char *descName, u32 indent, Bool XMTDump){ char ind_buf[OD_MAX_TREE]; OD_FORMAT_INDENT(ind_buf, indent); if (!XMTDump) { fprintf(trace, "%s}\n", ind_buf); } else { fprintf(trace, "%s</%s>\n", ind_buf, descName); }}/*special element open for XML only, appends "<eltName " - used because XMT-A OD representations use lots of subdescs not present in BT*/static void StartSubElement(FILE *trace, const char *eltName, u32 indent, Bool XMTDump){ if (XMTDump) { char ind_buf[OD_MAX_TREE]; OD_FORMAT_INDENT(ind_buf, indent); fprintf(trace, "%s<%s ", ind_buf, eltName); }}/*special close for XML only, appends "/>" - used because XMT-A OD representations use lots of subdescs not present in BT*/static void EndSubElement(FILE *trace, u32 indent, Bool XMTDump){ if (XMTDump) fprintf(trace, "/>\n");}static void EndAttributes(FILE *trace, u32 indent, Bool XMTDump){ if (XMTDump) fprintf(trace, ">\n");}static void StartElement(FILE *trace, const char *attName, u32 indent, Bool XMTDump, Bool IsList){ char ind_buf[OD_MAX_TREE]; OD_FORMAT_INDENT(ind_buf, indent); if (!XMTDump) { if (IsList) fprintf(trace, "%s%s [\n", ind_buf, attName); else fprintf(trace, "%s%s ", ind_buf, attName); } else { fprintf(trace, "%s<%s>\n", ind_buf, attName); }}static void EndElement(FILE *trace, const char *attName, u32 indent, Bool XMTDump, Bool IsList){ char ind_buf[OD_MAX_TREE]; OD_FORMAT_INDENT(ind_buf, indent); if (!XMTDump) { if (IsList) fprintf(trace, "%s]\n", ind_buf); } else { fprintf(trace, "%s</%s>\n", ind_buf, attName); }}static void StartAttribute(FILE *trace, const char *attName, u32 indent, Bool XMTDump){ char ind_buf[OD_MAX_TREE]; OD_FORMAT_INDENT(ind_buf, indent); if (!XMTDump) { fprintf(trace, "%s%s ", ind_buf, attName); } else { fprintf(trace, "%s=\"", attName); }}static void EndAttribute(FILE *trace, u32 indent, Bool XMTDump){ if (!XMTDump) { fprintf(trace, "\n"); } else { fprintf(trace, "\" "); }}static void DumpInt(FILE *trace, const char *attName, u32 val, u32 indent, Bool XMTDump){ if (!val) return; StartAttribute(trace, attName, indent, XMTDump); fprintf(trace, "%d", val); EndAttribute(trace, indent, XMTDump);}static void DumpIntHex(FILE *trace, const char *attName, u32 val, u32 indent, Bool XMTDump, Bool single_byte){ StartAttribute(trace, attName, indent, XMTDump); if (single_byte) { fprintf(trace, "0x%02X", val); } else { fprintf(trace, "0x%08X", val); } EndAttribute(trace, indent, XMTDump);}static void DumpFloat(FILE *trace, const char *attName, Float val, u32 indent, Bool XMTDump){ StartAttribute(trace, attName, indent, XMTDump); fprintf(trace, "%g", val); EndAttribute(trace, indent, XMTDump);}static void DumpDouble(FILE *trace, const char *attName, Double val, u32 indent, Bool XMTDump){ StartAttribute(trace, attName, indent, XMTDump); fprintf(trace, "%g", val); EndAttribute(trace, indent, XMTDump);}static void DumpBool(FILE *trace, const char *attName, u32 val, u32 indent, Bool XMTDump){ if (!val) return; StartAttribute(trace, attName, indent, XMTDump); fprintf(trace, "%s", val ? "true" : "false"); EndAttribute(trace, indent, XMTDump);}static void DumpString(FILE *trace, const char *attName, char *val, u32 indent, Bool XMTDump){ if (!val) return; StartAttribute(trace, attName, indent, XMTDump); if (!XMTDump) fprintf(trace, "\""); fprintf(trace, "%s", val); if (!XMTDump) fprintf(trace, "\""); EndAttribute(trace, indent, XMTDump);}static void DumpData(FILE *trace, const char *name, char *data, u32 dataLength, u32 indent, Bool XMTDump){ u32 i; if (!name ||!data) return; StartAttribute(trace, name, indent, XMTDump); if (XMTDump) fprintf(trace, "data:application/octet-string,"); for (i=0; i<dataLength; i++) { fprintf(trace, "%%"); fprintf(trace, "%02X", (unsigned char) data[i]); } EndAttribute(trace, indent, XMTDump);}static void DumpBin128(FILE *trace, const char *name, char *data, u32 indent, Bool XMTDump){ u32 i; if (!name ||!data) return; StartAttribute(trace, name, indent, XMTDump); fprintf(trace, "0x"); i=0; while (!data[i] && (i<16)) i++; if (i==16) { fprintf(trace, "00"); } else { for (; i<16; i++) fprintf(trace, "%02X", (unsigned char) data[i]); } EndAttribute(trace, indent, XMTDump);}GF_Err DumpDescList(GF_List *list, FILE *trace, u32 indent, const char *ListName, Bool XMTDump, Bool no_skip_empty){ u32 i, count; GF_Descriptor *desc; char ind_buf[OD_MAX_TREE]; if (!list) return GF_OK; count = gf_list_count(list); if (!no_skip_empty && !count) return GF_OK; StartElement(trace, ListName, indent, XMTDump, 1); indent++; OD_FORMAT_INDENT(ind_buf, indent); for (i=0; i<count; i++) { desc = (GF_Descriptor *)gf_list_get(list, i); //add offset if not XMT if (!XMTDump) fprintf(trace, "%s", ind_buf); gf_odf_dump_desc(desc, trace, indent, XMTDump); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -