//Starts a new sample for the hint track. A sample is just a collection of packets //the transmissionTime is indicated in the media timeScale of the hint track GF_Err gf_isom_begin_hint_sample(GF_ISOFile *the_file, u32 trackNumber, u32 HintDescriptionIndex, u32 TransmissionTime) { GF_TrackBox *trak; u32 descIndex, dataRefIndex; GF_HintSample *samp; GF_HintSampleEntryBox *entry; GF_Err e; trak = gf_isom_get_track_from_file(the_file, trackNumber); if (!trak || !IsHintTrack(trak)) return GF_BAD_PARAM; //assert we're increasing the timing... if (trak->Media->information->sampleTable->TimeToSample->w_LastDTS > TransmissionTime) return GF_BAD_PARAM; //store the descIndex for this sample descIndex = HintDescriptionIndex; if (!HintDescriptionIndex) { descIndex = trak->Media->information->sampleTable->currentEntryIndex; } e = Media_GetSampleDesc(trak->Media, descIndex, (GF_SampleEntryBox **) &entry, &dataRefIndex); if (e) return e; if (!entry || !dataRefIndex) return GF_BAD_PARAM; //set the current to this one if no packet is used if (entry->hint_sample) return GF_BAD_PARAM; trak->Media->information->sampleTable->currentEntryIndex = descIndex; //create a new sample based on the protocol type of the hint description entry samp = gf_isom_hint_sample_new(entry->type); if (!samp) return GF_NOT_SUPPORTED; //OK, let's store the time of this sample samp->TransmissionTime = TransmissionTime; //OK, set our sample in the entry... entry->hint_sample = samp; return GF_OK; }
static GF_Err gf_isom_load_next_hint_sample(GF_ISOFile *the_file, u32 trackNumber, GF_TrackBox *trak, GF_HintSampleEntryBox *entry) { GF_BitStream *bs; u32 descIdx; GF_ISOSample *samp; if (!entry->cur_sample) return GF_BAD_PARAM; if (entry->cur_sample>trak->Media->information->sampleTable->SampleSize->sampleCount) return GF_EOS; samp = gf_isom_get_sample(the_file, trackNumber, entry->cur_sample, &descIdx); if (!samp) return GF_IO_ERR; entry->cur_sample++; if (entry->hint_sample) gf_isom_hint_sample_del(entry->hint_sample); bs = gf_bs_new(samp->data, samp->dataLength, GF_BITSTREAM_READ); entry->hint_sample = gf_isom_hint_sample_new(entry->type); gf_isom_hint_sample_read(entry->hint_sample, bs, samp->dataLength); gf_bs_del(bs); entry->hint_sample->TransmissionTime = samp->DTS; gf_isom_sample_del(&samp); entry->hint_sample->sample_cache = gf_list_new(); return GF_OK; }