GF_Err gf_odf_size_ipmp_update(GF_IPMPUpdate *ipmpUp, u32 *outSize) { GF_Descriptor *tmp; u32 i, tmpSize; if (!ipmpUp) return GF_BAD_PARAM; *outSize = 0; i = 0; while ((tmp = (GF_Descriptor *)gf_list_enum(ipmpUp->IPMPDescList, &i))) { gf_odf_size_descriptor(tmp, &tmpSize); *outSize += tmpSize + gf_odf_size_field_size(tmpSize); } return GF_OK; }
GF_Err gf_odf_size_od_update(GF_ODUpdate *odUp, u32 *outSize) { GF_Descriptor *tmp; u32 i, tmpSize; if (!odUp) return GF_BAD_PARAM; *outSize = 0; i = 0; while ((tmp = (GF_Descriptor *)gf_list_enum(odUp->objectDescriptors, &i))) { gf_odf_size_descriptor(tmp, &tmpSize); *outSize += tmpSize + gf_odf_size_field_size(tmpSize); } return GF_OK; }
//use this function to get the size of a standalone descriptor GF_EXPORT u32 gf_odf_desc_size(GF_Descriptor *desc) { u32 descSize; GF_Err e; if (!desc) return GF_BAD_PARAM; //get the descriptor length e = gf_odf_size_descriptor(desc, &descSize); if (e) return 0; //add the header length descSize += gf_odf_size_field_size(descSize); return descSize; }
GF_Err gf_odf_size_descriptor_list(GF_List *descList, u32 *outSize) { GF_Err e; GF_Descriptor *tmp; u32 tmpSize, count, i; if (! descList) return GF_OK; count = gf_list_count(descList); for ( i = 0; i < count; i++ ) { tmp = (GF_Descriptor*)gf_list_get(descList, i); if (tmp) { e = gf_odf_size_descriptor(tmp, &tmpSize); if (e) return e; if (tmpSize) *outSize += tmpSize + gf_odf_size_field_size(tmpSize); } } return GF_OK; }
GF_Err gf_odf_size_esd_update(GF_ESDUpdate *esdUp, u32 *outSize) { u32 i, BitSize, tmpSize; GF_Descriptor *tmp; if (!esdUp) return GF_BAD_PARAM; *outSize = 0; BitSize = 10; i = 0; while ((tmp = (GF_Descriptor *)gf_list_enum(esdUp->ESDescriptors, &i))) { gf_odf_size_descriptor(tmp, &tmpSize); BitSize += (tmpSize + gf_odf_size_field_size(tmpSize)) * 8; } while ((s32)BitSize > 0) { BitSize -= 8; *outSize += 1; } return GF_OK; }
// // Writer // GF_Err gf_odf_write_slc(GF_BitStream *bs, GF_SLConfig *sl) { GF_Err e; u32 size; if (! sl) return GF_BAD_PARAM; e = gf_odf_size_descriptor((GF_Descriptor *)sl, &size); e = gf_odf_write_base_descriptor(bs, sl->tag, size); gf_bs_write_int(bs, sl->predefined, 8); if (! sl->predefined) { gf_bs_write_int(bs, sl->useAccessUnitStartFlag, 1); gf_bs_write_int(bs, sl->useAccessUnitEndFlag, 1); gf_bs_write_int(bs, sl->useRandomAccessPointFlag, 1); gf_bs_write_int(bs, sl->hasRandomAccessUnitsOnlyFlag, 1); gf_bs_write_int(bs, sl->usePaddingFlag, 1); gf_bs_write_int(bs, sl->useTimestampsFlag, 1); gf_bs_write_int(bs, sl->useIdleFlag, 1); gf_bs_write_int(bs, sl->durationFlag, 1); gf_bs_write_int(bs, sl->timestampResolution, 32); gf_bs_write_int(bs, sl->OCRResolution, 32); gf_bs_write_int(bs, sl->timestampLength, 8); gf_bs_write_int(bs, sl->OCRLength, 8); gf_bs_write_int(bs, sl->AULength, 8); gf_bs_write_int(bs, sl->instantBitrateLength, 8); gf_bs_write_int(bs, sl->degradationPriorityLength, 4); gf_bs_write_int(bs, sl->AUSeqNumLength, 5); gf_bs_write_int(bs, sl->packetSeqNumLength, 5); gf_bs_write_int(bs, 3, 2); //reserved: 0b11 == 3 } if (sl->durationFlag) { gf_bs_write_int(bs, sl->timeScale, 32); gf_bs_write_int(bs, sl->AUDuration, 16); gf_bs_write_int(bs, sl->CUDuration, 16); } if (! sl->useTimestampsFlag) { gf_bs_write_long_int(bs, sl->startDTS, sl->timestampLength); gf_bs_write_long_int(bs, sl->startCTS, sl->timestampLength); } return GF_OK; }
// // Writer // GF_Err gf_odf_write_qos(GF_BitStream *bs, GF_QoS_Descriptor *qos) { GF_Err e; u32 size, i; GF_QoS_Default *tmp; if (!qos) return GF_BAD_PARAM; e = gf_odf_size_descriptor((GF_Descriptor *)qos, &size); if (e) return e; e = gf_odf_write_base_descriptor(bs, qos->tag, size); if (e) return e; gf_bs_write_int(bs, qos->predefined, 8); if (! qos->predefined) { i=0; while ((tmp = (GF_QoS_Default *)gf_list_enum(qos->QoS_Qualifiers, &i))) { e = gf_odf_write_qos_qual(bs, tmp); if (e) return e; } } return GF_OK; }