GF_EXPORT void gf_sl_depacketize (GF_SLConfig *slConfig, GF_SLHeader *Header, char *PDU, u32 PDULength, u32 *HeaderLen) { GF_BitStream *bs; *HeaderLen = 0; if (!Header) return; //reset the input header memset(Header, 0, sizeof(GF_SLHeader)); bs = gf_bs_new(PDU, PDULength, GF_BITSTREAM_READ); if (!bs) return; if (slConfig->useAccessUnitStartFlag) Header->accessUnitStartFlag = gf_bs_read_int(bs, 1); if (slConfig->useAccessUnitEndFlag) Header->accessUnitEndFlag = gf_bs_read_int(bs, 1); if ( !slConfig->useAccessUnitStartFlag && !slConfig->useAccessUnitEndFlag) { Header->accessUnitStartFlag = 1; Header->accessUnitEndFlag = 1; } if (slConfig->OCRLength > 0) Header->OCRflag = gf_bs_read_int(bs, 1); if (slConfig->useIdleFlag) Header->idleFlag = gf_bs_read_int(bs, 1); if (slConfig->usePaddingFlag) { Header->paddingFlag = gf_bs_read_int(bs, 1); if (Header->paddingFlag) Header->paddingBits = gf_bs_read_int(bs, 3); } if (!Header->idleFlag && (!Header->paddingFlag || Header->paddingBits != 0)) { if (slConfig->packetSeqNumLength > 0) Header->packetSequenceNumber = gf_bs_read_int(bs, slConfig->packetSeqNumLength); if (slConfig->degradationPriorityLength > 0) { Header->degradationPriorityFlag = gf_bs_read_int(bs, 1); if (Header->degradationPriorityFlag) Header->degradationPriority = gf_bs_read_int(bs, slConfig->degradationPriorityLength); } if (Header->OCRflag) Header->objectClockReference = gf_bs_read_int(bs, slConfig->OCRLength); if (Header->accessUnitStartFlag) { if (slConfig->useRandomAccessPointFlag) Header->randomAccessPointFlag = gf_bs_read_int(bs, 1); if (slConfig->AUSeqNumLength > 0) Header->AU_sequenceNumber = gf_bs_read_int(bs, slConfig->AUSeqNumLength); if (slConfig->useTimestampsFlag) { Header->decodingTimeStampFlag = gf_bs_read_int(bs, 1); Header->compositionTimeStampFlag = gf_bs_read_int(bs, 1); } if (slConfig->instantBitrateLength > 0) Header->instantBitrateFlag = gf_bs_read_int(bs, 1); if (Header->decodingTimeStampFlag) Header->decodingTimeStamp = gf_bs_read_long_int(bs, slConfig->timestampLength); if (Header->compositionTimeStampFlag) Header->compositionTimeStamp = gf_bs_read_long_int(bs, slConfig->timestampLength); if (slConfig->AULength > 0) Header->accessUnitLength = gf_bs_read_int(bs, slConfig->AULength); if (Header->instantBitrateFlag) Header->instantBitrate = gf_bs_read_int(bs, slConfig->instantBitrateLength); } } gf_bs_align(bs); *HeaderLen = (u32) gf_bs_get_position(bs); gf_bs_del(bs); }
GF_ISMASample *gf_isom_ismacryp_sample_from_data(char *data, u32 dataLength, Bool use_selective_encryption, u8 KI_length, u8 IV_length) { GF_ISMASample *s; GF_BitStream *bs; /*empty text sample*/ if (!data || !dataLength) { return gf_isom_ismacryp_new_sample(); } s = gf_isom_ismacryp_new_sample(); /*empty sample*/ if (!data || !dataLength) return s; bs = gf_bs_new(data, dataLength, GF_BITSTREAM_READ); s->dataLength = dataLength; s->IV_length = IV_length; s->KI_length = KI_length; if (use_selective_encryption) { s->flags = GF_ISOM_ISMA_USE_SEL_ENC; if (s->dataLength < 1) goto exit; if (gf_bs_read_int(bs, 1)) s->flags |= GF_ISOM_ISMA_IS_ENCRYPTED; gf_bs_read_int(bs, 7); s->dataLength -= 1; } else { s->flags = GF_ISOM_ISMA_IS_ENCRYPTED; } if (s->flags & GF_ISOM_ISMA_IS_ENCRYPTED) { if (IV_length != 0) { if (s->dataLength < IV_length) goto exit; s->IV = gf_bs_read_long_int(bs, 8*IV_length); s->dataLength -= IV_length; } if (KI_length) { if (s->dataLength < KI_length) goto exit; s->key_indicator = (u8 *)malloc(KI_length); gf_bs_read_data(bs, (char*)s->key_indicator, KI_length); s->dataLength -= KI_length; } } s->data = (char*)malloc(sizeof(char)*s->dataLength); gf_bs_read_data(bs, s->data, s->dataLength); gf_bs_del(bs); return s; exit: gf_isom_ismacryp_delete_sample(s); return NULL; }
// // Reader // GF_Err gf_odf_read_slc(GF_BitStream *bs, GF_SLConfig *sl, u32 DescSize) { GF_Err e; u32 reserved, nbBytes = 0; if (!sl) return GF_BAD_PARAM; //APPLE fix if (!DescSize) { sl->predefined = SLPredef_MP4; return gf_odf_slc_set_pref(sl); } sl->predefined = gf_bs_read_int(bs, 8); nbBytes += 1; /*MPEG4 IP fix*/ if (!sl->predefined && nbBytes==DescSize) { sl->predefined = SLPredef_Null; gf_odf_slc_set_pref(sl); return GF_OK; } if (sl->predefined) { //predefined configuration e = gf_odf_slc_set_pref(sl); if (e) return e; } else { sl->useAccessUnitStartFlag = gf_bs_read_int(bs, 1); sl->useAccessUnitEndFlag = gf_bs_read_int(bs, 1); sl->useRandomAccessPointFlag = gf_bs_read_int(bs, 1); sl->hasRandomAccessUnitsOnlyFlag = gf_bs_read_int(bs, 1); sl->usePaddingFlag = gf_bs_read_int(bs, 1); sl->useTimestampsFlag = gf_bs_read_int(bs, 1); sl->useIdleFlag = gf_bs_read_int(bs, 1); sl->durationFlag = gf_bs_read_int(bs, 1); sl->timestampResolution = gf_bs_read_int(bs, 32); sl->OCRResolution = gf_bs_read_int(bs, 32); sl->timestampLength = gf_bs_read_int(bs, 8); if (sl->timestampLength > 64) return GF_ODF_INVALID_DESCRIPTOR; sl->OCRLength = gf_bs_read_int(bs, 8); if (sl->OCRLength > 64) return GF_ODF_INVALID_DESCRIPTOR; sl->AULength = gf_bs_read_int(bs, 8); if (sl->AULength > 32) return GF_ODF_INVALID_DESCRIPTOR; sl->instantBitrateLength = gf_bs_read_int(bs, 8); sl->degradationPriorityLength = gf_bs_read_int(bs, 4); sl->AUSeqNumLength = gf_bs_read_int(bs, 5); if (sl->AUSeqNumLength > 16) return GF_ODF_INVALID_DESCRIPTOR; sl->packetSeqNumLength = gf_bs_read_int(bs, 5); if (sl->packetSeqNumLength > 16) return GF_ODF_INVALID_DESCRIPTOR; reserved = gf_bs_read_int(bs, 2); nbBytes += 15; } if (sl->durationFlag) { sl->timeScale = gf_bs_read_int(bs, 32); sl->AUDuration = gf_bs_read_int(bs, 16); sl->CUDuration = gf_bs_read_int(bs, 16); nbBytes += 8; } if (! sl->useTimestampsFlag) { sl->startDTS = gf_bs_read_long_int(bs, sl->timestampLength); sl->startCTS = gf_bs_read_long_int(bs, sl->timestampLength); nbBytes += GetTSbytesLen(sl); } if (DescSize != nbBytes) return GF_ODF_INVALID_DESCRIPTOR; return GF_OK; }
GF_EXPORT GF_HEVCConfig *gf_odf_hevc_cfg_read_bs(GF_BitStream *bs, Bool is_shvc) { u32 i, count; GF_HEVCConfig *cfg = gf_odf_hevc_cfg_new(); cfg->configurationVersion = gf_bs_read_int(bs, 8); cfg->profile_space = gf_bs_read_int(bs, 2); cfg->tier_flag = gf_bs_read_int(bs, 1); cfg->profile_idc = gf_bs_read_int(bs, 5); cfg->general_profile_compatibility_flags = gf_bs_read_int(bs, 32); cfg->progressive_source_flag = gf_bs_read_int(bs, 1); cfg->interlaced_source_flag = gf_bs_read_int(bs, 1); cfg->non_packed_constraint_flag = gf_bs_read_int(bs, 1); cfg->frame_only_constraint_flag = gf_bs_read_int(bs, 1); /*only lowest 44 bits used*/ cfg->constraint_indicator_flags = gf_bs_read_long_int(bs, 44); cfg->level_idc = gf_bs_read_int(bs, 8); gf_bs_read_int(bs, 4); cfg->min_spatial_segmentation_idc = gf_bs_read_int(bs, 12); gf_bs_read_int(bs, 6); cfg->parallelismType = gf_bs_read_int(bs, 2); gf_bs_read_int(bs, 6); cfg->chromaFormat = gf_bs_read_int(bs, 2); gf_bs_read_int(bs, 5); cfg->luma_bit_depth = gf_bs_read_int(bs, 3) + 8; gf_bs_read_int(bs, 5); cfg->chroma_bit_depth = gf_bs_read_int(bs, 3) + 8; cfg->avgFrameRate = gf_bs_read_int(bs, 16); cfg->constantFrameRate = gf_bs_read_int(bs, 2); cfg->numTemporalLayers = gf_bs_read_int(bs, 3); cfg->temporalIdNested = gf_bs_read_int(bs, 1); cfg->nal_unit_size = 1 + gf_bs_read_int(bs, 2); if (is_shvc) { cfg->is_shvc = 1; cfg->complete_representation = gf_bs_read_int(bs, 1); cfg->non_hevc_base_layer = gf_bs_read_int(bs, 1); cfg->num_layers = 1 + gf_bs_read_int(bs, 6); cfg->scalability_mask = gf_bs_read_int(bs, 16); } count = gf_bs_read_int(bs, 8); for (i=0; i<count; i++) { u32 nalucount, j; GF_HEVCParamArray *ar; GF_SAFEALLOC(ar, GF_HEVCParamArray); ar->nalus = gf_list_new(); gf_list_add(cfg->param_array, ar); ar->array_completeness = gf_bs_read_int(bs, 1); gf_bs_read_int(bs, 1); ar->type = gf_bs_read_int(bs, 6); nalucount = gf_bs_read_int(bs, 16); for (j=0; j<nalucount; j++) { GF_AVCConfigSlot *sl; GF_SAFEALLOC(sl, GF_AVCConfigSlot ); sl->size = gf_bs_read_int(bs, 16); sl->data = (char *)gf_malloc(sizeof(char) * sl->size); gf_bs_read_data(bs, sl->data, sl->size); gf_list_add(ar->nalus, sl); } } return cfg; }