GF_Err gf_odf_write_base_command(GF_BitStream *bs, GF_BaseODCom *bcRem) { u32 size; GF_Err e; if (!bcRem) return GF_BAD_PARAM; e = gf_odf_size_base_command(bcRem, &size); if (e) return e; e = gf_odf_write_base_descriptor(bs, bcRem->tag, size); if (e) return e; gf_bs_write_data(bs, bcRem->data, bcRem->dataSize); return GF_OK; }
GF_Err gf_odf_write_qos_qual(GF_BitStream *bs, GF_QoS_Default *qos) { GF_Err e; if (!bs || !qos) return GF_BAD_PARAM; e = gf_odf_size_qos_qual(qos); if (e) return e; e = gf_odf_write_base_descriptor(bs, qos->tag, qos->size); if (e) return e; switch (qos->tag) { case QoSMaxDelayTag: gf_bs_write_int(bs, ((GF_QoS_MaxDelay *)qos)->MaxDelay, 32); break; case QoSPrefMaxDelayTag: gf_bs_write_int(bs, ((GF_QoS_PrefMaxDelay *)qos)->PrefMaxDelay, 32); break; case QoSLossProbTag: //FLOAT (double on 4 bytes) gf_bs_write_float(bs, ((GF_QoS_LossProb *)qos)->LossProb); break; case QoSMaxGapLossTag: gf_bs_write_int(bs, ((GF_QoS_MaxGapLoss *)qos)->MaxGapLoss, 32); break; case QoSMaxAUSizeTag: gf_bs_write_int(bs, ((GF_QoS_MaxAUSize *)qos)->MaxAUSize, 32); break; case QoSAvgAUSizeTag: gf_bs_write_int(bs, ((GF_QoS_AvgAUSize *)qos)->AvgAUSize, 32); break; case QoSMaxAURateTag: gf_bs_write_int(bs, ((GF_QoS_MaxAURate *)qos)->MaxAURate, 32); break; case 0x00: case 0xFF: return GF_ODF_FORBIDDEN_DESCRIPTOR; default: //we defined the private qos... gf_bs_write_data(bs, ((GF_QoS_Private *)qos)->Data, ((GF_QoS_Private *)qos)->DataLength); break; } return GF_OK; }
GF_Err gf_odf_write_ipmp_remove(GF_BitStream *bs, GF_IPMPRemove *ipmpRem) { GF_Err e; u32 size, i; if (!ipmpRem) return GF_BAD_PARAM; e = gf_odf_size_ipmp_remove(ipmpRem, &size); if (e) return e; e = gf_odf_write_base_descriptor(bs, ipmpRem->tag, size); if (e) return e; for (i = 0; i < ipmpRem->NbIPMPDs; i++) { gf_bs_write_int(bs, ipmpRem->IPMPDescID[i], 8); } //OD commands are aligned gf_bs_align(bs); return GF_OK; }
GF_Err gf_odf_write_od_remove(GF_BitStream *bs, GF_ODRemove *odRem) { GF_Err e; u32 size, i; if (!odRem) return GF_BAD_PARAM; e = gf_odf_size_od_remove(odRem, &size); if (e) return e; e = gf_odf_write_base_descriptor(bs, odRem->tag, size); if (e) return e; for (i = 0; i < odRem->NbODs; i++) { gf_bs_write_int(bs, odRem->OD_ID[i], 10); } //OD commands are aligned gf_bs_align(bs); 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; }
GF_Err gf_odf_write_esd_remove(GF_BitStream *bs, GF_ESDRemove *esdRem) { GF_Err e; u32 size, i; if (!esdRem) return GF_BAD_PARAM; e = gf_odf_size_esd_remove(esdRem, &size); if (e) return e; e = gf_odf_write_base_descriptor(bs, esdRem->tag, size); if (e) return e; gf_bs_write_int(bs, esdRem->ODID, 10); gf_bs_write_int(bs, 0, 6); //aligned for (i = 0; i < esdRem->NbESDs; i++) { gf_bs_write_int(bs, esdRem->ES_ID[i], 16); } //OD commands are aligned (but we are already aligned.... gf_bs_align(bs); return GF_OK; }
GF_Err gf_odf_write_ipmp_update(GF_BitStream *bs, GF_IPMPUpdate *ipmpUp) { GF_Err e; GF_Descriptor *tmp; u32 size, i; if (!ipmpUp) return GF_BAD_PARAM; e = gf_odf_size_ipmp_update(ipmpUp, &size); if (e) return e; e = gf_odf_write_base_descriptor(bs, ipmpUp->tag, size); if (e) return e; i = 0; while ((tmp = (GF_Descriptor *)gf_list_enum(ipmpUp->IPMPDescList, &i))) { e = gf_odf_write_descriptor(bs, tmp); if (e) return e; } //OD commands are aligned gf_bs_align(bs); return GF_OK; }
GF_Err gf_odf_write_od_update(GF_BitStream *bs, GF_ODUpdate *odUp) { GF_Err e; GF_Descriptor *tmp; u32 size, i; if (!odUp) return GF_BAD_PARAM; e = gf_odf_size_od_update(odUp, &size); if (e) return e; gf_odf_write_base_descriptor(bs, odUp->tag, size); if (e) return e; i = 0; while ((tmp = (GF_Descriptor *)gf_list_enum(odUp->objectDescriptors, &i))) { e = gf_odf_write_descriptor(bs, tmp); if (e) return e; } //OD commands are aligned gf_bs_align(bs); return GF_OK; }
GF_Err gf_odf_write_esd_update(GF_BitStream *bs, GF_ESDUpdate *esdUp) { GF_Descriptor *tmp; GF_Err e; u32 size, i; if (!esdUp) return GF_BAD_PARAM; e = gf_odf_size_esd_update(esdUp, &size); if (e) return e; e = gf_odf_write_base_descriptor(bs, esdUp->tag, size); if (e) return e; gf_bs_write_int(bs, esdUp->ODID, 10); i = 0; while ((tmp = (GF_Descriptor *)gf_list_enum(esdUp->ESDescriptors, &i))) { e = gf_odf_write_descriptor(bs, tmp); if (e) return e; } //OD commands are aligned gf_bs_align(bs); 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; }