void SegmentInformation::SplitUsingIndex(std::vector<SplitPoint> &splitlist) { std::vector<ISegment *> seglist; getSegments(INFOTYPE_MEDIA, seglist); size_t prevstart = 0; stime_t prevtime = 0; const Timescale timescale = inheritTimescale(); SplitPoint split = {0,0,0}; std::vector<SplitPoint>::const_iterator splitIt; for(splitIt = splitlist.begin(); splitIt < splitlist.end(); ++splitIt) { split = *splitIt; if(splitIt != splitlist.begin()) { /* do previous splitpoint */ const stime_t duration = timescale.ToScaled(split.duration); insertIntoSegment(seglist, prevstart, split.offset - 1, prevtime, duration); } prevstart = split.offset; prevtime = timescale.ToScaled(split.time); } if(splitlist.size() == 1) { const stime_t duration = timescale.ToScaled(split.duration); insertIntoSegment(seglist, prevstart, 0, prevtime, duration); } else if(splitlist.size() > 1) { const stime_t duration = timescale.ToScaled(split.duration); insertIntoSegment(seglist, prevstart, split.offset - 1, prevtime, duration); } }
void SegmentList::pruneByPlaybackTime(mtime_t time) { uint64_t num; const Timescale timescale = inheritTimescale(); if(getSegmentNumberByScaledTime(timescale.ToScaled(time), &num)) pruneBySegmentNumber(num); }
bool SegmentInformation::getSegmentNumberByTime(mtime_t time, uint64_t *ret) const { if( mediaSegmentTemplate ) { const Timescale timescale = mediaSegmentTemplate->inheritTimescale(); SegmentTimeline *timeline = mediaSegmentTemplate->segmentTimeline.Get(); if(timeline) { time = timescale.ToScaled(time); *ret = timeline->getElementNumberByScaledPlaybackTime(time); return true; } const stime_t duration = mediaSegmentTemplate->duration.Get(); *ret = mediaSegmentTemplate->startNumber.Get(); if(duration) { *ret += timescale.ToScaled(time) / duration; return true; } } else if ( segmentList && !segmentList->getSegments().empty() ) { const Timescale timescale = segmentList->inheritTimescale(); time = timescale.ToScaled(time); return segmentList->getSegmentNumberByScaledTime(time, ret); } else if( segmentBase ) { const Timescale timescale = inheritTimescale(); time = timescale.ToScaled(time); *ret = 0; const std::vector<ISegment *> list = segmentBase->subSegments(); return SegmentInfoCommon::getSegmentNumberByScaledTime(list, time, ret); } if(parent) return parent->getSegmentNumberByTime(time, ret); else return false; }
void MediaSegmentTemplate::mergeWith(MediaSegmentTemplate *updated, vlc_tick_t prunebarrier) { SegmentTimeline *timeline = segmentTimeline.Get(); if(timeline && updated->segmentTimeline.Get()) { timeline->mergeWith(*updated->segmentTimeline.Get()); if(prunebarrier) { const Timescale timescale = timeline->inheritTimescale(); const uint64_t number = timeline->getElementNumberByScaledPlaybackTime(timescale.ToScaled(prunebarrier)); timeline->pruneBySequenceNumber(number); } } }
uint64_t MediaSegmentTemplate::getCurrentLiveTemplateNumber() const { uint64_t number = startNumber.Get(); /* live streams / templated */ const stime_t dur = duration.Get(); if(dur) { /* compute, based on current time */ const time_t playbacktime = time(NULL); const Timescale timescale = inheritTimescale(); time_t streamstart = parentSegmentInformation->getPlaylist()->availabilityStartTime.Get(); streamstart += parentSegmentInformation->getPeriodStart(); stime_t elapsed = timescale.ToScaled(vlc_tick_from_sec(playbacktime - streamstart)); number += elapsed / dur; } return number; }