⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filedump.c

📁 一个用于智能手机的多媒体库适合S60 WinCE的跨平台开发库
💻 C
📖 第 1 页 / 共 4 页
字号:
/* *			GPAC - Multimedia Framework C SDK * *			Copyright (c) Jean Le Feuvre 2000-2005  *					All rights reserved * *  This file is part of GPAC / mp4box application * *  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/scene_manager.h>#include <gpac/nodes_x3d.h>#include <gpac/nodes_svg_sa.h>#include <gpac/internal/bifs_dev.h>#include <gpac/constants.h>#include <gpac/avparse.h>/*for asctime and gmtime*/#include <time.h>/*ISO 639 languages*/#include <gpac/iso639.h>#include <gpac/mpegts.h>extern u32 swf_flags;extern Float swf_flatten_angle;extern u32 get_file_type_by_ext(char *inName);void scene_coding_log(void *cbk, u32 log_level, u32 log_tool, const char *fmt, va_list vlist);#ifndef GPAC_READ_ONLYGF_Err import_file(GF_ISOFile *dest, char *inName, u32 import_flags, Double force_fps, u32 frames_per_sample);#endifvoid PrintLanguages(){	u32 i=0;	fprintf(stdout, "Supported ISO 639 languages and codes:\n\n");	while (GF_ISO639_Lang[i]) {		if (!GF_ISO639_Lang[i+2][0]) {			i+=3;			continue;		}		fprintf(stdout, "%s (%s - %s)\n", GF_ISO639_Lang[i], GF_ISO639_Lang[i+1], GF_ISO639_Lang[i+2]);		i+=3;	}}static const char *GetLanguage(char *lcode){	u32 i=0;	if ((lcode[0]=='u') && (lcode[1]=='n') && (lcode[2]=='d')) return "Undetermined";	while (GF_ISO639_Lang[i]) {		if (GF_ISO639_Lang[i+2][0] && strstr(GF_ISO639_Lang[i+1], lcode)) return GF_ISO639_Lang[i];		i+=3;	}	return "Unknown";}const char *GetLanguageCode(char *lang){	u32 i;	Bool check_2cc = 0;	i = strlen(lang);	if (i==3) return lang;	if (i==2) check_2cc = 1;	i=0;	while (GF_ISO639_Lang[i]) {		if (GF_ISO639_Lang[i+2][0]) {			if (check_2cc) {				if (!stricmp(GF_ISO639_Lang[i+2], lang) ) return GF_ISO639_Lang[i+1];			} else if (!stricmp(GF_ISO639_Lang[i], lang)) return GF_ISO639_Lang[i+1];		}		i+=3;	}	return "und";}#ifndef GPAC_READ_ONLYGF_Err dump_cover_art(GF_ISOFile *file, char *inName){	const char *tag;	char szName[1024];	FILE *t;	u32 tag_len;	GF_Err e = gf_isom_apple_get_tag(file, GF_ISOM_ITUNE_COVER_ART, &tag, &tag_len);	if (e!=GF_OK) {		if (e==GF_URL_ERROR) {			fprintf(stdout, "No cover art found\n");			return GF_OK;		}		return e;	}	sprintf(szName, "%s.%s", inName, (tag_len>>31) ? "png" : "jpg");	t = fopen(szName, "wb");	fwrite(tag, tag_len & 0x7FFFFFFF, 1, t);		fclose(t);	return GF_OK;}GF_Err set_cover_art(GF_ISOFile *file, char *inName){	GF_Err e;	char *tag, *ext;	FILE *t;	u32 tag_len;	t = fopen(inName, "rb");	fseek(t, 0, SEEK_END);	tag_len = ftell(t);	fseek(t, 0, SEEK_SET);	tag = malloc(sizeof(char) * tag_len);	fread(tag, tag_len, 1, t);	fclose(t);		ext = strrchr(inName, '.');	if (!stricmp(ext, ".png")) tag_len |= 0x80000000;	e = gf_isom_apple_set_tag(file, GF_ISOM_ITUNE_COVER_ART, tag, tag_len);	free(tag);	return e;}GF_Err dump_file_text(char *file, char *inName, u32 dump_mode, Bool do_log){	GF_Err e;	GF_SceneManager *ctx;	GF_SceneGraph *sg;	GF_SceneLoader load;	u32 ftype;	u32 prev_level = gf_log_get_level();	u32 prev_tools = gf_log_get_tools();	gf_log_cbk prev_logs = NULL;	FILE *logs = NULL;	e = GF_OK;	sg = gf_sg_new();	ctx = gf_sm_new(sg);	memset(&load, 0, sizeof(GF_SceneLoader));	load.fileName = file;	load.ctx = ctx;	load.swf_import_flags = swf_flags;	load.swf_flatten_limit = swf_flatten_angle;	ftype = get_file_type_by_ext(file);	if (ftype == 1) {		load.isom = gf_isom_open(file, GF_ISOM_OPEN_READ, NULL);		if (!load.isom) {			e = gf_isom_last_error(NULL);			fprintf(stdout, "Error opening file: %s\n", gf_error_to_string(e));			gf_sm_del(ctx);			gf_sg_del(sg);			return e;		}	}	/*SAF*/	else if (ftype==6) {		load.isom = gf_isom_open("saf_conv", GF_ISOM_WRITE_EDIT, NULL);		if (load.isom) e = import_file(load.isom, file, 0, 0, 0);		else e = gf_isom_last_error(NULL);		if (e) {			fprintf(stdout, "Error importing file: %s\n", gf_error_to_string(e));			gf_sm_del(ctx);			gf_sg_del(sg);			if (load.isom) gf_isom_delete(load.isom);			return e;		}	}	if (do_log) {		char szLog[GF_MAX_PATH];		sprintf(szLog, "%s_dec.logs", inName);		logs = fopen(szLog, "wt");		gf_log_set_tools(GF_LOG_CODING);		gf_log_set_level(GF_LOG_DEBUG);		prev_logs = gf_log_set_callback(logs, scene_coding_log);	}	e = gf_sm_load_init(&load);	if (!e) e = gf_sm_load_run(&load);	gf_sm_load_done(&load);	if (logs) {		gf_log_set_tools(prev_tools);		gf_log_set_level(prev_level);		gf_log_set_callback(NULL, prev_logs);		fclose(logs);	}	if (!e) {		u32 count = gf_list_count(ctx->streams);		if (count)			fprintf(stdout, "Scene loaded - dumping %d systems streams\n", count);		else			fprintf(stdout, "Scene loaded - dumping root scene\n");		e = gf_sm_dump(ctx, inName, dump_mode);	}	gf_sm_del(ctx);	gf_sg_del(sg);	if (e) fprintf(stdout, "Error loading scene: %s\n", gf_error_to_string(e));	if (load.isom) gf_isom_delete(load.isom);	return e;}static void dump_stats(FILE *dump, GF_SceneStatistics *stats){	u32 i;	s32 created, count, draw_created, draw_count, deleted, draw_deleted;	created = count = draw_created = draw_count = deleted = draw_deleted = 0;	fprintf(dump, "<NodeStatistics>\n");	fprintf(dump, "<General NumberOfNodeTypes=\"%d\"/>\n", gf_list_count(stats->node_stats));	for (i=0; i<gf_list_count(stats->node_stats); i++) {		GF_NodeStats *ptr = gf_list_get(stats->node_stats, i);		fprintf(dump, "<NodeStat NodeName=\"%s\">\n", ptr->name);				switch (ptr->tag) {		case TAG_MPEG4_Bitmap:		case TAG_MPEG4_Background2D:		case TAG_MPEG4_Background:		case TAG_MPEG4_Box:		case TAG_MPEG4_Circle:		case TAG_MPEG4_CompositeTexture2D:		case TAG_MPEG4_CompositeTexture3D:		case TAG_MPEG4_Cylinder:		case TAG_MPEG4_Cone:		case TAG_MPEG4_Curve2D:		case TAG_MPEG4_Extrusion:		case TAG_MPEG4_ElevationGrid:		case TAG_MPEG4_IndexedFaceSet2D:		case TAG_MPEG4_IndexedFaceSet:		case TAG_MPEG4_IndexedLineSet2D:		case TAG_MPEG4_IndexedLineSet:		case TAG_MPEG4_PointSet2D:		case TAG_MPEG4_PointSet:		case TAG_MPEG4_Rectangle:		case TAG_MPEG4_Sphere:		case TAG_MPEG4_Text:		case TAG_MPEG4_Ellipse:		case TAG_MPEG4_XCurve2D:			draw_count += ptr->nb_created + ptr->nb_used - ptr->nb_del;			draw_deleted += ptr->nb_del;			draw_created += ptr->nb_created;			break;		}		fprintf(dump, "<Instanciation NbObjects=\"%d\" NbUse=\"%d\" NbDestroy=\"%d\"/>\n", ptr->nb_created, ptr->nb_used, ptr->nb_del);		count += ptr->nb_created + ptr->nb_used;		deleted += ptr->nb_del;		created += ptr->nb_created;		fprintf(dump, "</NodeStat>\n");	}	if (i) {		fprintf(dump, "<CumulatedStat TotalNumberOfNodes=\"%d\" ReallyAllocatedNodes=\"%d\" DeletedNodes=\"%d\"/>\n", count, created, deleted);		fprintf(dump, "<DrawableNodesCumulatedStat TotalNumberOfNodes=\"%d\" ReallyAllocatedNodes=\"%d\" DeletedNodes=\"%d\"/>\n", draw_count, draw_created, draw_deleted);	}	fprintf(dump, "</NodeStatistics>\n");	created = count = deleted = 0;	if (gf_list_count(stats->proto_stats)) {		fprintf(dump, "<ProtoStatistics NumberOfProtoUsed=\"%d\">\n", gf_list_count(stats->proto_stats));		for (i=0; i<gf_list_count(stats->proto_stats); i++) {			GF_NodeStats *ptr = gf_list_get(stats->proto_stats, i);			fprintf(dump, "<ProtoStat ProtoName=\"%s\">\n", ptr->name);			fprintf(dump, "<Instanciation NbObjects=\"%d\" NbUse=\"%d\" NbDestroy=\"%d\"/>\n", ptr->nb_created, ptr->nb_used, ptr->nb_del);			count += ptr->nb_created + ptr->nb_used;			deleted += ptr->nb_del;			created += ptr->nb_created;			fprintf(dump, "</ProtoStat>\n");		}		if (i) fprintf(dump, "<CumulatedStat TotalNumberOfProtos=\"%d\" ReallyAllocatedProtos=\"%d\" DeletedProtos=\"%d\"/>\n", count, created, deleted);		fprintf(dump, "</ProtoStatistics>\n");	}	fprintf(dump, "<FixedValues min=\"%f\" max=\"%f\">\n", FIX2FLT( stats->min_fixed) , FIX2FLT( stats->max_fixed ));	fprintf(dump, "<Resolutions scaleIntegerPart=\"%d\" scaleFracPart=\"%d\" coordIntegerPart=\"%d\" coordFracPart=\"%d\"/>\n", stats->scale_int_res_2d, stats->scale_frac_res_2d, stats->int_res_2d, stats->frac_res_2d);	fprintf(dump, "</FixedValues>\n");	fprintf(dump, "<FieldStatistic FieldType=\"MFVec2f\">\n");	fprintf(dump, "<ParsingInfo NumParsed=\"%d\" NumRemoved=\"%d\"/>", stats->count_2d, stats->rem_2d);	if (stats->count_2d) {		fprintf(dump, "<ExtendInfo MinVec2f=\"%f %f\" MaxVec2f=\"%f %f\"/>\n", FIX2FLT( stats->min_2d.x) , FIX2FLT( stats->min_2d.y ), FIX2FLT( stats->max_2d.x ), FIX2FLT( stats->max_2d.y ) );	}	fprintf(dump, "</FieldStatistic>\n");	fprintf(dump, "<FieldStatistic FieldType=\"MFVec3f\">\n");	fprintf(dump, "<ParsingInfo NumParsed=\"%d\" NumRemoved=\"%d\"/>", stats->count_3d, stats->rem_3d);	if (stats->count_3d) {		fprintf(dump, "<ExtendInfo MinVec3f=\"%f %f %f\" MaxVec3f=\"%f %f %f\"/>\n", FIX2FLT( stats->min_3d.x ), FIX2FLT( stats->min_3d.y ), FIX2FLT( stats->min_3d.z ), FIX2FLT( stats->max_3d.x ), FIX2FLT( stats->max_3d.y ), FIX2FLT( stats->max_3d.z ) );	}	fprintf(dump, "</FieldStatistic>\n");	fprintf(dump, "<FieldStatistic FieldType=\"MF/SFColor\">\n");	fprintf(dump, "<ParsingInfo NumParsed=\"%d\" NumRemoved=\"%d\"/>", stats->count_color, stats->rem_color);	fprintf(dump, "</FieldStatistic>\n");	fprintf(dump, "<FieldStatistic FieldType=\"MF/SFFloat\">\n");	fprintf(dump, "<ParsingInfo NumParsed=\"%d\" NumRemoved=\"%d\"/>", stats->count_float, stats->rem_float);	fprintf(dump, "</FieldStatistic>\n");	fprintf(dump, "<FieldStatistic FieldType=\"SFVec2f\">\n");	fprintf(dump, "<ParsingInfo NumParsed=\"%d\"/>", stats->count_2f);	fprintf(dump, "</FieldStatistic>\n");	fprintf(dump, "<FieldStatistic FieldType=\"SFVec3f\">\n");	fprintf(dump, "<ParsingInfo NumParsed=\"%d\"/>", stats->count_3f);	fprintf(dump, "</FieldStatistic>\n");}static void ReorderAU(GF_List *sample_list, GF_AUContext *au){	u32 i;	for (i=0; i<gf_list_count(sample_list); i++) {		GF_AUContext *ptr = gf_list_get(sample_list, i);		if (			/*time ordered*/			(ptr->timing_sec > au->timing_sec) 			/*set bifs first*/			|| ((ptr->timing_sec == au->timing_sec) && (ptr->owner->streamType < au->owner->streamType))		) {			gf_list_insert(sample_list, au, i);			return;		}	}	gf_list_add(sample_list, au);}void dump_scene_stats(char *file, char *inName, u32 stat_level){	GF_Err e;	FILE *dump;	Bool close;	u32 i, j, count;	char szBuf[1024];	GF_SceneManager *ctx;	GF_SceneLoader load;	GF_StatManager *sm;		GF_List *sample_list;	GF_SceneGraph *scene_graph;	dump = NULL;	sm = NULL;	sample_list = NULL;		close = 0;	scene_graph = gf_sg_new();	ctx = gf_sm_new(scene_graph);	memset(&load, 0, sizeof(GF_SceneLoader));	load.fileName = file;	load.ctx = ctx;	if (get_file_type_by_ext(file) == 1) {		load.isom = gf_isom_open(file, GF_ISOM_OPEN_READ, NULL);		if (!load.isom) {			fprintf(stdout, "Cannot open file: %s\n", gf_error_to_string(gf_isom_last_error(NULL)));			gf_sm_del(ctx);			gf_sg_del(scene_graph);			return;		}	}	e = gf_sm_load_init(&load);	if (!e) e = gf_sm_load_run(&load);	gf_sm_load_done(&load);	if (e) goto exit;	if (inName) {		strcpy(szBuf, inName);		strcat(szBuf, "_stat.xml");		dump = fopen(szBuf, "wt");		close = 1;	} else {		dump = stdout;		close = 0;	}	fprintf(stdout, "Analysing Scene\n");	fprintf(dump, "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");	fprintf(dump, "<!-- Scene Graph Statistics Generated by MP4Box - GPAC " GPAC_VERSION" -->\n");	fprintf(dump, "<SceneStatistics file=\"%s\" DumpType=\"%s\">\n", file, (stat_level==1) ? "full scene" : ((stat_level==2) ? "AccessUnit based" : "SceneGraph after each AU"));	sm = gf_sm_stats_new();	/*stat level 1: complete scene stat*/	if (stat_level == 1) {		e = gf_sm_stats_for_scene(sm, ctx);		if (!e) dump_stats(dump, gf_sm_stats_get(sm) );		goto exit;	}	/*re_order all BIFS-AUs*/	sample_list = gf_list_new();	/*configure all systems streams we're dumping*/	for (i=0; i<gf_list_count(ctx->streams); i++) {		GF_StreamContext *sc = gf_list_get(ctx->streams, i);		if (sc->streamType != GF_STREAM_SCENE) continue;		for (j=0; j<gf_list_count(sc->AUs); j++) {			GF_AUContext *au = gf_list_get(sc->AUs, j);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -