📄 meta.c
字号:
gf_list_del_item(file->TopBoxes, meta); gf_isom_box_del((GF_Box *)file->meta); file->meta = NULL; } else if (file->moov) { if (!track_num) { gf_isom_box_del((GF_Box *)file->moov->meta); file->moov->meta = NULL; } else { GF_TrackBox *tk = (GF_TrackBox *)gf_list_get(file->moov->trackList, track_num-1); if (!tk) return GF_BAD_PARAM; gf_isom_box_del((GF_Box *)tk->meta); tk->meta = NULL; } } return GF_OK; } if (!meta->handler) meta->handler = (GF_HandlerBox *)hdlr_New(); if (meta->handler->nameUTF8) free(meta->handler->nameUTF8); meta->handler->handlerType = metaType; sprintf(szName, "GPAC %s Handler", gf_4cc_to_str(metaType)); meta->handler->nameUTF8 = strdup(szName); return GF_OK;}GF_Err gf_isom_remove_meta_xml(GF_ISOFile *file, Bool root_meta, u32 track_num){ u32 i; GF_Box *a; GF_MetaBox *meta = gf_isom_get_meta(file, root_meta, track_num); if (!meta) return GF_BAD_PARAM; i=0; while ((a = (GF_Box*)gf_list_enum(meta->other_boxes, &i))) { switch (a->type) { case GF_ISOM_BOX_TYPE_XML: case GF_ISOM_BOX_TYPE_BXML: gf_list_rem(meta->other_boxes, i-1); gf_isom_box_del(a); return GF_OK; } } return GF_OK;}GF_Err gf_isom_set_meta_xml(GF_ISOFile *file, Bool root_meta, u32 track_num, char *XMLFileName, Bool IsBinaryXML){ GF_Err e; FILE *xmlfile; GF_XMLBox *xml; GF_MetaBox *meta; e = CanAccessMovie(file, GF_ISOM_OPEN_WRITE); if (e) return e; meta = gf_isom_get_meta(file, root_meta, track_num); if (!meta) return GF_BAD_PARAM; e = gf_isom_remove_meta_xml(file, root_meta, track_num); if (e) return e; xml = (GF_XMLBox *)xml_New(); if (!xml) return GF_OUT_OF_MEM; gf_list_add(meta->other_boxes, xml); if (IsBinaryXML) xml->type = GF_ISOM_BOX_TYPE_BXML; /*assume 32bit max size = 4Go should be sufficient for a DID!!*/ xmlfile = fopen(XMLFileName, "rb"); if (!xmlfile) return GF_URL_ERROR; fseek(xmlfile, 0, SEEK_END); xml->xml_length = ftell(xmlfile); fseek(xmlfile, 0, SEEK_SET); xml->xml = (char*)malloc(sizeof(unsigned char)*xml->xml_length); xml->xml_length = fread(xml->xml, 1, sizeof(unsigned char)*xml->xml_length, xmlfile); if (ferror(xmlfile)) { free(xml->xml); xml->xml = NULL; return GF_BAD_PARAM; } fclose(xmlfile); return GF_OK;}GF_Err gf_isom_add_meta_item(GF_ISOFile *file, Bool root_meta, u32 track_num, Bool self_reference, char *resource_path, const char *item_name, const char *mime_type, const char *content_encoding, const char *URL, const char *URN){ GF_Err e; GF_ItemLocationEntry *location_entry; GF_ItemInfoEntryBox *infe; GF_MetaBox *meta; u32 lastItemID = 0; if (!self_reference && !item_name && !resource_path) return GF_BAD_PARAM; e = CanAccessMovie(file, GF_ISOM_OPEN_WRITE); if (e) return e; meta = gf_isom_get_meta(file, root_meta, track_num); if (!meta) return GF_BAD_PARAM; e = FlushCaptureMode(file); if (e) return e; /*check file exists */ if (!URN && !URL && !self_reference) { FILE *src = fopen(resource_path, "rb"); if (!src) return GF_URL_ERROR; fclose(src); } if (meta->item_infos) { u32 i; u32 item_count = gf_list_count(meta->item_infos->item_infos); for (i = 0; i < item_count; i++) { GF_ItemInfoEntryBox *e= (GF_ItemInfoEntryBox *)gf_list_get(meta->item_infos->item_infos, i); if (e->item_ID > lastItemID) lastItemID = e->item_ID; } } infe = (GF_ItemInfoEntryBox *)infe_New(); infe->item_ID = ++lastItemID; /*get relative name*/ if (item_name) { infe->item_name = strdup(item_name); } else if (resource_path) { if (strrchr(resource_path, GF_PATH_SEPARATOR)) { infe->item_name = strdup(strrchr(resource_path, GF_PATH_SEPARATOR) + 1); } else { infe->item_name = strdup(resource_path); } } if (mime_type) { infe->content_type = strdup(mime_type); } else { infe->content_type = strdup("application/octet-stream"); } if (content_encoding) infe->content_encoding = strdup(content_encoding); /*Creation of the ItemLocation */ location_entry = (GF_ItemLocationEntry*)malloc(sizeof(GF_ItemLocationEntry)); if (!location_entry) { gf_isom_box_del((GF_Box *)infe); return GF_OUT_OF_MEM; } memset(location_entry, 0, sizeof(GF_ItemLocationEntry)); location_entry->extent_entries = gf_list_new(); /*Creates an mdat if it does not exist*/ if (!file->mdat) { file->mdat = (GF_MediaDataBox *)mdat_New(); gf_list_add(file->TopBoxes, file->mdat); } /*Creation an ItemLocation Box if it does not exist*/ if (!meta->item_locations) meta->item_locations = (GF_ItemLocationBox *)iloc_New(); gf_list_add(meta->item_locations->location_entries, location_entry); location_entry->item_ID = lastItemID; if (!meta->item_infos) meta->item_infos = (GF_ItemInfoBox *) iinf_New(); e = gf_list_add(meta->item_infos->item_infos, infe); if (e) return e; /*0: the current file*/ location_entry->data_reference_index = 0; if (self_reference) { GF_ItemExtentEntry *entry; GF_SAFEALLOC(entry, GF_ItemExtentEntry); gf_list_add(location_entry->extent_entries, entry); if (!infe->item_name) infe->item_name = strdup(""); return GF_OK; } /*file not copied, just referenced*/ if (URL || URN) { u32 dataRefIndex; if (!meta->file_locations) meta->file_locations = (GF_DataInformationBox *) gf_isom_box_new(GF_ISOM_BOX_TYPE_DINF); if (!meta->file_locations->dref) meta->file_locations->dref = (GF_DataReferenceBox *) gf_isom_box_new(GF_ISOM_BOX_TYPE_DREF); e = Media_FindDataRef(meta->file_locations->dref, (char *) URL, (char *) URN, &dataRefIndex); if (e) return e; if (!dataRefIndex) { e = Media_CreateDataRef(meta->file_locations->dref, (char *) URL, (char *) URN, &dataRefIndex); if (e) return e; } location_entry->data_reference_index = dataRefIndex; } /*capture mode, write to disk*/ if ((file->openMode == GF_ISOM_OPEN_WRITE) && !location_entry->data_reference_index) { FILE *src; GF_ItemExtentEntry *entry; GF_SAFEALLOC(entry, GF_ItemExtentEntry); location_entry->base_offset = gf_bs_get_position(file->editFileMap->bs); /*update base offset size*/ if (location_entry->base_offset>0xFFFFFFFF) meta->item_locations->base_offset_size = 8; else if (location_entry->base_offset && !meta->item_locations->base_offset_size) meta->item_locations->base_offset_size = 4; entry->extent_length = 0; entry->extent_offset = 0; gf_list_add(location_entry->extent_entries, entry); src = gf_f64_open(resource_path, "rb"); if (src) { char cache_data[4096]; u64 remain; gf_f64_seek(src, 0, SEEK_END); entry->extent_length = gf_f64_tell(src); gf_f64_seek(src, 0, SEEK_SET); remain = entry->extent_length; while (remain) { u32 size_cache = (remain>4096) ? 4096 : (u32) remain; fread(cache_data, 1, size_cache, src); gf_bs_write_data(file->editFileMap->bs, cache_data, size_cache); remain -= size_cache; } fclose(src); /*update length size*/ if (entry->extent_length>0xFFFFFFFF) meta->item_locations->length_size = 8; else if (entry->extent_length && !meta->item_locations->length_size) meta->item_locations->length_size = 4; } } /*store full path for info*/ else if (!location_entry->data_reference_index) { infe->full_path = strdup(resource_path); } return GF_OK;}GF_Err gf_isom_remove_meta_item(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); u32 item_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) return GF_BAD_PARAM; iinf = (GF_ItemInfoEntryBox *)gf_list_get(meta->item_infos->item_infos, item_num-1); gf_list_rem(meta->item_infos->item_infos, item_num-1); 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) { /*FIXME: remove data ref...*/ if (iloc->data_reference_index) { } gf_list_rem(meta->item_locations->location_entries, i); gf_isom_box_del((GF_Box *)iloc); break; } } gf_isom_box_del((GF_Box *)iinf); return GF_OK;}GF_Err gf_isom_set_meta_primary_item(GF_ISOFile *file, Bool root_meta, u32 track_num, u32 item_id){ GF_MetaBox *meta = gf_isom_get_meta(file, root_meta, track_num); if (!meta || !meta->item_infos || !meta->item_locations) return GF_BAD_PARAM; /*either one or the other*/ if (gf_isom_has_meta_xml(file, root_meta, track_num)) return GF_BAD_PARAM; if (meta->primary_resource) gf_isom_box_del((GF_Box*)meta->primary_resource); meta->primary_resource = (GF_PrimaryItemBox*) gf_isom_box_new(GF_ISOM_BOX_TYPE_PITM); meta->primary_resource->item_ID = item_id; return GF_OK;}#endif //GPAC_READ_ONLY
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -