[vlc-commits] demux: adaptive: handle cache missing segments
Francois Cartegnie
git at videolan.org
Mon Mar 30 16:16:25 CEST 2020
vlc/vlc-3.0 | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Fri Oct 12 17:10:44 2018 +0200| [b36e08e63ae83c87f98dd0b7f558d13306fcdef6] | committer: Francois Cartegnie
demux: adaptive: handle cache missing segments
(cherry picked from commit abba9191d151005ead951842adbd688b507caa89)
> http://git.videolan.org/gitweb.cgi/vlc/vlc-3.0.git/?a=commit;h=b36e08e63ae83c87f98dd0b7f558d13306fcdef6
---
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 788a0cf2ad..1175a42405 100644
--- a/modules/demux/adaptive/Streams.cpp
+++ b/modules/demux/adaptive/Streams.cpp
@@ -56,6 +56,7 @@ AbstractStream::AbstractStream(demux_t * demux_)
demuxersource = NULL;
demuxer = NULL;
fakeesout = NULL;
+ notfound_sequence = 0;
last_buffer_status = buffering_lessthanmin;
vlc_mutex_init(&lock);
}
@@ -500,10 +501,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;
demuxfirstchunk = false;
@@ -530,6 +537,7 @@ bool AbstractStream::setPosition(mtime_t time, bool tryonly)
// clear eof flag before restartDemux() to prevent readNextBlock() fail
eof = false;
demuxfirstchunk = true;
+ notfound_sequence = 0;
if(b_needs_restart)
{
if(currentChunk)
diff --git a/modules/demux/adaptive/Streams.hpp b/modules/demux/adaptive/Streams.hpp
index 738da5486b..8c5fd69c45 100644
--- a/modules/demux/adaptive/Streams.hpp
+++ b/modules/demux/adaptive/Streams.hpp
@@ -141,6 +141,7 @@ namespace adaptive
buffering_status last_buffer_status;
bool valid;
bool disabled;
+ unsigned notfound_sequence;
};
class AbstractStreamFactory
diff --git a/modules/demux/adaptive/http/Chunk.cpp b/modules/demux/adaptive/http/Chunk.cpp
index 226e3fe3b1..5e828f45e2 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 fe2107b9d1..4b7fc3f8ae 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;
More information about the vlc-commits
mailing list