X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fdemux%2Fpva.c;h=f62b522339ea1b074e2d51a16675c931f8ab4c87;hb=6f768ab47bc2afdcb20b4a5e39e620f7f58e2256;hp=72b1a2988b1460a2d2d029517877467bfec97b0c;hpb=df61d33b06e2b3cbbe746b2f5a9bea5b370c24ff;p=vlc diff --git a/modules/demux/pva.c b/modules/demux/pva.c index 72b1a2988b..f62b522339 100644 --- a/modules/demux/pva.c +++ b/modules/demux/pva.c @@ -29,7 +29,8 @@ # include "config.h" #endif -#include +#include +#include #include /***************************************************************************** @@ -38,14 +39,14 @@ static int Open ( vlc_object_t * ); static void Close ( vlc_object_t * ); -vlc_module_begin(); - set_description( _("PVA demuxer" ) ); - set_capability( "demux", 10 ); - set_category( CAT_INPUT ); - set_subcategory( SUBCAT_INPUT_DEMUX ); - set_callbacks( Open, Close ); - add_shortcut( "pva" ); -vlc_module_end(); +vlc_module_begin () + set_description( N_("PVA demuxer" ) ) + set_capability( "demux", 10 ) + set_category( CAT_INPUT ) + set_subcategory( SUBCAT_INPUT_DEMUX ) + set_callbacks( Open, Close ) + add_shortcut( "pva" ) +vlc_module_end () /***************************************************************************** * Local prototypes @@ -83,7 +84,7 @@ static int Open( vlc_object_t *p_this ) es_format_t fmt; const uint8_t *p_peek; - if( stream_Peek( p_demux->s, &p_peek, 5 ) < 5 ) return VLC_EGENERIC; + if( stream_Peek( p_demux->s, &p_peek, 8 ) < 8 ) return VLC_EGENERIC; if( p_peek[0] != 'A' || p_peek[1] != 'V' || p_peek[4] != 0x55 ) { /* In case we had forced this demuxer we try to resynch */ @@ -97,10 +98,12 @@ static int Open( vlc_object_t *p_this ) p_demux->p_sys = p_sys = malloc( sizeof( demux_sys_t ) ); /* Register one audio and one video stream */ - es_format_Init( &fmt, AUDIO_ES, VLC_FOURCC( 'm', 'p', 'g', 'a' ) ); + es_format_Init( &fmt, AUDIO_ES, VLC_CODEC_MPGA ); + fmt.b_packetized = false; p_sys->p_audio = es_out_Add( p_demux->out, &fmt ); - es_format_Init( &fmt, VIDEO_ES, VLC_FOURCC( 'm', 'p', 'g', 'v' ) ); + es_format_Init( &fmt, VIDEO_ES, VLC_CODEC_MPGV ); + fmt.b_packetized = false; p_sys->p_video = es_out_Add( p_demux->out, &fmt ); p_sys->i_vc = -1; @@ -130,6 +133,8 @@ static void Close( vlc_object_t *p_this ) /***************************************************************************** * Demux: + ***************************************************************************** + * See http://multimedia.cx/mirror/av_format_v1.pdf *****************************************************************************/ static int Demux( demux_t *p_demux ) { @@ -206,7 +211,7 @@ static int Demux( demux_t *p_demux ) if( ( p_frame = p_sys->p_es ) ) { - if( p_frame->i_pts > 0 && !p_sys->b_pcr_audio ) + if( p_frame->i_pts > VLC_TS_INVALID && !p_sys->b_pcr_audio ) { es_out_Control( p_demux->out, ES_OUT_SET_PCR, (int64_t)p_frame->i_pts); } @@ -220,7 +225,8 @@ static int Demux( demux_t *p_demux ) { p_frame->p_buffer += i_skip; p_frame->i_buffer -= i_skip; - if( i_pts > 0 ) p_frame->i_pts = i_pts * 100 / 9; + if( i_pts >= 0 ) + p_frame->i_pts = VLC_TS_0 + i_pts * 100 / 9; block_ChainAppend( &p_sys->p_es, p_frame ); } break; @@ -250,7 +256,7 @@ static int Demux( demux_t *p_demux ) p_frame->p_buffer += 8; p_frame->i_buffer -= 8; /* XXX this a hack, some streams aren't compliant and - * doesn't set pes_start flag */ + * don't set pes_start flag */ if( p_sys->p_pes && p_frame->i_buffer > 4 && p_frame->p_buffer[0] == 0x00 && p_frame->p_buffer[1] == 0x00 && @@ -284,7 +290,8 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) if( ( i64 = stream_Size( p_demux->s ) ) > 0 ) { pf = (double*) va_arg( args, double* ); - *pf = (double)stream_Tell( p_demux->s ) / (double)i64; + double current = stream_Tell( p_demux->s ); + *pf = current / (double)i64; return VLC_SUCCESS; } return VLC_EGENERIC; @@ -293,7 +300,6 @@ static int Control( demux_t *p_demux, int i_query, va_list args ) f = (double) va_arg( args, double ); i64 = stream_Size( p_demux->s ); - es_out_Control( p_demux->out, ES_OUT_RESET_PCR ); if( stream_Seek( p_demux->s, (int64_t)(i64 * f) ) || ReSynch( p_demux ) ) { return VLC_EGENERIC; @@ -343,7 +349,7 @@ static int ReSynch( demux_t *p_demux ) int i_skip; int i_peek; - while( !p_demux->b_die ) + while( vlc_object_alive (p_demux) ) { if( ( i_peek = stream_Peek( p_demux->s, &p_peek, 1024 ) ) < 8 ) { @@ -376,9 +382,8 @@ static void ParsePES( demux_t *p_demux ) demux_sys_t *p_sys = p_demux->p_sys; block_t *p_pes = p_sys->p_pes; uint8_t hdr[30]; - int i_pes_size; - int i_skip; + unsigned i_skip; mtime_t i_dts = -1; mtime_t i_pts = -1; @@ -387,6 +392,7 @@ static void ParsePES( demux_t *p_demux ) /* FIXME find real max size */ block_ChainExtract( p_pes, hdr, 30 ); + /* See §2.4.3.6 of ISO 13818-1 */ if( hdr[0] != 0 || hdr[1] != 0 || hdr[2] != 1 ) { msg_Warn( p_demux, "invalid hdr [0x%2.2x:%2.2x:%2.2x:%2.2x]", @@ -394,7 +400,8 @@ static void ParsePES( demux_t *p_demux ) block_ChainRelease( p_pes ); return; } - i_pes_size = GetWBE( &hdr[4] ); + // hdr[4] i_pes_size, 2 bytes + // hdr[6] Marker -> original_or_copy /* we assume mpeg2 PES */ i_skip = hdr[8] + 9; @@ -426,8 +433,10 @@ static void ParsePES( demux_t *p_demux ) p_pes->i_buffer -= i_skip; p_pes->p_buffer += i_skip; - if( i_dts >= 0 ) p_pes->i_dts = i_dts * 100 / 9; - if( i_pts >= 0 ) p_pes->i_pts = i_pts * 100 / 9; + if( i_dts >= 0 ) + p_pes->i_dts = VLC_TS_0 + i_dts * 100 / 9; + if( i_pts >= 0 ) + p_pes->i_pts = VLC_TS_0 + i_pts * 100 / 9; /* Set PCR */ if( p_pes->i_pts > 0 )