vlc | branch: master | Francois Cartegnie <[email protected]> | Thu Jul 11 13:09:49 2019 +0200| [069271c3a9f851138f4cb019fcac71160efa914c] | committer: Francois Cartegnie
demux: adaptive: refactor es_out handling > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=069271c3a9f851138f4cb019fcac71160efa914c --- modules/demux/adaptive/Streams.cpp | 2 +- modules/demux/adaptive/plumbing/FakeESOut.cpp | 158 +++++++++++++++++--------- modules/demux/adaptive/plumbing/FakeESOut.hpp | 37 ++++-- 3 files changed, 132 insertions(+), 65 deletions(-) diff --git a/modules/demux/adaptive/Streams.cpp b/modules/demux/adaptive/Streams.cpp index e4f0bf4efb..9bee3c4396 100644 --- a/modules/demux/adaptive/Streams.cpp +++ b/modules/demux/adaptive/Streams.cpp @@ -595,7 +595,7 @@ void AbstractStream::fillExtraFMTInfo( es_format_t *p_fmt ) const AbstractDemuxer * AbstractStream::createDemux(const StreamFormat &format) { AbstractDemuxer *ret = newDemux( VLC_OBJECT(p_realdemux), format, - fakeEsOut()->getEsOut(), demuxersource ); + (es_out_t *)fakeEsOut(), demuxersource ); if(ret && !ret->create()) { delete ret; diff --git a/modules/demux/adaptive/plumbing/FakeESOut.cpp b/modules/demux/adaptive/plumbing/FakeESOut.cpp index aaad839522..052191d3e0 100644 --- a/modules/demux/adaptive/plumbing/FakeESOut.cpp +++ b/modules/demux/adaptive/plumbing/FakeESOut.cpp @@ -31,21 +31,83 @@ using namespace adaptive; -static const struct es_out_callbacks esOutCallbacks = +namespace adaptive { - FakeESOut::esOutAdd_Callback, - FakeESOut::esOutSend_Callback, - FakeESOut::esOutDel_Callback, - FakeESOut::esOutControl_Callback, - FakeESOut::esOutDestroy_Callback, -}; + class EsOutCallbacks + { + public: + /* static callbacks for demuxer */ + static es_out_id_t *es_out_Add( es_out_t *, const es_format_t * ); + static int es_out_Send( es_out_t *, es_out_id_t *, block_t * ); + static void es_out_Del( es_out_t *, es_out_id_t * ); + static int es_out_Control( es_out_t *, int, va_list ); + static void es_out_Destroy( es_out_t * ); + static const struct es_out_callbacks cbs; + struct Private + { + AbstractFakeEsOut *fake; + es_out_t es_out; + }; + }; +} -struct adaptive::es_out_fake +const struct es_out_callbacks EsOutCallbacks::cbs = { - FakeESOut *fake; - es_out_t es_out; + EsOutCallbacks::es_out_Add, + EsOutCallbacks::es_out_Send, + EsOutCallbacks::es_out_Del, + EsOutCallbacks::es_out_Control, + EsOutCallbacks::es_out_Destroy, }; +es_out_id_t * EsOutCallbacks::es_out_Add(es_out_t *fakees, const es_format_t *p_fmt) +{ + AbstractFakeEsOut *me = container_of(fakees, Private, es_out)->fake; + return me->esOutAdd(p_fmt); +} + +int EsOutCallbacks::es_out_Send(es_out_t *fakees, es_out_id_t *p_es, block_t *p_block) +{ + AbstractFakeEsOut *me = container_of(fakees, Private, es_out)->fake; + return me->esOutSend(p_es, p_block); +} + +void EsOutCallbacks::es_out_Del(es_out_t *fakees, es_out_id_t *p_es) +{ + AbstractFakeEsOut *me = container_of(fakees, Private, es_out)->fake; + me->esOutDel(p_es); +} + +int EsOutCallbacks::es_out_Control(es_out_t *fakees, int i_query, va_list args) +{ + AbstractFakeEsOut *me = container_of(fakees, Private, es_out)->fake; + return me->esOutControl(i_query, args); +} + +void EsOutCallbacks::es_out_Destroy(es_out_t *fakees) +{ + AbstractFakeEsOut *me = container_of(fakees, Private, es_out)->fake; + me->esOutDestroy(); +} + +AbstractFakeEsOut::AbstractFakeEsOut() +{ + EsOutCallbacks::Private *priv = new EsOutCallbacks::Private; + priv->fake = this; + priv->es_out.cbs = &EsOutCallbacks::cbs; + esoutpriv = priv; +} + +AbstractFakeEsOut::~AbstractFakeEsOut() +{ + delete reinterpret_cast<EsOutCallbacks::Private *>(esoutpriv); +} + +AbstractFakeEsOut::operator es_out_t *() +{ + return & reinterpret_cast<EsOutCallbacks::Private *>(esoutpriv)->es_out; +} + FakeESOut::LockedFakeEsOut::LockedFakeEsOut(FakeESOut &q) { p = &q; @@ -57,6 +119,11 @@ FakeESOut::LockedFakeEsOut::~LockedFakeEsOut() vlc_mutex_unlock(&p->lock); } +FakeESOut::LockedFakeEsOut::operator es_out_t*() +{ + return (es_out_t *) *p; +} + FakeESOut & FakeESOut::LockedFakeEsOut::operator *() { return *p; @@ -68,17 +135,15 @@ FakeESOut * FakeESOut::LockedFakeEsOut::operator ->() } FakeESOut::FakeESOut( es_out_t *es, CommandsQueue *queue ) - : real_es_out( es ) + : AbstractFakeEsOut() + , real_es_out( es ) , extrainfo( NULL ) , commandsqueue( queue ) - , fakeesout( new struct es_out_fake ) , timestamps_offset( 0 ) { associated.b_timestamp_set = false; expected.b_timestamp_set = false; timestamp_first = 0; - fakeesout->fake = this; - fakeesout->es_out.cbs = &esOutCallbacks; priority = ES_PRIORITY_SELECTABLE_MIN; vlc_mutex_init(&lock); @@ -94,17 +159,11 @@ CommandsQueue * FakeESOut::commandsQueue() return commandsqueue; } -es_out_t * FakeESOut::getEsOut() -{ - return &fakeesout->es_out; -} - FakeESOut::~FakeESOut() { recycleAll(); gc(); - delete fakeesout; delete commandsqueue; vlc_mutex_destroy(&lock); } @@ -401,25 +460,24 @@ void FakeESOut::declareEs(const es_format_t *fmt) /* Static callbacks */ /* Always pass Fake ES ID to slave demuxes, it is just an opaque struct to them */ -es_out_id_t * FakeESOut::esOutAdd_Callback(es_out_t *fakees, const es_format_t *p_fmt) +es_out_id_t * FakeESOut::esOutAdd(const es_format_t *p_fmt) { - FakeESOut *me = container_of(fakees, es_out_fake, es_out)->fake; - vlc_mutex_locker locker(&me->lock); + vlc_mutex_locker locker(&lock); if( p_fmt->i_cat != VIDEO_ES && p_fmt->i_cat != AUDIO_ES && p_fmt->i_cat != SPU_ES ) return NULL; /* Feed the slave demux/stream_Demux with FakeESOutID struct, * we'll create real ES later on main demux on execution */ - FakeESOutID *es_id = me->createNewID( p_fmt ); + FakeESOutID *es_id = createNewID( p_fmt ); if( likely(es_id) ) { assert(!es_id->scheduledForDeletion()); - AbstractCommand *command = me->commandsqueue->factory()->createEsOutAddCommand( es_id ); + AbstractCommand *command = commandsqueue->factory()->createEsOutAddCommand( es_id ); if( likely(command) ) { - me->fakeesidlist.push_back(es_id); - me->commandsqueue->Schedule( command ); + fakeesidlist.push_back(es_id); + commandsqueue->Schedule( command ); return reinterpret_cast<es_out_id_t *>(es_id); } else @@ -430,44 +488,41 @@ es_out_id_t * FakeESOut::esOutAdd_Callback(es_out_t *fakees, const es_format_t * return NULL; } -int FakeESOut::esOutSend_Callback(es_out_t *fakees, es_out_id_t *p_es, block_t *p_block) +int FakeESOut::esOutSend(es_out_id_t *p_es, block_t *p_block) { - FakeESOut *me = container_of(fakees, es_out_fake, es_out)->fake; - vlc_mutex_locker locker(&me->lock); + vlc_mutex_locker locker(&lock); FakeESOutID *es_id = reinterpret_cast<FakeESOutID *>( p_es ); assert(!es_id->scheduledForDeletion()); - p_block->i_dts = me->fixTimestamp( p_block->i_dts ); - p_block->i_pts = me->fixTimestamp( p_block->i_pts ); + p_block->i_dts = fixTimestamp( p_block->i_dts ); + p_block->i_pts = fixTimestamp( p_block->i_pts ); - AbstractCommand *command = me->commandsqueue->factory()->createEsOutSendCommand( es_id, p_block ); + AbstractCommand *command = commandsqueue->factory()->createEsOutSendCommand( es_id, p_block ); if( likely(command) ) { - me->commandsqueue->Schedule( command ); + commandsqueue->Schedule( command ); return VLC_SUCCESS; } return VLC_EGENERIC; } -void FakeESOut::esOutDel_Callback(es_out_t *fakees, es_out_id_t *p_es) +void FakeESOut::esOutDel(es_out_id_t *p_es) { - FakeESOut *me = container_of(fakees, es_out_fake, es_out)->fake; - vlc_mutex_locker locker(&me->lock); + vlc_mutex_locker locker(&lock); FakeESOutID *es_id = reinterpret_cast<FakeESOutID *>( p_es ); - AbstractCommand *command = me->commandsqueue->factory()->createEsOutDelCommand( es_id ); + AbstractCommand *command = commandsqueue->factory()->createEsOutDelCommand( es_id ); if( likely(command) ) { es_id->setScheduledForDeletion(); - me->commandsqueue->Schedule( command ); + commandsqueue->Schedule( command ); } } -int FakeESOut::esOutControl_Callback(es_out_t *fakees, int i_query, va_list args) +int FakeESOut::esOutControl(int i_query, va_list args) { - FakeESOut *me = container_of(fakees, es_out_fake, es_out)->fake; - vlc_mutex_locker locker(&me->lock); + vlc_mutex_locker locker(&lock); switch( i_query ) { @@ -480,11 +535,11 @@ int FakeESOut::esOutControl_Callback(es_out_t *fakees, int i_query, va_list args else i_group = 0; vlc_tick_t pcr = va_arg( args, vlc_tick_t ); - pcr = me->fixTimestamp( pcr ); - AbstractCommand *command = me->commandsqueue->factory()->createEsOutControlPCRCommand( i_group, pcr ); + pcr = fixTimestamp( pcr ); + AbstractCommand *command = commandsqueue->factory()->createEsOutControlPCRCommand( i_group, pcr ); if( likely(command) ) { - me->commandsqueue->Schedule( command ); + commandsqueue->Schedule( command ); return VLC_SUCCESS; } } @@ -494,10 +549,10 @@ int FakeESOut::esOutControl_Callback(es_out_t *fakees, 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 = me->commandsqueue->factory()->createEsOutMetaCommand( -1, p_meta ); + AbstractCommand *command = commandsqueue->factory()->createEsOutMetaCommand( -1, p_meta ); if( likely(command) ) { - me->commandsqueue->Schedule( command ); + commandsqueue->Schedule( command ); return VLC_SUCCESS; } } @@ -522,13 +577,12 @@ int FakeESOut::esOutControl_Callback(es_out_t *fakees, int i_query, va_list args return VLC_EGENERIC; } -void FakeESOut::esOutDestroy_Callback(es_out_t *fakees) +void FakeESOut::esOutDestroy() { - FakeESOut *me = container_of(fakees, es_out_fake, es_out)->fake; - vlc_mutex_locker locker(&me->lock); + vlc_mutex_locker locker(&lock); - AbstractCommand *command = me->commandsqueue->factory()->createEsOutDestroyCommand(); + AbstractCommand *command = commandsqueue->factory()->createEsOutDestroyCommand(); if( likely(command) ) - me->commandsqueue->Schedule( command ); + commandsqueue->Schedule( command ); } /* !Static callbacks */ diff --git a/modules/demux/adaptive/plumbing/FakeESOut.hpp b/modules/demux/adaptive/plumbing/FakeESOut.hpp index 3f65dbcf3f..b634499052 100644 --- a/modules/demux/adaptive/plumbing/FakeESOut.hpp +++ b/modules/demux/adaptive/plumbing/FakeESOut.hpp @@ -33,9 +33,25 @@ namespace adaptive class CommandsQueue; class FakeESOutID; - struct es_out_fake; - class FakeESOut + class AbstractFakeEsOut + { + friend class EsOutCallbacks; + public: + AbstractFakeEsOut(); + virtual ~AbstractFakeEsOut(); + operator es_out_t*(); + + private: + void *esoutpriv; + virtual es_out_id_t *esOutAdd( const es_format_t * ) = 0; + virtual int esOutSend( es_out_id_t *, block_t * ) = 0; + virtual void esOutDel( es_out_id_t * ) = 0; + virtual int esOutControl( int, va_list ) = 0; + virtual void esOutDestroy() = 0; + }; + + class FakeESOut : public AbstractFakeEsOut { public: class LockedFakeEsOut @@ -43,6 +59,7 @@ namespace adaptive friend class FakeESOut; public: ~LockedFakeEsOut(); + operator es_out_t*(); FakeESOut & operator*(); FakeESOut * operator->(); private: @@ -50,8 +67,7 @@ namespace adaptive LockedFakeEsOut(FakeESOut &q); }; FakeESOut( es_out_t *, CommandsQueue * ); - ~FakeESOut(); - es_out_t * getEsOut(); + virtual ~FakeESOut(); LockedFakeEsOut WithLock(); CommandsQueue * commandsQueue(); void setAssociatedTimestamp( vlc_tick_t ); @@ -77,21 +93,18 @@ namespace adaptive void recycleAll(); /* Cancels all commands and send fakees for recycling */ void gc(); - /* static callbacks for demuxer */ - static es_out_id_t *esOutAdd_Callback( es_out_t *, const es_format_t * ); - static int esOutSend_Callback( es_out_t *, es_out_id_t *, block_t * ); - static void esOutDel_Callback( es_out_t *, es_out_id_t * ); - static int esOutControl_Callback( es_out_t *, int, va_list ); - static void esOutDestroy_Callback( es_out_t * ); - private: friend class LockedFakeESOut; vlc_mutex_t lock; + virtual es_out_id_t *esOutAdd( const es_format_t * ); /* impl */ + virtual int esOutSend( es_out_id_t *, block_t * ); /* impl */ + virtual void esOutDel( es_out_id_t * ); /* impl */ + virtual int esOutControl( int, va_list ); /* impl */ + virtual void esOutDestroy(); /* impl */ es_out_t *real_es_out; FakeESOutID * createNewID( const es_format_t * ); ExtraFMTInfoInterface *extrainfo; CommandsQueue *commandsqueue; - struct es_out_fake *fakeesout; struct { vlc_tick_t timestamp; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
