[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