📄 main.c
字号:
void PrintWorldInfo(GF_Terminal *term){ u32 i; const char *title; GF_List *descs; descs = gf_list_new(); title = gf_term_get_world_info(term, NULL, descs); if (!title && !gf_list_count(descs)) { fprintf(stdout, "No World Info available\n"); } else { fprintf(stdout, "\t%s\n", title ? title : "No title available"); for (i=0; i<gf_list_count(descs); i++) { char *str = gf_list_get(descs, i); fprintf(stdout, "%s\n", str); } } gf_list_del(descs);}void PrintODList(GF_Terminal *term){ ODInfo odi; u32 i, count; GF_ObjectManager *odm, *root_odm = gf_term_get_root_object(term); if (!root_odm) return; if (gf_term_get_object_info(term, root_odm, &odi) != GF_OK) return; if (!odi.od) { fprintf(stdout, "Service not attached\n"); return; } fprintf(stdout, "Currently loaded objects:\n"); fprintf(stdout, "\tRootOD ID %d\n", odi.od->objectDescriptorID); count = gf_term_get_object_count(term, root_odm); for (i=0; i<count; i++) { odm = gf_term_get_object(term, root_odm, i); if (!odm) break; if (gf_term_get_object_info(term, odm, &odi) == GF_OK) fprintf(stdout, "\t\tOD %d - ID %d (%s)\n", i+1, odi.od->objectDescriptorID, (odi.od_type==GF_STREAM_VISUAL) ? "Video" : (odi.od_type==GF_STREAM_AUDIO) ? "Audio" : "Systems"); }}void ViewOD(GF_Terminal *term, u32 OD_ID){ ODInfo odi; u32 i, j, count, d_enum,id; GF_Err e; char code[5]; NetStatCommand com; GF_ObjectManager *odm, *root_odm = gf_term_get_root_object(term); if (!root_odm) return; odm = NULL; if (!OD_ID) { odm = root_odm; if ((gf_term_get_object_info(term, odm, &odi) != GF_OK)) odm=NULL; } else { count = gf_term_get_object_count(term, root_odm); for (i=0; i<count; i++) { odm = gf_term_get_object(term, root_odm, i); if (!odm) break; if ((gf_term_get_object_info(term, odm, &odi) == GF_OK) && (odi.od->objectDescriptorID == OD_ID)) break; odm = NULL; } } if (!odm) { fprintf(stdout, "cannot find OD with ID %d\n", OD_ID); return; } if (!odi.od) { fprintf(stdout, "Object %d not attached yet\n", OD_ID); return; } if (!odi.od) { fprintf(stdout, "Service not attached\n"); return; } if (odi.od->tag==GF_ODF_IOD_TAG) { fprintf(stdout, "InitialObjectDescriptor %d\n", odi.od->objectDescriptorID); fprintf(stdout, "Profiles and Levels: Scene %x - Graphics %x - Visual %x - Audio %x - OD %x\n", odi.scene_pl, odi.graphics_pl, odi.visual_pl, odi.audio_pl, odi.OD_pl); fprintf(stdout, "Inline Profile Flag %d\n", odi.inline_pl); } else { fprintf(stdout, "ObjectDescriptor %d\n", odi.od->objectDescriptorID); } fprintf(stdout, "Object Duration: "); if (odi.duration) { PrintTime((u32) (odi.duration*1000)); } else { fprintf(stdout, "unknown"); } fprintf(stdout, "\n"); if (odi.owns_service) { fprintf(stdout, "Service Handler: %s\n", odi.service_handler); fprintf(stdout, "Service URL: %s\n", odi.service_url); } if (odi.codec_name) { Float avg_dec_time; switch (odi.od_type) { case GF_STREAM_VISUAL: fprintf(stdout, "Video Object: Width %d - Height %d\r\n", odi.width, odi.height); fprintf(stdout, "Media Codec: %s\n", odi.codec_name); if (odi.par) fprintf(stdout, "Pixel Aspect Ratio: %d:%d\n", (odi.par>>16)&0xFF, (odi.par)&0xFF); break; case GF_STREAM_AUDIO: fprintf(stdout, "Audio Object: Sample Rate %d - %d channels\r\n", odi.sample_rate, odi.num_channels); fprintf(stdout, "Media Codec: %s\n", odi.codec_name); break; case GF_STREAM_SCENE: case GF_STREAM_PRIVATE_SCENE: if (odi.width && odi.height) { fprintf(stdout, "Scene Description - Width %d - Height %d\n", odi.width, odi.height); } else { fprintf(stdout, "Scene Description - no size specified\n"); } fprintf(stdout, "Scene Codec: %s\n", odi.codec_name); break; case GF_STREAM_TEXT: if (odi.width && odi.height) { fprintf(stdout, "Text Object: Width %d - Height %d\n", odi.width, odi.height); } else { fprintf(stdout, "Text Object: No size specified\n"); } fprintf(stdout, "Text Codec %s\n", odi.codec_name); break; } avg_dec_time = 0; if (odi.nb_dec_frames) { avg_dec_time = (Float) odi.total_dec_time; avg_dec_time /= odi.nb_dec_frames; } fprintf(stdout, "\tBitrate over last second: %d kbps\n\tMax bitrate over one second: %d kbps\n\tAverage Decoding Time %.2f ms (%d max)\n\tTotal decoded frames %d\n", (u32) odi.avg_bitrate/1024, odi.max_bitrate/1024, avg_dec_time, odi.max_dec_time, odi.nb_dec_frames); } if (odi.protection) fprintf(stdout, "Encrypted Media%s\n", (odi.protection==2) ? " NOT UNLOCKED" : ""); count = gf_list_count(odi.od->ESDescriptors); fprintf(stdout, "%d streams in OD\n", count); for (i=0; i<count; i++) { GF_ESD *esd = (GF_ESD *) gf_list_get(odi.od->ESDescriptors, i); fprintf(stdout, "\nStream ID %d - Clock ID %d\n", esd->ESID, esd->OCRESID); if (esd->dependsOnESID) fprintf(stdout, "\tDepends on Stream ID %d for decoding\n", esd->dependsOnESID); switch (esd->decoderConfig->streamType) { case GF_STREAM_OD: fprintf(stdout, "\tOD Stream - version %d\n", esd->decoderConfig->objectTypeIndication); break; case GF_STREAM_OCR: fprintf(stdout, "\tOCR Stream\n"); break; case GF_STREAM_SCENE: fprintf(stdout, "\tScene Description Stream - version %d\n", esd->decoderConfig->objectTypeIndication); break; case GF_STREAM_VISUAL: fprintf(stdout, "\tVisual Stream - media type: "); switch (esd->decoderConfig->objectTypeIndication) { case 0x20: fprintf(stdout, "MPEG-4\n"); break; case 0x60: fprintf(stdout, "MPEG-2 Simple Profile\n"); break; case 0x61: fprintf(stdout, "MPEG-2 Main Profile\n"); break; case 0x62: fprintf(stdout, "MPEG-2 SNR Profile\n"); break; case 0x63: fprintf(stdout, "MPEG-2 Spatial Profile\n"); break; case 0x64: fprintf(stdout, "MPEG-2 High Profile\n"); break; case 0x65: fprintf(stdout, "MPEG-2 422 Profile\n"); break; case 0x6A: fprintf(stdout, "MPEG-1\n"); break; case 0x6C: fprintf(stdout, "JPEG\n"); break; case 0x6D: fprintf(stdout, "PNG\n"); break; case 0x80: memcpy(code, esd->decoderConfig->decoderSpecificInfo->data, 4); code[4] = 0; fprintf(stdout, "GPAC Intern (%s)\n", code); break; default: fprintf(stdout, "Private Type (0x%x)\n", esd->decoderConfig->objectTypeIndication); break; } break; case GF_STREAM_AUDIO: fprintf(stdout, "\tAudio Stream - media type: "); switch (esd->decoderConfig->objectTypeIndication) { case 0x40: fprintf(stdout, "MPEG-4\n"); break; case 0x66: fprintf(stdout, "MPEG-2 AAC Main Profile\n"); break; case 0x67: fprintf(stdout, "MPEG-2 AAC LowComplexity Profile\n"); break; case 0x68: fprintf(stdout, "MPEG-2 AAC Scalable Sampling Rate Profile\n"); break; case 0x69: fprintf(stdout, "MPEG-2 Audio\n"); break; case 0x6B: fprintf(stdout, "MPEG-1 Audio\n"); break; case 0xA0: fprintf(stdout, "EVRC Audio\n"); break; case 0xA1: fprintf(stdout, "SMV Audio\n"); break; case 0xE1: fprintf(stdout, "QCELP Audio\n"); break; case 0x80: memcpy(code, esd->decoderConfig->decoderSpecificInfo->data, 4); code[4] = 0; fprintf(stdout, "GPAC Intern (%s)\n", code); break; default: fprintf(stdout, "Private Type (0x%x)\n", esd->decoderConfig->objectTypeIndication); break; } break; case GF_STREAM_MPEG7: fprintf(stdout, "\tMPEG-7 Stream - version %d\n", esd->decoderConfig->objectTypeIndication); break; case GF_STREAM_IPMP: fprintf(stdout, "\tIPMP Stream - version %d\n", esd->decoderConfig->objectTypeIndication); break; case GF_STREAM_OCI: fprintf(stdout, "\tOCI Stream - version %d\n", esd->decoderConfig->objectTypeIndication); break; case GF_STREAM_MPEGJ: fprintf(stdout, "\tMPEGJ Stream - version %d\n", esd->decoderConfig->objectTypeIndication); break; case GF_STREAM_INTERACT: fprintf(stdout, "\tUser Interaction Stream - version %d\n", esd->decoderConfig->objectTypeIndication); break; case GF_STREAM_TEXT: fprintf(stdout, "\tStreaming Text Stream - version %d\n", esd->decoderConfig->objectTypeIndication); break; default: fprintf(stdout, "Unknown Stream\r\n"); break; } fprintf(stdout, "\tBuffer Size %d\n\tAverage Bitrate %d bps\n\tMaximum Bitrate %d bps\n", esd->decoderConfig->bufferSizeDB, esd->decoderConfig->avgBitrate, esd->decoderConfig->maxBitrate); if (esd->slConfig->predefined==SLPredef_SkipSL) { fprintf(stdout, "\tNot using MPEG-4 Synchronization Layer\n"); } else { fprintf(stdout, "\tStream Clock Resolution %d\n", esd->slConfig->timestampResolution); } if (esd->URLString) fprintf(stdout, "\tStream Location: %s\n", esd->URLString); /*check language*/ if (esd->langDesc) { u32 i=0; char lan[4], *szLang; lan[0] = esd->langDesc->langCode>>16; lan[1] = (esd->langDesc->langCode>>8)&0xFF; lan[2] = (esd->langDesc->langCode)&0xFF; lan[3] = 0; if ((lan[0]=='u') && (lan[1]=='n') && (lan[2]=='d')) szLang = "Undetermined"; else { szLang = lan; while (GF_ISO639_Lang[i]) { if (GF_ISO639_Lang[i+2][0] && strstr(GF_ISO639_Lang[i+1], lan)) { szLang = (char*) GF_ISO639_Lang[i]; break; } i+=3; } } fprintf(stdout, "\tStream Language: %s\n", szLang); } } fprintf(stdout, "\n"); /*check OCI (not everything interests us) - FIXME: support for unicode*/ count = gf_list_count(odi.od->OCIDescriptors); if (count) { fprintf(stdout, "%d Object Content Information descriptors in OD\n", count); for (i=0; i<count; i++) { GF_Descriptor *desc = (GF_Descriptor *) gf_list_get(odi.od->OCIDescriptors, i); switch (desc->tag) { case GF_ODF_SEGMENT_TAG: { GF_Segment *sd = (GF_Segment *) desc; fprintf(stdout, "Segment Descriptor: Name: %s - start time %g sec - duration %g sec\n", sd->SegmentName, sd->startTime, sd->Duration); } break; case GF_ODF_CC_NAME_TAG: { GF_CC_Name *ccn = (GF_CC_Name *)desc; fprintf(stdout, "Content Creators:\n"); for (j=0; j<gf_list_count(ccn->ContentCreators); j++) { GF_ContentCreatorInfo *ci = (GF_ContentCreatorInfo *) gf_list_get(ccn->ContentCreators, j); if (!ci->isUTF8) continue; fprintf(stdout, "\t%s\n", ci->contentCreatorName); } } break; case GF_ODF_SHORT_TEXT_TAG: { GF_ShortTextual *std = (GF_ShortTextual *)desc; fprintf(stdout, "Description:\n\tEvent: %s\n\t%s\n", std->eventName, std->eventText); } break; default: break; } } fprintf(stdout, "\n"); } switch (odi.status) { case 0: fprintf(stdout, "Stoped - "); break; case 1: fprintf(stdout, "Playing - "); break; case 2: fprintf(stdout, "Paused - "); break; case 3: fprintf(stdout, "Not setup yet\n"); return; default: fprintf(stdout, "Setup Failed\n"); return; } if (odi.buffer>=0) fprintf(stdout, "Buffer: %d ms - ", odi.buffer); else fprintf(stdout, "Not buffering - "); fprintf(stdout, "Clock drift: %d ms\n", odi.clock_drift); if (odi.db_unit_count) fprintf(stdout, "%d AU in DB\n", odi.db_unit_count); if (odi.cb_max_count) fprintf(stdout, "Composition Buffer: %d CU (%d max)\n", odi.cb_unit_count, odi.cb_max_count); fprintf(stdout, "\n"); if (odi.owns_service) { const char *url; u32 done, total, bps; d_enum = 0; while (gf_term_get_download_info(term, odm, &d_enum, &url, NULL, &done, &total, &bps)) { if (d_enum==1) fprintf(stdout, "Current Downloads in service:\n"); if (done && total) { fprintf(stdout, "%s: %d / %d bytes (%.2f %%) - %.2f kBps\n", url, done, total, (100.0f*done)/total, ((Float)bps)/1024.0f); } else { fprintf(stdout, "%s: %.2f kbps\n", url, ((Float)8*bps)/1024.0f); } } if (!d_enum) fprintf(stdout, "No Downloads in service\n"); fprintf(stdout, "\n"); } d_enum = 0; while (gf_term_get_channel_net_info(term, odm, &d_enum, &id, &com, &e)) { if (e) continue; if (!com.bw_down && !com.bw_up) continue; fprintf(stdout, "Stream ID %d statistics:\n", id); if (com.multiplex_port) { fprintf(stdout, "\tMultiplex Port %d - multiplex ID %d\n", com.multiplex_port, com.port); } else { fprintf(stdout, "\tPort %d\n", com.port); } fprintf(stdout, "\tPacket Loss Percentage: %.4f\n", com.pck_loss_percentage); fprintf(stdout, "\tDown Bandwidth: %d bps\n", com.bw_down); if (com.bw_up) fprintf(stdout, "\tUp Bandwidth: %d bps\n", com.bw_up); if (com.ctrl_port) { if (com.multiplex_port) { fprintf(stdout, "\tControl Multiplex Port: %d - Control Multiplex ID %d\n", com.multiplex_port, com.ctrl_port); } else { fprintf(stdout, "\tControl Port: %d\n", com.ctrl_port); } fprintf(stdout, "\tDown Bandwidth: %d bps\n", com.ctrl_bw_down); fprintf(stdout, "\tUp Bandwidth: %d bps\n", com.ctrl_bw_up); } fprintf(stdout, "\n"); }}void PrintODTiming(GF_Terminal *term, GF_ObjectManager *odm){ ODInfo odi; if (!odm) return; if (gf_term_get_object_info(term, odm, &odi) != GF_OK) return; if (!odi.od) { fprintf(stdout, "Service not attached\n"); return; } fprintf(stdout, "OD %d: ", odi.od->objectDescriptorID); switch (odi.status) { case 1: fprintf(stdout, "Playing - "); break; case 2: fprintf(stdout, "Paused - "); break; default: fprintf(stdout, "Stoped - "); break; } if (odi.buffer>=0) fprintf(stdout, "Buffer: %d ms - ", odi.buffer); else fprintf(stdout, "Not buffering - "); fprintf(stdout, "Clock drift: %d ms", odi.clock_drift); fprintf(stdout, " - time: "); PrintTime((u32) (odi.current_time*1000)); fprintf(stdout, "\n");}void PrintODBuffer(GF_Terminal *term, GF_ObjectManager *odm){ Float avg_dec_time; ODInfo odi; if (!odm) return; if (gf_term_get_object_info(term, odm, &odi) != GF_OK) return; if (!odi.od) { fprintf(stdout, "Service not attached\n"); return; } fprintf(stdout, "OD %d: ", odi.od->objectDescriptorID); switch (odi.status) { case 1: fprintf(stdout, "Playing"); break; case 2: fprintf(stdout, "Paused"); break; default: fprintf(stdout, "Stoped"); break; } if (odi.buffer>=0) fprintf(stdout, " - Buffer: %d ms", odi.buffer); if (odi.db_unit_count) fprintf(stdout, " - DB: %d AU", odi.db_unit_count); if (odi.cb_max_count) fprintf(stdout, " - CB: %d/%d CUs", odi.cb_unit_count, odi.cb_max_count); fprintf(stdout, "\n * %d decoded frames - %d dropped frames\n", odi.nb_dec_frames, odi.nb_droped); avg_dec_time = 0; if (odi.nb_dec_frames) { avg_dec_time = (Float) odi.total_dec_time; avg_dec_time /= odi.nb_dec_frames; } fprintf(stdout, " * Avg Bitrate %d kbps (%d max) - Avg Decoding Time %.2f ms (%d max)\n", (u32) odi.avg_bitrate/1024, odi.max_bitrate/1024, avg_dec_time, odi.max_dec_time);}void ViewODs(GF_Terminal *term, Bool show_timing){ u32 i, count; GF_ObjectManager *odm, *root_odm = gf_term_get_root_object(term); if (!root_odm) return; if (show_timing) { PrintODTiming(term, root_odm); } else { PrintODBuffer(term, root_odm); } count = gf_term_get_object_count(term, root_odm); for (i=0; i<count; i++) { odm = gf_term_get_object(term, root_odm, i); if (show_timing) { PrintODTiming(term, odm); } else { PrintODBuffer(term, odm); } } fprintf(stdout, "\n");}void PrintGPACConfig(){ u32 i, j, cfg_count, key_count; char szName[200]; char *secName = NULL; fprintf(stdout, "Enter section name (\"*\" for complete dump):\n"); scanf("%s", szName); if (strcmp(szName, "*")) secName = szName; fprintf(stdout, "\n\n*** GPAC Configuration ***\n\n"); cfg_count = gf_cfg_get_section_count(cfg_file); for (i=0; i<cfg_count; i++) { const char *sec = gf_cfg_get_section_name(cfg_file, i); if (secName) { if (stricmp(sec, secName)) continue; } else { if (!stricmp(sec, "General")) continue; if (!stricmp(sec, "MimeTypes")) continue; if (!stricmp(sec, "RecentFiles")) continue; } fprintf(stdout, "[%s]\n", sec); key_count = gf_cfg_get_key_count(cfg_file, sec); for (j=0; j<key_count; j++) { const char *key = gf_cfg_get_key_name(cfg_file, sec, j); const char *val = gf_cfg_get_key(cfg_file, sec, key); fprintf(stdout, "%s=%s\n", key, val); } fprintf(stdout, "\n"); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -