[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