[vlc-commits] demux: ts: split PES header parsing

Francois Cartegnie git at videolan.org
Fri Feb 20 20:01:50 CET 2015


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Sun Feb 15 20:01:26 2015 +0100| [db37ca8b6a4f301c8108d100a86184a930f2e875] | committer: Francois Cartegnie

demux: ts: split PES header parsing

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

 modules/demux/ts.c |   97 ++++++++++++++++++++++++++++++----------------------
 1 file changed, 57 insertions(+), 40 deletions(-)

diff --git a/modules/demux/ts.c b/modules/demux/ts.c
index dda6986..de1022f 100644
--- a/modules/demux/ts.c
+++ b/modules/demux/ts.c
@@ -2050,30 +2050,12 @@ static block_t *Opus_Parse(demux_t *demux, block_t *block)
 /****************************************************************************
  * gathering stuff
  ****************************************************************************/
-static void ParsePES( demux_t *p_demux, ts_pid_t *pid, block_t *p_pes )
+static int ParsePESHeader( demux_t *p_demux, const uint8_t *p_header,
+                           unsigned *pi_skip, mtime_t *pi_dts, mtime_t *pi_pts )
 {
-    demux_sys_t *p_sys = p_demux->p_sys;
-    uint8_t header[34];
-    unsigned i_pes_size = 0;
-    unsigned i_skip = 0;
-    mtime_t i_dts = -1;
-    mtime_t i_pts = -1;
-    mtime_t i_length = 0;
-
-    /* FIXME find real max size */
-    /* const int i_max = */ block_ChainExtract( p_pes, header, 34 );
-
-    if( pid->b_scrambled || header[0] != 0 || header[1] != 0 || header[2] != 1 )
-    {
-        if ( !pid->b_scrambled )
-            msg_Warn( p_demux, "invalid header [0x%02x:%02x:%02x:%02x] (pid: %d)",
-                        header[0], header[1],header[2],header[3], pid->i_pid );
-        block_ChainRelease( p_pes );
-        return;
-    }
+    unsigned i_skip;
 
-    /* TODO check size */
-    switch( header[3] )
+    switch( p_header[3] )
     {
     case 0xBC:  /* Program stream map */
     case 0xBE:  /* Padding */
@@ -2086,48 +2068,43 @@ static void ParsePES( demux_t *p_demux, ts_pid_t *pid, block_t *p_pes )
         i_skip = 6;
         break;
     default:
-        if( ( header[6]&0xC0 ) == 0x80 )
+        if( ( p_header[6]&0xC0 ) == 0x80 )
         {
             /* mpeg2 PES */
-            i_skip = header[8] + 9;
+            i_skip = p_header[8] + 9;
 
-            if( header[7]&0x80 )    /* has pts */
+            if( p_header[7]&0x80 )    /* has pts */
             {
-                i_pts = ExtractPESTimestamp( &header[9] );
-                i_pts = AdjustPTSWrapAround( p_demux, i_pts );
+                *pi_pts = ExtractPESTimestamp( &p_header[9] );
 
-                if( header[7]&0x40 )    /* has dts */
-                {
-                    i_dts = ExtractPESTimestamp( &header[14] );
-                    i_dts = AdjustPTSWrapAround( p_demux, i_dts );
-                }
+                if( p_header[7]&0x40 )    /* has dts */
+                    *pi_dts = ExtractPESTimestamp( &p_header[14] );
             }
         }
         else
         {
             i_skip = 6;
-            while( i_skip < 23 && header[i_skip] == 0xff )
+            while( i_skip < 23 && p_header[i_skip] == 0xff )
             {
                 i_skip++;
             }
             if( i_skip == 23 )
             {
                 msg_Err( p_demux, "too much MPEG-1 stuffing" );
-                block_ChainRelease( p_pes );
-                return;
+                return VLC_EGENERIC;
             }
-            if( ( header[i_skip] & 0xC0 ) == 0x40 )
+            if( ( p_header[i_skip] & 0xC0 ) == 0x40 )
             {
                 i_skip += 2;
             }
 
-            if(  header[i_skip]&0x20 )
+            if(  p_header[i_skip]&0x20 )
             {
-                i_pts = ExtractPESTimestamp( &header[i_skip] );
+                *pi_pts = ExtractPESTimestamp( &p_header[i_skip] );
 
-                if( header[i_skip]&0x10 )    /* has dts */
+                if( p_header[i_skip]&0x10 )    /* has dts */
                 {
-                    i_dts = ExtractPESTimestamp( &header[i_skip+5] );
+                    *pi_dts = ExtractPESTimestamp( &p_header[i_skip+5] );
                     i_skip += 10;
                 }
                 else
@@ -2143,6 +2120,46 @@ static void ParsePES( demux_t *p_demux, ts_pid_t *pid, block_t *p_pes )
         break;
     }
 
+    *pi_skip = i_skip;
+    return VLC_SUCCESS;
+}
+
+static void ParsePES( demux_t *p_demux, ts_pid_t *pid, block_t *p_pes )
+{
+    demux_sys_t *p_sys = p_demux->p_sys;
+    uint8_t header[34];
+    unsigned i_pes_size = 0;
+    unsigned i_skip = 0;
+    mtime_t i_dts = -1;
+    mtime_t i_pts = -1;
+    mtime_t i_length = 0;
+
+    /* FIXME find real max size */
+    /* const int i_max = */ block_ChainExtract( p_pes, header, 34 );
+
+    if( pid->b_scrambled || header[0] != 0 || header[1] != 0 || header[2] != 1 )
+    {
+        if ( !pid->b_scrambled )
+            msg_Warn( p_demux, "invalid header [0x%02x:%02x:%02x:%02x] (pid: %d)",
+                        header[0], header[1],header[2],header[3], pid->i_pid );
+        block_ChainRelease( p_pes );
+        return;
+    }
+
+    /* TODO check size */
+    if( ParsePESHeader( p_demux, (uint8_t*)&header, &i_skip, &i_dts, &i_pts ) == VLC_EGENERIC )
+    {
+        block_ChainRelease( p_pes );
+        return;
+    }
+    else
+    {
+        if( i_pts != -1 )
+            i_pts = AdjustPTSWrapAround( p_demux, i_pts );
+        if( i_dts != -1 )
+            i_dts = AdjustPTSWrapAround( p_demux, i_dts );
+    }
+
     if( pid->es->fmt.i_codec == VLC_FOURCC( 'a', '5', '2', 'b' ) ||
         pid->es->fmt.i_codec == VLC_FOURCC( 'd', 't', 's', 'b' ) )
     {



More information about the vlc-commits mailing list