[vlc-commits] demux: adaptive: refactor es_out handling
Francois Cartegnie
git at videolan.org
Thu Jul 18 20:40:55 CEST 2019
vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | 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;
More information about the vlc-commits
mailing list