[vlc-commits] demux: ts: split sending block/fanout

Francois Cartegnie git at videolan.org
Wed Jun 21 21:33:48 CEST 2017


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Mon Jun 19 15:20:57 2017 +0200| [457a9f278a5fb9a9d8b6c96cf46fc75b90e0cc66] | committer: Francois Cartegnie

demux: ts: split sending block/fanout

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=457a9f278a5fb9a9d8b6c96cf46fc75b90e0cc66
---

 modules/demux/mpeg/ts.c | 112 +++++++++++++++++++++++++++---------------------
 1 file changed, 62 insertions(+), 50 deletions(-)

diff --git a/modules/demux/mpeg/ts.c b/modules/demux/mpeg/ts.c
index 1b100e6dc0..585ba5945e 100644
--- a/modules/demux/mpeg/ts.c
+++ b/modules/demux/mpeg/ts.c
@@ -1315,6 +1315,67 @@ static block_t * ConvertPESBlock( demux_t *p_demux, ts_pes_es_t *p_es,
 }
 
 /****************************************************************************
+ * fanouts current block to all subdecoders / shared pid es
+ ****************************************************************************/
+static void SendDataChain( demux_t *p_demux, ts_pes_es_t *p_es, block_t *p_chain )
+{
+    while( p_chain )
+    {
+        block_t *p_block = p_chain;
+        p_chain = p_block->p_next;
+        p_block->p_next = NULL;
+
+        ts_pes_es_t *p_es_send = p_es;
+        if( p_es_send->i_next_block_flags )
+        {
+            p_block->i_flags |= p_es_send->i_next_block_flags;
+            p_es_send->i_next_block_flags = 0;
+        }
+
+        while( p_es_send )
+        {
+            if( p_es_send->p_program->b_selected )
+            {
+                /* Send a copy to each extra es */
+                ts_pes_es_t *p_extra_es = p_es_send->p_extraes;
+                while( p_extra_es )
+                {
+                    if( p_extra_es->id )
+                    {
+                        block_t *p_dup = block_Duplicate( p_block );
+                        if( p_dup )
+                            es_out_Send( p_demux->out, p_extra_es->id, p_dup );
+                    }
+                    p_extra_es = p_extra_es->p_next;
+                }
+
+                if( p_es_send->p_next )
+                {
+                    if( p_es_send->id )
+                    {
+                        block_t *p_dup = block_Duplicate( p_block );
+                        if( p_dup )
+                            es_out_Send( p_demux->out, p_es_send->id, p_dup );
+                    }
+                }
+                else
+                {
+                    if( p_es_send->id )
+                    {
+                        es_out_Send( p_demux->out, p_es_send->id, p_block );
+                        p_block = NULL;
+                    }
+                }
+            }
+            p_es_send = p_es_send->p_next;
+        }
+
+        if( p_block )
+            block_Release( p_block );
+    }
+}
+
+/****************************************************************************
  * gathering stuff
  ****************************************************************************/
 static void ParsePESDataChain( demux_t *p_demux, ts_pid_t *pid, block_t *p_pes )
@@ -1547,56 +1608,7 @@ static void ParsePESDataChain( demux_t *p_demux, ts_pid_t *pid, block_t *p_pes )
                     }
                 }
 
-                if ( p_block )
-                {
-                    ts_pes_es_t *p_es_send = p_es;
-                    if( p_es_send->i_next_block_flags )
-                    {
-                        p_block->i_flags |= p_es_send->i_next_block_flags;
-                        p_es_send->i_next_block_flags = 0;
-                    }
-
-                    while( p_es_send )
-                    {
-                        if( p_es_send->p_program->b_selected )
-                        {
-                            /* Send a copy to each extra es */
-                            ts_pes_es_t *p_extra_es = p_es_send->p_extraes;
-                            while( p_extra_es )
-                            {
-                                if( p_extra_es->id )
-                                {
-                                    block_t *p_dup = block_Duplicate( p_block );
-                                    if( p_dup )
-                                        es_out_Send( p_demux->out, p_extra_es->id, p_dup );
-                                }
-                                p_extra_es = p_extra_es->p_next;
-                            }
-
-                            if( p_es_send->p_next )
-                            {
-                                if( p_es_send->id )
-                                {
-                                    block_t *p_dup = block_Duplicate( p_block );
-                                    if( p_dup )
-                                        es_out_Send( p_demux->out, p_es_send->id, p_dup );
-                                }
-                            }
-                            else
-                            {
-                                if( p_es_send->id )
-                                {
-                                    es_out_Send( p_demux->out, p_es_send->id, p_block );
-                                    p_block = NULL;
-                                }
-                            }
-                        }
-                        p_es_send = p_es_send->p_next;
-                    }
-
-                    if( p_block )
-                        block_Release( p_block );
-                }
+                SendDataChain( p_demux, p_es, p_block );
             }
             else
             {



More information about the vlc-commits mailing list