[vlc-commits] demux: ts: just keep logical id on ES

Francois Cartegnie git at videolan.org
Tue Mar 31 21:22:40 CEST 2015


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Fri Mar 27 18:49:59 2015 +0100| [1dba29e500fb4648faf5251d0658914b4ff19cd4] | committer: Francois Cartegnie

demux: ts: just keep logical id on ES

descriptors can then be updated and we'll
be able to do delayed es fmt setup (OD stream parsing)

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

 modules/demux/ts.c |  168 ++++++++++++++++++++++++++--------------------------
 1 file changed, 83 insertions(+), 85 deletions(-)

diff --git a/modules/demux/ts.c b/modules/demux/ts.c
index fc4cb4d..302f366 100644
--- a/modules/demux/ts.c
+++ b/modules/demux/ts.c
@@ -232,7 +232,7 @@ typedef struct
 {
     es_format_t  fmt;
     es_out_id_t *id;
-    const es_mpeg4_descriptor_t *p_mpeg4desc;
+    uint16_t i_sl_es_id;
 } ts_pes_es_t;
 
 typedef enum
@@ -479,6 +479,9 @@ static void PCRHandle( demux_t *p_demux, ts_pid_t *, block_t * );
 static void PCRFixHandle( demux_t *, ts_pmt_t *, block_t * );
 static int64_t TimeStampWrapAround( ts_pmt_t *, int64_t );
 
+/* MPEG4 related */
+static const es_mpeg4_descriptor_t * GetMPEG4DescByEsId( const ts_pmt_t *, uint16_t );
+
 #define TS_USER_PMT_NUMBER (0)
 static int UserPmt( demux_t *p_demux, const char * );
 
@@ -2145,6 +2148,7 @@ static void ParsePES( demux_t *p_demux, ts_pid_t *pid, block_t *p_pes )
     mtime_t i_dts = -1;
     mtime_t i_pts = -1;
     mtime_t i_length = 0;
+    const es_mpeg4_descriptor_t *p_mpeg4desc = NULL;
 
     assert(pid->type == TYPE_PES);
     assert(pid->p_parent && pid->p_parent->type == TYPE_PMT);
@@ -2178,6 +2182,10 @@ static void ParsePES( demux_t *p_demux, ts_pid_t *pid, block_t *p_pes )
             i_dts = TimeStampWrapAround( pid->p_parent->u.p_pmt, i_dts );
     }
 
