[vlc-commits] demux: ps: drop confusing stream_id shift

Francois Cartegnie git at videolan.org
Wed Mar 8 14:17:14 CET 2017


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Wed Mar  8 12:55:37 2017 +0100| [f28e383a9a999b12552bd10eb99fb42cff54d4ad] | committer: Francois Cartegnie

demux: ps: drop confusing stream_id shift

And only process PES video/audio packets

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

 modules/demux/mpeg/ps.c | 54 +++++++++++++++++++++++++++----------------------
 modules/demux/mpeg/ps.h |  2 ++
 2 files changed, 32 insertions(+), 24 deletions(-)

diff --git a/modules/demux/mpeg/ps.c b/modules/demux/mpeg/ps.c
index 1efde13..58c8dcc 100644
--- a/modules/demux/mpeg/ps.c
+++ b/modules/demux/mpeg/ps.c
@@ -101,8 +101,8 @@ struct demux_sys_t
 static int Demux  ( demux_t *p_demux );
 static int Control( demux_t *p_demux, int i_query, va_list args );
 
-static int      ps_pkt_resynch( stream_t *, uint32_t *pi_code, bool, bool );
-static block_t *ps_pkt_read   ( stream_t *, uint32_t i_code );
+static int      ps_pkt_resynch( stream_t *, bool, bool );
+static block_t *ps_pkt_read   ( stream_t * );
 
 /*****************************************************************************
  * Open
@@ -207,10 +207,9 @@ static int Demux2( demux_t *p_demux, bool b_end )
 {
     demux_sys_t *p_sys = p_demux->p_sys;
     int i_ret, i_id;
-    uint32_t i_code;
     block_t *p_pkt;
 
-    i_ret = ps_pkt_resynch( p_demux->s, &i_code, p_sys->b_cdxa, p_sys->b_have_pack );
+    i_ret = ps_pkt_resynch( p_demux->s, p_sys->b_cdxa, p_sys->b_have_pack );
     if( i_ret < 0 )
     {
         return 0;
@@ -227,7 +226,7 @@ static int Demux2( demux_t *p_demux, bool b_end )
     if( p_sys->b_lost_sync ) msg_Warn( p_demux, "found sync code" );
     p_sys->b_lost_sync = false;
 
-    if( ( p_pkt = ps_pkt_read( p_demux->s, i_code ) ) == NULL )
+    if( ( p_pkt = ps_pkt_read( p_demux->s ) ) == NULL )
     {
         return 0;
     }
@@ -324,11 +323,10 @@ static void NotifyDiscontinuity( ps_track_t *p_tk, es_out_t *out )
 static int Demux( demux_t *p_demux )
 {
     demux_sys_t *p_sys = p_demux->p_sys;
-    int i_ret, i_id, i_mux_rate;
-    uint32_t i_code;
+    int i_ret, i_mux_rate;
     block_t *p_pkt;
 
-    i_ret = ps_pkt_resynch( p_demux->s, &i_code, p_sys->b_cdxa, p_sys->b_have_pack );
+    i_ret = ps_pkt_resynch( p_demux->s, p_sys->b_cdxa, p_sys->b_have_pack );
     if( i_ret < 0 )
     {
         return VLC_DEMUXER_EOF;
@@ -355,18 +353,25 @@ static int Demux( demux_t *p_demux )
             return VLC_DEMUXER_EGENERIC;
     }
 
-    if( ( p_pkt = ps_pkt_read( p_demux->s, i_code ) ) == NULL )
+    if( ( p_pkt = ps_pkt_read( p_demux->s ) ) == NULL )
     {
         return VLC_DEMUXER_EOF;
     }
 
-    switch( i_code )
+    if( p_pkt->i_buffer < 4 )
     {
-    case PS_STREAM_ID_END_STREAM|0x100:
+        block_Release( p_pkt );
+        return VLC_DEMUXER_EGENERIC;
+    }
+
+    const uint8_t i_stream_id = p_pkt->p_buffer[3];
+    switch( i_stream_id )
+    {
+    case PS_STREAM_ID_END_STREAM:
         block_Release( p_pkt );
         break;
 
-    case PS_STREAM_ID_PACK_HEADER|0x100:
+    case PS_STREAM_ID_PACK_HEADER:
         if( !ps_pkt_parse_pack( p_pkt, &p_sys->i_scr, &i_mux_rate ) )
         {
             p_sys->i_last_scr = p_sys->i_scr;
@@ -378,7 +383,7 @@ static int Demux( demux_t *p_demux )
         block_Release( p_pkt );
         break;
 
-    case PS_STREAM_ID_SYSTEM_HEADER|0x100:
+    case PS_STREAM_ID_SYSTEM_HEADER:
         if( !ps_pkt_parse_system( p_pkt, &p_sys->psm, p_sys->tk ) )
         {
             int i;
@@ -395,7 +400,7 @@ static int Demux( demux_t *p_demux )
         block_Release( p_pkt );
         break;
 
-    case PS_STREAM_ID_MAP|0x100:
+    case PS_STREAM_ID_MAP:
         if( p_sys->psm.i_version == 0xFFFF )
             msg_Dbg( p_demux, "contains a PSM");
 
@@ -404,8 +409,16 @@ static int Demux( demux_t *p_demux )
         break;
 
     default:
-        if( (i_id = ps_pkt_id( p_pkt )) >= 0xc0 )
+        /* Reject non video/audio nor PES */
+        if( i_stream_id < 0xC0 || i_stream_id > 0xEF )
+        {
+            block_Release( p_pkt );
+            break;
+        }
+        //ft
+    case PS_STREAM_ID_PRIVATE_STREAM1:
         {
+            int i_id = ps_pkt_id( p_pkt );
             /* Small heuristic to improve MLP detection from AOB */
             if( i_id == 0xa001 &&
                 p_sys->i_aob_mlp_count < 500 )
@@ -507,10 +520,6 @@ static int Demux( demux_t *p_demux )
 
             p_sys->i_scr = -1;
         }
-        else
-        {
-            block_Release( p_pkt );
-        }
         break;
     }
 
@@ -653,7 +662,7 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
  *  It doesn't skip more than 512 bytes
  *  -1 -> error, 0 -> not synch, 1 -> ok
  */
-static int ps_pkt_resynch( stream_t *s, uint32_t *pi_code, bool b_cdxa, bool b_pack )
+static int ps_pkt_resynch( stream_t *s, bool b_cdxa, bool b_pack )
 {
     const uint8_t *p_peek;
     int     i_peek;
@@ -666,7 +675,6 @@ static int ps_pkt_resynch( stream_t *s, uint32_t *pi_code, bool b_cdxa, bool b_p
     if( p_peek[0] == 0 && p_peek[1] == 0 && p_peek[2] == 1 &&
         p_peek[3] >= PS_STREAM_ID_END_STREAM )
     {
-        *pi_code = 0x100 | p_peek[3];
         return 1;
     }
 
@@ -707,7 +715,6 @@ static int ps_pkt_resynch( stream_t *s, uint32_t *pi_code, bool b_cdxa, bool b_p
             ( b_pack ) ? ( p_peek[3] == PS_STREAM_ID_PACK_HEADER )
                        : ( p_peek[3] >= PS_STREAM_ID_END_STREAM ) )
         {
-            *pi_code = 0x100 | p_peek[3];
             return vlc_stream_Read( s, NULL, i_skip ) == i_skip ? 1 : -1;
         }
 
@@ -718,7 +725,7 @@ static int ps_pkt_resynch( stream_t *s, uint32_t *pi_code, bool b_cdxa, bool b_p
     return vlc_stream_Read( s, NULL, i_skip ) == i_skip ? 0 : -1;
 }
 
-static block_t *ps_pkt_read( stream_t *s, uint32_t i_code )
+static block_t *ps_pkt_read( stream_t *s )
 {
     const uint8_t *p_peek;
     int i_peek = vlc_stream_Peek( s, &p_peek, 14 );
@@ -754,6 +761,5 @@ static block_t *ps_pkt_read( stream_t *s, uint32_t i_code )
         return vlc_stream_Block( s, i_size );
     }
 
-    VLC_UNUSED(i_code);
     return NULL;
 }
diff --git a/modules/demux/mpeg/ps.h b/modules/demux/mpeg/ps.h
index b94dc85..211499b 100644
--- a/modules/demux/mpeg/ps.h
+++ b/modules/demux/mpeg/ps.h
@@ -30,6 +30,8 @@
 #define PS_STREAM_ID_PACK_HEADER      0xBA
 #define PS_STREAM_ID_SYSTEM_HEADER    0xBB
 #define PS_STREAM_ID_MAP              0xBC
+#define PS_STREAM_ID_PRIVATE_STREAM1  0xBD
+#define PS_STREAM_ID_PADDING          0xBE
 #define PS_STREAM_ID_DIRECTORY        0xFF
 
 /* 256-0xC0 for normal stream, 256 for 0xbd stream, 256 for 0xfd stream, 8 for 0xa0 AOB stream */



More information about the vlc-commits mailing list