📄 box_code_base.c
字号:
if (!hnti || !a) return GF_BAD_PARAM; switch (a->type) { //this is the value for GF_RTPBox - same as HintSampleEntry for RTP !!! case GF_ISOM_BOX_TYPE_RTP: case GF_ISOM_BOX_TYPE_SDP: if (hnti->SDP) return GF_BAD_PARAM; hnti->SDP = a; break; default: break; } return gf_list_add(hnti->boxList, a);}GF_Err hnti_Read(GF_Box *s, GF_BitStream *bs){ u32 type; u32 length; GF_Err e; GF_Box *a; GF_RTPBox *rtp; GF_HintTrackInfoBox *ptr = (GF_HintTrackInfoBox *)s; if (ptr == NULL) return GF_BAD_PARAM; //WARNING: because of the HNTI at movie level, we cannot use the generic parsing scheme! //this because the child SDP box at the movie level has a type of RTP, used for //the HintSampleEntry ! while (ptr->size) { //get the type of the box (4 bytes after our current position in the bitstream) //before parsing... type = gf_bs_peek_bits(bs, 32, 4); if (type != GF_ISOM_BOX_TYPE_RTP) { e = gf_isom_parse_box(&a, bs); if (e) return e; e = hnti_AddBox(ptr, a); if (e) return e; if (ptr->size<a->size) return GF_ISOM_INVALID_FILE; ptr->size-=a->size; } else { u32 sr; rtp = (GF_RTPBox*)malloc(sizeof(GF_RTPBox)); if (!rtp) return GF_OUT_OF_MEM; rtp->size = gf_bs_read_u32(bs); rtp->type = gf_bs_read_u32(bs); sr = 8; //"ITS LENGTH IS CALCULATED BY SUBSTRACTING 8 (or 12) from the box size" - QT specs //this means that we don't have any NULL char as a delimiter in QT ... if (rtp->size == 1) return GF_BAD_PARAM; rtp->subType = gf_bs_read_u32(bs); sr += 4; if (rtp->subType != GF_ISOM_BOX_TYPE_SDP) return GF_NOT_SUPPORTED; if (rtp->size < sr) return GF_ISOM_INVALID_FILE; length = (u32) (rtp->size - sr); rtp->sdpText = (char*)malloc(sizeof(char) * (length + 1)); if (!rtp->sdpText) { free(rtp); return GF_OUT_OF_MEM; } gf_bs_read_data(bs, rtp->sdpText, length); rtp->sdpText[length] = 0; sr += length; e = hnti_AddBox(ptr, (GF_Box *)rtp); if (e) return e; if (ptr->size<rtp->size) return GF_ISOM_INVALID_FILE; ptr->size -= rtp->size; } } return GF_OK;}#ifndef GPAC_READ_ONLYGF_Err hnti_Write(GF_Box *s, GF_BitStream *bs){ GF_Err e; u32 i, count; GF_Box *a; GF_RTPBox *rtp; GF_HintTrackInfoBox *ptr = (GF_HintTrackInfoBox *)s; if (ptr == NULL) return GF_BAD_PARAM; e = gf_isom_box_write_header(s, bs); if (e) return e; count = gf_list_count(ptr->boxList); for (i = 0; i < count; i ++) { a = (GF_Box*)gf_list_get(ptr->boxList, i); if (a->type != GF_ISOM_BOX_TYPE_RTP) { e = gf_isom_box_write(a, bs); if (e) return e; } else { //write the GF_RTPBox by hand rtp = (GF_RTPBox *)a; e = gf_isom_box_write_header(a, bs); if (e) return e; gf_bs_write_u32(bs, rtp->subType); //don't write the NULL char gf_bs_write_data(bs, rtp->sdpText, strlen(rtp->sdpText)); } } return GF_OK;}GF_Err hnti_Size(GF_Box *s){ GF_Err e; u32 i, count; GF_Box *a; GF_RTPBox *rtp; GF_HintTrackInfoBox *ptr = (GF_HintTrackInfoBox *)s; if (ptr == NULL) return GF_BAD_PARAM; e = gf_isom_box_get_size(s); if (e) return e; count = gf_list_count(ptr->boxList); for (i = 0; i < count; i ++) { a = (GF_Box*)gf_list_get(ptr->boxList, i); if (a->type != GF_ISOM_BOX_TYPE_RTP) { e = gf_isom_box_size(a); if (e) return e; } else { //get the GF_RTPBox size by hand rtp = (GF_RTPBox *)a; e = gf_isom_box_get_size(a); if (e) return e; //don't count the NULL char... rtp->size += 4 + strlen(rtp->sdpText); } ptr->size += a->size; } return GF_OK;}#endif/********************************************************** GF_SDPBox**********************************************************/void sdp_del(GF_Box *s){ GF_SDPBox *ptr = (GF_SDPBox *)s; if (ptr->sdpText) free(ptr->sdpText); free(ptr);}GF_Err sdp_Read(GF_Box *s, GF_BitStream *bs){ u32 length; GF_SDPBox *ptr = (GF_SDPBox *)s; if (ptr == NULL) return GF_BAD_PARAM; length = (u32) (ptr->size); //sdp text has no delimiter !!! ptr->sdpText = (char*)malloc(sizeof(char) * (length+1)); if (!ptr->sdpText) return GF_OUT_OF_MEM; gf_bs_read_data(bs, ptr->sdpText, length); ptr->sdpText[length] = 0; return GF_OK;}GF_Box *sdp_New(){ GF_SDPBox *tmp = (GF_SDPBox *) malloc(sizeof(GF_SDPBox)); if (!tmp) return NULL; memset(tmp, 0, sizeof(GF_SDPBox)); tmp->type = GF_ISOM_BOX_TYPE_SDP; return (GF_Box *)tmp;}#ifndef GPAC_READ_ONLYGF_Err sdp_Write(GF_Box *s, GF_BitStream *bs){ GF_Err e; GF_SDPBox *ptr = (GF_SDPBox *)s; if (ptr == NULL) return GF_BAD_PARAM; e = gf_isom_box_write_header(s, bs); if (e) return e; //don't write the NULL char!!! gf_bs_write_data(bs, ptr->sdpText, strlen(ptr->sdpText)); return GF_OK;}GF_Err sdp_Size(GF_Box *s){ GF_Err e; GF_SDPBox *ptr = (GF_SDPBox *)s; e = gf_isom_box_get_size(s); if (e) return e; //don't count the NULL char!!! ptr->size += strlen(ptr->sdpText); return GF_OK;}#endif/********************************************************** TRPY GF_Box**********************************************************/void trpy_del(GF_Box *s){ free((GF_TRPYBox *)s);}GF_Err trpy_Read(GF_Box *s, GF_BitStream *bs){ GF_TRPYBox *ptr = (GF_TRPYBox *)s; ptr->nbBytes = gf_bs_read_u64(bs); return GF_OK;}GF_Box *trpy_New(){ GF_TRPYBox *tmp = (GF_TRPYBox *) malloc(sizeof(GF_TRPYBox)); if (!tmp) return NULL; tmp->type = GF_ISOM_BOX_TYPE_TRPY; tmp->nbBytes = 0; return (GF_Box *)tmp;}#ifndef GPAC_READ_ONLYGF_Err trpy_Write(GF_Box *s, GF_BitStream *bs){ GF_Err e; GF_TRPYBox *ptr = (GF_TRPYBox *)s; if (ptr == NULL) return GF_BAD_PARAM; e = gf_isom_box_write_header(s, bs); if (e) return e; gf_bs_write_u64(bs, ptr->nbBytes); return GF_OK;}GF_Err trpy_Size(GF_Box *s){ GF_Err e; e = gf_isom_box_get_size(s); if (e) return e; s->size += 8; return GF_OK;}#endif/********************************************************** TOTL GF_Box**********************************************************/void totl_del(GF_Box *s){ free((GF_TRPYBox *)s);}GF_Err totl_Read(GF_Box *s, GF_BitStream *bs){ GF_TOTLBox *ptr = (GF_TOTLBox *)s; ptr->nbBytes = gf_bs_read_u32(bs); return GF_OK;}GF_Box *totl_New(){ GF_TOTLBox *tmp = (GF_TOTLBox *) malloc(sizeof(GF_TOTLBox)); if (!tmp) return NULL; tmp->type = GF_ISOM_BOX_TYPE_TOTL; tmp->nbBytes = 0; return (GF_Box *)tmp;}#ifndef GPAC_READ_ONLYGF_Err totl_Write(GF_Box *s, GF_BitStream *bs){ GF_Err e; GF_TOTLBox *ptr = (GF_TOTLBox *)s; if (ptr == NULL) return GF_BAD_PARAM; e = gf_isom_box_write_header(s, bs); if (e) return e; gf_bs_write_u32(bs, ptr->nbBytes); return GF_OK;}GF_Err totl_Size(GF_Box *s){ GF_Err e; e = gf_isom_box_get_size(s); if (e) return e; s->size += 4; return GF_OK;}#endif/********************************************************** NUMP GF_Box**********************************************************/void nump_del(GF_Box *s){ free((GF_NUMPBox *)s);}GF_Err nump_Read(GF_Box *s, GF_BitStream *bs){ GF_NUMPBox *ptr = (GF_NUMPBox *)s; ptr->nbPackets = gf_bs_read_u64(bs); return GF_OK;}GF_Box *nump_New(){ GF_NUMPBox *tmp = (GF_NUMPBox *) malloc(sizeof(GF_NUMPBox)); if (!tmp) return NULL; tmp->type = GF_ISOM_BOX_TYPE_NUMP; tmp->nbPackets = 0; return (GF_Box *)tmp;}#ifndef GPAC_READ_ONLYGF_Err nump_Write(GF_Box *s, GF_BitStream *bs){ GF_Err e; GF_NUMPBox *ptr = (GF_NUMPBox *)s; if (ptr == NULL) return GF_BAD_PARAM; e = gf_isom_box_write_header(s, bs); if (e) return e; gf_bs_write_u64(bs, ptr->nbPackets); return GF_OK;}GF_Err nump_Size(GF_Box *s){ GF_Err e; e = gf_isom_box_get_size(s); if (e) return e; s->size += 8; return GF_OK;}#endif/********************************************************** NPCK GF_Box**********************************************************/void npck_del(GF_Box *s){ free((GF_NPCKBox *)s);}GF_Err npck_Read(GF_Box *s, GF_BitStream *bs){ GF_NPCKBox *ptr = (GF_NPCKBox *)s; ptr->nbPackets = gf_bs_read_u32(bs); return GF_OK;}GF_Box *npck_New(){ GF_NPCKBox *tmp = (GF_NPCKBox *) malloc(sizeof(GF_NPCKBox)); if (!tmp) return NULL; tmp->type = GF_ISOM_BOX_TYPE_NPCK; tmp->nbPackets = 0; return (GF_Box *)tmp;}#ifndef GPAC_READ_ONLYGF_Err npck_Write(GF_Box *s, GF_BitStream *bs){ GF_Err e; GF_NPCKBox *ptr = (GF_NPCKBox *)s; if (ptr == NULL) return GF_BAD_PARAM; e = gf_isom_box_write_header(s, bs); if (e) return e; gf_bs_write_u32(bs, ptr->nbPackets); return GF_OK;}GF_Err npck_Size(GF_Box *s){ GF_Err e; e = gf_isom_box_get_size(s); if (e) return e; s->size += 4; return GF_OK;}#endif/********************************************************** TPYL GF_Box**********************************************************/void tpyl_del(GF_Box *s){ free((GF_NTYLBox *)s);}GF_Err tpyl_Read(GF_Box *s, GF_BitStream *bs){ GF_NTYLBox *ptr = (GF_NTYLBox *)s; if (ptr == NULL) return GF_BAD_PARAM; ptr->nbBytes = gf_bs_read_u64(bs); return GF_OK;}GF_Box *tpyl_New(){ GF_NTYLBox *tmp = (GF_NTYLBox *) malloc(sizeof(GF_NTYLBox)); if (!tmp) return NULL; tmp->type = GF_ISOM_BOX_TYPE_TPYL; tmp->nbBytes = 0; return (GF_Box *)tmp;}#ifndef GPAC_READ_ONLYGF_Err tpyl_Write(GF_Box *s, GF_BitStream *bs){ GF_Err e; GF_NTYLBox *ptr = (GF_NTYLBox *)s; if (ptr == NULL) return GF_BAD_PARAM; e = gf_isom_box_write_header(s, bs); if (e) return e; gf_bs_write_u64(bs, ptr->nbBytes); return GF_OK;}GF_Err tpyl_Size(GF_Box *s){ GF_Err e; e = gf_isom_box_get_size(s); if (e) return e; s->size += 8; return GF_OK;}#endif/********************************************************** TPAY GF_Box**********************************************************/void tpay_del(GF_Box *s){ free((GF_TPAYBox *)s);}GF_Err tpay_Read(GF_Box *s, GF_BitStream *bs){ GF_TPAYBox *ptr = (GF_TPAYBox *)s; ptr->nbBytes = gf_bs_read_u32(bs); return GF_OK;}GF_Box *tpay_New(){ GF_TPAYBox *tmp = (GF_TPAYBox *) malloc(sizeof(GF_TPAYBox)); if (!tmp) return NULL; tmp->type = GF_ISOM_BOX_TYPE_TPAY; tmp->nbBytes = 0; return (GF_Box *)tmp;}#ifndef GPAC_READ_ONLYGF_Err tpay_Write(GF_Box *s, GF_BitStream *bs){ GF_Err e; GF_TPAYBox *ptr = (GF_TPAYBox *)s; if (ptr == NULL) return GF_BAD_PARAM; e = gf_isom_box_write_header(s, bs); if (e) return e; gf_bs_write_u32(bs, ptr->nbBytes); return GF_OK;}GF_Err tpay_Size(GF_Box *s){ GF_Err e; e = gf_isom_box_get_size(s); if (e) return e; s->size += 4; return GF_OK;}#endif/********************************************************** MAXR GF_Box**********************************************************/void maxr_del(GF_Box *s){ free((GF_MAXRBox *)s);}GF_Err maxr_Read(GF_Box *s, GF_BitStream *bs){ GF_MAXRBox *ptr = (GF_MAXRBox *)s; if (ptr == NULL) return GF_BAD_PARAM; ptr->granularity = gf_bs_read_u32(bs); ptr->maxDataRate = gf_bs_read_u32(bs); return GF_OK;}GF_Box *maxr_New(){ GF_MAXRBox *tmp = (GF_MAXRBox *) malloc(sizeof(GF_MAXRBox)); if (!tmp) return NULL; tmp->type = GF_ISOM_BOX_TYPE_MAXR; tmp->granularity = tmp->maxDataRate = 0; return (GF_Box *)tmp;}#ifndef GPAC_READ_ONLYGF_Err maxr_Write(GF_Box *s, GF_BitStream *bs){ GF_Err e; GF_MAXRBox *ptr = (GF_MAXRBox *)s; if (ptr == NULL) return GF_BAD_PARAM; e = gf_isom_box_write_header(s, bs); if (e) return e; gf_bs_write_u32(bs, ptr->granularity); gf_bs_write_u32(bs, ptr->maxDataRate); return GF_OK;}GF_Err maxr_Size(GF_Box *s){ GF_Err e; e = gf_isom_box_get_size(s); if (e) return e; s->size += 8; return GF_OK;}#endif/********************************************************** DMED GF_Box**********************************************************/void dmed_del(GF_Box *s){ free((GF_DMEDBox *)s);}GF_Err dmed_Read(GF_Box *s, GF_BitStream *bs){ GF_DMEDBox *ptr = (GF_DMEDBox *)s; ptr->nbBytes = gf_bs_read_u64(bs); return GF_OK;}GF_Box *dmed_New(){ GF_DMEDBox *tmp = (GF_DMEDBox *) malloc(sizeof(GF_DMEDBox)); if (!tmp) return NULL; tmp->type = GF_ISOM_BOX_TYPE_DMED; tmp->nbBytes = 0; return (GF_Box *)tmp;}#ifndef GPAC_READ_ONLYGF_Err dmed_Write(GF_Box *s, GF_BitStream *bs){ GF_Err e; GF_DMEDBox *ptr = (GF_DMEDBox *)s; if (ptr == NULL) return GF_BAD_PARAM; e = gf_isom_box_write_header(s, bs); if (e) return e; gf_bs_write_u64(bs, ptr->nbBytes); return GF_OK;}GF_Err dmed_Size(GF_Box *s){ GF_Err e; e = gf_isom_box_get_size(s); if (e) return e; s->size += 8; return GF_OK;}#endif/********************************************************** DIMM GF_Box**********************************************************/void dimm_del(GF_Box *s){ free((GF_DIMMBox *)s);}GF_Err dimm_Read(GF_Box *s, GF_BitStream *bs){ GF_DIMMBox *ptr = (GF_DIMMBox *)s; ptr->nbBytes = gf_bs_read_u64(bs); return GF_OK;}GF_Box *dimm_New(){ GF_DIMMBox *tmp = (GF_DIMMBox *) malloc(sizeof(GF_DIMMBox)); if (!tmp) return NULL; tmp->type = GF_ISOM_BOX_TYPE_DIMM; tmp->nbBytes = 0; return (GF_Box *)tmp;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -