Commit ab7decb5 authored by Laurent Aimar's avatar Laurent Aimar

* avi: partial fix for non interleaved file with incorrect( I'm not sure

about that) stream descriptor. Now at least video will be played.
parent 1f27e2f4
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* avi.c : AVI file Stream input module for vlc * avi.c : AVI file Stream input module for vlc
***************************************************************************** *****************************************************************************
* Copyright (C) 2001 VideoLAN * Copyright (C) 2001 VideoLAN
* $Id: avi.c,v 1.23 2003/01/11 18:31:17 fenrir Exp $ * $Id: avi.c,v 1.24 2003/01/12 18:26:09 fenrir Exp $
* Authors: Laurent Aimar <fenrir@via.ecp.fr> * Authors: Laurent Aimar <fenrir@via.ecp.fr>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
...@@ -622,6 +622,7 @@ print_stat: ...@@ -622,6 +622,7 @@ print_stat:
static vlc_bool_t AVI_StreamStart ( input_thread_t *, demux_sys_t *, int ); static vlc_bool_t AVI_StreamStart ( input_thread_t *, demux_sys_t *, int );
static int AVI_StreamSeek ( input_thread_t *, demux_sys_t *, int, mtime_t ); static int AVI_StreamSeek ( input_thread_t *, demux_sys_t *, int, mtime_t );
static void AVI_StreamStop ( input_thread_t *, demux_sys_t *, int ); static void AVI_StreamStop ( input_thread_t *, demux_sys_t *, int );
static int AVI_StreamStopFinishedStreams( input_thread_t *, demux_sys_t * );
static vlc_bool_t AVI_StreamStart( input_thread_t *p_input, static vlc_bool_t AVI_StreamStart( input_thread_t *p_input,
demux_sys_t *p_avi, int i_stream ) demux_sys_t *p_avi, int i_stream )
...@@ -679,6 +680,28 @@ static void AVI_StreamStop( input_thread_t *p_input, ...@@ -679,6 +680,28 @@ static void AVI_StreamStop( input_thread_t *p_input,
#undef p_stream #undef p_stream
} }
static int AVI_StreamStopFinishedStreams( input_thread_t *p_input,
demux_sys_t *p_avi )
{
int i_stream;
int b_end;
for( i_stream = 0,b_end = VLC_TRUE;
i_stream < p_avi->i_streams; i_stream++ )
{
#define p_stream p_avi->pp_info[i_stream]
if( p_stream->i_idxposc >= p_stream->i_idxnb )
{
AVI_StreamStop( p_input, p_avi, i_stream );
}
else
{
b_end = VLC_FALSE;
}
#undef p_stream
}
return( b_end );
}
/**************************************************************************** /****************************************************************************
* AVI_MovieGetLength give max streams length in second * AVI_MovieGetLength give max streams length in second
****************************************************************************/ ****************************************************************************/
...@@ -941,7 +964,9 @@ static int AVIInit( vlc_object_t * p_this ) ...@@ -941,7 +964,9 @@ static int AVIInit( vlc_object_t * p_this )
p_info->i_rate = p_avi_strh->i_rate; p_info->i_rate = p_avi_strh->i_rate;
p_info->i_scale = p_avi_strh->i_scale; p_info->i_scale = p_avi_strh->i_scale;
p_info->i_samplesize = p_avi_strh->i_samplesize; p_info->i_samplesize = p_avi_strh->i_samplesize;
msg_Dbg( p_input, "stream[%d] rate:%d scale:%d samplesize:%d",
i,
p_info->i_rate, p_info->i_scale, p_info->i_samplesize );
switch( p_avi_strh->i_type ) switch( p_avi_strh->i_type )
{ {
case( AVIFOURCC_auds ): case( AVIFOURCC_auds ):
...@@ -1661,6 +1686,7 @@ typedef struct avi_stream_toread_s ...@@ -1661,6 +1686,7 @@ typedef struct avi_stream_toread_s
static int AVIDemux_Seekable( input_thread_t *p_input ) static int AVIDemux_Seekable( input_thread_t *p_input )
{ {
unsigned int i_stream_count;
unsigned int i_stream; unsigned int i_stream;
vlc_bool_t b_stream; vlc_bool_t b_stream;
...@@ -1670,7 +1696,8 @@ static int AVIDemux_Seekable( input_thread_t *p_input ) ...@@ -1670,7 +1696,8 @@ static int AVIDemux_Seekable( input_thread_t *p_input )
demux_sys_t *p_avi = p_input->p_demux_data; demux_sys_t *p_avi = p_input->p_demux_data;
/* detect new selected/unselected streams */ /* detect new selected/unselected streams */
for( i_stream = 0; i_stream < p_avi->i_streams; i_stream++ ) for( i_stream = 0,i_stream_count= 0;
i_stream < p_avi->i_streams; i_stream++ )
{ {
#define p_stream p_avi->pp_info[i_stream] #define p_stream p_avi->pp_info[i_stream]
if( p_stream->p_es ) if( p_stream->p_es )
...@@ -1687,9 +1714,19 @@ static int AVIDemux_Seekable( input_thread_t *p_input ) ...@@ -1687,9 +1714,19 @@ static int AVIDemux_Seekable( input_thread_t *p_input )
AVI_StreamStop( p_input, p_avi, i_stream ); AVI_StreamStop( p_input, p_avi, i_stream );
} }
} }
if( p_stream->b_activated )
{
i_stream_count++;
}
#undef p_stream #undef p_stream
} }
if( i_stream_count <= 0 )
{
msg_Err( p_input, "no track selected, exiting..." );
return( 0 );
}
if( p_input->stream.p_selected_program->i_synchro_state == SYNCHRO_REINIT ) if( p_input->stream.p_selected_program->i_synchro_state == SYNCHRO_REINIT )
{ {
mtime_t i_date; mtime_t i_date;
...@@ -1819,13 +1856,14 @@ static int AVIDemux_Seekable( input_thread_t *p_input ) ...@@ -1819,13 +1856,14 @@ static int AVIDemux_Seekable( input_thread_t *p_input )
if( i_pos == -1 ) if( i_pos == -1 )
{ {
/* no valid index, we will parse directly the stream */ /* no valid index, we will parse directly the stream
* in case we fail we will disable all finished stream */
if( p_avi->i_movi_lastchunk_pos >= p_avi->i_movi_begin ) if( p_avi->i_movi_lastchunk_pos >= p_avi->i_movi_begin )
{ {
AVI_SeekAbsolute( p_input, p_avi->i_movi_lastchunk_pos ); AVI_SeekAbsolute( p_input, p_avi->i_movi_lastchunk_pos );
if( AVI_PacketNext( p_input ) ) if( AVI_PacketNext( p_input ) )
{ {
return( 0 ); return( AVI_StreamStopFinishedStreams( p_input, p_avi ) ? 0 : 1 );
} }
} }
else else
...@@ -1839,8 +1877,9 @@ static int AVIDemux_Seekable( input_thread_t *p_input ) ...@@ -1839,8 +1877,9 @@ static int AVIDemux_Seekable( input_thread_t *p_input )
if( AVI_PacketGetHeader( p_input, &avi_pk ) ) if( AVI_PacketGetHeader( p_input, &avi_pk ) )
{ {
msg_Err( p_input, "cannot get packet header" ); msg_Err( p_input,
return( 0 ); "cannot get packet header, track disabled" );
return( AVI_StreamStopFinishedStreams( p_input, p_avi ) ? 0 : 1 );
} }
if( avi_pk.i_stream >= p_avi->i_streams || if( avi_pk.i_stream >= p_avi->i_streams ||
( avi_pk.i_cat != AUDIO_ES && avi_pk.i_cat != VIDEO_ES ) ) ( avi_pk.i_cat != AUDIO_ES && avi_pk.i_cat != VIDEO_ES ) )
...@@ -1853,8 +1892,9 @@ static int AVIDemux_Seekable( input_thread_t *p_input ) ...@@ -1853,8 +1892,9 @@ static int AVIDemux_Seekable( input_thread_t *p_input )
default: default:
if( AVI_PacketNext( p_input ) ) if( AVI_PacketNext( p_input ) )
{ {
msg_Err( p_input, "cannot skip packet" ); msg_Err( p_input,
return( 0 ); "cannot skip packet, track disabled" );
return( AVI_StreamStopFinishedStreams( p_input, p_avi ) ? 0 : 1 );
} }
break; break;
} }
...@@ -1884,8 +1924,9 @@ static int AVIDemux_Seekable( input_thread_t *p_input ) ...@@ -1884,8 +1924,9 @@ static int AVIDemux_Seekable( input_thread_t *p_input )
{ {
if( AVI_PacketNext( p_input ) ) if( AVI_PacketNext( p_input ) )
{ {
msg_Err( p_input, "cannot skip packet" ); msg_Err( p_input,
return( 0 ); "cannot skip packet, track disabled" );
return( AVI_StreamStopFinishedStreams( p_input, p_avi ) ? 0 : 1 );
} }
} }
} }
...@@ -1994,28 +2035,7 @@ static int AVIDemux_Seekable( input_thread_t *p_input ) ...@@ -1994,28 +2035,7 @@ static int AVIDemux_Seekable( input_thread_t *p_input )
input_ClockGetTS( p_input, input_ClockGetTS( p_input,
p_input->stream.p_selected_program, p_input->stream.p_selected_program,
p_pes->i_pts * 9/100); p_pes->i_pts * 9/100);
#if 0
/* debuuging: split pes in 2 parts */
if( p_pes->i_nb_data >= 2 && p_stream->i_cat == AUDIO_ES )
{
pes_packet_t *p_pes_;
data_packet_t *p_data;
int i_nb_data;
p_pes_ = PES_split( p_input, p_stream, p_pes );
if( p_pes_->i_nb_data >= 2 )
{
input_DecodePES( p_stream->p_es->p_decoder_fifo, PES_split( p_input,p_stream,p_pes_ ) );
}
input_DecodePES( p_stream->p_es->p_decoder_fifo,p_pes_ );
if( p_pes->i_nb_data >= 2 )
{
input_DecodePES( p_stream->p_es->p_decoder_fifo, PES_split( p_input,p_stream,p_pes ) );
}
//input_DecodePES( p_stream->p_es->p_decoder_fifo,p_pes );
}
#endif
input_DecodePES( p_stream->p_es->p_decoder_fifo, p_pes ); input_DecodePES( p_stream->p_es->p_decoder_fifo, p_pes );
} }
else else
......
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