[vlc-devel] [PATCH] demux: adaptive: workaround successive setPosition failed by flush EsOutAddCommand

Zhao Zhili quinkblack at foxmail.com
Sat Oct 7 08:03:19 CEST 2017


---
 modules/demux/adaptive/Streams.cpp                |  8 ++++++
 modules/demux/adaptive/plumbing/CommandsQueue.cpp | 33 +++++++++++++++++++++++
 modules/demux/adaptive/plumbing/CommandsQueue.hpp |  1 +
 3 files changed, 42 insertions(+)

diff --git a/modules/demux/adaptive/Streams.cpp b/modules/demux/adaptive/Streams.cpp
index 96543d3187..d1e97df358 100644
--- a/modules/demux/adaptive/Streams.cpp
+++ b/modules/demux/adaptive/Streams.cpp
@@ -498,7 +498,15 @@ bool AbstractStream::setPosition(mtime_t time, bool tryonly)
             setTimeOffset(segmentTracker->getPlaybackTime());
 
             if( !restartDemux() )
+            {
                 dead = true;
+            }
+            else
+            {
+                /* To avoid a successive setPosition failed because fakeesout is restarting, we
+                 * flush EsOutAddCommand here. */
+                commandsqueue->flushAddCommand(p_realdemux->out);
+            }
         }
         else commandsqueue->Abort( true );
 
diff --git a/modules/demux/adaptive/plumbing/CommandsQueue.cpp b/modules/demux/adaptive/plumbing/CommandsQueue.cpp
index f2a48b6cec..7d7c81b408 100644
--- a/modules/demux/adaptive/plumbing/CommandsQueue.cpp
+++ b/modules/demux/adaptive/plumbing/CommandsQueue.cpp
@@ -417,6 +417,39 @@ bool CommandsQueue::isEOF() const
     return b;
 }
 
+void CommandsQueue::flushAddCommand( es_out_t *out )
+{
+    std::list<AbstractCommand *>::iterator it;
+
+    it = commands.begin();
+    while( it != commands.end() )
+    {
+        if( (*it)->getType() == ES_OUT_PRIVATE_COMMAND_ADD )
+        {
+            (*it)->Execute(out);
+            it = commands.erase(it);
+        }
+        else
+        {
+            ++it;
+        }
+    }
+
+    it = incoming.begin();
+    while( it != incoming.end() )
+    {
+        if( (*it)->getType() == ES_OUT_PRIVATE_COMMAND_ADD )
+        {
+            (*it)->Execute(out);
+            it = incoming.erase(it);
+        }
+        else
+        {
+            ++it;
+        }
+    }
+}
+
 mtime_t CommandsQueue::getDemuxedAmount() const
 {
     return bufferinglevel - getFirstDTS();
diff --git a/modules/demux/adaptive/plumbing/CommandsQueue.hpp b/modules/demux/adaptive/plumbing/CommandsQueue.hpp
index 979820e66a..7d0df386b2 100644
--- a/modules/demux/adaptive/plumbing/CommandsQueue.hpp
+++ b/modules/demux/adaptive/plumbing/CommandsQueue.hpp
@@ -163,6 +163,7 @@ namespace adaptive
             void setEOF();
             bool isDraining() const;
             bool isEOF() const;
+            void flushAddCommand( es_out_t *out );
             mtime_t getDemuxedAmount() const;
             mtime_t getBufferingLevel() const;
             mtime_t getFirstDTS() const;
-- 
2.13.2
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-demux-adaptive-workaround-successive-setPosition-fai.patch
Type: application/octet-stream
Size: 2980 bytes
Desc: not available
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20171007/a1d05c36/attachment.obj>


More information about the vlc-devel mailing list