📄 box_code_base.c
字号:
//the flag set indicates we have a string (WE HAVE TO for URLs) if ( !(ptr->flags & 1)) { //to check, the spec says: First name, then location if (ptr->nameURN) { gf_bs_write_data(bs, ptr->nameURN, (u32)strlen(ptr->nameURN) + 1); } if (ptr->location) { gf_bs_write_data(bs, ptr->location, (u32)strlen(ptr->location) + 1); } } return GF_OK;}GF_Err urn_Size(GF_Box *s){ GF_Err e; GF_DataEntryURNBox *ptr = (GF_DataEntryURNBox *)s; e = gf_isom_full_box_get_size(s); if (e) return e; if ( !(ptr->flags & 1)) { if (ptr->nameURN) ptr->size += 1 + strlen(ptr->nameURN); if (ptr->location) ptr->size += 1 + strlen(ptr->location); } return GF_OK;}#endif //GPAC_READ_ONLYvoid defa_del(GF_Box *s){ GF_UnknownBox *ptr = (GF_UnknownBox *) s; if (!s) return; if (ptr->data) free(ptr->data); free(ptr);}GF_Err defa_Read(GF_Box *s, GF_BitStream *bs){ u32 bytesToRead; GF_UnknownBox *ptr = (GF_UnknownBox *)s; if (ptr->size > 0xFFFFFFFF) return GF_ISOM_INVALID_FILE; bytesToRead = (u32) (ptr->size); if (bytesToRead) { ptr->data = (char*)malloc(bytesToRead); if (ptr->data == NULL ) return GF_OUT_OF_MEM; ptr->dataSize = bytesToRead; gf_bs_read_data(bs, ptr->data, ptr->dataSize); } return GF_OK;}//warning: we don't have any boxType, trick has to be done while creating..GF_Box *defa_New(){ GF_UnknownBox *tmp = (GF_UnknownBox *) malloc(sizeof(GF_UnknownBox)); memset(tmp, 0, sizeof(GF_UnknownBox)); return (GF_Box *) tmp;}//from here, for write/edit versions#ifndef GPAC_READ_ONLYGF_Err defa_Write(GF_Box *s, GF_BitStream *bs){ GF_Err e; GF_UnknownBox *ptr = (GF_UnknownBox *)s; if (!s) return GF_BAD_PARAM; e = gf_isom_box_write_header(s, bs); if (e) return e; if (ptr->data) { gf_bs_write_data(bs, ptr->data, ptr->dataSize); } return GF_OK;}GF_Err defa_Size(GF_Box *s){ GF_Err e; GF_UnknownBox *ptr = (GF_UnknownBox *)s; e = gf_isom_box_get_size(s); if (e) return e; ptr->size += ptr->dataSize; return GF_OK;}#endif //GPAC_READ_ONLYvoid uuid_del(GF_Box *s){ GF_UnknownUUIDBox *ptr = (GF_UnknownUUIDBox *) s; if (!s) return; if (ptr->data) free(ptr->data); free(ptr);}GF_Err uuid_Read(GF_Box *s, GF_BitStream *bs){ u32 bytesToRead; GF_UnknownUUIDBox *ptr = (GF_UnknownUUIDBox *)s; if (ptr->size > 0xFFFFFFFF) return GF_ISOM_INVALID_FILE; bytesToRead = (u32) (ptr->size); if (bytesToRead) { ptr->data = (char*)malloc(bytesToRead); if (ptr->data == NULL ) return GF_OUT_OF_MEM; ptr->dataSize = bytesToRead; gf_bs_read_data(bs, ptr->data, ptr->dataSize); } return GF_OK;}//warning: we don't have any boxType, trick has to be done while creating..GF_Box *uuid_New(){ GF_UnknownUUIDBox *tmp = (GF_UnknownUUIDBox *) malloc(sizeof(GF_UnknownUUIDBox)); memset(tmp, 0, sizeof(GF_UnknownUUIDBox)); tmp->type = GF_ISOM_BOX_TYPE_UUID; return (GF_Box *) tmp;}//from here, for write/edit versions#ifndef GPAC_READ_ONLYGF_Err uuid_Write(GF_Box *s, GF_BitStream *bs){ GF_Err e; GF_UnknownUUIDBox *ptr = (GF_UnknownUUIDBox*)s; if (!s) return GF_BAD_PARAM; e = gf_isom_box_write_header(s, bs); if (e) return e; if (ptr->data) { gf_bs_write_data(bs, ptr->data, ptr->dataSize); } return GF_OK;}GF_Err uuid_Size(GF_Box *s){ GF_Err e; GF_UnknownUUIDBox*ptr = (GF_UnknownUUIDBox*)s; e = gf_isom_box_get_size(s); if (e) return e; ptr->size += ptr->dataSize; return GF_OK;}#endif //GPAC_READ_ONLYvoid dinf_del(GF_Box *s){ GF_DataInformationBox *ptr = (GF_DataInformationBox *)s; if (ptr == NULL) return; gf_isom_box_del((GF_Box *)ptr->dref); free(ptr);}GF_Err dinf_AddBox(GF_Box *s, GF_Box *a){ GF_DataInformationBox *ptr = (GF_DataInformationBox *)s; switch(a->type) { case GF_ISOM_BOX_TYPE_DREF: if (ptr->dref) return GF_ISOM_INVALID_FILE; ptr->dref = (GF_DataReferenceBox *)a; return GF_OK; } gf_isom_box_del(a); return GF_OK; }GF_Err dinf_Read(GF_Box *s, GF_BitStream *bs){ return gf_isom_read_box_list(s, bs, dinf_AddBox);}GF_Box *dinf_New(){ GF_DataInformationBox *tmp = (GF_DataInformationBox *) malloc(sizeof(GF_DataInformationBox)); if (tmp == NULL) return NULL; memset(tmp, 0, sizeof(GF_DataInformationBox)); tmp->type = GF_ISOM_BOX_TYPE_DINF; return (GF_Box *)tmp;}//from here, for write/edit versions#ifndef GPAC_READ_ONLYGF_Err dinf_Write(GF_Box *s, GF_BitStream *bs){ GF_Err e; GF_DataInformationBox *ptr = (GF_DataInformationBox *)s; e = gf_isom_box_write_header(s, bs); if (e) return e; if (ptr->dref) { e = gf_isom_box_write((GF_Box *)ptr->dref, bs); if (e) return e; } return GF_OK;}GF_Err dinf_Size(GF_Box *s){ GF_Err e; GF_DataInformationBox *ptr = (GF_DataInformationBox *)s; e = gf_isom_box_get_size(s); if (ptr->dref) { e = gf_isom_box_size((GF_Box *) ptr->dref); if (e) return e; ptr->size += ptr->dref->size; } return GF_OK;}#endif //GPAC_READ_ONLYvoid dref_del(GF_Box *s){ GF_DataReferenceBox *ptr = (GF_DataReferenceBox *) s; if (ptr == NULL) return; gf_isom_box_array_del(ptr->boxList); free(ptr);}GF_Err dref_AddDataEntry(GF_DataReferenceBox *ptr, GF_Box *entry){ return gf_list_add(ptr->boxList, entry);}GF_Err dref_Read(GF_Box *s, GF_BitStream *bs){ GF_Err e; u32 count, i; GF_Box *a; GF_DataReferenceBox *ptr = (GF_DataReferenceBox *)s; if (ptr == NULL) return GF_BAD_PARAM; e = gf_isom_full_box_read(s, bs); if (e) return e; count = gf_bs_read_u32(bs); for ( i = 0; i < count; i++ ) { e = gf_isom_parse_box(&a, bs); if (e) return e; if (ptr->size<a->size) return GF_ISOM_INVALID_FILE; e = gf_list_add(ptr->boxList, a); if (e) return e; ptr->size -= a->size; } return GF_OK;}GF_Box *dref_New(){ GF_DataReferenceBox *tmp = (GF_DataReferenceBox *) malloc(sizeof(GF_DataReferenceBox)); if (tmp == NULL) return NULL; memset(tmp, 0, sizeof(GF_DataReferenceBox)); gf_isom_full_box_init((GF_Box *) tmp); tmp->boxList = gf_list_new(); if (!tmp->boxList) { free(tmp); return NULL; } tmp->type = GF_ISOM_BOX_TYPE_DREF; return (GF_Box *)tmp;}//from here, for write/edit versions#ifndef GPAC_READ_ONLYGF_Err dref_Write(GF_Box *s, GF_BitStream *bs){ GF_Err e; u32 count; GF_DataReferenceBox *ptr = (GF_DataReferenceBox *)s; if (!s) return GF_BAD_PARAM; e = gf_isom_full_box_write(s, bs); if (e) return e; count = gf_list_count(ptr->boxList); gf_bs_write_u32(bs, count); return gf_isom_box_array_write(s, ptr->boxList, bs);}GF_Err dref_Size(GF_Box *s){ GF_Err e; GF_DataReferenceBox *ptr = (GF_DataReferenceBox *)s; if (!s) return GF_BAD_PARAM; e = gf_isom_full_box_get_size(s); if (e) return e; ptr->size += 4; e = gf_isom_box_array_size(s, ptr->boxList); if (e) return e; return GF_OK;}#endif //GPAC_READ_ONLYvoid edts_del(GF_Box *s){ GF_EditBox *ptr = (GF_EditBox *) s; gf_isom_box_del((GF_Box *)ptr->editList); free(ptr);}GF_Err edts_AddBox(GF_Box *s, GF_Box *a){ GF_EditBox *ptr = (GF_EditBox *)s; if (a->type == GF_ISOM_BOX_TYPE_ELST) { if (ptr->editList) return GF_BAD_PARAM; ptr->editList = (GF_EditListBox *)a; return GF_OK; } gf_isom_box_del(a); return GF_OK;}GF_Err edts_Read(GF_Box *s, GF_BitStream *bs){ return gf_isom_read_box_list(s, bs, edts_AddBox);}GF_Box *edts_New(){ GF_EditBox *tmp; GF_SAFEALLOC(tmp, GF_EditBox); if (tmp == NULL) return NULL; tmp->type = GF_ISOM_BOX_TYPE_EDTS; return (GF_Box *) tmp;}//from here, for write/edit versions#ifndef GPAC_READ_ONLYGF_Err edts_Write(GF_Box *s, GF_BitStream *bs){ GF_Err e; GF_EditBox *ptr = (GF_EditBox *)s; //here we have a trick: if editList is empty, skip the box if (gf_list_count(ptr->editList->entryList)) { e = gf_isom_box_write_header(s, bs); if (e) return e; e = gf_isom_box_write((GF_Box *) ptr->editList, bs); if (e) return e; } return GF_OK;}GF_Err edts_Size(GF_Box *s){ GF_Err e; GF_EditBox *ptr = (GF_EditBox *)s; //here we have a trick: if editList is empty, skip the box if (! gf_list_count(ptr->editList->entryList)) { ptr->size = 0; } else { e = gf_isom_box_get_size(s); if (e) return e; e = gf_isom_box_size((GF_Box *)ptr->editList); if (e) return e; ptr->size += ptr->editList->size; } return GF_OK;}#endif //GPAC_READ_ONLYvoid elst_del(GF_Box *s){ GF_EditListBox *ptr; GF_EdtsEntry *p; u32 entryCount; u32 i; ptr = (GF_EditListBox *)s; if (ptr == NULL) return; entryCount = gf_list_count(ptr->entryList); for (i = 0; i < entryCount; i++) { p = (GF_EdtsEntry*)gf_list_get(ptr->entryList, i); if (p) free(p); } gf_list_del(ptr->entryList); free(ptr);}GF_Err elst_Read(GF_Box *s, GF_BitStream *bs){ GF_Err e; u32 entries; s32 tr; u32 entryCount; GF_EdtsEntry *p; GF_EditListBox *ptr = (GF_EditListBox *)s; e = gf_isom_full_box_read(s, bs); if (e) return e; entryCount = gf_bs_read_u32(bs); for (entries = 0; entries < entryCount; entries++ ) { p = (GF_EdtsEntry *) malloc(sizeof(GF_EdtsEntry)); if (!p) return GF_OUT_OF_MEM; if (ptr->version == 1) { p->segmentDuration = gf_bs_read_u64(bs); p->mediaTime = (s64) gf_bs_read_u64(bs); } else { p->segmentDuration = gf_bs_read_u32(bs); tr = gf_bs_read_u32(bs); p->mediaTime = (s64) tr; } p->mediaRate = gf_bs_read_u32(bs); gf_list_add(ptr->entryList, p); } return GF_OK;}GF_Box *elst_New(){ GF_EditListBox *tmp; tmp = (GF_EditListBox *) malloc(sizeof(GF_EditListBox)); if (tmp == NULL) return NULL; memset(tmp, 0, sizeof(GF_EditListBox)); gf_isom_full_box_init((GF_Box *)tmp); tmp->entryList = gf_list_new(); if (!tmp->entryList) { free(tmp); return NULL; } tmp->type = GF_ISOM_BOX_TYPE_ELST; return (GF_Box *)tmp;}//from here, for write/edit versions#ifndef GPAC_READ_ONLYGF_Err elst_Write(GF_Box *s, GF_BitStream *bs){ GF_Err e; u32 i; u32 entryCount; GF_EdtsEntry *p; GF_EditListBox *ptr = (GF_EditListBox *)s; if (!ptr) return GF_BAD_PARAM; entryCount = gf_list_count(ptr->entryList); e = gf_isom_full_box_write(s, bs); if (e) return e; gf_bs_write_u32(bs, entryCount); for (i = 0; i < entryCount; i++ ) { p = (GF_EdtsEntry*)gf_list_get(ptr->entryList, i); if (ptr->version == 1) { gf_bs_write_u64(bs, p->segmentDuration); gf_bs_write_u64(bs, p->mediaTime); } else { gf_bs_write_u32(bs, (u32) p->segmentDuration); gf_bs_write_u32(bs, (s32) p->mediaTime); } gf_bs_write_u32(bs, p->mediaRate); } return GF_OK;}GF_Err elst_Size(GF_Box *s){ GF_Err e; u32 durtimebytes; u32 i, entryCount; GF_EditListBox *ptr = (GF_EditListBox *)s; e = gf_isom_full_box_get_size(s); if (e) return e; //entry count ptr->size += 4; entryCount = gf_list_count(ptr->entryList); ptr->version = 0; for (i=0; i<entryCount; i++) { GF_EdtsEntry *p = (GF_EdtsEntry*)gf_list_get(ptr->entryList, i); if ((p->segmentDuration>0xFFFFFFFF) || (p->mediaTime>0xFFFFFFFF)) { ptr->version = 1; break; } } durtimebytes = (ptr->version == 1 ? 16 : 8) + 4; ptr->size += (entryCount * durtimebytes); return GF_OK;}#endif //GPAC_READ_ONLYvoid esds_del(GF_Box *s){ GF_ESDBox *ptr = (GF_ESDBox *)s; if (ptr == NULL) return; if (ptr->desc) gf_odf_desc_del((GF_Descriptor *)ptr->desc); free(ptr);}GF_Err esds_Read(GF_Box *s, GF_BitStream *bs){ GF_Err e; u32 descSize; char *enc_desc; u32 SLIsPredefined(GF_SLConfig *sl); GF_ESDBox *ptr = (GF_ESDBox *)s; e = gf_isom_full_box_read(s, bs); if (e) return e; descSize = (u32) (ptr->size); if (descSize) { enc_desc = (char*)malloc(sizeof(char) * descSize); if (!enc_desc) return GF_OUT_OF_MEM; //get the payload gf_bs_read_data(bs, enc_desc, descSize); //send it to the OD Codec e = gf_odf_desc_read(enc_desc, descSize, (GF_Descriptor **) &ptr->desc); //OK, free our desc free(enc_desc); //we do not abbort on error, but skip the descritpor if (e) { ptr->desc = NULL; } else { /*fix broken files*/ if (!ptr->desc->URLString) { if (!ptr->desc->slConfig) { ptr->desc->slConfig = (GF_SLConfig *) gf_odf_desc_new(GF_ODF_SLC_TAG); ptr->desc->slConfig->predefined = SLPredef_MP4; } else if (ptr->desc->slConfig->predefined != SLPredef_MP4) { ptr->desc->slConfig->predefined = SLPredef_MP4; gf_odf_slc_set_pref(ptr->desc->slConfig); } } } } return GF_OK;}GF_Box *esds_New(){ GF_ESDBox *tmp = (GF_ESDBox *) malloc(sizeof(GF_ESDBox)); if (tmp == NULL) return NULL; memset(tmp, 0, sizeof(GF_ESDBox)); gf_isom_full_box_init((GF_Box *) tmp); tmp->type = GF_ISOM_BOX_TYPE_ESDS; return (GF_Box *)tmp;}//from here, for write/edit versions#ifndef GPAC_READ_ONLYGF_Err esds_Write(GF_Box *s, GF_BitStream *bs)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -