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

📄 isom_read.c

📁 一个用于智能手机的多媒体库适合S60 WinCE的跨平台开发库
💻 C
📖 第 1 页 / 共 5 页
字号:
GF_EXPORTu8 gf_isom_is_track_in_root_od(GF_ISOFile *movie, u32 trackNumber){	u32 i;	u32 trackID;	GF_Descriptor *desc;	GF_ES_ID_Inc *inc;	GF_List *inc_list;	if (!movie) return 2;	if (!movie->moov || !movie->moov->iods) return 0;	desc = movie->moov->iods->descriptor;	switch (desc->tag) {	case GF_ODF_ISOM_IOD_TAG:		inc_list = ((GF_IsomInitialObjectDescriptor *)desc)->ES_ID_IncDescriptors;		break;	case GF_ODF_ISOM_OD_TAG:		inc_list = ((GF_IsomObjectDescriptor *)desc)->ES_ID_IncDescriptors;		break;		//files without IOD are possible !	default:		return 0;	}	trackID = gf_isom_get_track_id(movie, trackNumber);	if (!trackID) return 2;	i=0;	while ((inc = (GF_ES_ID_Inc*)gf_list_enum(inc_list, &i))) {		if (inc->trackID == trackID) return 1;	}	return 0;}//gets the enable flag of a track//0: NO, 1: yes, 2: errorGF_EXPORTu8 gf_isom_is_track_enabled(GF_ISOFile *the_file, u32 trackNumber){	GF_TrackBox *trak;	trak = gf_isom_get_track_from_file(the_file, trackNumber);	if (!trak) return 2;	return (trak->Header->flags & 1) ? 1 : 0;}//get the track duration//return 0 if bad paramGF_EXPORTu64 gf_isom_get_track_duration(GF_ISOFile *movie, u32 trackNumber){	GF_TrackBox *trak;	trak = gf_isom_get_track_from_file(movie, trackNumber);	if (!trak) return 0;#ifndef GPAC_READ_ONLY	/*in all modes except dump recompute duration in case headers are wrong*/	if (movie->openMode != GF_ISOM_OPEN_READ_DUMP) {		SetTrackDuration(trak);	}#endif	return trak->Header->duration;}GF_EXPORTGF_Err gf_isom_get_media_language(GF_ISOFile *the_file, u32 trackNumber, char *three_char_code){	GF_TrackBox *trak;	trak = gf_isom_get_track_from_file(the_file, trackNumber);	if (!trak) return GF_BAD_PARAM;	memcpy(three_char_code, trak->Media->mediaHeader->packedLanguage, sizeof(char)*4);	return GF_OK;}//Return the number of track references of a track for a given ReferenceType//return -1 if errorGF_EXPORTs32 gf_isom_get_reference_count(GF_ISOFile *movie, u32 trackNumber, u32 referenceType){	GF_TrackBox *trak;	GF_TrackReferenceTypeBox *dpnd;	trak = gf_isom_get_track_from_file(movie, trackNumber);	if (!trak) return -1;	if (!trak->References) return 0;	if (movie->openMode == GF_ISOM_OPEN_WRITE) {		movie->LastError = GF_ISOM_INVALID_MODE;		return -1;	}		dpnd = NULL;	if ( (movie->LastError = Track_FindRef(trak, referenceType, &dpnd)) ) return -1;	if (!dpnd) return 0;	return dpnd->trackIDCount;}//Return the referenced track number for a track and a given ReferenceType and Index//return -1 if error, 0 if the reference is a NULL one, or the trackNumberGF_EXPORTGF_Err gf_isom_get_reference(GF_ISOFile *movie, u32 trackNumber, u32 referenceType, u32 referenceIndex, u32 *refTrack){	GF_Err e;	GF_TrackBox *trak;	GF_TrackReferenceTypeBox *dpnd;	u32 refTrackNum;	trak = gf_isom_get_track_from_file(movie, trackNumber);	*refTrack = 0;	if (!trak || !trak->References) return GF_BAD_PARAM;		dpnd = NULL;	e = Track_FindRef(trak, referenceType, &dpnd);	if (e) return e;	if (!dpnd) return GF_BAD_PARAM;	if (referenceIndex > dpnd->trackIDCount) return GF_BAD_PARAM;	//the spec allows a NULL reference 	//(ex, to force desync of a track, set a sync ref with ID = 0)	if (dpnd->trackIDs[referenceIndex - 1] == 0) return GF_OK;	refTrackNum = gf_isom_get_tracknum_from_id(movie->moov, dpnd->trackIDs[referenceIndex-1]);	//if the track was not found, this means the file is broken !!!	if (! refTrackNum) return GF_ISOM_INVALID_FILE;	*refTrack = refTrackNum;	return GF_OK;}//Return the media time given the absolute time in the MovieGF_EXPORTGF_Err gf_isom_get_media_time(GF_ISOFile *the_file, u32 trackNumber, u32 movieTime, u64 *MediaTime){	GF_TrackBox *trak;	u8 useEdit;	s64 SegmentStartTime, mediaOffset;	trak = gf_isom_get_track_from_file(the_file, trackNumber);	if (!trak || !MediaTime) return GF_BAD_PARAM;;	SegmentStartTime = 0;	return GetMediaTime(trak, movieTime, MediaTime, &SegmentStartTime, &mediaOffset, &useEdit);}//Get the stream description index (eg, the ESD) for a given time IN MEDIA TIMESCALE//return 0 if error or if emptyGF_EXPORTu32 gf_isom_get_sample_description_index(GF_ISOFile *movie, u32 trackNumber, u64 for_time){	u32 streamDescIndex;	GF_TrackBox *trak;	trak = gf_isom_get_track_from_file(movie, trackNumber);	if (!trak) return 0;	if ( (movie->LastError = Media_GetSampleDescIndex(trak->Media, for_time, &streamDescIndex)) ) {		return 0;	}	return streamDescIndex;}//Get the number of "streams" stored in the media - a media can have several stream descriptions...GF_EXPORTu32 gf_isom_get_sample_description_count(GF_ISOFile *the_file, u32 trackNumber){	GF_TrackBox *trak;	trak = gf_isom_get_track_from_file(the_file, trackNumber);	if (!trak) return 0;	return gf_list_count(trak->Media->information->sampleTable->SampleDescription->boxList);}//Get the GF_ESD given the StreamDescriptionIndex//THE DESCRIPTOR IS DUPLICATED, SO HAS TO BE DELETED BY THE APPGF_EXPORTGF_ESD *gf_isom_get_esd(GF_ISOFile *movie, u32 trackNumber, u32 StreamDescriptionIndex){	GF_ESD *outESD;	GF_Err e;	e = GetESD(movie->moov, gf_isom_get_track_id(movie, trackNumber), StreamDescriptionIndex, &outESD);	if (e && (e!= GF_ISOM_INVALID_MEDIA)) {		movie->LastError = e;		return NULL;	}	return outESD;}//Get the decoderConfigDescriptor given the SampleDescriptionIndex//THE DESCRIPTOR IS DUPLICATED, SO HAS TO BE DELETED BY THE APPGF_EXPORTGF_DecoderConfig *gf_isom_get_decoder_config(GF_ISOFile *the_file, u32 trackNumber, u32 StreamDescriptionIndex){	GF_TrackBox *trak;	GF_ESD *esd;	GF_Descriptor *decInfo;	trak = gf_isom_get_track_from_file(the_file, trackNumber);	if (!trak) return NULL;	//get the ESD (possibly emulated)	Media_GetESD(trak->Media, StreamDescriptionIndex, &esd, 0);	if (!esd) return NULL;	decInfo = (GF_Descriptor *) esd->decoderConfig;	esd->decoderConfig = NULL;	gf_odf_desc_del((GF_Descriptor *) esd);	return (GF_DecoderConfig *)decInfo;}//get the media duration (without edit)//return 0 if bad paramGF_EXPORTu64 gf_isom_get_media_duration(GF_ISOFile *movie, u32 trackNumber){	GF_TrackBox *trak;	trak = gf_isom_get_track_from_file(movie, trackNumber);	if (!trak) return 0;#ifndef GPAC_READ_ONLY	/*except in dump mode always recompute the duration*/	if (movie->openMode != GF_ISOM_OPEN_READ_DUMP) {		if ( (movie->LastError = Media_SetDuration(trak)) ) return 0;	}#endif	return trak->Media->mediaHeader->duration;}//Get the timeScale of the media. All samples DTS/CTS are expressed in this timeScaleGF_EXPORTu32 gf_isom_get_media_timescale(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->mediaHeader->timeScale;}GF_EXPORTu32 gf_isom_get_copyright_count(GF_ISOFile *mov){	GF_UserDataMap *map;	if (!mov || !mov->moov || !mov->moov->udta) return 0;	map = udta_getEntry(mov->moov->udta, GF_ISOM_BOX_TYPE_CPRT, NULL);	if (!map) return 0;	return gf_list_count(map->boxList);}GF_EXPORTGF_Err gf_isom_get_copyright(GF_ISOFile *mov, u32 Index, const char **threeCharCode, const char **notice){	GF_UserDataMap *map;	GF_CopyrightBox *cprt;		if (!mov || !mov->moov || !Index) return GF_BAD_PARAM;	if (!mov->moov->udta) return GF_OK;	map = udta_getEntry(mov->moov->udta, GF_ISOM_BOX_TYPE_CPRT, NULL);	if (!map) return GF_OK;	if (Index > gf_list_count(map->boxList)) return GF_BAD_PARAM;	cprt = (GF_CopyrightBox*)gf_list_get(map->boxList, Index-1);	(*threeCharCode) = cprt->packedLanguageCode;	(*notice) = cprt->notice;	return GF_OK;}GF_EXPORTGF_Err gf_isom_get_watermark(GF_ISOFile *mov, bin128 UUID, u8** data, u32* length){	GF_UserDataMap *map;	GF_UnknownUUIDBox *wm;	if (!mov) return GF_BAD_PARAM;	if (!mov->moov || !mov->moov->udta) return GF_NOT_SUPPORTED;		map = udta_getEntry(mov->moov->udta, GF_ISOM_BOX_TYPE_UUID, (bin128 *) & UUID);	if (!map) return GF_NOT_SUPPORTED;	wm = (GF_UnknownUUIDBox*)gf_list_get(map->boxList, 0);	if (!wm) return GF_NOT_SUPPORTED;	*data = (u8 *) malloc(sizeof(char)*wm->dataSize);	memcpy(*data, wm->data, wm->dataSize);	*length = wm->dataSize;	return GF_OK;}GF_EXPORTu32 gf_isom_get_chapter_count(GF_ISOFile *movie, u32 trackNumber){	GF_UserDataMap *map;	GF_ChapterListBox *lst;	GF_UserDataBox *udta;	if (!movie || !movie->moov) return 0;	udta = NULL;	if (trackNumber) {		GF_TrackBox *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;	map = udta_getEntry(udta, GF_ISOM_BOX_TYPE_CHPL, NULL);	if (!map) return 0;	lst = (GF_ChapterListBox *)gf_list_get(map->boxList, 0);	if (!lst) return 0;	return gf_list_count(lst->list);}GF_EXPORTGF_Err gf_isom_get_chapter(GF_ISOFile *movie, u32 trackNumber, u32 Index, u64 *chapter_time, const char **name){	GF_UserDataMap *map;	GF_ChapterListBox *lst;	GF_ChapterEntry *ce;	GF_UserDataBox *udta;	if (!movie || !movie->moov) return GF_BAD_PARAM;	udta = NULL;	if (trackNumber) {		GF_TrackBox *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;	map = udta_getEntry(movie->moov->udta, GF_ISOM_BOX_TYPE_CHPL, NULL);	if (!map) return GF_BAD_PARAM;	lst = (GF_ChapterListBox *)gf_list_get(map->boxList, 0);	if (!lst) return GF_BAD_PARAM;		ce = (GF_ChapterEntry *)gf_list_get(lst->list, Index-1);	if (!ce) return GF_BAD_PARAM;	if (chapter_time) {		*chapter_time = ce->start_time;		*chapter_time /= 10000L;	}	if (name) *name = ce->name;	return GF_OK;}GF_EXPORTu32 gf_isom_get_media_type(GF_ISOFile *movie, u32 trackNumber){	GF_TrackBox *trak;	trak = gf_isom_get_track_from_file(movie, trackNumber);	if (!trak) return GF_BAD_PARAM;	return trak->Media->handler->handlerType;}Bool IsMP4Description(u32 entryType){	switch (entryType) {	case GF_ISOM_BOX_TYPE_MP4S:	case GF_ISOM_BOX_TYPE_MP4A:	case GF_ISOM_BOX_TYPE_MP4V:	case GF_ISOM_BOX_TYPE_ENCA:	case GF_ISOM_BOX_TYPE_ENCV:	case GF_ISOM_BOX_TYPE_ENCS:		return 1;	default:		return 0;	}}Bool IsMP4EncryptedDescription(u32 entryType){	switch (entryType) {	case GF_ISOM_BOX_TYPE_ENCA:	case GF_ISOM_BOX_TYPE_ENCV:	case GF_ISOM_BOX_TYPE_ENCS:		return 1;	default:		return 0;	}}GF_EXPORTu8 gf_isom_is_track_encrypted(GF_ISOFile *the_file, u32 trackNumber){	GF_TrackBox *trak;	GF_Box *entry;	trak = gf_isom_get_track_from_file(the_file, trackNumber);	if (!trak) return 2;	entry = (GF_Box*)gf_list_get(trak->Media->information->sampleTable->SampleDescription->boxList, 0);	if (!entry) return 2;	return IsMP4EncryptedDescription(entry->type);}GF_EXPORTu32 gf_isom_get_media_subtype(GF_ISOFile *the_file, u32 trackNumber, u32 DescriptionIndex){	GF_TrackBox *trak;	GF_Box *entry;	trak = gf_isom_get_track_from_file(the_file, trackNumber);	if (!trak || !DescriptionIndex) return 0;	entry = (GF_Box*)gf_list_get(trak->Media->information->sampleTable->SampleDescription->boxList, DescriptionIndex-1);	if (!entry) return 0;	//filter MPEG sub-types	if (IsMP4Description(entry->type)) {		if (IsMP4EncryptedDescription(entry->type)) return GF_ISOM_SUBTYPE_MPEG4_CRYP;		else return GF_ISOM_SUBTYPE_MPEG4;	}	if (entry->type == GF_ISOM_BOX_TYPE_GNRV) {		return ((GF_GenericVisualSampleEntryBox *)entry)->EntryType;	}	else if (entry->type == GF_ISOM_BOX_TYPE_GNRA) {		return ((GF_GenericAudioSampleEntryBox *)entry)->EntryType;	}	else if (entry->type == GF_ISOM_BOX_TYPE_GNRM) {		return ((GF_GenericSampleEntryBox *)entry)->EntryType;	}	return entry->type;}GF_EXPORTu32 gf_isom_get_mpeg4_subtype(GF_ISOFile *the_file, u32 trackNumber, u32 DescriptionIndex){	GF_TrackBox *trak;	GF_Box *entry;	trak = gf_isom_get_track_from_file(the_file, trackNumber);	if (!trak || !DescriptionIndex) return 0;	entry = (GF_Box*)gf_list_get(trak->Media->information->sampleTable->SampleDescription->boxList, DescriptionIndex-1);	if (!entry) return 0;	//filter MPEG sub-types

⌨️ 快捷键说明

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