Commit 31bfaf90 authored by Gildas Bazin's avatar Gildas Bazin

* modules/demux/ps.c: small cleanup.

parent 29be1e00
/*****************************************************************************
* ps.c
* ps.c: Program Stream demux module for VLC.
*****************************************************************************
* Copyright (C) 2004 VideoLAN
* $Id$
......@@ -39,8 +39,8 @@
/*****************************************************************************
* Module descriptor
*****************************************************************************/
static int Open ( vlc_object_t * );
static void Close ( vlc_object_t * );
static int Open ( vlc_object_t * );
static void Close( vlc_object_t * );
vlc_module_begin();
set_description( _("PS demuxer") );
......@@ -55,7 +55,7 @@ vlc_module_end();
struct demux_sys_t
{
ps_track_t tk[PS_TK_COUNT];
ps_track_t tk[PS_TK_COUNT];
int64_t i_scr;
int i_mux_rate;
......@@ -83,9 +83,11 @@ static int Open( vlc_object_t *p_this )
return VLC_EGENERIC;
}
if( p_peek[0] != 0 || p_peek[1] != 0 || p_peek[2] != 1 || p_peek[3] < 0xb9 )
if( p_peek[0] != 0 || p_peek[1] != 0 || p_peek[2] != 1 ||
p_peek[3] < 0xb9 )
{
msg_Warn( p_demux, "this does not look like an MPEG PS stream, continuing anyway" );
msg_Warn( p_demux, "this does not look like an MPEG PS stream, "
"continuing anyway" );
}
/* Fill p_demux field */
......@@ -111,6 +113,17 @@ static void Close( vlc_object_t *p_this )
{
demux_t *p_demux = (demux_t*)p_this;
demux_sys_t *p_sys = p_demux->p_sys;
int i;
for( i = 0; i < PS_TK_COUNT; i++ )
{
ps_track_t *tk = &p_sys->tk[i];
if( tk->b_seen )
{
es_format_Clean( &tk->fmt );
if( tk->es ) es_out_Del( p_demux->out, tk->es );
}
}
free( p_sys );
}
......@@ -121,9 +134,9 @@ static void Close( vlc_object_t *p_this )
static int Demux( demux_t *p_demux )
{
demux_sys_t *p_sys = p_demux->p_sys;
int i_ret;
int i_ret, i_id, i_mux_rate;
uint32_t i_code;
block_t *p_pkt;
block_t *p_pkt;
i_ret = ps_pkt_resynch( p_demux->s, &i_code );
if( i_ret < 0 )
......@@ -143,76 +156,71 @@ static int Demux( demux_t *p_demux )
switch( i_code )
{
case 0x1b9:
block_Release( p_pkt );
break;
case 0x1ba:
case 0x1b9:
block_Release( p_pkt );
break;
case 0x1ba:
if( !ps_pkt_parse_pack( p_pkt, &p_sys->i_scr, &i_mux_rate ) )
{
int i_mux_rate;
es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_sys->i_scr );
if( i_mux_rate > 0 ) p_sys->i_mux_rate = i_mux_rate;
}
block_Release( p_pkt );
break;
if( !ps_pkt_parse_pack( p_pkt, &p_sys->i_scr, &i_mux_rate ) )
case 0x1bb:
if( !ps_pkt_parse_system( p_pkt, p_sys->tk ) )
{
int i;
for( i = 0; i < PS_TK_COUNT; i++ )
{
es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_sys->i_scr );
if( i_mux_rate > 0 )
ps_track_t *tk = &p_sys->tk[i];
if( tk->b_seen && !tk->es && tk->fmt.i_cat != UNKNOWN_ES )
{
p_sys->i_mux_rate = i_mux_rate;
tk->es = es_out_Add( p_demux->out, &tk->fmt );
}
}
block_Release( p_pkt );
break;
}
case 0x1bb:
if( !ps_pkt_parse_system( p_pkt, p_sys->tk ) )
{
int i;
for( i = 0; i < PS_TK_COUNT; i++ )
{
ps_track_t *tk = &p_sys->tk[i];
block_Release( p_pkt );
break;
if( tk->b_seen && !tk->es && tk->fmt.i_cat != UNKNOWN_ES )
{
tk->es = es_out_Add( p_demux->out, &tk->fmt );
}
}
}
block_Release( p_pkt );
break;
case 0x1bc:
/* TODO PSM */
block_Release( p_pkt );
break;
case 0x1bc:
/* TODO PSM */
block_Release( p_pkt );
break;
default:
default:
if( (i_id = ps_pkt_id( p_pkt )) >= 0xc0 )
{
int i_id = ps_pkt_id( p_pkt );
if( i_id >= 0xc0 )
{
ps_track_t *tk = &p_sys->tk[PS_ID_TO_TK(i_id)];
ps_track_t *tk = &p_sys->tk[PS_ID_TO_TK(i_id)];
if( !tk->b_seen )
{
if( !ps_track_fill( tk, i_id ) )
{
tk->es = es_out_Add( p_demux->out, &tk->fmt );
}
tk->b_seen = VLC_TRUE;
}
if( tk->b_seen && tk->es && !ps_pkt_parse_pes( p_pkt, tk->i_skip ) )
{
es_out_Send( p_demux->out, tk->es, p_pkt );
}
else
if( !tk->b_seen )
{
if( !ps_track_fill( tk, i_id ) )
{
block_Release( p_pkt );
tk->es = es_out_Add( p_demux->out, &tk->fmt );
}
tk->b_seen = VLC_TRUE;
}
if( tk->b_seen && tk->es &&
!ps_pkt_parse_pes( p_pkt, tk->i_skip ) )
{
es_out_Send( p_demux->out, tk->es, p_pkt );
}
else
{
block_Release( p_pkt );
}
break;
}
else
{
block_Release( p_pkt );
}
break;
}
return 1;
}
......@@ -239,6 +247,7 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
*pf = 0.0;
}
return VLC_SUCCESS;
case DEMUX_SET_POSITION:
f = (double) va_arg( args, double );
i64 = stream_Size( p_demux->s );
......@@ -251,7 +260,8 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
pi64 = (int64_t*)va_arg( args, int64_t * );
if( p_sys->i_mux_rate > 0 )
{
*pi64 = (int64_t)1000000 * ( stream_Tell( p_demux->s ) / 50 ) / p_sys->i_mux_rate;
*pi64 = (int64_t)1000000 * ( stream_Tell( p_demux->s ) / 50 ) /
p_sys->i_mux_rate;
return VLC_SUCCESS;
}
*pi64 = 0;
......@@ -261,7 +271,8 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
pi64 = (int64_t*)va_arg( args, int64_t * );
if( p_sys->i_mux_rate > 0 )
{
*pi64 = (int64_t)1000000 * ( stream_Size( p_demux->s ) / 50 ) / p_sys->i_mux_rate;
*pi64 = (int64_t)1000000 * ( stream_Size( p_demux->s ) / 50 ) /
p_sys->i_mux_rate;
return VLC_SUCCESS;
}
*pi64 = 0;
......@@ -278,7 +289,7 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
* Divers:
*****************************************************************************/
/* PSResynch: resynch on a systeme starcode
/* PSResynch: resynch on a system starcode
* It doesn't skip more than 512 bytes
* -1 -> error, 0 -> not synch, 1 -> ok
*/
......@@ -292,7 +303,8 @@ static int ps_pkt_resynch( stream_t *s, uint32_t *pi_code )
{
return -1;
}
if( p_peek[0] == 0 && p_peek[1] == 0 && p_peek[2] == 1 && p_peek[3] >= 0xb9 )
if( p_peek[0] == 0 && p_peek[1] == 0 && p_peek[2] == 1 &&
p_peek[3] >= 0xb9 )
{
*pi_code = 0x100 | p_peek[3];
return 1;
......@@ -310,7 +322,8 @@ static int ps_pkt_resynch( stream_t *s, uint32_t *pi_code )
{
break;
}
if( p_peek[0] == 0 && p_peek[1] == 0 && p_peek[2] == 1 && p_peek[3] >= 0xb9 )
if( p_peek[0] == 0 && p_peek[1] == 0 && p_peek[2] == 1 &&
p_peek[3] >= 0xb9 )
{
*pi_code = 0x100 | p_peek[3];
return stream_Read( s, NULL, i_skip ) == i_skip ? 1 : -1;
......@@ -342,7 +355,8 @@ static block_t *ps_pkt_read( stream_t *s, uint32_t i_code )
}
while( i_size <= i_peek - 4 )
{
if( p_peek[i_size] == 0x00 && p_peek[i_size+1] == 0x00 && p_peek[i_size+2] == 0x01 && p_peek[i_size+3] >= 0xb9 )
if( p_peek[i_size] == 0x00 && p_peek[i_size+1] == 0x00 &&
p_peek[i_size+2] == 0x01 && p_peek[i_size+3] >= 0xb9 )
{
return stream_Block( s, i_size );
}
......@@ -358,4 +372,3 @@ static block_t *ps_pkt_read( stream_t *s, uint32_t i_code )
return NULL;
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment