⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 isom_read.c

📁 一个用于智能手机的多媒体库适合S60 WinCE的跨平台开发库
💻 C
📖 第 1 页 / 共 5 页
字号:
		if ( (*sample)->DTS > (u64) mediaOffset) {			(*sample)->DTS -= (u64) mediaOffset;		} else {			(*sample)->DTS = 0;		}	}	if (sampleNumber) *sampleNumber = sampNum;	return GF_OK;}GF_EXPORTu64 gf_isom_get_missing_bytes(GF_ISOFile *the_file, u32 trackNumber){	GF_TrackBox *trak;	trak = gf_isom_get_track_from_file(the_file, trackNumber);	if (!trak) return 0;	return trak->Media->BytesMissing;}GF_EXPORTGF_Err gf_isom_set_sample_padding(GF_ISOFile *the_file, u32 trackNumber, u32 padding_bytes){	GF_TrackBox *trak;	trak = gf_isom_get_track_from_file(the_file, trackNumber);	if (!trak) return GF_BAD_PARAM;	trak->padding_bytes = padding_bytes;	return GF_OK;}//get the number of edited segmentGF_EXPORTu32 gf_isom_get_edit_segment_count(GF_ISOFile *the_file, u32 trackNumber){	GF_TrackBox *trak;	trak = gf_isom_get_track_from_file(the_file, trackNumber);	if (!trak) return 0;	if (!trak->editBox || !trak->editBox->editList) return 0;	return gf_list_count(trak->editBox->editList->entryList);}//Get the desired segment informationGF_EXPORTGF_Err gf_isom_get_edit_segment(GF_ISOFile *the_file, u32 trackNumber, u32 SegmentIndex, u64 *EditTime, u64 *SegmentDuration, u64 *MediaTime, u8 *EditMode){	u32 i;	u64 startTime;	GF_TrackBox *trak;	GF_EditListBox *elst;	GF_EdtsEntry *ent;	ent = NULL;	trak = gf_isom_get_track_from_file(the_file, trackNumber);	if (!trak) return GF_BAD_PARAM;	if (!trak || !trak->editBox || 		!trak->editBox->editList || 		(SegmentIndex > gf_list_count(trak->editBox->editList->entryList)) || 		!SegmentIndex)		return GF_BAD_PARAM;	elst = trak->editBox->editList;	startTime = 0;	for (i = 0; i < SegmentIndex; i++) {		ent = (GF_EdtsEntry*)gf_list_get(elst->entryList, i);		if (i < SegmentIndex-1) startTime += ent->segmentDuration;	}	*EditTime = startTime;	*SegmentDuration = ent->segmentDuration;	if (ent->mediaTime < 0) {		*MediaTime = 0;		*EditMode = GF_ISOM_EDIT_EMPTY;		return GF_OK;	}	if (ent->mediaRate == 0) {		*MediaTime = ent->mediaTime;		*EditMode = GF_ISOM_EDIT_DWELL;		return GF_OK;	}	*MediaTime = ent->mediaTime;	*EditMode = GF_ISOM_EDIT_NORMAL;	return GF_OK;}GF_EXPORTu8 gf_isom_has_sync_points(GF_ISOFile *the_file, u32 trackNumber){	GF_TrackBox *trak;	trak = gf_isom_get_track_from_file(the_file, trackNumber);	if (!trak) return 0;	if (trak->Media->information->sampleTable->SyncSample) {		if (!trak->Media->information->sampleTable->SyncSample->entryCount) return 2;			return 1;	}	return 0;}/*returns number of sync points*/GF_EXPORTu32 gf_isom_get_sync_point_count(GF_ISOFile *the_file, u32 trackNumber){	GF_TrackBox *trak;	trak = gf_isom_get_track_from_file(the_file, trackNumber);	if (!trak) return 0;	if (trak->Media->information->sampleTable->SyncSample) {		return trak->Media->information->sampleTable->SyncSample->entryCount;		}	return 0;}GF_EXPORTGF_Err gf_isom_get_brand_info(GF_ISOFile *movie, u32 *brand, u32 *minorVersion, u32 *AlternateBrandsCount){	if (!movie || !brand) return GF_BAD_PARAM;	if (!movie->brand) {		*brand = 0;		if (minorVersion) *minorVersion = 0;		if (AlternateBrandsCount) *AlternateBrandsCount = 0;		return GF_OK;	}	*brand = movie->brand->majorBrand;	if (minorVersion) *minorVersion = movie->brand->minorVersion;	if (AlternateBrandsCount) *AlternateBrandsCount = movie->brand->altCount;	return GF_OK;}GF_EXPORTGF_Err gf_isom_get_alternate_brand(GF_ISOFile *movie, u32 BrandIndex, u32 *brand){	if (!movie || !movie->brand || !brand) return GF_BAD_PARAM;	if (BrandIndex > movie->brand->altCount || !BrandIndex) return GF_BAD_PARAM;	*brand = movie->brand->altBrand[BrandIndex-1];	return GF_OK;}GF_Err gf_isom_get_sample_padding_bits(GF_ISOFile *the_file, u32 trackNumber, u32 sampleNumber, u8 *NbBits){	GF_TrackBox *trak;	trak = gf_isom_get_track_from_file(the_file, trackNumber);	if (!trak) return GF_BAD_PARAM;	//Padding info	return stbl_GetPaddingBits(trak->Media->information->sampleTable->PaddingBits, 		sampleNumber, NbBits);}GF_EXPORTBool gf_isom_has_padding_bits(GF_ISOFile *the_file, u32 trackNumber){	GF_TrackBox *trak;	trak = gf_isom_get_track_from_file(the_file, trackNumber);	if (!trak) return 0;	if (trak->Media->information->sampleTable->PaddingBits) return 1;	return 0;}GF_EXPORTu32 gf_isom_get_user_data_count(GF_ISOFile *movie, u32 trackNumber, u32 UserDataType, bin128 UUID){	GF_UserDataMap *map;	GF_TrackBox *trak;	GF_UserDataBox *udta;	bin128 t;	u32 i, count;	if (!movie || !movie->moov) return 0;		if (UserDataType == GF_ISOM_BOX_TYPE_UUID) UserDataType = 0;	memset(t, 1, 16);		if (trackNumber) {		trak = gf_isom_get_track_from_file(movie, trackNumber);		if (!trak) return 0;		udta = trak->udta;	} else {		udta = movie->moov->udta;	}	if (!udta) return 0;	i=0;	while ((map = (GF_UserDataMap*)gf_list_enum(udta->recordList, &i))) {		count = gf_list_count(map->boxList);		if ((map->boxType == GF_ISOM_BOX_TYPE_UUID) && !memcmp(map->uuid, UUID, 16)) return count;		else if (map->boxType == UserDataType) return count;	}	return 0;}GF_EXPORTGF_Err gf_isom_get_user_data(GF_ISOFile *movie, u32 trackNumber, u32 UserDataType, bin128 UUID, u32 UserDataIndex, char **userData, u32 *userDataSize){	GF_UserDataMap *map;	GF_UnknownBox *ptr;	u32 i;	bin128 t;	GF_TrackBox *trak;	GF_UserDataBox *udta;	if (!movie || !movie->moov) return GF_BAD_PARAM;		if (trackNumber) {		trak = gf_isom_get_track_from_file(movie, trackNumber);		if (!trak) return GF_BAD_PARAM;		udta = trak->udta;	} else {		udta = movie->moov->udta;	}	if (!udta) return GF_BAD_PARAM;	if (UserDataType == GF_ISOM_BOX_TYPE_UUID) UserDataType = 0;	memset(t, 1, 16);	if (!UserDataIndex) return GF_BAD_PARAM;	if (!userData || !userDataSize || *userData) return GF_BAD_PARAM;	i=0;	while ((map = (GF_UserDataMap*)gf_list_enum(udta->recordList, &i))) {		if ((map->boxType == GF_ISOM_BOX_TYPE_UUID) && !memcmp(map->uuid, UUID, 16)) goto found;		else if (map->boxType == UserDataType) goto found;		}	return GF_BAD_PARAM;found:	if (UserDataIndex > gf_list_count(map->boxList) ) return GF_BAD_PARAM;	ptr = (GF_UnknownBox*)gf_list_get(map->boxList, UserDataIndex-1);	//ok alloc the data	*userData = (char *)malloc(sizeof(char)*ptr->dataSize);	if (!*userData) return GF_OUT_OF_MEM;	memcpy(*userData, ptr->data, sizeof(char)*ptr->dataSize);	*userDataSize = ptr->dataSize;		return GF_OK;}GF_EXPORTvoid gf_isom_delete(GF_ISOFile *movie){	//free and return;	gf_isom_delete_movie(movie);}GF_EXPORTu32 gf_isom_get_max_chunk_duration(GF_ISOFile *movie, u32 trackNumber){	GF_TrackBox *trak;	u32 i, sample_per_chunk, sample_dur;	GF_SampleToChunkBox *stsc;	GF_TimeToSampleBox *stts;	GF_StscEntry *sc;	GF_SttsEntry *ts;	if (!movie || !trackNumber || !movie->moov) return 0;	trak = gf_isom_get_track_from_file(movie, trackNumber);	if (!trak) return 0;	stsc = trak->Media->information->sampleTable->SampleToChunk;	stts = trak->Media->information->sampleTable->TimeToSample;	sample_per_chunk = 0;	i=0;	while ((sc = (GF_StscEntry *) gf_list_enum(stsc->entryList, &i))) {		if (sc->samplesPerChunk > sample_per_chunk) sample_per_chunk = sc->samplesPerChunk;	}	sample_dur = 0;	i=0;	while ((ts = (GF_SttsEntry *)gf_list_enum(stts->entryList, &i))) {		if (ts->sampleDelta > sample_dur) sample_dur = ts->sampleDelta;	}		//rescale to ms	i = 1000 * sample_dur * sample_per_chunk / trak->Media->mediaHeader->timeScale;	return i;}GF_EXPORTu32 gf_isom_get_sample_fragment_count(GF_ISOFile *the_file, u32 trackNumber, u32 sampleNumber){	GF_TrackBox *trak;	trak = gf_isom_get_track_from_file(the_file, trackNumber);	if (!trak) return 0;	//Padding info	return stbl_GetSampleFragmentCount(trak->Media->information->sampleTable->Fragments, sampleNumber);}GF_EXPORTu16 gf_isom_get_sample_fragment_size(GF_ISOFile *the_file, u32 trackNumber, u32 sampleNumber, u32 FragmentIndex){	GF_TrackBox *trak;	trak = gf_isom_get_track_from_file(the_file, trackNumber);	if (!trak || !FragmentIndex) return 0;	//Padding info	return stbl_GetSampleFragmentSize(trak->Media->information->sampleTable->Fragments, sampleNumber, FragmentIndex);}GF_EXPORTGF_Err gf_isom_get_fragment_defaults(GF_ISOFile *the_file, u32 trackNumber, 							 u32 *defaultDuration, u32 *defaultSize, u32 *defaultDescriptionIndex,							 u32 *defaultRandomAccess, u8 *defaultPadding, u16 *defaultDegradationPriority){	GF_TrackBox *trak;	GF_SttsEntry *ts_ent;	GF_StscEntry *sc_ent;	u32 i, j, maxValue, value;	GF_SampleTableBox *stbl;	trak = gf_isom_get_track_from_file(the_file, trackNumber);	if (!trak) return GF_BAD_PARAM;	stbl = trak->Media->information->sampleTable;	//duration	if (defaultDuration) {		maxValue = value = 0;		i=0;		while ((ts_ent = (GF_SttsEntry *)gf_list_enum(stbl->TimeToSample->entryList, &i))) {			if (ts_ent->sampleCount>maxValue) {				value = ts_ent->sampleDelta;				maxValue = ts_ent->sampleCount;			}		}		*defaultDuration = value;	}	//size	if (defaultSize) {		*defaultSize = stbl->SampleSize->sampleSize;	}	//descIndex	if (defaultDescriptionIndex) {		maxValue = value = 0;		i=0;		while ((sc_ent = (GF_StscEntry *)gf_list_enum(stbl->SampleToChunk->entryList, &i))) {			if ((sc_ent->nextChunk - sc_ent->firstChunk) * sc_ent->samplesPerChunk > maxValue) {				value = sc_ent->sampleDescriptionIndex;				maxValue = (sc_ent->nextChunk - sc_ent->firstChunk) * sc_ent->samplesPerChunk;			}		}		*defaultDescriptionIndex = value ? value : 1;	}	//RAP	if (defaultRandomAccess) {		//no sync table is ALL RAP		*defaultRandomAccess = stbl->SyncSample ? 0 : 1;		if (stbl->SyncSample 			&& (stbl->SyncSample->entryCount >= stbl->SampleSize->sampleCount/2)) {			*defaultRandomAccess = 1;		}	}	//defaultPadding	if (defaultPadding) {		*defaultPadding = 0;		if (stbl->PaddingBits) {			maxValue = 0;			for (i=0; i<stbl->PaddingBits->SampleCount; i++) {				value = 0;				for (j=0; j<stbl->PaddingBits->SampleCount; j++) {					if (stbl->PaddingBits->padbits[i]==stbl->PaddingBits->padbits[j]) {						value ++;					}				}				if (value>maxValue) {					maxValue = value;					*defaultPadding = stbl->PaddingBits->padbits[i];				}			}		}	}	//defaultDegradationPriority	if (defaultDegradationPriority) {		*defaultDegradationPriority = 0;		if (stbl->DegradationPriority) {			maxValue = 0;			for (i=0; i<stbl->DegradationPriority->entryCount; i++) {				value = 0;				for (j=0; j<stbl->DegradationPriority->entryCount; j++) {					if (stbl->DegradationPriority->priorities[i]==stbl->DegradationPriority->priorities[j]) {						value ++;					}				}				if (value>maxValue) {					maxValue = value;					*defaultDegradationPriority = stbl->DegradationPriority->priorities[i];				}			}		}	}	return GF_OK;}GF_EXPORTGF_Err gf_isom_refresh_fragmented(GF_ISOFile *movie, u64 *MissingBytes){#ifdef	GF_ISOM_NO_FRAGMENTS	return GF_NOT_SUPPORTED;#else	if (!movie || !movie->moov || !movie->moov->mvex) return GF_BAD_PARAM;	if (movie->openMode != GF_ISOM_OPEN_READ) return GF_BAD_PARAM;	//ok parse root boxes	return gf_isom_parse_movie_boxes(movie, MissingBytes);#endif}GF_EXPORTGF_Err gf_isom_text_set_streaming_mode(GF_ISOFile *movie, Bool do_convert){	if (!movie) return GF_BAD_PARAM;	movie->convert_streaming_text = do_convert;	return GF_OK;}GF_EXPORTGF_GenericSampleDescription *gf_isom_get_generic_sample_description(GF_ISOFile *movie, u32 trackNumber, u32 StreamDescriptionIndex){	GF_GenericVisualSampleEntryBox *entry;	GF_GenericAudioSampleEntryBox *gena;	GF_GenericSampleEntryBox *genm;	GF_TrackBox *trak;	GF_GenericSampleDescription *udesc;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -