[vlc-commits] demux: adaptive: continue non dated packets for the same ES (fix #19145)

Francois Cartegnie git at videolan.org
Fri Nov 24 14:46:32 CET 2017


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Fri Nov 24 14:16:32 2017 +0100| [dde7a83b2defc859048b88a105eb2884828c7de2] | committer: Francois Cartegnie

demux: adaptive: continue non dated packets for the same ES (fix #19145)

Otherwise creates misordered output.

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

 modules/demux/adaptive/plumbing/CommandsQueue.cpp | 42 ++++++++++++++++++++---
 modules/demux/adaptive/plumbing/CommandsQueue.hpp |  1 +
 2 files changed, 39 insertions(+), 4 deletions(-)

diff --git a/modules/demux/adaptive/plumbing/CommandsQueue.cpp b/modules/demux/adaptive/plumbing/CommandsQueue.cpp
index bd4959d28c..0cbff82d29 100644
--- a/modules/demux/adaptive/plumbing/CommandsQueue.cpp
+++ b/modules/demux/adaptive/plumbing/CommandsQueue.cpp
@@ -28,6 +28,7 @@
 #include <vlc_block.h>
 #include <vlc_meta.h>
 #include <algorithm>
+#include <set>
 
 using namespace adaptive;
 
@@ -96,6 +97,11 @@ mtime_t EsOutSendCommand::getTime() const
         return AbstractCommand::getTime();
 }
 
+const void * EsOutSendCommand::esIdentifier() const
+{
+    return static_cast<const void *>(p_fakeid);
+}
+
 EsOutDelCommand::EsOutDelCommand( FakeESOutID *p_es ) :
     AbstractFakeEsCommand( ES_OUT_PRIVATE_COMMAND_DEL, p_es )
 {
@@ -274,6 +280,7 @@ const CommandsFactory * CommandsQueue::factory() const
 mtime_t CommandsQueue::Process( es_out_t *out, mtime_t barrier )
 {
     mtime_t lastdts = barrier;
+    std::set<const void *> allowinvalid;
     bool b_datasent = false;
 
     /* We need to filter the current commands list
@@ -306,10 +313,37 @@ mtime_t CommandsQueue::Process( es_out_t *out, mtime_t barrier )
         in.pop_front();
         b_datasent = true;
 
-        if( command->getType() == ES_OUT_PRIVATE_COMMAND_SEND && command->getTime() > barrier )
-            commands.push_back( command );
-        else
-            output.push_back( command );
+        if( command->getType() == ES_OUT_PRIVATE_COMMAND_SEND )
+        {
+            EsOutSendCommand *sendcommand = dynamic_cast<EsOutSendCommand *>(command);
+            /* We need a stream identifier to send NON DATED data following DATA for the same ES */
+            const void *id = (sendcommand) ? sendcommand->esIdentifier() : 0;
+
+            /* Not for now */
+            if( command->getTime() > barrier ) /* Not for now */
+            {
+                /* ensure no more non dated for that ES is sent
+                 * since we're sure that data is above barrier */
+                allowinvalid.erase( id );
+                commands.push_back( command );
+            }
+            else if( command->getTime() == VLC_TS_INVALID )
+            {
+                /* Did we sent data already for that ES ? */
+                if( allowinvalid.find( id ) != allowinvalid.end() ||
+                   /* but also include invalid ones at start (other we will never dequeue them) */
+                   (commands.empty() && output.empty()) )
+                    output.push_back( command );
+                else
+                    commands.push_back( command );
+            }
+            else /* Falls below barrier, send */
+            {
+                allowinvalid.insert( id );
+                output.push_back( command );
+            }
+        }
+        else output.push_back( command ); /* will discard below */
     }
 
     /* push remaining ones if broke above */
diff --git a/modules/demux/adaptive/plumbing/CommandsQueue.hpp b/modules/demux/adaptive/plumbing/CommandsQueue.hpp
index a81d92998d..b730340ce8 100644
--- a/modules/demux/adaptive/plumbing/CommandsQueue.hpp
+++ b/modules/demux/adaptive/plumbing/CommandsQueue.hpp
@@ -59,6 +59,7 @@ namespace adaptive
             virtual ~EsOutSendCommand();
             virtual void Execute( es_out_t *out );
             virtual mtime_t getTime() const;
+            const void * esIdentifier() const;
 
         protected:
             EsOutSendCommand( FakeESOutID *, block_t * );



More information about the vlc-commits mailing list