📄 isom_read.c
字号:
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 + -