@ -121,7 +121,7 @@ static int get_riff(AVFormatContext *s, AVIOContext *pb)
if ( ! memcmp ( header , avi_headers [ i ] , 8 ) )
if ( ! memcmp ( header , avi_headers [ i ] , 8 ) )
break ;
break ;
if ( ! avi_headers [ i ] [ 0 ] )
if ( ! avi_headers [ i ] [ 0 ] )
return - 1 ;
return AVERROR_INVALIDDATA ;
if ( header [ 7 ] = = 0x19 )
if ( header [ 7 ] = = 0x19 )
av_log ( s , AV_LOG_INFO , " This file has been generated by a totally broken muxer. \n " ) ;
av_log ( s , AV_LOG_INFO , " This file has been generated by a totally broken muxer. \n " ) ;
@ -149,26 +149,26 @@ static int read_braindead_odml_indx(AVFormatContext *s, int frame_num){
longs_pre_entry , index_type , entries_in_use , chunk_id , base ) ;
longs_pre_entry , index_type , entries_in_use , chunk_id , base ) ;
if ( stream_id > = s - > nb_streams | | stream_id < 0 )
if ( stream_id > = s - > nb_streams | | stream_id < 0 )
return - 1 ;
return AVERROR_INVALIDDATA ;
st = s - > streams [ stream_id ] ;
st = s - > streams [ stream_id ] ;
ast = st - > priv_data ;
ast = st - > priv_data ;
if ( index_sub_type )
if ( index_sub_type )
return - 1 ;
return AVERROR_INVALIDDATA ;
avio_rl32 ( pb ) ;
avio_rl32 ( pb ) ;
if ( index_type & & longs_pre_entry ! = 2 )
if ( index_type & & longs_pre_entry ! = 2 )
return - 1 ;
return AVERROR_INVALIDDATA ;
if ( index_type > 1 )
if ( index_type > 1 )
return - 1 ;
return AVERROR_INVALIDDATA ;
if ( filesize > 0 & & base > = filesize ) {
if ( filesize > 0 & & base > = filesize ) {
av_log ( s , AV_LOG_ERROR , " ODML index invalid \n " ) ;
av_log ( s , AV_LOG_ERROR , " ODML index invalid \n " ) ;
if ( base > > 32 = = ( base & 0xFFFFFFFF ) & & ( base & 0xFFFFFFFF ) < filesize & & filesize < = 0xFFFFFFFF )
if ( base > > 32 = = ( base & 0xFFFFFFFF ) & & ( base & 0xFFFFFFFF ) < filesize & & filesize < = 0xFFFFFFFF )
base & = 0xFFFFFFFF ;
base & = 0xFFFFFFFF ;
else
else
return - 1 ;
return AVERROR_INVALIDDATA ;
}
}
for ( i = 0 ; i < entries_in_use ; i + + ) {
for ( i = 0 ; i < entries_in_use ; i + + ) {
@ -181,7 +181,7 @@ static int read_braindead_odml_indx(AVFormatContext *s, int frame_num){
av_dlog ( s , " pos:% " PRId64 " , len:%X \n " , pos , len ) ;
av_dlog ( s , " pos:% " PRId64 " , len:%X \n " , pos , len ) ;
if ( pb - > eof_reached )
if ( pb - > eof_reached )
return - 1 ;
return AVERROR_INVALIDDATA ;
if ( last_pos = = pos | | pos = = base - 8 )
if ( last_pos = = pos | | pos = = base - 8 )
avi - > non_interleaved = 1 ;
avi - > non_interleaved = 1 ;
@ -198,13 +198,13 @@ static int read_braindead_odml_indx(AVFormatContext *s, int frame_num){
duration = avio_rl32 ( pb ) ;
duration = avio_rl32 ( pb ) ;
if ( pb - > eof_reached )
if ( pb - > eof_reached )
return - 1 ;
return AVERROR_INVALIDDATA ;
pos = avio_tell ( pb ) ;
pos = avio_tell ( pb ) ;
if ( avi - > odml_depth > MAX_ODML_DEPTH ) {
if ( avi - > odml_depth > MAX_ODML_DEPTH ) {
av_log ( s , AV_LOG_ERROR , " Too deeply nested ODML indexes \n " ) ;
av_log ( s , AV_LOG_ERROR , " Too deeply nested ODML indexes \n " ) ;
return - 1 ;
return AVERROR_INVALIDDATA ;
}
}
avio_seek ( pb , offset + 8 , SEEK_SET ) ;
avio_seek ( pb , offset + 8 , SEEK_SET ) ;
@ -254,10 +254,10 @@ static int avi_read_tag(AVFormatContext *s, AVStream *st, uint32_t tag, uint32_t
size + = ( size & 1 ) ;
size + = ( size & 1 ) ;
if ( size = = UINT_MAX )
if ( size = = UINT_MAX )
return - 1 ;
return AVERROR ( EINVAL ) ;
value = av_malloc ( size + 1 ) ;
value = av_malloc ( size + 1 ) ;
if ( ! value )
if ( ! value )
return - 1 ;
return AVERROR ( ENOMEM ) ;
avio_read ( pb , value , size ) ;
avio_read ( pb , value , size ) ;
value [ size ] = 0 ;
value [ size ] = 0 ;
@ -342,8 +342,9 @@ static int avi_read_header(AVFormatContext *s)
avi - > stream_index = - 1 ;
avi - > stream_index = - 1 ;
if ( get_riff ( s , pb ) < 0 )
ret = get_riff ( s , pb ) ;
return - 1 ;
if ( ret < 0 )
return ret ;
avi - > fsize = avio_size ( pb ) ;
avi - > fsize = avio_size ( pb ) ;
if ( avi - > fsize < = 0 )
if ( avi - > fsize < = 0 )
@ -701,7 +702,9 @@ static int avi_read_header(AVFormatContext *s)
break ;
break ;
case MKTAG ( ' s ' , ' t ' , ' r ' , ' n ' ) :
case MKTAG ( ' s ' , ' t ' , ' r ' , ' n ' ) :
if ( s - > nb_streams ) {
if ( s - > nb_streams ) {
avi_read_tag ( s , s - > streams [ s - > nb_streams - 1 ] , tag , size ) ;
ret = avi_read_tag ( s , s - > streams [ s - > nb_streams - 1 ] , tag , size ) ;
if ( ret < 0 )
return ret ;
break ;
break ;
}
}
default :
default :
@ -724,7 +727,7 @@ static int avi_read_header(AVFormatContext *s)
/* check stream number */
/* check stream number */
if ( stream_index ! = s - > nb_streams - 1 ) {
if ( stream_index ! = s - > nb_streams - 1 ) {
fail :
fail :
return - 1 ;
return AVERROR_INVALIDDATA ;
}
}
if ( ! avi - > index_loaded & & pb - > seekable )
if ( ! avi - > index_loaded & & pb - > seekable )
@ -1016,7 +1019,7 @@ static int avi_read_packet(AVFormatContext *s, AVPacket *pkt)
}
}
}
}
if ( ! best_st )
if ( ! best_st )
return - 1 ;
return AVERROR_EOF ;
best_ast = best_st - > priv_data ;
best_ast = best_st - > priv_data ;
best_ts = av_rescale_q ( best_ts , ( AVRational ) { FFMAX ( 1 , best_ast - > sample_size ) , AV_TIME_BASE } , best_st - > time_base ) ;
best_ts = av_rescale_q ( best_ts , ( AVRational ) { FFMAX ( 1 , best_ast - > sample_size ) , AV_TIME_BASE } , best_st - > time_base ) ;
@ -1148,7 +1151,7 @@ static int avi_read_idx1(AVFormatContext *s, int size)
nb_index_entries = size / 16 ;
nb_index_entries = size / 16 ;
if ( nb_index_entries < = 0 )
if ( nb_index_entries < = 0 )
return - 1 ;
return AVERROR_INVALIDDATA ;
idx1_pos = avio_tell ( pb ) ;
idx1_pos = avio_tell ( pb ) ;
avio_seek ( pb , avi - > movi_list + 4 , SEEK_SET ) ;
avio_seek ( pb , avi - > movi_list + 4 , SEEK_SET ) ;
@ -1183,7 +1186,7 @@ static int avi_read_idx1(AVFormatContext *s, int size)
av_dlog ( s , " %d cum_len=% " PRId64 " \n " , len , ast - > cum_len ) ;
av_dlog ( s , " %d cum_len=% " PRId64 " \n " , len , ast - > cum_len ) ;
if ( pb - > eof_reached )
if ( pb - > eof_reached )
return - 1 ;
return AVERROR_INVALIDDATA ;
if ( last_pos = = pos )
if ( last_pos = = pos )
avi - > non_interleaved = 1 ;
avi - > non_interleaved = 1 ;
@ -1293,7 +1296,7 @@ static int avi_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp
ast = st - > priv_data ;
ast = st - > priv_data ;
index = av_index_search_timestamp ( st , timestamp * FFMAX ( ast - > sample_size , 1 ) , flags ) ;
index = av_index_search_timestamp ( st , timestamp * FFMAX ( ast - > sample_size , 1 ) , flags ) ;
if ( index < 0 )
if ( index < 0 )
return - 1 ;
return AVERROR_INVALIDDATA ;
/* find the position */
/* find the position */
pos = st - > index_entries [ index ] . pos ;
pos = st - > index_entries [ index ] . pos ;