+    if( pid->u.p_pes->es.i_sl_es_id )
+        p_mpeg4desc = GetMPEG4DescByEsId( pid->p_parent->u.p_pmt,
+                                          pid->u.p_pes->es.i_sl_es_id );
+
     if( pid->u.p_pes->es.fmt.i_codec == VLC_FOURCC( 'a', '5', '2', 'b' ) ||
         pid->u.p_pes->es.fmt.i_codec == VLC_FOURCC( 'd', 't', 's', 'b' ) )
     {
@@ -2189,10 +2197,9 @@ static void ParsePES( demux_t *p_demux, ts_pid_t *pid, block_t *p_pes )
     {
         i_skip += 1;
     }
-    else if( pid->u.p_pes->es.fmt.i_codec == VLC_CODEC_SUBT &&
-             pid->u.p_pes->es.p_mpeg4desc )
+    else if( pid->u.p_pes->es.fmt.i_codec == VLC_CODEC_SUBT && p_mpeg4desc )
     {
-        const decoder_config_descriptor_t *dcd = &pid->u.p_pes->es.p_mpeg4desc->dec_descr;
+        const decoder_config_descriptor_t *dcd = &p_mpeg4desc->dec_descr;
 
         if( dcd->i_extra > 2 &&
             dcd->p_extra[0] == 0x10 &&
@@ -3951,94 +3958,26 @@ static bool PMTEsHasComponentTag( const dvbpsi_pmt_es_t *p_es,
     return p_si->i_component_tag == i_component_tag;
 }
 
-static const es_mpeg4_descriptor_t * GetMPEG4DescByEsId( const iod_descriptor_t *iod,
-                                                         uint16_t i_es_id )
+static const es_mpeg4_descriptor_t * GetMPEG4DescByEsId( const ts_pmt_t *pmt, uint16_t i_es_id )
 {
-    if( iod )
+    if( pmt->iod )
     for( int i = 0; i < ES_DESCRIPTOR_COUNT; i++ )
     {
-        if( iod->es_descr[i].i_es_id == i_es_id )
+        if( pmt->iod->es_descr[i].i_es_id == i_es_id )
         {
-            if ( iod->es_descr[i].b_ok )
-                return &iod->es_descr[i];
+            if ( pmt->iod->es_descr[i].b_ok )
+                return &pmt->iod->es_descr[i];
         }
     }
     return NULL;
 }
 
-static void PMTSetupEsISO14496( demux_t *p_demux, ts_pes_es_t *p_es,
-                                const ts_pmt_t *p_pmt, const dvbpsi_pmt_es_t *p_dvbpsies )
+static bool SetupISO14496LogicalStream( demux_t *p_demux, const decoder_config_descriptor_t *dcd,
+                                        es_format_t *p_fmt )
 {
-    es_format_t *p_fmt = &p_es->fmt;
-
-    const dvbpsi_descriptor_t *p_dr = p_dvbpsies->p_first_descriptor;
-    while( p_dr )
-    {
-        const es_mpeg4_descriptor_t *p_esdescr = NULL;
-        uint16_t i_es_id;
-        uint8_t i_length = p_dr->i_length;
-
-        switch( p_dr->i_tag )
-        {
-            case 0x1f: /* FMC Descriptor */
-                while( i_length >= 3 && !p_esdescr )
-                {
-                    i_es_id = ( p_dr->p_data[0] << 8 ) | p_dr->p_data[1];
-                    p_esdescr = GetMPEG4DescByEsId( p_pmt->iod, i_es_id );
-                    /* FIXME: add flexmux channel */
-                    i_length -= 3;
-                    if( p_esdescr )
-                        msg_Dbg( p_demux, "found FMC_descriptor declaring sl packetization on es_id=%"PRIu16, i_es_id );
-                }
-                break;
-            case 0x1e: /* SL Descriptor */
-                if( i_length == 2 )
-                {
-                    i_es_id = ( p_dr->p_data[0] << 8 ) | p_dr->p_data[1];
-                    p_esdescr = GetMPEG4DescByEsId( p_pmt->iod, i_es_id );
-                    if( p_esdescr )
-                        msg_Dbg( p_demux, "found SL_descriptor declaring sl packetization on es_id=%"PRIu16, i_es_id );
-                }
-                break;
-            default:
-                break;
-        }
-
-        if( p_esdescr )
-        {
-            if( !p_esdescr->b_ok )
-            {
-                msg_Dbg( p_demux, "MPEG-4 descriptor not yet available on es_id=%"PRIu16, i_es_id );
-            }
-            else
-            {
-                p_es->p_mpeg4desc = p_esdescr;
-                break;
-            }
-        }
-
-        p_dr = p_dr->p_next;
-    }
-
-    if( !p_es->p_mpeg4desc )
-    {
-        switch( p_dvbpsies->i_type )
-        {
-        /* non fatal, set by packetizer */
-        case 0x0f: /* ADTS */
-        case 0x11: /* LOAS */
-            msg_Info( p_demux, "MPEG-4 descriptor not found for pid 0x%x type 0x%x",
-                      p_dvbpsies->i_pid, p_dvbpsies->i_type );
-            break;
-        default:
-            msg_Err( p_demux, "MPEG-4 descriptor not found for pid 0x%x type 0x%x",
-                     p_dvbpsies->i_pid, p_dvbpsies->i_type );
-            break;
-        }
-        return;
-    }
+    msg_Dbg( p_demux, "     - IOD objecttype: %"PRIx8" streamtype:%"PRIx8,
+             dcd->i_objectTypeIndication, dcd->i_streamType );
 
-    const decoder_config_descriptor_t *dcd = &p_es->p_mpeg4desc->dec_descr;
     if( dcd->i_streamType == 0x04 )    /* VisualStream */
     {
         p_fmt->i_cat = VIDEO_ES;
@@ -4115,6 +4054,67 @@ static void PMTSetupEsISO14496( demux_t *p_demux, ts_pes_es_t *p_es,
                 p_fmt->i_extra = 0;
         }
     }
+
+    return true;
+}
+
+static void SetupISO14496Descriptors( demux_t *p_demux, ts_pes_es_t *p_es,
+                                      const ts_pmt_t *p_pmt, const dvbpsi_pmt_es_t *p_dvbpsies )
+{
+    const dvbpsi_descriptor_t *p_dr = p_dvbpsies->p_first_descriptor;
+
+    while( p_dr )
+    {
+        uint8_t i_length = p_dr->i_length;
+
+        switch( p_dr->i_tag )
+        {
+            case 0x1f: /* FMC Descriptor */
+                while( i_length >= 3 && !p_es->i_sl_es_id )
+                {
+                    p_es->i_sl_es_id = ( p_dr->p_data[0] << 8 ) | p_dr->p_data[1];
+                    /* FIXME: map all ids and flexmux channels */
+                    i_length -= 3;
+                    msg_Dbg( p_demux, "     - found FMC_descriptor mapping es_id=%"PRIu16, p_es->i_sl_es_id );
+                }
+                break;
+            case 0x1e: /* SL Descriptor */
+                if( i_length == 2 )
+                {
+                    p_es->i_sl_es_id = ( p_dr->p_data[0] << 8 ) | p_dr->p_data[1];
+                    msg_Dbg( p_demux, "     - found SL_descriptor mapping es_id=%"PRIu16, p_es->i_sl_es_id );
+                }
+                break;
+            default:
+                break;
+        }
+
+        p_dr = p_dr->p_next;
+    }
+
+    if( p_es->i_sl_es_id )
+    {
+        const es_mpeg4_descriptor_t *p_mpeg4desc = GetMPEG4DescByEsId( p_pmt, p_es->i_sl_es_id );
+        if( p_mpeg4desc && p_mpeg4desc->b_ok )
+        {
+            if( !SetupISO14496LogicalStream( p_demux, &p_mpeg4desc->dec_descr, &p_es->fmt ) )
+                msg_Dbg( p_demux, "     - IOD not yet available for es_id=%"PRIu16, p_es->i_sl_es_id );
+        }
+    }
+    else
+    {
+        switch( p_dvbpsies->i_type )
+        {
+        /* non fatal, set by packetizer */
+        case 0x0f: /* ADTS */
+        case 0x11: /* LOAS */
+            msg_Info( p_demux, "     - SL/FMC descriptor not found/matched" );
+            break;
+        default:
+            msg_Err( p_demux, "      - SL/FMC descriptor not found/matched" );
+            break;
+        }
+    }
 }
 
 typedef struct
@@ -4984,8 +4984,6 @@ static void PMTCallBack( void *data, dvbpsi_pmt_t *p_dvbpsipmt )
     {
         IODFree( p_pmt->iod );
         p_pmt->iod = NULL;
-        for( int i=0; i<old_es_rm.i_size; i++ )
-            old_es_rm.p_elems[i]->u.p_pes->es.p_mpeg4desc = NULL;
     }
 
     msg_Dbg( p_demux, "new PMT program number=%d version=%d pid_pcr=%d",
@@ -5230,7 +5228,7 @@ static void PMTCallBack( void *data, dvbpsi_pmt_t *p_dvbpsipmt )
             case 0x10:
             case 0x11:
             case 0x12:
-                PMTSetupEsISO14496( p_demux, &p_pes->es, p_pmt, p_dvbpsies );
+                SetupISO14496Descriptors( p_demux, &p_pes->es, p_pmt, p_dvbpsies );
                 break;
             case 0x83:
                 /* LPCM (audio) */
@@ -5583,7 +5581,7 @@ static ts_pes_t *ts_pes_New( demux_t *p_demux )
         return NULL;
 
     pes->es.id = NULL;
-    pes->es.p_mpeg4desc = NULL;
+    pes->es.i_sl_es_id = 0;
     es_format_Init( &pes->es.fmt, UNKNOWN_ES, 0 );
     ARRAY_INIT( pes->extra_es );
     pes->data_type = TS_ES_DATA_PES;



More information about the vlc-commits mailing list