vlc | branch: master | Francois Cartegnie <[email protected]> | Thu May 23 23:10:13 2019 +0200| [00021e8e6ec133f3e6f643627112a17706bcda56] | committer: Francois Cartegnie
demux: adaptive: cache total segments length > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=00021e8e6ec133f3e6f643627112a17706bcda56 --- modules/demux/adaptive/playlist/SegmentList.cpp | 8 ++++++++ modules/demux/adaptive/playlist/SegmentList.h | 2 ++ modules/demux/adaptive/playlist/SegmentTimeline.cpp | 11 +++++++++++ modules/demux/adaptive/playlist/SegmentTimeline.h | 2 ++ 4 files changed, 23 insertions(+) diff --git a/modules/demux/adaptive/playlist/SegmentList.cpp b/modules/demux/adaptive/playlist/SegmentList.cpp index 4813425c7e..4be39a99a5 100644 --- a/modules/demux/adaptive/playlist/SegmentList.cpp +++ b/modules/demux/adaptive/playlist/SegmentList.cpp @@ -34,6 +34,7 @@ using namespace adaptive::playlist; SegmentList::SegmentList( SegmentInformation *parent ): SegmentInfoCommon( parent ), TimescaleAble( parent ) { + totalLength = 0; } SegmentList::~SegmentList() { @@ -69,6 +70,7 @@ void SegmentList::addSegment(ISegment *seg) { seg->setParent(this); segments.push_back(seg); + totalLength += seg->duration.Get(); } void SegmentList::mergeWith(SegmentList *updated, bool b_restamp) @@ -118,6 +120,7 @@ void SegmentList::pruneBySegmentNumber(uint64_t tobelownum) if(seg->getSequenceNumber() >= tobelownum) break; + totalLength -= (*it)->duration.Get(); delete *it; it = segments.erase(it); } @@ -179,3 +182,8 @@ bool SegmentList::getPlaybackTimeDurationBySegmentNumber(uint64_t number, *dur = VLC_TICK_0 + timescale.ToTime(seg_dura); return true; } + +stime_t SegmentList::getTotalLength() const +{ + return totalLength; +} diff --git a/modules/demux/adaptive/playlist/SegmentList.h b/modules/demux/adaptive/playlist/SegmentList.h index 58156b1550..5b2ad6c183 100644 --- a/modules/demux/adaptive/playlist/SegmentList.h +++ b/modules/demux/adaptive/playlist/SegmentList.h @@ -49,9 +49,11 @@ namespace adaptive void pruneByPlaybackTime(vlc_tick_t); bool getSegmentNumberByScaledTime(stime_t, uint64_t *) const; bool getPlaybackTimeDurationBySegmentNumber(uint64_t, vlc_tick_t *, vlc_tick_t *) const; + stime_t getTotalLength() const; private: std::vector<ISegment *> segments; + stime_t totalLength; }; } } diff --git a/modules/demux/adaptive/playlist/SegmentTimeline.cpp b/modules/demux/adaptive/playlist/SegmentTimeline.cpp index 04430d49e2..862725b31d 100644 --- a/modules/demux/adaptive/playlist/SegmentTimeline.cpp +++ b/modules/demux/adaptive/playlist/SegmentTimeline.cpp @@ -32,6 +32,7 @@ using namespace adaptive::playlist; SegmentTimeline::SegmentTimeline(TimescaleAble *parent) :TimescaleAble(parent) { + totalLength = 0; } SegmentTimeline::SegmentTimeline(uint64_t scale) @@ -58,6 +59,7 @@ void SegmentTimeline::addElement(uint64_t number, stime_t d, uint64_t r, stime_t element->t = el->t + (el->d * (el->r + 1)); } elements.push_back(element); + totalLength += (d * (r + 1)); } } @@ -157,6 +159,11 @@ stime_t SegmentTimeline::getScaledPlaybackTimeByElementNumber(uint64_t number) c return time; } +stime_t SegmentTimeline::getTotalLength() const +{ + return totalLength; +} + uint64_t SegmentTimeline::maxElementNumber() const { if(elements.empty()) @@ -203,6 +210,7 @@ size_t SegmentTimeline::pruneBySequenceNumber(uint64_t number) { prunednow += el->r + 1; elements.pop_front(); + totalLength -= (el->d * (el->r + 1)); delete el; } } @@ -231,7 +239,9 @@ void SegmentTimeline::mergeWith(SegmentTimeline &other) if(last->contains(el->t)) /* Same element, but prev could have been middle of repeat */ { const uint64_t count = (el->t - last->t) / last->d; + totalLength -= (last->d * (last->r + 1)); last->r = std::max(last->r, el->r + count); + totalLength += (last->d * (last->r + 1)); delete el; } else if(el->t < last->t) @@ -240,6 +250,7 @@ void SegmentTimeline::mergeWith(SegmentTimeline &other) } else /* Did not exist in previous list */ { + totalLength += (el->d * (el->r + 1)); elements.push_back(el); el->number = last->number + last->r + 1; last = el; diff --git a/modules/demux/adaptive/playlist/SegmentTimeline.h b/modules/demux/adaptive/playlist/SegmentTimeline.h index 447ef6b9ea..d95b0e82db 100644 --- a/modules/demux/adaptive/playlist/SegmentTimeline.h +++ b/modules/demux/adaptive/playlist/SegmentTimeline.h @@ -44,6 +44,7 @@ namespace adaptive bool getScaledPlaybackTimeDurationBySegmentNumber(uint64_t, stime_t *, stime_t *) const; stime_t getScaledPlaybackTimeByElementNumber(uint64_t) const; stime_t getMinAheadScaledTime(uint64_t) const; + stime_t getTotalLength() const; uint64_t maxElementNumber() const; uint64_t minElementNumber() const; void pruneByPlaybackTime(vlc_tick_t); @@ -53,6 +54,7 @@ namespace adaptive private: std::list<Element *> elements; + stime_t totalLength; class Element { _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
