[vlc-commits] demux: adaptive: handle position change through event

Francois Cartegnie git at videolan.org
Fri Jan 22 15:12:28 UTC 2021


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Wed Jan 20 20:34:45 2021 +0100| [704c48efa653154d1373bcdb380b033db804d7dc] | committer: Francois Cartegnie

demux: adaptive: handle position change through event

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=704c48efa653154d1373bcdb380b033db804d7dc
---

 modules/demux/adaptive/SegmentTracker.cpp |  1 +
 modules/demux/adaptive/Streams.cpp        | 64 +++++++++++++++++--------------
 modules/demux/adaptive/Streams.hpp        |  1 +
 3 files changed, 37 insertions(+), 29 deletions(-)

diff --git a/modules/demux/adaptive/SegmentTracker.cpp b/modules/demux/adaptive/SegmentTracker.cpp
index 3d9be10f80..ffe4418212 100644
--- a/modules/demux/adaptive/SegmentTracker.cpp
+++ b/modules/demux/adaptive/SegmentTracker.cpp
@@ -413,6 +413,7 @@ void SegmentTracker::setPosition(const Position &pos, bool restarted)
         initializing = true;
     current = Position();
     next = pos;
+    notify(PositionChangedEvent());
 }
 
 SegmentTracker::Position SegmentTracker::getStartPosition()
diff --git a/modules/demux/adaptive/Streams.cpp b/modules/demux/adaptive/Streams.cpp
index 04cfc39f87..3928a01d34 100644
--- a/modules/demux/adaptive/Streams.cpp
+++ b/modules/demux/adaptive/Streams.cpp
@@ -141,6 +141,37 @@ void AbstractStream::prepareRestart(bool b_discontinuity)
     }
 }
 
+bool AbstractStream::resetForNewPosition(vlc_tick_t seekMediaTime)
+{
+    // clear eof flag before restartDemux() to prevent readNextBlock() fail
+    eof = false;
+    demuxfirstchunk = true;
+    notfound_sequence = 0;
+    if(!demuxer || demuxer->needsRestartOnSeek()) /* needs (re)start */
+    {
+        delete currentChunk;
+        currentChunk = nullptr;
+        needrestart = false;
+
+        fakeEsOut()->resetTimestamps();
+
+        fakeEsOut()->setExpectedTimestamp(seekMediaTime);
+        if( !restartDemux() )
+        {
+            msg_Info(p_realdemux, "Restart demux failed");
+            eof = true;
+            valid = false;
+            return false;
+        }
+        else
+        {
+            fakeEsOut()->commandsQueue()->setEOF(false);
+        }
+    }
+    else fakeEsOut()->commandsQueue()->Abort( true );
+    return true;
+}
+
 void AbstractStream::setLanguage(const std::string &lang)
 {
     language = lang;
@@ -545,35 +576,6 @@ bool AbstractStream::setPosition(vlc_tick_t time, bool tryonly)
     bool ret = segmentTracker->setPositionByTime(time, b_needs_restart, tryonly);
     if(!tryonly && ret)
     {
-        // clear eof flag before restartDemux() to prevent readNextBlock() fail
-        eof = false;
-        demuxfirstchunk = true;
-        notfound_sequence = 0;
-        if(b_needs_restart)
-        {
-            if(currentChunk)
-                delete currentChunk;
-            currentChunk = nullptr;
-            needrestart = false;
-
-            fakeEsOut()->resetTimestamps();
-
-            vlc_tick_t seekMediaTime = segmentTracker->getPlaybackTime(true);
-            fakeEsOut()->setExpectedTimestamp(seekMediaTime);
-            if( !restartDemux() )
-            {
-                msg_Info(p_realdemux, "Restart demux failed");
-                eof = true;
-                valid = false;
-                ret = false;
-            }
-            else
-            {
-                fakeEsOut()->commandsQueue()->setEOF(false);
-            }
-        }
-        else fakeEsOut()->commandsQueue()->Abort( true );
-
 // in some cases, media time seek != sent dts
 //        es_out_Control(p_realdemux->out, ES_OUT_SET_NEXT_DISPLAY_TIME,
 //                       VLC_TICK_0 + time);
@@ -692,6 +694,10 @@ void AbstractStream::trackerEvent(const TrackerEvent &ev)
             }
             break;
 
+        case TrackerEvent::Type::PositionChange:
+            resetForNewPosition(segmentTracker->getPlaybackTime(true));
+            break;
+
         default:
             break;
     }
diff --git a/modules/demux/adaptive/Streams.hpp b/modules/demux/adaptive/Streams.hpp
index 54ea4e5b72..2b961416f7 100644
--- a/modules/demux/adaptive/Streams.hpp
+++ b/modules/demux/adaptive/Streams.hpp
@@ -111,6 +111,7 @@ namespace adaptive
         virtual bool restartDemux();
 
         virtual void prepareRestart(bool = true);
+        bool resetForNewPosition(vlc_tick_t);
 
         bool discontinuity;
         bool needrestart;



More information about the vlc-commits mailing list