[vlc-commits] demux: ps: const correctness and less block_t dependency

Francois Cartegnie git at videolan.org
Mon Aug 19 20:49:36 CEST 2019


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Mon Aug 19 18:58:51 2019 +0200| [cc669ab67785f932f95a1341623a4180ade135df] | committer: Francois Cartegnie

demux: ps: const correctness and less block_t dependency

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

 modules/access/dvdnav.c  |   7 +--
 modules/access/dvdread.c |   7 +--
 modules/demux/mpeg/ps.c  |  20 ++++++---
 modules/demux/mpeg/ps.h  | 113 +++++++++++++++++++++++++----------------------
 modules/demux/vobsub.c   |   2 +-
 5 files changed, 82 insertions(+), 67 deletions(-)

diff --git a/modules/access/dvdnav.c b/modules/access/dvdnav.c
index 540e9aad4d..0a915f1e6a 100644
--- a/modules/access/dvdnav.c
+++ b/modules/access/dvdnav.c
@@ -1424,7 +1424,8 @@ static int DemuxBlock( demux_t *p_demux, const uint8_t *p, int len )
         {
             vlc_tick_t i_scr;
             int i_mux_rate;
-            if( !ps_pkt_parse_pack( p_pkt, &i_scr, &i_mux_rate ) )
+            if( !ps_pkt_parse_pack( p_pkt->p_buffer, p_pkt->i_buffer,
+                                    &i_scr, &i_mux_rate ) )
             {
                 es_out_SetPCR( p_demux->out, i_scr );
                 if( i_mux_rate > 0 ) p_sys->i_mux_rate = i_mux_rate;
@@ -1434,7 +1435,7 @@ static int DemuxBlock( demux_t *p_demux, const uint8_t *p, int len )
         }
         default:
         {
-            int i_id = ps_pkt_id( p_pkt );
+            int i_id = ps_pkt_id( p_pkt->p_buffer, p_pkt->i_buffer );
             if( i_id >= 0xc0 )
             {
                 ps_track_t *tk = &p_sys->tk[ps_id_to_tk(i_id)];
@@ -1510,7 +1511,7 @@ static void ESNew( demux_t *p_demux, int i_id )
 
     if( tk->b_configured ) return;
 
-    if( ps_track_fill( tk, 0, i_id, NULL, true ) )
+    if( ps_track_fill( tk, 0, i_id, NULL, 0, true ) )
     {
         msg_Warn( p_demux, "unknown codec for id=0x%x", i_id );
         return;
diff --git a/modules/access/dvdread.c b/modules/access/dvdread.c
index 10138189bd..7b3a4a3694 100644
--- a/modules/access/dvdread.c
+++ b/modules/access/dvdread.c
@@ -605,7 +605,8 @@ static int DemuxBlock( demux_t *p_demux, const uint8_t *p, int len )
         {
             vlc_tick_t i_scr;
             int i_mux_rate;
-            if( !ps_pkt_parse_pack( p_pkt, &i_scr, &i_mux_rate ) )
+            if( !ps_pkt_parse_pack( p_pkt->p_buffer, p_pkt->i_buffer,
+                                    &i_scr, &i_mux_rate ) )
             {
                 es_out_SetPCR( p_demux->out, VLC_TICK_0 + i_scr );
                 if( i_mux_rate > 0 ) p_sys->i_mux_rate = i_mux_rate;
@@ -615,7 +616,7 @@ static int DemuxBlock( demux_t *p_demux, const uint8_t *p, int len )
         }
         default:
         {
-            int i_id = ps_pkt_id( p_pkt );
+            int i_id = ps_pkt_id( p_pkt->p_buffer, p_pkt->i_buffer );
             if( i_id >= 0xc0 )
             {
                 ps_track_t *tk = &p_sys->tk[ps_id_to_tk(i_id)];
@@ -660,7 +661,7 @@ static void ESNew( demux_t *p_demux, int i_id, int i_lang )
 
     if( tk->b_configured ) return;
 
-    if( ps_track_fill( tk, 0, i_id, NULL, true ) )
+    if( ps_track_fill( tk, 0, i_id, NULL, 0, true ) )
     {
         msg_Warn( p_demux, "unknown codec for id=0x%x", i_id );
         return;
diff --git a/modules/demux/mpeg/ps.c b/modules/demux/mpeg/ps.c
index 859c23b313..68a69a4955 100644
--- a/modules/demux/mpeg/ps.c
+++ b/modules/demux/mpeg/ps.c
@@ -302,7 +302,7 @@ static int Probe( demux_t *p_demux, bool b_end )
         return VLC_DEMUXER_EOF;
     }
 
-    i_id = ps_pkt_id( p_pkt );
+    i_id = ps_pkt_id( p_pkt->p_buffer, p_pkt->i_buffer );
     if( i_id >= 0xc0 )
     {
         ps_track_t *tk = &p_sys->tk[ps_id_to_tk(i_id)];
@@ -322,7 +322,8 @@ static int Probe( demux_t *p_demux, bool b_end )
     else if( i_id == PS_STREAM_ID_PACK_HEADER )
     {
         vlc_tick_t i_scr; int dummy;
-        if( !b_end && !ps_pkt_parse_pack( p_pkt, &i_scr, &dummy ) )
+        if( !b_end && !ps_pkt_parse_pack( p_pkt->p_buffer, p_pkt->i_buffer,
+                                          &i_scr, &dummy ) )
         {
             if( p_sys->i_first_scr == VLC_TICK_INVALID )
                 p_sys->i_first_scr = i_scr;
@@ -460,7 +461,8 @@ static int Demux( demux_t *p_demux )
         break;
 
     case PS_STREAM_ID_PACK_HEADER:
-        if( !ps_pkt_parse_pack( p_pkt, &p_sys->i_pack_scr, &i_mux_rate ) )
+        if( !ps_pkt_parse_pack( p_pkt->p_buffer, p_pkt->i_buffer,
+                                &p_sys->i_pack_scr, &i_mux_rate ) )
         {
             if( p_sys->i_first_scr == VLC_TICK_INVALID )
                 p_sys->i_first_scr = p_sys->i_pack_scr;
@@ -476,7 +478,8 @@ static int Demux( demux_t *p_demux )
         break;
 
     case PS_STREAM_ID_SYSTEM_HEADER:
-        if( !ps_pkt_parse_system( p_pkt, &p_sys->psm, p_sys->tk ) )
+        if( !ps_pkt_parse_system( p_pkt->p_buffer, p_pkt->i_buffer,
+                                  &p_sys->psm, p_sys->tk ) )
         {
             int i;
             for( i = 0; i < PS_TK_COUNT; i++ )
@@ -499,7 +502,9 @@ static int Demux( demux_t *p_demux )
         if( p_sys->psm.i_version == 0xFFFF )
             msg_Dbg( p_demux, "contains a PSM");
 
-        ps_psm_fill( &p_sys->psm, p_pkt, p_sys->tk, p_demux->out );
+        ps_psm_fill( &p_sys->psm,
+                     p_pkt->p_buffer, p_pkt->i_buffer,
+                     p_sys->tk, p_demux->out );
         block_Release( p_pkt );
         break;
 
@@ -514,7 +519,7 @@ static int Demux( demux_t *p_demux )
     case PS_STREAM_ID_PRIVATE_STREAM1:
     case PS_STREAM_ID_EXTENDED:
         {
-            int i_id = ps_pkt_id( p_pkt );
+            int i_id = ps_pkt_id( p_pkt->p_buffer, p_pkt->i_buffer );
             /* Small heuristic to improve MLP detection from AOB */
             if( i_id == 0xa001 &&
                 p_sys->i_aob_mlp_count < 500 )
@@ -533,7 +538,8 @@ static int Demux( demux_t *p_demux )
 
             if( !tk->b_configured )
             {
-                if( !ps_track_fill( tk, &p_sys->psm, i_id, p_pkt, false ) )
+                if( !ps_track_fill( tk, &p_sys->psm, i_id,
+                                    p_pkt->p_buffer, p_pkt->i_buffer, false ) )
                 {
                     /* No PSM and no probing yet */
                     if( p_sys->format == PSMF_PS )
diff --git a/modules/demux/mpeg/ps.h b/modules/demux/mpeg/ps.h
index 1ce0bb4185..097dcc1dbb 100644
--- a/modules/demux/mpeg/ps.h
+++ b/modules/demux/mpeg/ps.h
@@ -121,7 +121,9 @@ static inline bool ps_is_H264( const uint8_t *p_data, size_t i_data )
 
 /* From id fill i_skip and es_format_t */
 static inline int ps_track_fill( ps_track_t *tk, ps_psm_t *p_psm,
-                                 int i_id, block_t *p_pkt, bool b_mpeg2only )
+                                 int i_id,
+                                 const uint8_t *p_pkt, size_t i_pkt,
+                                 bool b_mpeg2only )
 {
     tk->i_skip = 0;
     tk->i_id = i_id;
@@ -140,17 +142,17 @@ static inline int ps_track_fill( ps_track_t *tk, ps_psm_t *p_psm,
             bool b_eac3 = false;
             if( ( i_id&0xf0 ) == 0xc0 )
             {
-                if( p_pkt == NULL || p_pkt->i_buffer < 9 )
+                if( p_pkt == NULL || i_pkt < 9 )
                     return VLC_EGENERIC;
 
-                unsigned i_start = 9 + p_pkt->p_buffer[8];
-                if( i_start + 9 < p_pkt->i_buffer )
+                unsigned i_start = 9 + p_pkt[8];
+                if( i_start + 9 < i_pkt )
                 {
                     /* AC-3 marking, see vlc_a52_header_Parse */
-                    if( p_pkt->p_buffer[i_start + 4] == 0x0b ||
-                        p_pkt->p_buffer[i_start + 5] == 0x77 )
+                    if( p_pkt[i_start + 4] == 0x0b ||
+                        p_pkt[i_start + 5] == 0x77 )
                     {
-                        int bsid = p_pkt->p_buffer[i_start + 9] >> 3;
+                        int bsid = p_pkt[i_start + 9] >> 3;
                         if( bsid > 10 )
                             b_eac3 = true;
                     }
@@ -261,10 +263,10 @@ static inline int ps_track_fill( ps_track_t *tk, ps_psm_t *p_psm,
                 es_format_Change( &tk->fmt, VIDEO_ES, VLC_CODEC_H264 );
             }
             else if( p_pkt && i_type == 0x00 && /* Not from PSM */
-                     p_pkt->i_buffer > 9 + 5 &&
-                     p_pkt->i_buffer > 9U + 5 + p_pkt->p_buffer[8] &&
-                     ps_is_H264( &p_pkt->p_buffer[ 9 + p_pkt->p_buffer[8] ],
-                                  p_pkt->i_buffer - 9 - p_pkt->p_buffer[8] ) )
+                     i_pkt > 9 + 5 &&
+                     i_pkt > 9U + 5 + p_pkt[8] &&
+                     ps_is_H264( &p_pkt[ 9 + p_pkt[8] ],
+                                  i_pkt - 9 - p_pkt[8] ) )
             {
                 es_format_Change( &tk->fmt, VIDEO_ES, VLC_CODEC_H264 );
             }
@@ -317,21 +319,23 @@ static inline int ps_track_fill( ps_track_t *tk, ps_psm_t *p_psm,
 }
 
 /* return the id of a PES (should be valid) */
-static inline int ps_pkt_id( block_t *p_pkt )
+static inline int ps_pkt_id( const uint8_t *p_pkt, size_t i_pkt )
 {
-    if( p_pkt->p_buffer[3] == 0xbd )
+    if(unlikely(i_pkt < 4))
+        return 0;
+    if( p_pkt[3] == 0xbd )
     {
         uint8_t i_sub_id = 0;
-        if( p_pkt->i_buffer >= 9 &&
-            p_pkt->i_buffer > 9 + (size_t)p_pkt->p_buffer[8] )
+        if( i_pkt >= 9 &&
+            i_pkt > 9 + (size_t)p_pkt[8] )
         {
-            const unsigned i_start = 9 + p_pkt->p_buffer[8];
-            i_sub_id = p_pkt->p_buffer[i_start];
+            const unsigned i_start = 9 + p_pkt[8];
+            i_sub_id = p_pkt[i_start];
 
             if( (i_sub_id & 0xfe) == 0xa0 &&
-                p_pkt->i_buffer >= i_start + 7 &&
-                ( p_pkt->p_buffer[i_start + 5] >=  0xc0 ||
-                p_pkt->p_buffer[i_start + 6] != 0x80 ) )
+                i_pkt >= i_start + 7 &&
+                ( p_pkt[i_start + 5] >=  0xc0 ||
+                  p_pkt[i_start + 6] != 0x80 ) )
             {
                 /* AOB LPCM/MLP extension
                 * XXX for MLP I think that the !=0x80 test is not good and
@@ -343,13 +347,13 @@ static inline int ps_pkt_id( block_t *p_pkt )
         /* VOB extension */
         return 0xbd00 | i_sub_id;
     }
-    else if( p_pkt->p_buffer[3] == 0xfd &&
-             p_pkt->i_buffer >= 9 &&
-             (p_pkt->p_buffer[6]&0xC0) == 0x80 &&   /* mpeg2 */
-             (p_pkt->p_buffer[7]&0x01) == 0x01 )    /* extension_flag */
+    else if( i_pkt >= 9 &&
+             p_pkt[3] == 0xfd &&
+             (p_pkt[6]&0xC0) == 0x80 &&   /* mpeg2 */
+             (p_pkt[7]&0x01) == 0x01 )    /* extension_flag */
     {
         /* ISO 13818 amendment 2 and SMPTE RP 227 */
-        const uint8_t i_flags = p_pkt->p_buffer[7];
+        const uint8_t i_flags = p_pkt[7];
         unsigned int i_skip = 9;
 
         /* Find PES extension */
@@ -370,34 +374,34 @@ static inline int ps_pkt_id( block_t *p_pkt )
         if( (i_flags & 0x02 ) )
             i_skip += 2;
 
-        if( i_skip < p_pkt->i_buffer && (p_pkt->p_buffer[i_skip]&0x01) )
+        if( i_skip < i_pkt && (p_pkt[i_skip]&0x01) )
         {
-            const uint8_t i_flags2 = p_pkt->p_buffer[i_skip];
+            const uint8_t i_flags2 = p_pkt[i_skip];
 
             /* Find PES extension 2 */
             i_skip += 1;
             if( i_flags2 & 0x80 )
                 i_skip += 16;
-            if( (i_flags2 & 0x40) && i_skip < p_pkt->i_buffer )
-                i_skip += 1 + p_pkt->p_buffer[i_skip];
+            if( (i_flags2 & 0x40) && i_skip < i_pkt )
+                i_skip += 1 + p_pkt[i_skip];
             if( i_flags2 & 0x20 )
                 i_skip += 2;
             if( i_flags2 & 0x10 )
                 i_skip += 2;
 
-            if( i_skip + 1 < p_pkt->i_buffer )
+            if( i_skip + 1 < i_pkt )
             {
-                const int i_extension_field_length = p_pkt->p_buffer[i_skip]&0x7f;
+                const int i_extension_field_length = p_pkt[i_skip]&0x7f;
                 if( i_extension_field_length >=1 )
                 {
-                    int i_stream_id_extension_flag = (p_pkt->p_buffer[i_skip+1] >> 7)&0x1;
+                    int i_stream_id_extension_flag = (p_pkt[i_skip+1] >> 7)&0x1;
                     if( i_stream_id_extension_flag == 0 )
-                        return 0xfd00 | (p_pkt->p_buffer[i_skip+1]&0x7f);
+                        return 0xfd00 | (p_pkt[i_skip+1]&0x7f);
                 }
             }
         }
     }
-    return p_pkt->p_buffer[3];
+    return p_pkt[3];
 }
 
 /* return the size of the next packet */
@@ -432,16 +436,16 @@ static inline int ps_pkt_size( const uint8_t *p, int i_peek )
 }
 
 /* parse a PACK PES */
-static inline int ps_pkt_parse_pack( block_t *p_pkt, vlc_tick_t *pi_scr,
-                                     int *pi_mux_rate )
+static inline int ps_pkt_parse_pack( const uint8_t *p_pkt, size_t i_pkt,
+                                     vlc_tick_t *pi_scr, int *pi_mux_rate )
 {
-    uint8_t *p = p_pkt->p_buffer;
-    if( p_pkt->i_buffer >= 14 && (p[4] >> 6) == 0x01 )
+    const uint8_t *p = p_pkt;
+    if( i_pkt >= 14 && (p[4] >> 6) == 0x01 )
     {
         *pi_scr = FROM_SCALE( ExtractPackHeaderTimestamp( &p[4] ) );
         *pi_mux_rate = ( p[10] << 14 )|( p[11] << 6 )|( p[12] >> 2);
     }
-    else if( p_pkt->i_buffer >= 12 && (p[4] >> 4) == 0x02 ) /* MPEG-1 Pack SCR, same bits as PES/PTS */
+    else if( i_pkt >= 12 && (p[4] >> 4) == 0x02 ) /* MPEG-1 Pack SCR, same bits as PES/PTS */
     {
         stime_t i_scr;
         if(!ExtractPESTimestamp( &p[4], 0x02, &i_scr ))
@@ -457,26 +461,28 @@ static inline int ps_pkt_parse_pack( block_t *p_pkt, vlc_tick_t *pi_scr,
 }
 
 /* Parse a SYSTEM PES */
-static inline int ps_pkt_parse_system( block_t *p_pkt, ps_psm_t *p_psm,
+static inline int ps_pkt_parse_system( const uint8_t *p_pkt, size_t i_pkt,
+                                       ps_psm_t *p_psm,
                                        ps_track_t tk[PS_TK_COUNT] )
 {
-    uint8_t *p = &p_pkt->p_buffer[6 + 3 + 1 + 1 + 1];
+    const uint8_t *p = &p_pkt[6 + 3 + 1 + 1 + 1];
+    const uint8_t *p_pktend = &p_pkt[i_pkt];
 
     /* System header is not useable if it references private streams (0xBD)
      * or 'all audio streams' (0xB8) or 'all video streams' (0xB9) */
-    while( p < &p_pkt->p_buffer[p_pkt->i_buffer] && (p[0] & 0x80) )
+    while( p < p_pktend && (p[0] & 0x80) )
     {
         int i_id = p[0];
         switch( i_id )
         {
             case 0xB7:
-                if( &p_pkt->p_buffer[p_pkt->i_buffer] - p < 6 )
+                if( p_pktend - p < 6 )
                     return VLC_EGENERIC;
                 i_id = ((int)PS_STREAM_ID_EXTENDED << 8) | (p[2] & 0x7F);
                 p += 6;
                 break;
             default:
-                if( &p_pkt->p_buffer[p_pkt->i_buffer] - p < 3 )
+                if( p_pktend - p < 3 )
                     return VLC_EGENERIC;
                 p += 3;
                 break;
@@ -487,7 +493,7 @@ static inline int ps_pkt_parse_system( block_t *p_pkt, ps_psm_t *p_psm,
 
         int i_tk = ps_id_to_tk( i_id );
         if( !tk[i_tk].b_configured )
-            ps_track_fill( &tk[i_tk], p_psm, i_id, NULL, false );
+            ps_track_fill( &tk[i_tk], p_psm, i_id, NULL, 0, false );
     }
     return VLC_SUCCESS;
 }
@@ -511,7 +517,8 @@ static inline int ps_pkt_parse_pes( vlc_object_t *p_object, block_t *p_pes, int
     if( i_skip_extra >= 0 )
         i_skip += i_skip_extra;
     else if( p_pes->i_buffer > i_skip + 3 &&
-             ( ps_pkt_id( p_pes ) == 0xa001 || ps_pkt_id( p_pes ) == 0xbda1 ) )
+             ( ps_pkt_id( p_pes->p_buffer, p_pes->i_buffer ) == 0xa001 ||
+               ps_pkt_id( p_pes->p_buffer, p_pes->i_buffer ) == 0xbda1 ) )
         i_skip += 4 + p_pes->p_buffer[i_skip+3];
 
     if( p_pes->i_buffer <= i_skip )
@@ -617,23 +624,22 @@ static inline void ps_parse_descriptors( const uint8_t *p_data, size_t i_data,
     }
 }
 
-static inline int ps_psm_fill( ps_psm_t *p_psm, block_t *p_pkt,
+static inline int ps_psm_fill( ps_psm_t *p_psm,
+                               const uint8_t *p_buffer, size_t i_pkt,
                                ps_track_t tk[PS_TK_COUNT], es_out_t *out )
 {
-    size_t i_buffer = p_pkt->i_buffer;
-    uint8_t *p_buffer = p_pkt->p_buffer;
     size_t i_length, i_info_length, i_es_base;
     int i_version;
     bool b_single_extension;
 
     // Demux() checks that we have at least 4 bytes, but we need
     // at least 10 to read up to the info_length field
-    assert(i_buffer >= 4);
-    if( !p_psm || i_buffer < 10 || p_buffer[3] != PS_STREAM_ID_MAP)
+    assert(i_pkt >= 4);
+    if( !p_psm || i_pkt < 10 || p_buffer[3] != PS_STREAM_ID_MAP)
         return VLC_EGENERIC;
 
     i_length = GetWBE(&p_buffer[4]) + 6;
-    if( i_length > i_buffer ) return VLC_EGENERIC;
+    if( i_length > i_pkt ) return VLC_EGENERIC;
 
     if((p_buffer[6] & 0x80) == 0) /* current_next_indicator */
         return VLC_EGENERIC;
@@ -705,7 +711,8 @@ static inline int ps_psm_fill( ps_psm_t *p_psm, block_t *p_pkt,
         ps_track_t tk_tmp;
         es_format_Init( &tk_tmp.fmt, UNKNOWN_ES, 0 );
 
-        if( ps_track_fill( &tk_tmp, p_psm, tk[i].i_id, p_pkt, false ) != VLC_SUCCESS )
+        if( ps_track_fill( &tk_tmp, p_psm, tk[i].i_id,
+                           p_buffer, i_pkt, false ) != VLC_SUCCESS )
             continue;
 
         if( tk_tmp.fmt.i_codec == tk[i].fmt.i_codec )
diff --git a/modules/demux/vobsub.c b/modules/demux/vobsub.c
index 4b5444e71b..d75f2d53d0 100644
--- a/modules/demux/vobsub.c
+++ b/modules/demux/vobsub.c
@@ -675,7 +675,7 @@ static int DemuxVobSub( demux_t *p_demux, block_t *p_bk )
         memcpy( p_pkt->p_buffer, p, i_size);
         p += i_size;
 
-        i_id = ps_pkt_id( p_pkt );
+        i_id = ps_pkt_id( p_pkt->p_buffer, p_pkt->i_buffer );
         if( (i_id&0xffe0) != 0xbd20 ||
             ps_pkt_parse_pes( VLC_OBJECT(p_demux), p_pkt, 1 ) )
         {



More information about the vlc-commits mailing list