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 * Copyright (C) 2004 VideoLAN
* $Id$ * $Id$
...@@ -39,8 +39,8 @@ ...@@ -39,8 +39,8 @@
/***************************************************************************** /*****************************************************************************
* Module descriptor * Module descriptor
*****************************************************************************/ *****************************************************************************/
static int Open ( vlc_object_t * ); static int Open ( vlc_object_t * );
static void Close ( vlc_object_t * ); static void Close( vlc_object_t * );
vlc_module_begin(); vlc_module_begin();
set_description( _("PS demuxer") ); set_description( _("PS demuxer") );
...@@ -55,7 +55,7 @@ vlc_module_end(); ...@@ -55,7 +55,7 @@ vlc_module_end();
struct demux_sys_t struct demux_sys_t
{ {
ps_track_t tk[PS_TK_COUNT]; ps_track_t tk[PS_TK_COUNT];
int64_t i_scr; int64_t i_scr;
int i_mux_rate; int i_mux_rate;
...@@ -83,9 +83,11 @@ static int Open( vlc_object_t *p_this ) ...@@ -83,9 +83,11 @@ static int Open( vlc_object_t *p_this )
return VLC_EGENERIC; 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 */ /* Fill p_demux field */
...@@ -111,6 +113,17 @@ static void Close( vlc_object_t *p_this ) ...@@ -111,6 +113,17 @@ static void Close( vlc_object_t *p_this )
{ {
demux_t *p_demux = (demux_t*)p_this; demux_t *p_demux = (demux_t*)p_this;
demux_sys_t *p_sys = p_demux->p_sys; 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 ); free( p_sys );
} }
...@@ -121,9 +134,9 @@ static void Close( vlc_object_t *p_this ) ...@@ -121,9 +134,9 @@ static void Close( vlc_object_t *p_this )
static int Demux( demux_t *p_demux ) static int Demux( demux_t *p_demux )
{ {
demux_sys_t *p_sys = p_demux->p_sys; demux_sys_t *p_sys = p_demux->p_sys;
int i_ret; int i_ret, i_id, i_mux_rate;
uint32_t i_code; uint32_t i_code;
block_t *p_pkt; block_t *p_pkt;
i_ret = ps_pkt_resynch( p_demux->s, &i_code ); i_ret = ps_pkt_resynch( p_demux->s, &i_code );
if( i_ret < 0 ) if( i_ret < 0 )
...@@ -143,76 +156,71 @@ static int Demux( demux_t *p_demux ) ...@@ -143,76 +156,71 @@ static int Demux( demux_t *p_demux )
switch( i_code ) switch( i_code )
{ {
case 0x1b9: case 0x1b9:
block_Release( p_pkt ); block_Release( p_pkt );
break; break;
case 0x1ba:
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 ); ps_track_t *tk = &p_sys->tk[i];
if( i_mux_rate > 0 )
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: block_Release( p_pkt );
if( !ps_pkt_parse_system( p_pkt, p_sys->tk ) ) break;
{
int i;
for( i = 0; i < PS_TK_COUNT; i++ )
{
ps_track_t *tk = &p_sys->tk[i];
if( tk->b_seen && !tk->es && tk->fmt.i_cat != UNKNOWN_ES ) case 0x1bc:
{ /* TODO PSM */
tk->es = es_out_Add( p_demux->out, &tk->fmt ); block_Release( p_pkt );
} break;
}
}
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 ); ps_track_t *tk = &p_sys->tk[PS_ID_TO_TK(i_id)];
if( i_id >= 0xc0 )
{
ps_track_t *tk = &p_sys->tk[PS_ID_TO_TK(i_id)];
if( !tk->b_seen ) if( !tk->b_seen )
{ {
if( !ps_track_fill( tk, i_id ) ) 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
{ {
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 else
{ {
block_Release( p_pkt ); block_Release( p_pkt );
} }
break;
} }
else
{
block_Release( p_pkt );
}
break;
} }
return 1; return 1;
} }
...@@ -239,6 +247,7 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) ...@@ -239,6 +247,7 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
*pf = 0.0; *pf = 0.0;
} }
return VLC_SUCCESS; return VLC_SUCCESS;
case DEMUX_SET_POSITION: case DEMUX_SET_POSITION:
f = (double) va_arg( args, double ); f = (double) va_arg( args, double );
i64 = stream_Size( p_demux->s ); i64 = stream_Size( p_demux->s );
...@@ -251,7 +260,8 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) ...@@ -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 * ); pi64 = (int64_t*)va_arg( args, int64_t * );
if( p_sys->i_mux_rate > 0 ) 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; return VLC_SUCCESS;
} }
*pi64 = 0; *pi64 = 0;
...@@ -261,7 +271,8 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) ...@@ -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 * ); pi64 = (int64_t*)va_arg( args, int64_t * );
if( p_sys->i_mux_rate > 0 ) 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; return VLC_SUCCESS;
} }
*pi64 = 0; *pi64 = 0;
...@@ -278,7 +289,7 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) ...@@ -278,7 +289,7 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
* Divers: * Divers:
*****************************************************************************/ *****************************************************************************/
/* PSResynch: resynch on a systeme starcode /* PSResynch: resynch on a system starcode
* It doesn't skip more than 512 bytes * It doesn't skip more than 512 bytes
* -1 -> error, 0 -> not synch, 1 -> ok * -1 -> error, 0 -> not synch, 1 -> ok
*/ */
...@@ -292,7 +303,8 @@ static int ps_pkt_resynch( stream_t *s, uint32_t *pi_code ) ...@@ -292,7 +303,8 @@ static int ps_pkt_resynch( stream_t *s, uint32_t *pi_code )
{ {
return -1; 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]; *pi_code = 0x100 | p_peek[3];
return 1; return 1;
...@@ -310,7 +322,8 @@ static int ps_pkt_resynch( stream_t *s, uint32_t *pi_code ) ...@@ -310,7 +322,8 @@ static int ps_pkt_resynch( stream_t *s, uint32_t *pi_code )
{ {
break; 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]; *pi_code = 0x100 | p_peek[3];
return stream_Read( s, NULL, i_skip ) == i_skip ? 1 : -1; 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 ) ...@@ -342,7 +355,8 @@ static block_t *ps_pkt_read( stream_t *s, uint32_t i_code )
} }
while( i_size <= i_peek - 4 ) 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 ); return stream_Block( s, i_size );
} }
...@@ -358,4 +372,3 @@ static block_t *ps_pkt_read( stream_t *s, uint32_t i_code ) ...@@ -358,4 +372,3 @@ static block_t *ps_pkt_read( stream_t *s, uint32_t i_code )
return NULL; 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