@ -1456,30 +1456,30 @@ static int64_t asf_read_pts(AVFormatContext *s, int stream_index,
return pts ;
}
static void asf_build_simple_index ( AVFormatContext * s , int stream_index )
static int asf_build_simple_index ( AVFormatContext * s , int stream_index )
{
ff_asf_guid g ;
ASFContext * asf = s - > priv_data ;
int64_t current_pos = avio_tell ( s - > pb ) ;
int ret = 0 ;
if ( avio_seek ( s - > pb , asf - > data_object_offset + asf - > data_object_size , SEEK_SET ) < 0 ) {
asf - > index_read = - 1 ;
return ;
return AVERROR_INVALIDDATA ;
}
ff_get_guid ( s - > pb , & g ) ;
if ( ( ret = ff_get_guid ( s - > pb , & g ) ) < 0 )
goto end ;
/* the data object can be followed by other top-level objects,
* skip them until the simple index object is reached */
while ( ff_guidcmp ( & g , & ff_asf_simple_index_header ) ) {
int64_t gsize = avio_rl64 ( s - > pb ) ;
if ( gsize < 24 | | url_feof ( s - > pb ) ) {
avio_seek ( s - > pb , current_pos , SEEK_SET ) ;
asf - > index_read = - 1 ;
return ;
goto end ;
}
avio_skip ( s - > pb , gsize - 24 ) ;
ff_get_guid ( s - > pb , & g ) ;
if ( ( ret = ff_get_guid ( s - > pb , & g ) ) < 0 )
goto end ;
}
{
@ -1487,7 +1487,8 @@ static void asf_build_simple_index(AVFormatContext *s, int stream_index)
int pct , ict ;
int i ;
int64_t av_unused gsize = avio_rl64 ( s - > pb ) ;
ff_get_guid ( s - > pb , & g ) ;
if ( ( ret = ff_get_guid ( s - > pb , & g ) ) < 0 )
goto end ;
itime = avio_rl64 ( s - > pb ) ;
pct = avio_rl32 ( s - > pb ) ;
ict = avio_rl32 ( s - > pb ) ;
@ -1510,7 +1511,12 @@ static void asf_build_simple_index(AVFormatContext *s, int stream_index)
}
asf - > index_read = ict > 1 ;
}
end :
// if (url_feof(s->pb)) {
// ret = 0;
// }
avio_seek ( s - > pb , current_pos , SEEK_SET ) ;
return ret ;
}
static int asf_read_seek ( AVFormatContext * s , int stream_index ,
@ -1518,6 +1524,7 @@ static int asf_read_seek(AVFormatContext *s, int stream_index,
{
ASFContext * asf = s - > priv_data ;
AVStream * st = s - > streams [ stream_index ] ;
int ret = 0 ;
if ( s - > packet_size < = 0 )
return - 1 ;
@ -1531,10 +1538,13 @@ static int asf_read_seek(AVFormatContext *s, int stream_index,
return ret ;
}
if ( ! asf - > index_read )
asf_build_simple_index ( s , stream_index ) ;
if ( ! asf - > index_read ) {
ret = asf_build_simple_index ( s , stream_index ) ;
if ( ret < 0 )
asf - > index_read = - 1 ;
}
if ( ( asf - > index_read > 0 & & st - > index_entries ) ) {
if ( asf - > index_read > 0 & & st - > index_entries ) {
int index = av_index_search_timestamp ( st , pts , flags ) ;
if ( index > = 0 ) {
/* find the position */