@ -1024,7 +1024,7 @@ int av_add_index_entry(AVStream *st,
st - > index_entries = entries ;
index = av_index_search_timestamp ( st , timestamp , 0 ) ;
index = av_index_search_timestamp ( st , timestamp , AVSEEK_FLAG_ANY ) ;
if ( index < 0 ) {
index = st - > nb_index_entries + + ;
@ -1090,13 +1090,14 @@ static int is_raw_stream(AVFormatContext *s)
/**
* gets the index for a specific timestamp .
* @ param backward if non zero then the returned index will correspond to
* @ param flags if AVSEEK_FLAG_BACKWARD then the returned index will correspond to
* the timestamp which is < = the requested one , if backward is 0
* then it will be > =
* if AVSEEK_FLAG_ANY seek to any frame , only keyframes otherwise
* @ return < 0 if no such timestamp could be found
*/
int av_index_search_timestamp ( AVStream * st , int64_t wanted_timestamp ,
int backward )
int flags )
{
AVIndexEntry * entries = st - > index_entries ;
int nb_entries = st - > nb_index_entries ;
@ -1114,7 +1115,13 @@ int av_index_search_timestamp(AVStream *st, int64_t wanted_timestamp,
if ( timestamp < = wanted_timestamp )
a = m ;
}
m = backward ? a : b ;
m = ( flags & AVSEEK_FLAG_BACKWARD ) ? a : b ;
if ( ! ( flags & AVSEEK_FLAG_ANY ) ) {
while ( m > = 0 & & m < nb_entries & & ! ( entries [ m ] . flags & AVINDEX_KEYFRAME ) ) {
m + = ( flags & AVSEEK_FLAG_BACKWARD ) ? - 1 : 1 ;
}
}
if ( m = = nb_entries )
return - 1 ;
@ -1152,7 +1159,7 @@ int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts
if ( st - > index_entries ) {
AVIndexEntry * e ;
index = av_index_search_timestamp ( st , target_ts , 1 ) ;
index = av_index_search_timestamp ( st , target_ts , flags | AVSEEK_FLAG_BACKWARD ) ; //FIXME whole func must be checked for non keyframe entries in index case, especially read_timestamp()
index = FFMAX ( index , 0 ) ;
e = & st - > index_entries [ index ] ;
@ -1166,8 +1173,10 @@ int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts
} else {
assert ( index = = 0 ) ;
}
index + + ;
if ( index < st - > nb_index_entries ) {
index = av_index_search_timestamp ( st , target_ts , flags & ~ AVSEEK_FLAG_BACKWARD ) ;
assert ( index < st - > nb_index_entries ) ;
if ( index > = 0 ) {
e = & st - > index_entries [ index ] ;
assert ( e - > timestamp > = target_ts ) ;
pos_max = e - > pos ;
@ -1316,7 +1325,7 @@ static int av_seek_frame_generic(AVFormatContext *s,
}
st = s - > streams [ stream_index ] ;
index = av_index_search_timestamp ( st , timestamp , flags & AVSEEK_FLAG_BACKWARD ) ;
index = av_index_search_timestamp ( st , timestamp , flags ) ;
if ( index < 0 )
return - 1 ;