void senc_del(GF_Box *s) { GF_SampleEncryptionBox *ptr = (GF_SampleEncryptionBox *)s; while (gf_list_count(ptr->samp_aux_info)) { GF_CENCSampleAuxInfo *sai = (GF_CENCSampleAuxInfo *)gf_list_get(ptr->samp_aux_info, 0); if (sai) gf_isom_cenc_samp_aux_info_del(sai); gf_list_rem(ptr->samp_aux_info, 0); } if (ptr->samp_aux_info) gf_list_del(ptr->samp_aux_info); gf_free(s); }
GF_EXPORT GF_Err gf_isom_cenc_get_sample_aux_info(GF_ISOFile *the_file, u32 trackNumber, u32 sampleNumber, GF_CENCSampleAuxInfo **sai, u32 *container_type) { GF_TrackBox *trak; GF_SampleTableBox *stbl; GF_Box *a_box = NULL; u32 i, type; GF_CENCSampleAuxInfo *a_sai; u8 IV_size; trak = gf_isom_get_track_from_file(the_file, trackNumber); if (!trak) return GF_BAD_PARAM; stbl = trak->Media->information->sampleTable; if (!stbl) return GF_BAD_PARAM; type = 0; for (i = 0; i < gf_list_count(stbl->other_boxes); i++) { a_box = (GF_Box *)gf_list_get(stbl->other_boxes, i++); if ((a_box->type == GF_ISOM_BOX_TYPE_UUID) && (((GF_UUIDBox *)a_box)->internal_4cc == GF_ISOM_BOX_UUID_PSEC)) { type = GF_ISOM_BOX_UUID_PSEC; break; } else if (a_box->type == GF_ISOM_BOX_TYPE_SENC) { type = GF_ISOM_BOX_TYPE_SENC; break; } } if (container_type) *container_type = type; if (!sai) return GF_OK; /*we need only container_type*/ if (*sai) { gf_isom_cenc_samp_aux_info_del(*sai); *sai = NULL; } gf_isom_get_sample_cenc_info_ex(trak, NULL, sampleNumber, NULL, &IV_size, NULL); if (!IV_size) { GF_SAFEALLOC( (*sai), GF_CENCSampleAuxInfo); return GF_OK; } /*get sample auxiliary information by saiz/saio rather than by parsing senc box*/ if (gf_isom_cenc_has_saiz_saio_track(stbl)) { return gf_isom_cenc_get_sai_by_saiz_saio(trak->Media, sampleNumber, IV_size, sai); } a_sai = NULL; switch (type) { case GF_ISOM_BOX_UUID_PSEC: if (a_box) a_sai = (GF_CENCSampleAuxInfo *)gf_list_get(((GF_PIFFSampleEncryptionBox *)a_box)->samp_aux_info, sampleNumber-1); break; case GF_ISOM_BOX_TYPE_SENC: if (a_box) a_sai = (GF_CENCSampleAuxInfo *)gf_list_get(((GF_SampleEncryptionBox *)a_box)->samp_aux_info, sampleNumber-1); break; } if (!a_sai) return GF_NOT_SUPPORTED; GF_SAFEALLOC( (*sai), GF_CENCSampleAuxInfo); if (a_box) { memmove((*sai)->IV, a_sai->IV, 16); (*sai)->subsample_count = a_sai->subsample_count; (*sai)->subsamples = (GF_CENCSubSampleEntry*)gf_malloc(sizeof(GF_CENCSubSampleEntry)*(*sai)->subsample_count); memmove((*sai)->subsamples, a_sai->subsamples, sizeof(GF_CENCSubSampleEntry)*(*sai)->subsample_count); } return GF_OK; }