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

📄 meta.c

📁 一个用于智能手机的多媒体库适合S60 WinCE的跨平台开发库
💻 C
📖 第 1 页 / 共 2 页
字号:
/* *					GPAC Multimedia Framework * *			Authors: Cyril Concolato - Jean le Feuvre *				Copyright (c) 2005-200X ENST *					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>GF_MetaBox *gf_isom_get_meta(GF_ISOFile *file, Bool root_meta, u32 track_num){	GF_TrackBox *tk;	if (!file) return NULL;	if (root_meta) return file->meta;	if (!track_num) return file->moov ? file->moov->meta : NULL;	tk = (GF_TrackBox*)gf_list_get(file->moov->trackList, track_num-1);	return tk ? tk->meta : NULL;}GF_EXPORTu32 gf_isom_get_meta_type(GF_ISOFile *file, Bool root_meta, u32 track_num){	GF_MetaBox *meta = gf_isom_get_meta(file, root_meta, track_num);	if (!meta) return 0;	if (!meta->handler) return 0;	return meta->handler->handlerType;}GF_EXPORTu32 gf_isom_has_meta_xml(GF_ISOFile *file, Bool root_meta, u32 track_num){	u32 i, count;	GF_MetaBox *meta = gf_isom_get_meta(file, root_meta, track_num);	if (!meta) return 0;	count = gf_list_count(meta->other_boxes);	for (i=0; i<count; i++) {		GF_Box *a = (GF_Box *)gf_list_get(meta->other_boxes, i);		if (a->type == GF_ISOM_BOX_TYPE_XML) return 1;		if (a->type == GF_ISOM_BOX_TYPE_BXML) return 2;	}	return 0;}GF_Err gf_isom_extract_meta_xml(GF_ISOFile *file, Bool root_meta, u32 track_num, char *outName, Bool *is_binary){	u32 i, count;	FILE *didfile;	GF_XMLBox *xml = NULL;	GF_MetaBox *meta = gf_isom_get_meta(file, root_meta, track_num);	if (!meta) return GF_BAD_PARAM;	/*Find XMLBox*/	count = gf_list_count(meta->other_boxes);	for (i = 0; i <count; i++) {		GF_Box *a = (GF_Box *)gf_list_get(meta->other_boxes, i);		if ((a->type == GF_ISOM_BOX_TYPE_XML) || (a->type == GF_ISOM_BOX_TYPE_BXML) ) {			xml = (GF_XMLBox *)a;			break;		}	}	if (!xml || !xml->xml || !xml->xml_length) return GF_BAD_PARAM;		didfile = gf_f64_open(outName, "wt");	if (!didfile) return GF_IO_ERR;	fwrite(xml->xml, xml->xml_length, 1, didfile);	fclose(didfile);	if (is_binary) *is_binary = (xml->type==GF_ISOM_BOX_TYPE_BXML) ? 1 : 0;	return GF_OK;}GF_EXPORTu32 gf_isom_get_meta_item_count(GF_ISOFile *file, Bool root_meta, u32 track_num){	GF_MetaBox *meta = gf_isom_get_meta(file, root_meta, track_num);	if (!meta || !meta->item_infos || !meta->item_locations) return 0;	return gf_list_count(meta->item_infos->item_infos);}GF_EXPORTGF_Err gf_isom_get_meta_item_info(GF_ISOFile *file, Bool root_meta, u32 track_num, u32 item_num, 							u32 *itemID, u32 *protection_idx, Bool *is_self_reference,							const char **item_name, const char **item_mime_type, const char **item_encoding,							const char **item_url, const char **item_urn){	GF_ItemInfoEntryBox *iinf;	u32 i, count;	GF_MetaBox *meta = gf_isom_get_meta(file, root_meta, track_num);	if (!meta || !meta->item_infos || !meta->item_locations) return GF_BAD_PARAM;	iinf = (GF_ItemInfoEntryBox *)gf_list_get(meta->item_infos->item_infos, item_num-1);	if (!iinf) return GF_BAD_PARAM;		if (itemID) (*itemID) = iinf->item_ID;	if (protection_idx) (*protection_idx) = iinf->item_protection_index;	if (item_name) (*item_name) = iinf->item_name;	if (item_mime_type) (*item_mime_type) = iinf->content_type;	if (item_encoding) (*item_encoding) = iinf->content_encoding;	if (is_self_reference) *is_self_reference = 0;	if (item_url) (*item_url) = NULL;	if (item_urn) (*item_urn) = NULL;	count = gf_list_count(meta->item_locations->location_entries);	for (i=0; i<count; i++) {		GF_ItemLocationEntry *iloc = (GF_ItemLocationEntry *)gf_list_get(meta->item_locations->location_entries, i);		if (iloc->item_ID==iinf->item_ID) {			if (iloc->data_reference_index) {				GF_Box *a = (GF_Box *)gf_list_get(meta->file_locations->dref->boxList, iloc->data_reference_index-1);				if (a->type==GF_ISOM_BOX_TYPE_URL) {					if (item_url) (*item_url) = ((GF_DataEntryURLBox*)a)->location;				} else if (a->type==GF_ISOM_BOX_TYPE_URN) {					if (item_url) (*item_url) = ((GF_DataEntryURNBox*)a)->location;					if (item_urn) (*item_urn) = ((GF_DataEntryURNBox*)a)->nameURN;				}				break;			} else if (is_self_reference && !iloc->base_offset) {				GF_ItemExtentEntry *entry = (GF_ItemExtentEntry *)gf_list_get(iloc->extent_entries, 0);				if (!entry->extent_length && !entry->original_extent_offset)					*is_self_reference = 1;			}		}	}	return GF_OK;}GF_EXPORTu32 gf_isom_get_meta_item_by_id(GF_ISOFile *file, Bool root_meta, u32 track_num, u32 item_ID){	GF_ItemInfoEntryBox *iinf;	u32 i, count;	GF_MetaBox *meta = gf_isom_get_meta(file, root_meta, track_num);	if (!meta || !meta->item_infos || !meta->item_locations) return 0;	count = gf_list_count(meta->item_infos->item_infos);	for (i=0; i<count; i++) {		iinf = (GF_ItemInfoEntryBox *)gf_list_get(meta->item_infos->item_infos, i);		if (iinf->item_ID==item_ID) return i+1;	}	return 0;}GF_Err gf_isom_extract_meta_item(GF_ISOFile *file, Bool root_meta, u32 track_num, u32 item_id, const char *dump_file_name){	char szPath[1024];	GF_ItemExtentEntry *extent_entry;	FILE *resource = NULL;	u32 i, count;	GF_ItemLocationEntry *location_entry;	u32 item_num;	char *item_name = NULL;	GF_MetaBox *meta = gf_isom_get_meta(file, root_meta, track_num);	if (!meta || !meta->item_infos || !meta->item_locations) return GF_BAD_PARAM;	item_num = gf_isom_get_meta_item_by_id(file, root_meta, track_num, item_id);	if (item_num) {		GF_ItemInfoEntryBox *item_entry = (GF_ItemInfoEntryBox *)gf_list_get(meta->item_infos->item_infos, item_num-1);		item_name = item_entry->item_name;	} 	location_entry = NULL;	count = gf_list_count(meta->item_locations->location_entries);	for (i=0; i<count; i++) {		location_entry = (GF_ItemLocationEntry *)gf_list_get(meta->item_locations->location_entries, i);		if (location_entry->item_ID == item_id) break;		location_entry = NULL;	}	if (!location_entry) return GF_BAD_PARAM;	/*FIXME*/	if (location_entry->data_reference_index) {		char *item_url = NULL, *item_urn = NULL;		GF_Box *a = (GF_Box *)gf_list_get(meta->file_locations->dref->boxList, location_entry->data_reference_index-1);		if (a->type==GF_ISOM_BOX_TYPE_URL) {			item_url = ((GF_DataEntryURLBox*)a)->location;		} else if (a->type==GF_ISOM_BOX_TYPE_URN) {			item_url = ((GF_DataEntryURNBox*)a)->location;			item_urn = ((GF_DataEntryURNBox*)a)->nameURN;		}		GF_LOG(GF_LOG_INFO, GF_LOG_CONTAINER, ("[IsoMedia] Item already outside the ISO file at URL: %s, URN: %s\n", (item_url?item_url:"N/A"), (item_urn?item_urn:"N/A") ));		return GF_OK;	}	/*don't extract self-reference item*/	count = gf_list_count(location_entry->extent_entries);	if (!location_entry->base_offset && (count==1)) {		extent_entry = (GF_ItemExtentEntry *)gf_list_get(location_entry->extent_entries, 0);		if (!extent_entry->extent_length && !extent_entry->original_extent_offset) return GF_BAD_PARAM;	}	if (dump_file_name) {		strcpy(szPath, dump_file_name);	} else {		if (item_name) strcpy(szPath, item_name);		else sprintf(szPath, "item_id%02d", item_id);	}	resource = gf_f64_open(szPath, "wb");			for (i=0; i<count; i++) {		char buf_cache[4096];		u64 remain;		GF_ItemExtentEntry *extent_entry = (GF_ItemExtentEntry *)gf_list_get(location_entry->extent_entries, i);		gf_bs_seek(file->movieFileMap->bs, /*location_entry->base_offset +*/ extent_entry->extent_offset);		remain = extent_entry->extent_length;		while (remain) {			u32 cache_size = (remain>4096) ? 4096 : (u32) remain;			gf_bs_read_data(file->movieFileMap->bs, buf_cache, cache_size);			fwrite(buf_cache, 1, cache_size, resource);			remain -= cache_size;		}	}	fclose(resource);	return GF_OK;}u32 gf_isom_get_meta_primary_item_id(GF_ISOFile *file, Bool root_meta, u32 track_num){	GF_MetaBox *meta = gf_isom_get_meta(file, root_meta, track_num);	if (!meta || !meta->primary_resource) return 0;	return meta->primary_resource->item_ID;}#ifndef GPAC_READ_ONLYGF_Err gf_isom_set_meta_type(GF_ISOFile *file, Bool root_meta, u32 track_num, u32 metaType){	char szName[20];	GF_MetaBox *meta;	GF_Err e = CanAccessMovie(file, GF_ISOM_OPEN_WRITE);	if (e) return e;	meta = gf_isom_get_meta(file, root_meta, track_num);	if (!meta) {		if (!metaType) return GF_OK;		meta = (GF_MetaBox *) meta_New();		if (root_meta) {			file->meta = meta;			gf_list_add(file->TopBoxes, meta);		} else {			gf_isom_insert_moov(file);			if (!track_num) {				file->moov->meta = meta;			} else {				GF_TrackBox *tk = (GF_TrackBox *)gf_list_get(file->moov->trackList, track_num-1);				if (!tk) {					gf_isom_box_del((GF_Box *)meta);					return GF_BAD_PARAM;				}				tk->meta = meta;			}		}	} else if (!metaType) {		if (root_meta) {

⌨️ 快捷键说明

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