vlc | branch: master | Francois Cartegnie <[email protected]> | 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 * ); _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
