vlc | branch: master | Francois Cartegnie <[email protected]> | Sun Jun 7 14:10:06 2015 +0200| [2bf7935f51989a4a24054a83c59361d94b6babc1] | committer: Francois Cartegnie
demux: adaptative: add pruning by position > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=2bf7935f51989a4a24054a83c59361d94b6babc1 --- modules/demux/adaptative/SegmentTracker.cpp | 6 ++++ modules/demux/adaptative/SegmentTracker.hpp | 1 + modules/demux/adaptative/Streams.cpp | 5 ++++ modules/demux/adaptative/Streams.hpp | 1 + .../demux/adaptative/playlist/AbstractPlaylist.cpp | 6 ++++ .../demux/adaptative/playlist/AbstractPlaylist.hpp | 1 + .../adaptative/playlist/SegmentInformation.cpp | 29 ++++++++++++++++---- .../adaptative/playlist/SegmentInformation.hpp | 3 +- modules/demux/adaptative/playlist/SegmentList.cpp | 26 ++++++++++++++++++ modules/demux/adaptative/playlist/SegmentList.h | 3 ++ 10 files changed, 75 insertions(+), 6 deletions(-) diff --git a/modules/demux/adaptative/SegmentTracker.cpp b/modules/demux/adaptative/SegmentTracker.cpp index fc1822c..f5e49a3 100644 --- a/modules/demux/adaptative/SegmentTracker.cpp +++ b/modules/demux/adaptative/SegmentTracker.cpp @@ -131,3 +131,9 @@ mtime_t SegmentTracker::getSegmentStart() const else return 0; } + +void SegmentTracker::pruneFromCurrent() +{ + if(playlist->isLive()) + playlist->pruneBySegmentNumber(count); +} diff --git a/modules/demux/adaptative/SegmentTracker.hpp b/modules/demux/adaptative/SegmentTracker.hpp index 2acd902..e1d1510 100644 --- a/modules/demux/adaptative/SegmentTracker.hpp +++ b/modules/demux/adaptative/SegmentTracker.hpp @@ -61,6 +61,7 @@ namespace adaptative Chunk* getNextChunk(StreamType); bool setPosition(mtime_t, bool, bool); mtime_t getSegmentStart() const; + void pruneFromCurrent(); private: bool initializing; diff --git a/modules/demux/adaptative/Streams.cpp b/modules/demux/adaptative/Streams.cpp index e79855c..0637357 100644 --- a/modules/demux/adaptative/Streams.cpp +++ b/modules/demux/adaptative/Streams.cpp @@ -249,6 +249,11 @@ mtime_t Stream::getPosition() const return segmentTracker->getSegmentStart(); } +void Stream::prune() +{ + segmentTracker->pruneFromCurrent(); +} + AbstractStreamOutput::AbstractStreamOutput(demux_t *demux) { realdemux = demux; diff --git a/modules/demux/adaptative/Streams.hpp b/modules/demux/adaptative/Streams.hpp index 1970c30..6cfd66b 100644 --- a/modules/demux/adaptative/Streams.hpp +++ b/modules/demux/adaptative/Streams.hpp @@ -71,6 +71,7 @@ namespace adaptative status demux(HTTPConnectionManager *, mtime_t); bool setPosition(mtime_t, bool); mtime_t getPosition() const; + void prune(); private: Chunk *getChunk(); diff --git a/modules/demux/adaptative/playlist/AbstractPlaylist.cpp b/modules/demux/adaptative/playlist/AbstractPlaylist.cpp index 5030a8f..5e3022e 100644 --- a/modules/demux/adaptative/playlist/AbstractPlaylist.cpp +++ b/modules/demux/adaptative/playlist/AbstractPlaylist.cpp @@ -145,3 +145,9 @@ void AbstractPlaylist::mergeWith(AbstractPlaylist *updatedAbstractPlaylist, mtim periods.at(i)->mergeWith(updatedAbstractPlaylist->periods.at(i), prunebarrier); } +void AbstractPlaylist::pruneBySegmentNumber(uint64_t num) +{ + for(size_t i = 0; i < periods.size(); i++) + periods.at(i)->pruneBySegmentNumber(num); +} + diff --git a/modules/demux/adaptative/playlist/AbstractPlaylist.hpp b/modules/demux/adaptative/playlist/AbstractPlaylist.hpp index b80621e..30ec6cd 100644 --- a/modules/demux/adaptative/playlist/AbstractPlaylist.hpp +++ b/modules/demux/adaptative/playlist/AbstractPlaylist.hpp @@ -54,6 +54,7 @@ namespace adaptative virtual BasePeriod* getNextPeriod(BasePeriod *period); void mergeWith(AbstractPlaylist *, mtime_t = 0); + void pruneBySegmentNumber(uint64_t); void getTimeLinesBoundaries(mtime_t *, mtime_t *) const; void getPlaylistDurationsRange(mtime_t *, mtime_t *) const; diff --git a/modules/demux/adaptative/playlist/SegmentInformation.cpp b/modules/demux/adaptative/playlist/SegmentInformation.cpp index ac4c578..725f95d 100644 --- a/modules/demux/adaptative/playlist/SegmentInformation.cpp +++ b/modules/demux/adaptative/playlist/SegmentInformation.cpp @@ -69,8 +69,10 @@ AbstractPlaylist * SegmentInformation::getPlaylist() const return NULL; } -std::size_t SegmentInformation::getSegments(SegmentInfoType type, vector<ISegment *> &retSegments) const +std::size_t SegmentInformation::getSegments(SegmentInfoType type, vector<ISegment *> &retSegments, + std::size_t *offset) const { + std::size_t off = 0; switch (type) { case INFOTYPE_INIT: @@ -106,6 +108,7 @@ std::size_t SegmentInformation::getSegments(SegmentInfoType type, vector<ISegmen std::vector<ISegment *> list = (*it)->subSegments(); retSegments.insert( retSegments.end(), list.begin(), list.end() ); } + off = segmentList->getOffset(); } else if( segmentBase ) { @@ -134,9 +137,15 @@ std::size_t SegmentInformation::getSegments(SegmentInfoType type, vector<ISegmen } if( retSegments.empty() && parent ) - return parent->getSegments( type, retSegments ); + { + return parent->getSegments( type, retSegments, offset ); + } else + { + if( offset ) + *offset = off; return retSegments.size(); + } } std::size_t SegmentInformation::getAllSegments(vector<ISegment *> &retSegments) const @@ -155,7 +164,8 @@ ISegment * SegmentInformation::getSegment(SegmentInfoType type, uint64_t pos) co ISegment *segment = NULL; vector<ISegment *> retSegments; - const size_t size = getSegments( type, retSegments ); + std::size_t offset = 0; + const size_t size = getSegments( type, retSegments, &offset ); if( size ) { /* check if that's a template (fixme: find a better way) */ @@ -166,9 +176,9 @@ ISegment * SegmentInformation::getSegment(SegmentInfoType type, uint64_t pos) co templ->segmentTimeline.Get()->maxElementNumber() > pos) return templ; } - else if( pos < size ) + else if( pos < size + offset && pos >= offset ) { - segment = retSegments[pos]; + segment = retSegments[pos - offset]; } } @@ -291,6 +301,15 @@ void SegmentInformation::mergeWith(SegmentInformation *updated, mtime_t prunetim } } +void SegmentInformation::pruneBySegmentNumber(uint64_t num) +{ + if(segmentList) + segmentList->pruneBySegmentNumber(num); + + for(size_t i=0; i<childs.size(); i++) + childs.at(i)->pruneBySegmentNumber(num); +} + bool SegmentInformation::canBitswitch() const { if(bitswitch_policy == BITSWITCH_INHERIT) diff --git a/modules/demux/adaptative/playlist/SegmentInformation.hpp b/modules/demux/adaptative/playlist/SegmentInformation.hpp index 503ac67..895458d 100644 --- a/modules/demux/adaptative/playlist/SegmentInformation.hpp +++ b/modules/demux/adaptative/playlist/SegmentInformation.hpp @@ -80,10 +80,11 @@ namespace adaptative void collectTimelines(std::vector<SegmentTimeline *> *) const; void getDurationsRange(mtime_t *, mtime_t *) const; virtual void mergeWith(SegmentInformation *, mtime_t); + virtual void pruneBySegmentNumber(uint64_t); protected: std::size_t getAllSegments(std::vector<ISegment *> &) const; - std::size_t getSegments(SegmentInfoType, std::vector<ISegment *>&) const; + std::size_t getSegments(SegmentInfoType, std::vector<ISegment *>&, std::size_t * = NULL) const; std::vector<SegmentInformation *> childs; SegmentInformation *parent; diff --git a/modules/demux/adaptative/playlist/SegmentList.cpp b/modules/demux/adaptative/playlist/SegmentList.cpp index 4e8b54b..a298941 100644 --- a/modules/demux/adaptative/playlist/SegmentList.cpp +++ b/modules/demux/adaptative/playlist/SegmentList.cpp @@ -31,6 +31,7 @@ using namespace adaptative::playlist; SegmentList::SegmentList( SegmentInformation *parent ): SegmentInfoCommon( parent ), TimescaleAble( parent ) { + pruned = 0; } SegmentList::~SegmentList() { @@ -64,3 +65,28 @@ void SegmentList::mergeWith(SegmentList *updated) } updated->segments.clear(); } + +void SegmentList::pruneBySegmentNumber(uint64_t tobelownum) +{ + if(tobelownum < pruned) + return; + + uint64_t current = pruned; + std::vector<Segment *>::iterator it = segments.begin(); + while(it != segments.end() && current < tobelownum) + { + Segment *seg = *it; + if(seg->chunksuse.Get()) /* can't prune from here, still in use */ + break; + delete *it; + it = segments.erase(it); + + current++; + pruned++; + } +} + +std::size_t SegmentList::getOffset() const +{ + return pruned; +} diff --git a/modules/demux/adaptative/playlist/SegmentList.h b/modules/demux/adaptative/playlist/SegmentList.h index 8db3fe7..69e7aef 100644 --- a/modules/demux/adaptative/playlist/SegmentList.h +++ b/modules/demux/adaptative/playlist/SegmentList.h @@ -48,9 +48,12 @@ namespace adaptative const std::vector<Segment *>& getSegments() const; void addSegment(Segment *seg); void mergeWith(SegmentList *); + void pruneBySegmentNumber(uint64_t); + std::size_t getOffset() const; private: std::vector<Segment *> segments; + std::size_t pruned; }; } } _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
