]> git.sesse.net Git - vlc/commitdiff
demux: dash: prune expired live timeline elements
authorFrancois Cartegnie <fcvlcdev@free.fr>
Tue, 13 Jan 2015 14:10:03 +0000 (15:10 +0100)
committerFrancois Cartegnie <fcvlcdev@free.fr>
Tue, 13 Jan 2015 14:10:03 +0000 (15:10 +0100)
modules/demux/dash/DASHManager.cpp
modules/demux/dash/SegmentTracker.cpp
modules/demux/dash/SegmentTracker.hpp
modules/demux/dash/Streams.cpp
modules/demux/dash/Streams.hpp
modules/demux/dash/mpd/MPD.cpp
modules/demux/dash/mpd/MPD.h

index 5652c8aa50fba9c62b6db4cb2766735ab9ca702a..b6dca19d011c82acd1a5b989a0c5c59f6155cfeb 100644 (file)
@@ -223,10 +223,20 @@ bool DASHManager::updateMPD()
             return false;
         }
 
+        mtime_t minsegmentTime = 0;
+        for(int type=0; type<Streams::count; type++)
+        {
+            if(!streams[type])
+                continue;
+            mtime_t segmentTime = streams[type]->getPosition();
+            if(!minsegmentTime || segmentTime < minsegmentTime)
+                minsegmentTime = segmentTime;
+        }
+
         MPD *newmpd = MPDFactory::create(parser.getRootNode(), mpdstream, parser.getProfile());
         if(newmpd)
         {
-            mpd->mergeWith(newmpd);
+            mpd->mergeWith(newmpd, minsegmentTime);
             delete newmpd;
         }
         stream_Delete(mpdstream);
index 8559dc418f4c184d36665ff52a10aaaa06395260..4284647cba7862b743428e387b4c4b21ee7b9563 100644 (file)
@@ -108,3 +108,11 @@ bool SegmentTracker::setPosition(mtime_t time, bool tryonly)
     }
     return false;
 }
+
+mtime_t SegmentTracker::getSegmentStart() const
+{
+    if(prevRepresentation)
+        return prevRepresentation->getPlaybackTimeBySegmentNumber(count);
+    else
+        return 0;
+}
index d76d5251a0c2f853ff014f5e12e570dfd4fd9a5f..22a35ebd79d619e698a4e538d49ec52f4700eb4e 100644 (file)
@@ -57,6 +57,7 @@ namespace dash
             void resetCounter();
             http::Chunk* getNextChunk(Streams::Type);
             bool setPosition(mtime_t, bool);
+            mtime_t getSegmentStart() const;
 
         private:
             bool initializing;
index 9e2ac478b9de7d976c4dcefddb5f0cf1b721c19e..b85c8e31ee54efe9ede3cc8bd0a683f5bc40063a 100644 (file)
@@ -223,6 +223,11 @@ bool Stream::setPosition(mtime_t time, bool tryonly)
     return ret;
 }
 
+mtime_t Stream::getPosition() const
+{
+    return segmentTracker->getSegmentStart();
+}
+
 AbstractStreamOutput::AbstractStreamOutput(demux_t *demux)
 {
     realdemux = demux;
index 10404f43580704060f8d5a9751f6d62ba0c61dd4..e0d3fcc26d45d9f79f884c1c42fc31db4d639158 100644 (file)
@@ -56,6 +56,7 @@ namespace dash
                 bool seekAble() const;
                 size_t read(http::HTTPConnectionManager *);
                 bool setPosition(mtime_t, bool);
+                mtime_t getPosition() const;
 
             private:
                 http::Chunk *getChunk();
index f55556fa8abf4ed5fc97b011aeca66bb154eb2e5..79499edc50f8e616f87b2f9b8f96e9db605e9b22 100644 (file)
@@ -154,7 +154,7 @@ void MPD::getTimeLinesBoundaries(mtime_t *min, mtime_t *max) const
     }
 }
 
-void MPD::mergeWith(MPD *updatedMPD)
+void MPD::mergeWith(MPD *updatedMPD, mtime_t prunebarrier)
 {
     availabilityEndTime.Set(updatedMPD->availabilityEndTime.Get());
     /* Only merge timelines for now */
@@ -166,6 +166,10 @@ void MPD::mergeWith(MPD *updatedMPD)
         updatedMPD->periods.at(i)->collectTimelines(&timelinesUpdate);
 
         for(size_t j = 0; j < timelines.size() && j < timelinesUpdate.size(); j++)
+        {
             timelines.at(j)->mergeWith(*timelinesUpdate.at(j));
+            if(prunebarrier)
+                timelines.at(j)->prune(prunebarrier);
+        }
     }
 }
index d3908e1d558cec9605dccfa219cf71f47cfe5f02..f6cf5fe0770169229eb5e6b13cfa437f389f34f6 100644 (file)
@@ -60,7 +60,7 @@ namespace dash
                 virtual Period*                         getFirstPeriod();
                 virtual Period*                         getNextPeriod(Period *period);
 
-                void                mergeWith(MPD *);
+                void                mergeWith(MPD *, mtime_t = 0);
                 void                getTimeLinesBoundaries(mtime_t *, mtime_t *) const;
 
                 Property<time_t>                    duration;