vlc | branch: master | Francois Cartegnie <fcvlc...@free.fr> | Thu Mar 18 17:34:21 2021 +0100| [5924cb42a5c71a2583b606ec4c49c4c9ddb5f2c4] | committer: Francois Cartegnie
demux: adaptive: change commands factory ownership > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=5924cb42a5c71a2583b606ec4c49c4c9ddb5f2c4 --- modules/demux/adaptive/Streams.cpp | 50 ++++++++++------------ modules/demux/adaptive/plumbing/CommandsQueue.cpp | 9 +--- modules/demux/adaptive/plumbing/CommandsQueue.hpp | 4 +- modules/demux/adaptive/plumbing/FakeESOut.cpp | 26 +++++++---- modules/demux/adaptive/plumbing/FakeESOut.hpp | 5 ++- .../demux/adaptive/test/plumbing/CommandsQueue.cpp | 34 +++++++-------- modules/demux/hls/HLSStreams.cpp | 2 +- 7 files changed, 63 insertions(+), 67 deletions(-) diff --git a/modules/demux/adaptive/Streams.cpp b/modules/demux/adaptive/Streams.cpp index 0cc5afadc5..6628d67879 100644 --- a/modules/demux/adaptive/Streams.cpp +++ b/modules/demux/adaptive/Streams.cpp @@ -70,38 +70,32 @@ bool AbstractStream::init(const StreamFormat &format_, SegmentTracker *tracker, if(demuxersource) { CommandsFactory *factory = new (std::nothrow) CommandsFactory(); - if(factory) + CommandsQueue *commandsqueue = new (std::nothrow) CommandsQueue(); + if(factory && commandsqueue) { - CommandsQueue *commandsqueue = new (std::nothrow) CommandsQueue(factory); - if(commandsqueue) + fakeesout = new (std::nothrow) FakeESOut(p_realdemux->out, + commandsqueue, factory); + if(fakeesout) { - fakeesout = new (std::nothrow) FakeESOut(p_realdemux->out, commandsqueue); - if(fakeesout) - { - /* All successfull */ - fakeesout->setExtraInfoProvider( this ); - const Role & streamRole = tracker->getStreamRole(); - if(streamRole.isDefault() && streamRole.autoSelectable()) - fakeesout->setPriority(ES_PRIORITY_MIN + 10); - else if(!streamRole.autoSelectable()) - fakeesout->setPriority(ES_PRIORITY_NOT_DEFAULTABLE); - format = format_; - segmentTracker = tracker; - segmentTracker->registerListener(this); - segmentTracker->notifyBufferingState(true); - connManager = conn; - fakeesout->setExpectedTimestamp(segmentTracker->getPlaybackTime()); - declaredCodecs(); - return true; - } - delete commandsqueue; - commandsqueue = nullptr; - } - else - { - delete factory; + /* All successfull */ + fakeesout->setExtraInfoProvider( this ); + const Role & streamRole = tracker->getStreamRole(); + if(streamRole.isDefault() && streamRole.autoSelectable()) + fakeesout->setPriority(ES_PRIORITY_MIN + 10); + else if(!streamRole.autoSelectable()) + fakeesout->setPriority(ES_PRIORITY_NOT_DEFAULTABLE); + format = format_; + segmentTracker = tracker; + segmentTracker->registerListener(this); + segmentTracker->notifyBufferingState(true); + connManager = conn; + fakeesout->setExpectedTimestamp(segmentTracker->getPlaybackTime()); + declaredCodecs(); + return true; } } + delete factory; + delete commandsqueue; delete demuxersource; } diff --git a/modules/demux/adaptive/plumbing/CommandsQueue.cpp b/modules/demux/adaptive/plumbing/CommandsQueue.cpp index 28f61108c1..3f2ddd4677 100644 --- a/modules/demux/adaptive/plumbing/CommandsQueue.cpp +++ b/modules/demux/adaptive/plumbing/CommandsQueue.cpp @@ -239,21 +239,19 @@ std::ostream& operator<<(std::ostream& ostr, const std::list<AbstractCommand *>& } #endif -CommandsQueue::CommandsQueue( CommandsFactory *f ) +CommandsQueue::CommandsQueue() { bufferinglevel = VLC_TICK_INVALID; pcr = VLC_TICK_INVALID; b_drop = false; b_draining = false; b_eof = false; - commandsFactory = f; nextsequence = 0; } CommandsQueue::~CommandsQueue() { Abort( false ); - delete commandsFactory; } static bool compareCommands( const Queueentry &a, const Queueentry &b ) @@ -297,11 +295,6 @@ void CommandsQueue::Schedule( AbstractCommand *command ) } } -const CommandsFactory * CommandsQueue::factory() const -{ - return commandsFactory; -} - vlc_tick_t CommandsQueue::Process( vlc_tick_t barrier ) { vlc_tick_t lastdts = barrier; diff --git a/modules/demux/adaptive/plumbing/CommandsQueue.hpp b/modules/demux/adaptive/plumbing/CommandsQueue.hpp index 96c8a46167..75ce359d58 100644 --- a/modules/demux/adaptive/plumbing/CommandsQueue.hpp +++ b/modules/demux/adaptive/plumbing/CommandsQueue.hpp @@ -154,9 +154,8 @@ namespace adaptive class CommandsQueue { public: - CommandsQueue( CommandsFactory * ); + CommandsQueue(); ~CommandsQueue(); - const CommandsFactory * factory() const; void Schedule( AbstractCommand * ); vlc_tick_t Process( vlc_tick_t ); void Abort( bool b_reset ); @@ -173,7 +172,6 @@ namespace adaptive vlc_tick_t getPCR() const; private: - CommandsFactory *commandsFactory; void LockedCommit(); void LockedSetDraining(); std::list<Queueentry> incoming; diff --git a/modules/demux/adaptive/plumbing/FakeESOut.cpp b/modules/demux/adaptive/plumbing/FakeESOut.cpp index 841f81dc18..6ff849e222 100644 --- a/modules/demux/adaptive/plumbing/FakeESOut.cpp +++ b/modules/demux/adaptive/plumbing/FakeESOut.cpp @@ -135,11 +135,13 @@ FakeESOut * FakeESOut::LockedFakeEsOut::operator ->() return p; } -FakeESOut::FakeESOut( es_out_t *es, CommandsQueue *queue ) +FakeESOut::FakeESOut( es_out_t *es, CommandsQueue *queue, + CommandsFactory *cf ) : AbstractFakeEsOut() , real_es_out( es ) , extrainfo( nullptr ) , commandsqueue( queue ) + , commandsfactory( cf ) , timestamps_offset( 0 ) { associated.b_timestamp_set = false; @@ -160,12 +162,18 @@ CommandsQueue * FakeESOut::commandsQueue() return commandsqueue; } +CommandsFactory * FakeESOut::commandsFactory() const +{ + return commandsfactory; +} + FakeESOut::~FakeESOut() { recycleAll(); gc(); delete commandsqueue; + delete commandsfactory; } void FakeESOut::resetTimestamps() @@ -327,7 +335,7 @@ size_t FakeESOut::esCount() const void FakeESOut::schedulePCRReset() { - AbstractCommand *command = commandsqueue->factory()->creatEsOutControlResetPCRCommand(); + AbstractCommand *command = commandsfactory->creatEsOutControlResetPCRCommand(); if( likely(command) ) commandsqueue->Schedule( command ); } @@ -340,7 +348,7 @@ void FakeESOut::scheduleAllForDeletion() FakeESOutID *es_id = *it; if(!es_id->scheduledForDeletion()) { - AbstractCommand *command = commandsqueue->factory()->createEsOutDelCommand( es_id ); + AbstractCommand *command = commandsfactory->createEsOutDelCommand( es_id ); if( likely(command) ) { commandsqueue->Schedule( command ); @@ -493,7 +501,7 @@ es_out_id_t * FakeESOut::esOutAdd(const es_format_t *p_fmt) if( likely(es_id) ) { assert(!es_id->scheduledForDeletion()); - AbstractCommand *command = commandsqueue->factory()->createEsOutAddCommand( es_id ); + AbstractCommand *command = commandsfactory->createEsOutAddCommand( es_id ); if( likely(command) ) { fakeesidlist.push_back(es_id); @@ -518,7 +526,7 @@ int FakeESOut::esOutSend(es_out_id_t *p_es, block_t *p_block) p_block->i_dts = fixTimestamp( p_block->i_dts ); p_block->i_pts = fixTimestamp( p_block->i_pts ); - AbstractCommand *command = commandsqueue->factory()->createEsOutSendCommand( es_id, p_block ); + AbstractCommand *command = commandsfactory->createEsOutSendCommand( es_id, p_block ); if( likely(command) ) { commandsqueue->Schedule( command ); @@ -532,7 +540,7 @@ void FakeESOut::esOutDel(es_out_id_t *p_es) vlc_mutex_locker locker(&lock); FakeESOutID *es_id = reinterpret_cast<FakeESOutID *>( p_es ); - AbstractCommand *command = commandsqueue->factory()->createEsOutDelCommand( es_id ); + AbstractCommand *command = commandsfactory->createEsOutDelCommand( es_id ); if( likely(command) ) { es_id->setScheduledForDeletion(); @@ -556,7 +564,7 @@ int FakeESOut::esOutControl(int i_query, va_list args) i_group = 0; vlc_tick_t pcr = va_arg( args, vlc_tick_t ); pcr = fixTimestamp( pcr ); - AbstractCommand *command = commandsqueue->factory()->createEsOutControlPCRCommand( i_group, pcr ); + AbstractCommand *command = commandsfactory->createEsOutControlPCRCommand( i_group, pcr ); if( likely(command) ) { commandsqueue->Schedule( command ); @@ -569,7 +577,7 @@ int FakeESOut::esOutControl(int i_query, va_list args) { static_cast<void>(va_arg( args, int )); /* ignore group */ const vlc_meta_t *p_meta = va_arg( args, const vlc_meta_t * ); - AbstractCommand *command = commandsqueue->factory()->createEsOutMetaCommand( this,-1, p_meta ); + AbstractCommand *command = commandsfactory->createEsOutMetaCommand( this,-1, p_meta ); if( likely(command) ) { commandsqueue->Schedule( command ); @@ -600,7 +608,7 @@ void FakeESOut::esOutDestroy() { vlc_mutex_locker locker(&lock); - AbstractCommand *command = commandsqueue->factory()->createEsOutDestroyCommand(); + AbstractCommand *command = commandsfactory->createEsOutDestroyCommand(); if( likely(command) ) commandsqueue->Schedule( command ); } diff --git a/modules/demux/adaptive/plumbing/FakeESOut.hpp b/modules/demux/adaptive/plumbing/FakeESOut.hpp index d31d2c0fae..e173bfe9af 100644 --- a/modules/demux/adaptive/plumbing/FakeESOut.hpp +++ b/modules/demux/adaptive/plumbing/FakeESOut.hpp @@ -33,6 +33,7 @@ namespace adaptive }; class CommandsQueue; + class CommandsFactory; class AbstractFakeESOutID; class FakeESOutID; @@ -74,10 +75,11 @@ namespace adaptive FakeESOut *p; LockedFakeEsOut(FakeESOut &q); }; - FakeESOut( es_out_t *, CommandsQueue * ); + FakeESOut( es_out_t *, CommandsQueue *, CommandsFactory * ); virtual ~FakeESOut(); LockedFakeEsOut WithLock(); CommandsQueue * commandsQueue(); + CommandsFactory *commandsFactory() const; void setAssociatedTimestamp( vlc_tick_t ); void setExpectedTimestamp( vlc_tick_t ); void resetTimestamps(); @@ -115,6 +117,7 @@ namespace adaptive FakeESOutID * createNewID( const es_format_t * ); ExtraFMTInfoInterface *extrainfo; CommandsQueue *commandsqueue; + CommandsFactory *commandsfactory; struct { vlc_tick_t timestamp; diff --git a/modules/demux/adaptive/test/plumbing/CommandsQueue.cpp b/modules/demux/adaptive/test/plumbing/CommandsQueue.cpp index bba807e416..c70847b220 100644 --- a/modules/demux/adaptive/test/plumbing/CommandsQueue.cpp +++ b/modules/demux/adaptive/test/plumbing/CommandsQueue.cpp @@ -93,8 +93,8 @@ int CommandsQueue_test() TestEsOutID *id1 = nullptr; try { - CommandsFactory *factory = new CommandsFactory(); - CommandsQueue queue(factory); + CommandsFactory factory; + CommandsQueue queue; id0 = new TestEsOutID(&esout); AbstractCommand *cmd = nullptr; @@ -106,9 +106,9 @@ int CommandsQueue_test() Expect(queue.getBufferingLevel() == VLC_TICK_INVALID); Expect(queue.getFirstDTS() == VLC_TICK_INVALID); Expect(queue.getPCR() == VLC_TICK_INVALID); - cmd = queue.factory()->createEsOutAddCommand(id0); + cmd = factory.createEsOutAddCommand(id0); queue.Schedule(cmd); - cmd = queue.factory()->createEsOutDelCommand(id0); + cmd = factory.createEsOutDelCommand(id0); queue.Schedule(cmd); for(size_t i=0; i<3; i++) /* Add / Del will return in between */ queue.Process(std::numeric_limits<vlc_tick_t>::max()); @@ -132,7 +132,7 @@ int CommandsQueue_test() block_t *data = block_Alloc(0); Expect(data); data->i_dts = VLC_TICK_0 + vlc_tick_from_sec(i); - cmd = queue.factory()->createEsOutSendCommand(id0, data); + cmd = factory.createEsOutSendCommand(id0, data); queue.Schedule(cmd); } Expect(queue.getPCR() == VLC_TICK_INVALID); @@ -140,7 +140,7 @@ int CommandsQueue_test() Expect(queue.getDemuxedAmount(VLC_TICK_0) == 0); Expect(queue.getBufferingLevel() == VLC_TICK_INVALID); /* commit some */ - cmd = queue.factory()->createEsOutControlPCRCommand(0, VLC_TICK_0 + vlc_tick_from_sec(8)); + cmd = factory.createEsOutControlPCRCommand(0, VLC_TICK_0 + vlc_tick_from_sec(8)); queue.Schedule(cmd); Expect(queue.getDemuxedAmount(VLC_TICK_0) == vlc_tick_from_sec(8)); /* PCR committed data up to 8s */ Expect(queue.getBufferingLevel() == VLC_TICK_0 + vlc_tick_from_sec(8)); @@ -148,7 +148,7 @@ int CommandsQueue_test() Expect(queue.getDemuxedAmount(VLC_TICK_0 + vlc_tick_from_sec(7)) == vlc_tick_from_sec(1)); Expect(queue.getPCR() == VLC_TICK_INVALID); /* extend through PCR */ - cmd = queue.factory()->createEsOutControlPCRCommand(0, VLC_TICK_0 + vlc_tick_from_sec(10)); + cmd = factory.createEsOutControlPCRCommand(0, VLC_TICK_0 + vlc_tick_from_sec(10)); queue.Schedule(cmd); Expect(queue.getBufferingLevel() == VLC_TICK_0 + vlc_tick_from_sec(10)); Expect(queue.getDemuxedAmount(VLC_TICK_0) == vlc_tick_from_sec(10)); @@ -167,10 +167,10 @@ int CommandsQueue_test() block_t *data = block_Alloc(0); Expect(data); data->i_dts = VLC_TICK_0 + vlc_tick_from_sec(11); - cmd = queue.factory()->createEsOutSendCommand(id0, data); + cmd = factory.createEsOutSendCommand(id0, data); queue.Schedule(cmd); } while(0); - cmd = queue.factory()->createEsOutControlPCRCommand(0, VLC_TICK_0 + vlc_tick_from_sec(11)); + cmd = factory.createEsOutControlPCRCommand(0, VLC_TICK_0 + vlc_tick_from_sec(11)); queue.Schedule(cmd); Expect(queue.getPCR() == VLC_TICK_0 + vlc_tick_from_sec(3)); /* should be unchanged */ Expect(queue.getDemuxedAmount(VLC_TICK_0 + vlc_tick_from_sec(3)) == vlc_tick_from_sec(7)); @@ -196,12 +196,12 @@ int CommandsQueue_test() block_t *data = block_Alloc(0); Expect(data); data->i_dts = VLC_TICK_0 + OFFSET + vlc_tick_from_sec(i); - cmd = queue.factory()->createEsOutSendCommand(id, data); + cmd = factory.createEsOutSendCommand(id, data); queue.Schedule(cmd); } } - cmd = queue.factory()->createEsOutControlPCRCommand(0, VLC_TICK_0 + OFFSET + vlc_tick_from_sec(10)); + cmd = factory.createEsOutControlPCRCommand(0, VLC_TICK_0 + OFFSET + vlc_tick_from_sec(10)); queue.Schedule(cmd); Expect(esout.output.empty()); queue.Process(VLC_TICK_0 + OFFSET - 1); @@ -236,11 +236,11 @@ int CommandsQueue_test() block_t *data = block_Alloc(0); Expect(data); data->i_dts = VLC_TICK_0 + OFFSET + vlc_tick_from_sec(k * 2 + i); - cmd = queue.factory()->createEsOutSendCommand(id, data); + cmd = factory.createEsOutSendCommand(id, data); queue.Schedule(cmd); } } - cmd = queue.factory()->createEsOutControlPCRCommand(0, + cmd = factory.createEsOutControlPCRCommand(0, VLC_TICK_0 + OFFSET + vlc_tick_from_sec( (k*2)+1 )); queue.Schedule(cmd); } @@ -271,11 +271,11 @@ int CommandsQueue_test() Expect(data); if(i==0) data->i_dts = VLC_TICK_0 + OFFSET + vlc_tick_from_sec(k); - cmd = queue.factory()->createEsOutSendCommand(id, data); + cmd = factory.createEsOutSendCommand(id, data); queue.Schedule(cmd); } } - cmd = queue.factory()->createEsOutControlPCRCommand(0, + cmd = factory.createEsOutControlPCRCommand(0, VLC_TICK_0 + OFFSET + vlc_tick_from_sec(k)); queue.Schedule(cmd); } @@ -303,12 +303,12 @@ int CommandsQueue_test() for(size_t i=0; i<2; i++) { const vlc_tick_t now = VLC_TICK_0 + OFFSET + vlc_tick_from_sec(i); - cmd = queue.factory()->createEsOutControlPCRCommand(0, now); + cmd = factory.createEsOutControlPCRCommand(0, now); queue.Schedule(cmd); block_t *data = block_Alloc(0); Expect(data); data->i_dts = now; - cmd = queue.factory()->createEsOutSendCommand(id0, data); + cmd = factory.createEsOutSendCommand(id0, data); queue.Schedule(cmd); } queue.Process(VLC_TICK_0 + OFFSET + vlc_tick_from_sec(0)); diff --git a/modules/demux/hls/HLSStreams.cpp b/modules/demux/hls/HLSStreams.cpp index a612c98586..022c940e9c 100644 --- a/modules/demux/hls/HLSStreams.cpp +++ b/modules/demux/hls/HLSStreams.cpp @@ -116,7 +116,7 @@ block_t * HLSStream::checkBlock(block_t *p_block, bool b_first) if( b_meta_updated ) { b_meta_updated = false; - AbstractCommand *command = fakeEsOut()->commandsQueue()->factory()->createEsOutMetaCommand( fakeesout, -1, p_meta ); + AbstractCommand *command = fakeEsOut()->commandsFactory()->createEsOutMetaCommand( fakeesout, -1, p_meta ); if( command ) fakeEsOut()->commandsQueue()->Schedule( command ); } _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits