[vlc-commits] commit: Preparse the TS until at least one ES is declared. (Laurent Aimar )

git at videolan.org git at videolan.org
Sun Jun 27 19:04:45 CEST 2010


vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | Sun Jun 27 00:18:46 2010 +0200| [46576f85796c8fd8a06df1d39102fed7b6f9a82c] | committer: Laurent Aimar 

Preparse the TS until at least one ES is declared.

It is a better workaround to #3075 and it makes preparsing return the ES list
(not yet perfect for that).

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

 modules/demux/ts.c |   45 +++++++++++++++++++++++++++++++++++----------
 1 files changed, 35 insertions(+), 10 deletions(-)

diff --git a/modules/demux/ts.c b/modules/demux/ts.c
index d6b26f6..720034a 100644
--- a/modules/demux/ts.c
+++ b/modules/demux/ts.c
@@ -359,6 +359,7 @@ struct demux_sys_t
     bool        b_user_pmt;
     int         i_pmt;
     ts_pid_t    **pmt;
+    int         i_pmt_es;
 
     /* */
     bool        b_es_id_pid;
@@ -400,7 +401,7 @@ static int DemuxFile( demux_t *p_demux );
 static int Control( demux_t *p_demux, int i_query, va_list args );
 
 static void PIDInit ( ts_pid_t *pid, bool b_psi, ts_psi_t *p_owner );
-static void PIDClean( es_out_t *out, ts_pid_t *pid );
+static void PIDClean( demux_t *, ts_pid_t *pid );
 static int  PIDFillFormat( ts_pid_t *pid, int i_stream_type );
 
 static void PATCallBack( demux_t *, dvbpsi_pat_t * );
@@ -708,6 +709,7 @@ static int Open( vlc_object_t *p_this )
 
     /* Init PMT array */
     TAB_INIT( p_sys->i_pmt, p_sys->pmt );
+    p_sys->i_pmt_es = 0;
 
     /* Read config */
     p_sys->b_es_id_pid = var_CreateGetBool( p_demux, "ts-es-id-pid" );
@@ -804,6 +806,14 @@ static int Open( vlc_object_t *p_this )
     p_sys->b_silent = var_CreateGetBool( p_demux, "ts-silent" );
     p_sys->b_split_es = var_InheritBool( p_demux, "ts-split-es" );
 
+    while( !p_sys->b_file_out && p_sys->i_pmt_es <= 0 &&
+           vlc_object_alive( p_demux ) )
+    {
+        if( p_demux->pf_demux( p_demux ) != 1 )
+            break;
+    }
+
+
     return VLC_SUCCESS;
 }
 
@@ -840,14 +850,14 @@ static void Close( vlc_object_t *p_this )
                 }
                 else
                 {
-                    PIDClean( p_demux->out, pid );
+                    PIDClean( p_demux, pid );
                 }
                 break;
             }
         }
         else if( pid->b_valid && pid->es )
         {
-            PIDClean( p_demux->out, pid );
+            PIDClean( p_demux, pid );
         }
 
         if( pid->b_seen )
@@ -1036,6 +1046,7 @@ static int DemuxFile( demux_t *p_demux )
 static int Demux( demux_t *p_demux )
 {
     demux_sys_t *p_sys = p_demux->p_sys;
+    bool b_wait_es = p_sys->i_pmt_es <= 0;
 
     /* We read at most 100 TS packet or until a frame is completed */
     for( int i_pkt = 0; i_pkt < p_sys->i_ts_read; i_pkt++ )
@@ -1151,7 +1162,7 @@ static int Demux( demux_t *p_demux )
         }
         p_pid->b_seen = true;
 
-        if( b_frame )
+        if( b_frame || ( b_wait_es && p_sys->i_pmt_es > 0 ) )
             break;
     }
 
@@ -1522,6 +1533,7 @@ static int UserPmt( demux_t *p_demux, const char *psz_fmt )
                          (char*)&pid->es->fmt.i_codec );
                 pid->es->id = es_out_Add( p_demux->out,
                                           &pid->es->fmt );
+                p_sys->i_pmt_es++;
             }
         }
 
@@ -1603,8 +1615,11 @@ static void PIDInit( ts_pid_t *pid, bool b_psi, ts_psi_t *p_owner )
     }
 }
 
-static void PIDClean( es_out_t *out, ts_pid_t *pid )
+static void PIDClean( demux_t *p_demux, ts_pid_t *pid )
 {
+    demux_sys_t *p_sys = p_demux->p_sys;
+    es_out_t *out = p_demux->out;
+
     if( pid->psi )
     {
         if( pid->psi->handle )
@@ -1623,7 +1638,10 @@ static void PIDClean( es_out_t *out, ts_pid_t *pid )
     else
     {
         if( pid->es->id )
+        {
             es_out_Del( out, pid->es->id );
+            p_sys->i_pmt_es--;
+        }
 
         if( pid->es->p_pes )
             block_ChainRelease( pid->es->p_pes );
@@ -1635,7 +1653,10 @@ static void PIDClean( es_out_t *out, ts_pid_t *pid )
         for( int i = 0; i < pid->i_extra_es; i++ )
         {
             if( pid->extra_es[i]->id )
+            {
                 es_out_Del( out, pid->extra_es[i]->id );
+                p_sys->i_pmt_es--;
+            }
 
             if( pid->extra_es[i]->p_pes )
                 block_ChainRelease( pid->extra_es[i]->p_pes );
@@ -1869,6 +1890,9 @@ static void PCRHandle( demux_t *p_demux, ts_pid_t *pid, block_t *p_bk )
     demux_sys_t   *p_sys = p_demux->p_sys;
     const uint8_t *p = p_bk->p_buffer;
 
+    if( p_sys->i_pmt_es <= 0 )
+        return;
+
     if( ( p[3]&0x20 ) && /* adaptation */
         ( p[5]&0x10 ) &&
         ( p[4] >= 7 ) )
@@ -4156,7 +4180,7 @@ static void PMTCallBack( demux_t *p_demux, dvbpsi_pmt_t *p_pmt )
             {
                 if( old_pid )
                 {
-                    PIDClean( p_demux->out, old_pid );
+                    PIDClean( p_demux, old_pid );
                     TAB_REMOVE( i_clean, pp_clean, old_pid );
                     old_pid = 0;
                 }
@@ -4167,13 +4191,14 @@ static void PMTCallBack( demux_t *p_demux, dvbpsi_pmt_t *p_pmt )
                     pid->extra_es[i]->id =
                         es_out_Add( p_demux->out, &pid->extra_es[i]->fmt );
                 }
+                p_sys->i_pmt_es += 1 + pid->i_extra_es;
             }
         }
 
         /* Add ES to the list */
         if( old_pid )
         {
-            PIDClean( p_demux->out, old_pid );
+            PIDClean( p_demux, old_pid );
             TAB_REMOVE( i_clean, pp_clean, old_pid );
         }
         p_sys->pid[p_es->i_pid] = *pid;
@@ -4211,7 +4236,7 @@ static void PMTCallBack( demux_t *p_demux, dvbpsi_pmt_t *p_pmt )
                             false );
         }
 
-        PIDClean( p_demux->out, pp_clean[i] );
+        PIDClean( p_demux, pp_clean[i] );
     }
     if( i_clean )
         free( pp_clean );
@@ -4298,7 +4323,7 @@ static void PATCallBack( demux_t *p_demux, dvbpsi_pat_t *p_pat )
                             p_sys->b_access_control = false;
                     }
 
-                    PIDClean( p_demux->out, pid );
+                    PIDClean( p_demux, pid );
                     break;
                 }
             }
@@ -4321,7 +4346,7 @@ static void PATCallBack( demux_t *p_demux, dvbpsi_pat_t *p_pat )
                 es_out_Control( p_demux->out, ES_OUT_DEL_GROUP, i_number );
             }
 
-            PIDClean( p_demux->out, &p_sys->pid[pmt_rm[i]->i_pid] );
+            PIDClean( p_demux, &p_sys->pid[pmt_rm[i]->i_pid] );
             TAB_REMOVE( p_sys->i_pmt, p_sys->pmt, pmt_rm[i] );
         }
 



More information about the vlc-commits mailing list