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