vlc | branch: master | Francois Cartegnie <[email protected]> | Fri Oct 12 17:10:44 2018 +0200| [abba9191d151005ead951842adbd688b507caa89] | committer: Francois Cartegnie
demux: adaptive: handle cache missing segments > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=abba9191d151005ead951842adbd688b507caa89 --- modules/demux/adaptive/Streams.cpp | 8 ++++++++ modules/demux/adaptive/Streams.hpp | 1 + modules/demux/adaptive/http/Chunk.cpp | 18 ++++++++++++++---- modules/demux/adaptive/http/Chunk.h | 3 +++ 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/modules/demux/adaptive/Streams.cpp b/modules/demux/adaptive/Streams.cpp index 202bf41033..b53206704d 100644 --- a/modules/demux/adaptive/Streams.cpp +++ b/modules/demux/adaptive/Streams.cpp @@ -54,6 +54,7 @@ AbstractStream::AbstractStream(demux_t * demux_) commandsqueue = NULL; demuxer = NULL; fakeesout = NULL; + notfound_sequence = 0; last_buffer_status = buffering_lessthanmin; vlc_mutex_init(&lock); } @@ -482,10 +483,16 @@ block_t * AbstractStream::readNextBlock() block_t *block = currentChunk->readBlock(); if(block == NULL) { + if(currentChunk->getRequestStatus() == RequestStatus::NotFound && + ++notfound_sequence < 3) + { + discontinuity = true; + } delete currentChunk; currentChunk = NULL; return NULL; } + else notfound_sequence = 0; if (currentChunk->isEmpty()) { @@ -508,6 +515,7 @@ bool AbstractStream::setPosition(vlc_tick_t time, bool tryonly) { // clear eof flag before restartDemux() to prevent readNextBlock() fail eof = false; + notfound_sequence = 0; if(demuxer->needsRestartOnSeek()) { if(currentChunk) diff --git a/modules/demux/adaptive/Streams.hpp b/modules/demux/adaptive/Streams.hpp index f74db017ee..4e7bedbcd5 100644 --- a/modules/demux/adaptive/Streams.hpp +++ b/modules/demux/adaptive/Streams.hpp @@ -138,6 +138,7 @@ namespace adaptive buffering_status last_buffer_status; bool dead; bool disabled; + unsigned notfound_sequence; }; class AbstractStreamFactory diff --git a/modules/demux/adaptive/http/Chunk.cpp b/modules/demux/adaptive/http/Chunk.cpp index 0674231ee5..3ec89fd4a1 100644 --- a/modules/demux/adaptive/http/Chunk.cpp +++ b/modules/demux/adaptive/http/Chunk.cpp @@ -40,6 +40,7 @@ using namespace adaptive::http; AbstractChunkSource::AbstractChunkSource() { contentLength = 0; + requeststatus = RequestStatus::Success; } AbstractChunkSource::~AbstractChunkSource() @@ -64,6 +65,11 @@ std::string AbstractChunkSource::getContentType() const return std::string(); } +enum RequestStatus AbstractChunkSource::getRequestStatus() const +{ + return requeststatus; +} + AbstractChunk::AbstractChunk(AbstractChunkSource *source_) { bytesRead = 0; @@ -80,6 +86,11 @@ std::string AbstractChunk::getContentType() return source->getContentType(); } +enum RequestStatus AbstractChunk::getRequestStatus() const +{ + return source->getRequestStatus(); +} + size_t AbstractChunk::getBytesRead() const { return this->bytesRead; @@ -250,11 +261,10 @@ bool HTTPChunkSource::prepare() break; } - enum RequestStatus status = - connection->request(connparams.getPath(), bytesRange); - if(status != RequestStatus::Success) + requeststatus = connection->request(connparams.getPath(), bytesRange); + if(requeststatus != RequestStatus::Success) { - if(status == RequestStatus::Redirection) + if(requeststatus == RequestStatus::Redirection) { HTTPConnection *httpconn = dynamic_cast<HTTPConnection *>(connection); if(httpconn) diff --git a/modules/demux/adaptive/http/Chunk.h b/modules/demux/adaptive/http/Chunk.h index 0b5efd5fe9..c1eb3ba2e5 100644 --- a/modules/demux/adaptive/http/Chunk.h +++ b/modules/demux/adaptive/http/Chunk.h @@ -53,8 +53,10 @@ namespace adaptive void setBytesRange (const BytesRange &); const BytesRange & getBytesRange () const; virtual std::string getContentType () const; + enum RequestStatus getRequestStatus() const; protected: + enum RequestStatus requeststatus; size_t contentLength; BytesRange bytesRange; }; @@ -65,6 +67,7 @@ namespace adaptive virtual ~AbstractChunk(); std::string getContentType (); + enum RequestStatus getRequestStatus () const; size_t getBytesRead () const; uint64_t getStartByteInFile () const; bool isEmpty () const; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
