X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fdemux%2Fps.c;h=0b0227529c9f2df41d0cf2a9ea45367909bcc294;hb=a95553a1b9725e1f475bd501cd442200e8483604;hp=033eee81f3abbb2ea8dbbe159b0e70b9ec94ae95;hpb=7e3972c490bf6de6db0050dc05a3a6974dd12d88;p=vlc diff --git a/modules/demux/ps.c b/modules/demux/ps.c index 033eee81f3..0b0227529c 100644 --- a/modules/demux/ps.c +++ b/modules/demux/ps.c @@ -1,7 +1,7 @@ /***************************************************************************** * ps.c: Program Stream demux module for VLC. ***************************************************************************** - * Copyright (C) 2004 the VideoLAN team + * Copyright (C) 2004-2009 the VideoLAN team * $Id$ * * Authors: Laurent Aimar @@ -61,7 +61,7 @@ vlc_module_begin () set_callbacks( OpenForce, Close ) add_shortcut( "ps" ) - add_bool( "ps-trust-timestamps", true, NULL, TIME_TEXT, + add_bool( "ps-trust-timestamps", true, TIME_TEXT, TIME_LONGTEXT, true ) change_safe () @@ -240,7 +240,7 @@ static void FindLength( demux_t *p_demux ) int64_t i_current_pos = -1, i_size = 0, i_end = 0; int i; - if( !var_CreateGetInteger( p_demux, "ps-trust-timestamps" ) ) + if( !var_CreateGetBool( p_demux, "ps-trust-timestamps" ) ) return; if( p_sys->i_length == -1 ) /* First time */ @@ -391,14 +391,14 @@ static int Demux( demux_t *p_demux ) /* The popular VCD/SVCD subtitling WinSubMux does not * renumber the SCRs when merging subtitles into the PES */ if( tk->b_seen && - ( tk->fmt.i_codec == VLC_FOURCC('o','g','t',' ') || - tk->fmt.i_codec == VLC_FOURCC('c','v','d',' ') ) ) + ( tk->fmt.i_codec == VLC_CODEC_OGT || + tk->fmt.i_codec == VLC_CODEC_CVD ) ) { p_sys->i_scr = -1; } - if( p_sys->i_scr > 0 ) - es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_sys->i_scr ); + if( p_sys->i_scr >= 0 ) + es_out_Control( p_demux->out, ES_OUT_SET_PCR, VLC_TS_0 + p_sys->i_scr ); p_sys->i_scr = -1; @@ -411,7 +411,7 @@ static int Demux( demux_t *p_demux ) { if( !b_new && !p_sys->b_have_pack && (tk->fmt.i_cat == AUDIO_ES) && - (p_pkt->i_pts > 0) ) + (p_pkt->i_pts > VLC_TS_INVALID) ) { /* A hack to sync the A/V on PES files. */ msg_Dbg( p_demux, "force SCR: %"PRId64, p_pkt->i_pts ); @@ -456,7 +456,8 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) i64 = stream_Size( p_demux->s ); if( i64 > 0 ) { - *pf = (double)stream_Tell( p_demux->s ) / (double)i64; + double current = stream_Tell( p_demux->s ); + *pf = current / (double)i64; } else { @@ -513,6 +514,7 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) if( !i_now ) return i64 ? VLC_EGENERIC : VLC_SUCCESS; + p_sys->i_current_pts = 0; i_pos *= (float)i64 / (float)i_now; stream_Seek( p_demux->s, i_pos ); return VLC_SUCCESS; @@ -579,16 +581,12 @@ static int ps_pkt_resynch( stream_t *s, uint32_t *pi_code ) static block_t *ps_pkt_read( stream_t *s, uint32_t i_code ) { const uint8_t *p_peek; - int i_peek = stream_Peek( s, &p_peek, 14 ); - int i_size; - VLC_UNUSED(i_code); - - /* Smallest valid packet */ - if( i_peek < 6 ) return NULL; + int i_peek = stream_Peek( s, &p_peek, 14 ); + if( i_peek < 4 ) + return NULL; - i_size = ps_pkt_size( p_peek, i_peek ); - - if( i_size < 0 || ( i_size <= 6 && p_peek[3] > 0xba ) ) + int i_size = ps_pkt_size( p_peek, i_peek ); + if( i_size <= 6 && p_peek[3] > 0xba ) { /* Special case, search the next start code */ i_size = 6; @@ -616,5 +614,6 @@ static block_t *ps_pkt_read( stream_t *s, uint32_t i_code ) return stream_Block( s, i_size ); } + VLC_UNUSED(i_code); return NULL; }