//to use with internally supported protocols GF_Err gf_isom_new_hint_description(GF_ISOFile *the_file, u32 trackNumber, s32 HintTrackVersion, s32 LastCompatibleVersion, u8 Rely, u32 *HintDescriptionIndex) { GF_Err e; u32 drefIndex; GF_TrackBox *trak; GF_HintSampleEntryBox *hdesc; GF_RelyHintBox *relyA; e = CanAccessMovie(the_file, GF_ISOM_OPEN_WRITE); if (e) return e; trak = gf_isom_get_track_from_file(the_file, trackNumber); *HintDescriptionIndex = 0; if (!trak || !IsHintTrack(trak)) return GF_BAD_PARAM; //OK, create a new HintSampleDesc hdesc = (GF_HintSampleEntryBox *) gf_isom_box_new(GetHintFormat(trak)); if (HintTrackVersion > 0) hdesc->HintTrackVersion = HintTrackVersion; if (LastCompatibleVersion > 0) hdesc->LastCompatibleVersion = LastCompatibleVersion; //create a data reference - WE ONLY DEAL WITH SELF-CONTAINED HINT TRACKS e = Media_CreateDataRef(trak->Media->information->dataInformation->dref, NULL, NULL, &drefIndex); if (e) return e; hdesc->dataReferenceIndex = drefIndex; //add the entry to our table... e = stsd_AddBox(trak->Media->information->sampleTable->SampleDescription, (GF_Box *) hdesc); if (e) return e; *HintDescriptionIndex = gf_list_count(trak->Media->information->sampleTable->SampleDescription->boxList); //RTP needs a default timeScale... use the media one. if (CheckHintFormat(trak, GF_ISOM_HINT_RTP)) { e = gf_isom_rtp_set_timescale(the_file, trackNumber, *HintDescriptionIndex, trak->Media->mediaHeader->timeScale); if (e) return e; } if (!Rely) return GF_OK; //we need a rely box (common to all protocols) relyA = (GF_RelyHintBox *) gf_isom_box_new(GF_ISOM_BOX_TYPE_RELY); if (Rely == 1) { relyA->prefered = 1; } else { relyA->required = 1; } return gf_list_add(hdesc->HintDataTable, relyA); }
//to use with internally supported protocols M4Err M4H_NewHintDescription(M4File *the_file, u32 trackNumber, s32 HintTrackVersion, s32 LastCompatibleVersion, u8 Rely, u32 *HintDescriptionIndex) { M4Err e; u32 drefIndex; TrackAtom *trak; HintSampleEntryAtom *hdesc; RelyHintEntry *relyA; M4Err stsd_AddAtom(SampleDescriptionAtom *ptr, Atom *a); trak = GetTrackFromFile(the_file, trackNumber); *HintDescriptionIndex = 0; if (!trak || !IsHintTrack(trak)) return M4BadParam; //OK, create a new HintSampleDesc hdesc = (HintSampleEntryAtom *) CreateAtom(GetHintFormat(trak)); if (HintTrackVersion > 0) hdesc->HintTrackVersion = HintTrackVersion; if (LastCompatibleVersion > 0) hdesc->LastCompatibleVersion = LastCompatibleVersion; //create a data reference - WE ONLY DEAL WITH SELF-CONTAINED HINT TRACKS e = Media_CreateDataRef(trak->Media->information->dataInformation->dref, NULL, NULL, &drefIndex); if (e) return e; hdesc->dataReferenceIndex = drefIndex; //add the entry to our table... e = stsd_AddAtom(trak->Media->information->sampleTable->SampleDescription, (Atom *) hdesc); if (e) return e; *HintDescriptionIndex = ChainGetCount(trak->Media->information->sampleTable->SampleDescription->atomList); //RTP needs a default timeScale... use the media one. if (CheckHintFormat(trak, M4_Hint_RTP)) { e = M4H_RTP_SetTimeScale(the_file, trackNumber, *HintDescriptionIndex, trak->Media->mediaHeader->timeScale); if (e) return e; } if (!Rely) return M4OK; //we need a rely atom (common to all protocols) relyA = (RelyHintEntry *) CreateAtom(relyHintEntryType); if (Rely == 1) { relyA->prefered = 1; } else { relyA->required = 1; } return ChainAddEntry(hdesc->HintDataTable, relyA); }
Bool CheckHintFormat(GF_TrackBox *trak, u32 HintType) { if (!IsHintTrack(trak)) return 0; if (GetHintFormat(trak) != HintType) return 0; return 1; }
Bool CheckHintFormat(GF_TrackBox *trak, u32 HintType) { if (!IsHintTrack(trak)) return GF_FALSE; if (GetHintFormat(trak) != HintType) return GF_FALSE; return GF_TRUE; }