//this is useful to duplicate on the fly a descriptor (mainly for authoring purposes) GF_EXPORT GF_Err gf_odf_desc_copy(GF_Descriptor *inDesc, GF_Descriptor **outDesc) { GF_Err e; char *desc; u32 size; //warning: here we get some data allocated e = gf_odf_desc_write(inDesc, &desc, &size); if (e) return e; e = gf_odf_desc_read(desc, size, outDesc); gf_free(desc); return e; }
/*load iod from data:application/mpeg4-iod;base64*/ GF_Err RP_SDPLoadIOD(RTPClient *rtp, char *iod_str) { char buf[2000]; u32 size; if (rtp->session_desc) return GF_SERVICE_ERROR; /*the only IOD format we support*/ iod_str += 1; if (!strnicmp(iod_str, "data:application/mpeg4-iod;base64", strlen("data:application/mpeg4-iod;base64"))) { char *buf64; u32 size64; buf64 = strstr(iod_str, ","); if (!buf64) return GF_URL_ERROR; buf64 += 1; size64 = (u32) strlen(buf64) - 1; size = gf_base64_decode(buf64, size64, buf, 2000); if (!size) return GF_SERVICE_ERROR; } else if (!strnicmp(iod_str, "data:application/mpeg4-iod;base16", strlen("data:application/mpeg4-iod;base16"))) { char *buf16; u32 size16; buf16 = strstr(iod_str, ","); if (!buf16) return GF_URL_ERROR; buf16 += 1; size16 = (u32) strlen(buf16) - 1; size = gf_base16_decode(buf16, size16, buf, 2000); if (!size) return GF_SERVICE_ERROR; } else { return GF_NOT_SUPPORTED; } gf_odf_desc_read(buf, size, &rtp->session_desc); return GF_OK; }