Пример #1
0
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);
}
Пример #2
0
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;
}
Пример #3
0
//
//		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;
}
Пример #4
0
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;
}