GF_EXPORT GF_Err gf_oci_codec_encode(OCICodec *codec, char **outAU, u32 *au_length) { GF_BitStream *bs; u32 i, size, desc_size; GF_Err e; OCIEvent *ev; if (!codec || !codec->Mode || *outAU) return GF_BAD_PARAM; bs = NULL; size = 0; //get the size of each event i=0; while ((ev = (OCIEvent *)gf_list_enum(codec->OCIEvents, &i))) { //fixed size header size += 10; e = gf_odf_size_descriptor_list(codec->OCIEvents, &desc_size); if (e) goto err_exit; size += desc_size; } //encode bs = gf_bs_new(NULL, 0, GF_BITSTREAM_WRITE); e = WriteSevenBitLength(bs, size); if (e) goto err_exit; //get one event, write it and delete it while (gf_list_count(codec->OCIEvents)) { ev = (OCIEvent *)gf_list_get(codec->OCIEvents, 0); gf_list_rem(codec->OCIEvents, 0); gf_bs_write_int(bs, ev->EventID, 15); gf_bs_write_int(bs, ev->AbsoluteTimeFlag, 1); gf_bs_write_data(bs, ev->StartingTime, 4); gf_bs_write_data(bs, ev->duration, 4); e = gf_odf_write_descriptor_list(bs, ev->OCIDescriptors); gf_oci_event_del(ev); if (e) goto err_exit; //OCI Event is aligned gf_bs_align(bs); } gf_bs_get_content(bs, outAU, au_length); gf_bs_del(bs); return GF_OK; err_exit: if (bs) gf_bs_del(bs); //delete everything while (gf_list_count(codec->OCIEvents)) { ev = (OCIEvent *)gf_list_get(codec->OCIEvents, 0); gf_list_rem(codec->OCIEvents, 0); gf_oci_event_del(ev); } return e; }
GF_EXPORT GF_Err gf_odf_desc_list_size(GF_List *descList, u32 *outSize) { return gf_odf_size_descriptor_list(descList, outSize); }