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); } } }
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; }