[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