GF_Err senc_Parse(GF_BitStream *bs, GF_TrackBox *trak, void *traf, GF_SampleEncryptionBox *senc) #endif { GF_Err e; u32 i, j, count; u64 pos = gf_bs_get_position(bs); #ifdef GPAC_DISABLE_ISOM_FRAGMENTS if (!traf) return GF_BAD_PARAM; #endif gf_bs_seek(bs, senc->bs_offset); count = gf_bs_read_u32(bs); if (!senc->samp_aux_info) senc->samp_aux_info = gf_list_new(); for (i=0; i<count; i++) { u32 is_encrypted; u32 samp_count; GF_CENCSampleAuxInfo *sai = (GF_CENCSampleAuxInfo *)gf_malloc(sizeof(GF_CENCSampleAuxInfo)); memset(sai, 0, sizeof(GF_CENCSampleAuxInfo)); samp_count = i+1; #ifndef GPAC_DISABLE_ISOM_FRAGMENTS if (trak) samp_count += trak->sample_count_at_seg_start; #endif if (trak) { e = gf_isom_get_sample_cenc_info_ex(trak, traf, senc, samp_count, &is_encrypted, &sai->IV_size, NULL, NULL, NULL, NULL, NULL); if (e) { GF_LOG(GF_LOG_ERROR, GF_LOG_CONTAINER, ("[isobmf] could not get cenc info for sample %d: %s\n", samp_count, gf_error_to_string(e) )); return e; } } //no init movie setup (segment dump/inspaction, assume default encrypted and 16 bytes IV else { is_encrypted = GF_TRUE; sai->IV_size = 16; } if (is_encrypted) { gf_bs_read_data(bs, (char *)sai->IV, sai->IV_size); if (senc->flags & 0x00000002) { sai->subsample_count = gf_bs_read_u16(bs); sai->subsamples = (GF_CENCSubSampleEntry *)gf_malloc(sai->subsample_count*sizeof(GF_CENCSubSampleEntry)); for (j = 0; j < sai->subsample_count; j++) { sai->subsamples[j].bytes_clear_data = gf_bs_read_u16(bs); sai->subsamples[j].bytes_encrypted_data = gf_bs_read_u32(bs); } } } gf_list_add(senc->samp_aux_info, sai); } gf_bs_seek(bs, pos); return GF_OK; }
GF_Err senc_Parse(GF_BitStream *bs, GF_TrackBox *trak, void *traf, GF_SampleEncryptionBox *ptr) #endif { GF_Err e; u32 i, j, count; u64 pos = gf_bs_get_position(bs); #ifdef GPAC_DISABLE_ISOM_FRAGMENTS if (!traf) return GF_BAD_PARAM; #endif gf_bs_seek(bs, ptr->bs_offset); count = gf_bs_read_u32(bs); if (!ptr->samp_aux_info) ptr->samp_aux_info = gf_list_new(); for (i=0; i<count; i++) { u32 is_encrypted; GF_CENCSampleAuxInfo *sai = (GF_CENCSampleAuxInfo *)gf_malloc(sizeof(GF_CENCSampleAuxInfo)); memset(sai, 0, sizeof(GF_CENCSampleAuxInfo)); e = gf_isom_get_sample_cenc_info_ex(trak, traf, (trak ? trak->sample_count_at_seg_start : 0 )+ i+1, &is_encrypted, &sai->IV_size, NULL); if (e) { GF_LOG(GF_LOG_ERROR, GF_LOG_CONTAINER, ("[isobmf] could not get cenc info for sample %d: %s\n", trak->sample_count_at_seg_start + i+1, gf_error_to_string(e) )); return e; } if (is_encrypted) { gf_bs_read_data(bs, (char *)sai->IV, sai->IV_size); if (ptr->flags & 0x00000002) { sai->subsample_count = gf_bs_read_u16(bs); sai->subsamples = (GF_CENCSubSampleEntry *)gf_malloc(sai->subsample_count*sizeof(GF_CENCSubSampleEntry)); for (j = 0; j < sai->subsample_count; j++) { sai->subsamples[j].bytes_clear_data = gf_bs_read_u16(bs); sai->subsamples[j].bytes_encrypted_data = gf_bs_read_u32(bs); } } } gf_list_add(ptr->samp_aux_info, sai); } gf_bs_seek(bs, pos); return GF_OK; }
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; }