📄 meta.c
字号:
/* * 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 + -