@ -54,7 +54,7 @@ typedef struct {
int is_cbr ;
} MP3DecContext ;
static int check ( AVFormatContext * s , int64_t pos ) ;
static int check ( AVIOContext * pb , int64_t pos ) ;
/* mp3 read */
@ -376,7 +376,7 @@ static int mp3_read_header(AVFormatContext *s)
for ( i = 0 ; i < 64 * 1024 ; i + + ) {
if ( ! ( i & 1023 ) )
ffio_ensure_seekback ( s - > pb , i + 1024 + 4 ) ;
if ( check ( s , off + i ) > = 0 ) {
if ( check ( s - > pb , off + i ) > = 0 ) {
av_log ( s , AV_LOG_INFO , " Skipping %d bytes of junk at % " PRId64 " . \n " , i , off ) ;
avio_seek ( s - > pb , off + i , SEEK_SET ) ;
break ;
@ -418,18 +418,22 @@ static int mp3_read_packet(AVFormatContext *s, AVPacket *pkt)
return ret ;
}
static int check ( AVFormatContext * s , int64_t pos )
# define SEEK_WINDOW 4096
static int check ( AVIOContext * pb , int64_t pos )
{
int64_t ret = avio_seek ( s - > pb , pos , SEEK_SET ) ;
int64_t ret = avio_seek ( pb , pos , SEEK_SET ) ;
unsigned header ;
MPADecodeHeader sd ;
if ( ret < 0 )
return ret ;
header = avio_rb32 ( s - > pb ) ;
header = avio_rb32 ( pb ) ;
if ( ff_mpa_check_header ( header ) < 0 )
return - 1 ;
if ( avpriv_mpegaudio_decode_header ( & sd , header ) = = 1 )
return - 1 ;
return sd . frame_size ;
}
@ -466,7 +470,7 @@ static int mp3_seek(AVFormatContext *s, int stream_index, int64_t timestamp,
return - 1 ;
}
avio_seek ( s - > pb , FFMAX ( ie - > pos - 4096 , 0 ) , SEEK_SET ) ;
avio_seek ( s - > pb , FFMAX ( ie - > pos - SEEK_WINDOW , 0 ) , SEEK_SET ) ;
ret = avio_seek ( s - > pb , ie - > pos , SEEK_SET ) ;
if ( ret < 0 )
return ret ;
@ -474,8 +478,8 @@ static int mp3_seek(AVFormatContext *s, int stream_index, int64_t timestamp,
# define MIN_VALID 3
best_pos = ie - > pos ;
best_score = 999 ;
for ( i = 0 ; i < 4096 ; i + + ) {
int64_t pos = ie - > pos + ( dir > 0 ? i - 102 4 : - i ) ;
for ( i = 0 ; i < SEEK_WINDOW ; i + + ) {
int64_t pos = ie - > pos + ( dir > 0 ? i - SEEK_WINDOW / 4 : - i ) ;
int64_t candidate = - 1 ;
int score = 999 ;
@ -483,7 +487,7 @@ static int mp3_seek(AVFormatContext *s, int stream_index, int64_t timestamp,
continue ;
for ( j = 0 ; j < MIN_VALID ; j + + ) {
ret = check ( s , pos ) ;
ret = check ( s - > pb , pos ) ;
if ( ret < 0 )
break ;
if ( ( ie - > pos - pos ) * dir < = 0 & & abs ( MIN_VALID / 2 - j ) < score ) {